From 86ba0b040722623234ad162f04de58774c1deb1c Mon Sep 17 00:00:00 2001 From: tomcw Date: Sat, 22 Oct 2016 23:20:23 +0100 Subject: [PATCH] Apply fixes and enhancements to PR #285 (Support for TK3000 //e) --- ApplewinExpress10.00.vcxproj | 20 +- ApplewinExpress10.00.vcxproj.filters | 42 ++- ApplewinExpress9.00.vcproj | 12 + resource/Applewin.rc | 3 + resource/RUN3000E.bmp | Bin 0 -> 2882 bytes resource/TK3000e.rom | Bin 0 -> 16384 bytes resource/TKClock.rom | Bin 0 -> 2304 bytes resource/resource.h | 266 ++++++++++--------- source/Applewin.cpp | 1 + source/CPU.cpp | 2 +- source/CPU.h | 2 +- source/Common.h | 2 + source/Configuration/PageAdvanced.cpp | 10 +- source/Configuration/PageConfig.cpp | 12 +- source/Configuration/PropertySheetHelper.cpp | 12 + source/Frame.cpp | 18 +- source/Keyboard.cpp | 41 ++- source/Memory.cpp | 2 + 18 files changed, 282 insertions(+), 163 deletions(-) create mode 100644 resource/RUN3000E.bmp create mode 100644 resource/TK3000e.rom create mode 100644 resource/TKClock.rom diff --git a/ApplewinExpress10.00.vcxproj b/ApplewinExpress10.00.vcxproj index f00ab559..62fdc484 100644 --- a/ApplewinExpress10.00.vcxproj +++ b/ApplewinExpress10.00.vcxproj @@ -267,6 +267,7 @@ + Create Create @@ -469,14 +470,6 @@ - - - - - - - - @@ -491,6 +484,7 @@ + @@ -518,16 +512,26 @@ + + + + + + + + + + diff --git a/ApplewinExpress10.00.vcxproj.filters b/ApplewinExpress10.00.vcxproj.filters index 023cd320..3052e88a 100644 --- a/ApplewinExpress10.00.vcxproj.filters +++ b/ApplewinExpress10.00.vcxproj.filters @@ -215,6 +215,9 @@ Source\Video + + Source\Emulator + @@ -501,6 +504,9 @@ Resources + + Resources + Resources @@ -582,6 +588,24 @@ Resources + + Resources + + + Resources + + + Resources + + + Resources + + + Resources + + + Resources + Resources @@ -597,9 +621,15 @@ Resources + + Resources + Resources + + Resources + Resources @@ -612,16 +642,12 @@ Resources - + + Resources + + Resources - - - - - - - diff --git a/ApplewinExpress9.00.vcproj b/ApplewinExpress9.00.vcproj index aa4af152..95f88eb8 100644 --- a/ApplewinExpress9.00.vcproj +++ b/ApplewinExpress9.00.vcproj @@ -1242,6 +1242,10 @@ RelativePath="RESOURCE\RUN.BMP" > + + @@ -1258,6 +1262,14 @@ RelativePath=".\resource\ThunderClockPlus.rom" > + + + + diff --git a/resource/Applewin.rc b/resource/Applewin.rc index b463a359..983ea401 100644 --- a/resource/Applewin.rc +++ b/resource/Applewin.rc @@ -53,6 +53,7 @@ END FULLSCR_BUTTON BITMAP "FULLSCR.BMP" RUN_BUTTON BITMAP "RUN.BMP" RUNP_BUTTON BITMAP "RUNP.BMP" +RUN3000E_BUTTON BITMAP "RUN3000E.BMP" DEBUG_BUTTON BITMAP "DEBUG.BMP" DRIVE1_BUTTON BITMAP "DRIVE1.BMP" DRIVE2_BUTTON BITMAP "DRIVE2.BMP" @@ -308,6 +309,7 @@ IDR_PRINTDRVR_FW FIRMWARE "Parallel.rom" IDR_MOCKINGBOARD_D_FW FIRMWARE "Mockingboard-D.rom" IDR_MOUSEINTERFACE_FW FIRMWARE "MouseInterface.rom" IDR_THUNDERCLOCKPLUS_FW FIRMWARE "ThunderClockPlus.rom" +IDR_TKCLOCK_FW FIRMWARE "TKClock.rom" ///////////////////////////////////////////////////////////////////////////// // @@ -321,6 +323,7 @@ IDR_APPLE2E_ENHANCED_ROM ROM "Apple2e_Enhanced.rom" IDR_PRAVETS_82_ROM ROM "Pravets82.rom" IDR_PRAVETS_8M_ROM ROM "Pravets8M.rom" IDR_PRAVETS_8C_ROM ROM "Pravets8C.rom" +IDR_TK3000_2E_ROM ROM "TK3000e.rom" IDR_FREEZES_F8_ROM ROM "FREEZES_NON-AUTOSTART_F8_ROM.rom" ///////////////////////////////////////////////////////////////////////////// diff --git a/resource/RUN3000E.bmp b/resource/RUN3000E.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1c828c27ad8d5aff136067bb87175ccdd369b944 GIT binary patch literal 2882 zcmd7QJ&xNz42EF_2%rGTAy_6CNKI^?JMbtx3JW7u4#7HSNHIs)Dop@y-kFiS{?Yz* zEBg^;>GOyh&E1c?&oZ{}A4R@$^lkM)K8^EVmQi+gA;MQ8W?|2vRF%}9lKbC3MbzNn zf+h-0!~_Zs%n?WwnurS&27Y)TQE2OZm1=MV5``whp`^m#2qX%PCIt$EBakRG5x&wC z21g)KXktQ}qUaw-AW>-Z(Nw7hM<7vX^RZ2-21g)KXmd(jsRl*@ zDpRQjM<7vXbDB%321g)KXyX-FQ>wucNEDg`&mW@bPwwcSM4?HjKw)qM5`{Kjn<>@c z2qX$^zEW4J!4XIl+I-#IB*NebBnoXVg;c7+5l9r;TqdPdgCmeAw6TPuDb?TzBnnN6 z=Pywh9Dzjtw7IlYsRl%egr=K6uaYVH~#n9=<&T~54YQRrkj431?k4-6314Mzqrb*>p4~d^SuU=-QPwO2&vDt$?J7I|wzj`zPp|GKJMJ^myVb%@$i7ex(mC!TOke mw2OyYe{JLTj$YbE_V`k2T;E#{PrvOquZO3Hy14SjasLB_(u|A% literal 0 HcmV?d00001 diff --git a/resource/TK3000e.rom b/resource/TK3000e.rom new file mode 100644 index 0000000000000000000000000000000000000000..3e73abb9d82b51319b4f53bf5eb0f766fe45ec45 GIT binary patch literal 16384 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 mq|lnh*a2u%7XZTJJ*?^`O<%eRcCb9! zhnVK_C?A*yuy#!{xjK;yk?x1RxS?cNAX^&T#K>a;FWKbU1t}clVe^4rEikZ2mq=1z zG`%cIuM-EdIV^(oxG7mT*_C69UF=l{?9yQECpqq>mv5o>dPOBfk!9{C=Pf+mljzJ&y>Ki7bqy2Un%DJ`u3BT>CUEx#0^2M7O~g(Z#bT96)(d0_9({_?FwmB)Og#FrXOxWc~j#pNfD_(&slWm z0W29G2sKQ$b))BQx#8m=e-)HjSr|?s@R5eSTsnEe@w8hlvy@DRP>xfgLS1~B(xwhone)5yG%;=RLGt8gnRD5C1!8P?l{WmVh z5$3SN!Hlww8vB>e9;~aeJ~X!Gvxn*!?E@Q)t_Q{@6+8%k57aRuUwDBSlae-Wba}MQ z2h4rzURy_u+5*$CiHXEGmOuRRpY_QvueKCs`U?%2q1DW$7}K&%DX%ZPzBA{oZikg| z+wIGiEqg1|@co4EnK8`Bk;%z#y=C!lZ%x)`X4?HYi)694x50eitQ5qC4S2EvKfMIF z_Hi#ddYdf?A4aCT=!rh`iIRXoBR&9GJ9_F2w!mHq)Mk!c15Z zp0ZVvE_U!Ij&1*WYj_*1MYbM3BJT4n_3=zsS5q;3!si!zE%Z23PhE7O&oj>_Fw!7! zsNk>BQ@!*;crgOW8Z0h|-0gwT#fqM=<7Z-xTbvvYiNl2B6qCR8 zli$J9F0)G4TG6EbK&2QHxi_!d(gpoN9R7vY-4V*mUT{uvz(w(XG~*U5pgioQeljIC z8pC&>csiM)jTRN?i~fj2H%tLBhL8DdAuh+(m6JoJ(H)+WDf)WoG3wt?C|*ewd0j-LcW!o@b;{fJg*~2sVNX$ZL28P!a@6Ftj_up?B^I!}SB) zH$4re0anlA70xO}|2U;`a;y3l$4>`u5;jesnl;Uy4wn;PWrU~klKm+%O`9MoV?hH~ zGnF!a2%QZE>;bE22e@c@c*$gjJ#?Gv;$VikF1A-8%%D=>ZkFKKoy?S!d!~qS7V-={ zDAOpb&U1V`%o$?t8VuqR+IkOl!qNnB?EW1;c)i~5zUx5!ci_(bEzbKId<&RjkES=~ z%cT$f;w!Ky0u!>Ak_XRE=-lY_B+D_|IV*+3S*F?MSuq9-H}JCI7Vm#pJ!<0wcSP{u zPCwk^H%;V6SahKyJHsHDKZP9=*|)=X1@)0}$8piMjCQ pw=HYF5Bwxe`uyNm-;EgY*dwb-|FZMPJ0nKiQ1mHYzI}V!{{m^LgyaAK literal 0 HcmV?d00001 diff --git a/resource/TKClock.rom b/resource/TKClock.rom new file mode 100644 index 0000000000000000000000000000000000000000..94a955bfcdb5048d06b0717d1e83389f6e6d8d0d GIT binary patch literal 2304 zcmeHH&uiOu6qml1WLaw$lTvEReu%+FT-w!66Z`A5TRh4-IkdxQ0V{hg{+{Uwe+fP2v)E=z8d32|MU8hQ~_1r)7s+`WG}0 z@qO>qb zkF`}nr zc#yv9j?z=^>-2-%@ARtuH2mf&7K6u?T@I?{!#AL;-K}FWkYRt)6ZV=~X~o)&kc8Co93Uy&a)?-%ci4A%fWHr3)hP5VEq<6ByjZq7Kl>lJOL7)0ni=5quK(cIc!F_MRy<{~iN02vA%D!?G zF@X%TSLtw0u^2s;6Z*TuJK7WoL#bfO&K^NVcqm|JkD|Q(yed|BROGCyELaq*YZVdE zdld=g&}<+)lvR*&O+nu(2u=@>$)j~oq5qUlmSHrYO8veC#Ca|DEwB7)RV;7_>I2Eo zTH0z=pwq5IH5XZ;Hy@Cos%=A4kF^h8hL#!}^ga7b8%TVNCAMJ@&W-C&R4bTEv+Hie z<}yiV1W#)rS+Nz(3aQC9i85KU(w_A;@N4Ln<=LZH+vV9a1CGD+W%vSvX2#ju+au}! z^+A7uJ<(6TbrGMGqmvVfvK=eqczJxRd~UQHjc~>E7t65==ec6cx^(x#d4ros+{JOe z_{nFM(BZ6)KlN1cqcmq-yv)UrHIeXH5Vyw1YUf64(FniR?QAt4Y&SO__8Jd+bgQ|u z)wthkZ2a7O)M;!s?r(M)wAI^a^?qqQ=x#N)yS?p=?xVHluP^>997YZqIAq{uVc=ix Cy literal 0 HcmV?d00001 diff --git a/resource/resource.h b/resource/resource.h index 651ce3ce..aa46914a 100644 --- a/resource/resource.h +++ b/resource/resource.h @@ -1,132 +1,134 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Applewin.rc -// -#define IDC_COMPUTER 101 -#define IDC_JOYSTICK0 102 -#define IDC_SOUNDTYPE 103 -#define IDC_SERIALPORT 104 -#define IDR_ACCELERATOR1 105 -#define IDC_VIDEOTYPE 106 -#define IDD_PROPPAGE_INPUT 107 -#define IDC_AUTHENTIC_SPEED 108 -#define IDD_PROPPAGE_CONFIG 109 -#define IDC_CUSTOM_SPEED 110 -#define IDC_SLIDER_CPU_SPEED 111 -#define IDD_PROPPAGE_SOUND 112 -#define IDC_DISKTYPE 113 -#define IDC_JOYSTICK1 115 -#define IDD_PROPPAGE_DISK 116 -#define IDC_BENCHMARK 117 -#define IDC_LOADSTATE 118 -#define IDR_HDDRVR_FW 119 -#define IDC_0_5_MHz 120 -#define IDB_APPLEWIN 121 -#define IDC_1_0_MHz 122 -#define IDC_2_0_MHz 123 -#define IDC_MAX_MHz 124 -#define IDR_MENU 125 -#define IDR_APPLE2_ROM 126 -#define IDR_APPLE2_PLUS_ROM 127 -#define IDR_APPLE2E_ROM 128 -#define IDR_APPLE2E_ENHANCED_ROM 129 -#define IDC_MB_ENABLE 130 -#define IDD_TFE_SETTINGS_DIALOG 131 -#define IDR_PRINTDRVR_FW 132 -#define IDD_PROPPAGE_ADVANCED 132 -#define IDR_DISK2_FW 133 -#define IDR_SSC_FW 134 -#define IDR_MOCKINGBOARD_D_FW 135 -#define IDR_MOUSEINTERFACE_FW 136 -#define IDR_THUNDERCLOCKPLUS_FW 137 -#define IDR_FREEZES_F8_ROM 138 -#define IDR_PRAVETS_82_ROM 139 -#define IDR_PRAVETS_8M_ROM 140 -#define IDR_PRAVETS_8C_ROM 142 -#define IDR_MENU_DISK_POPUP 143 -#define IDD_ABOUT 145 -#define IDC_CHECK_CONFIRM_REBOOT 146 -#define IDC_KEYB_BUFFER_ENABLE 1005 -#define IDC_SAVESTATE 1006 -#define IDC_SAVESTATE_ON_EXIT 1007 -#define IDC_SAVESTATE_FILENAME 1008 -#define IDC_SPKR_VOLUME 1009 -#define IDC_MB_VOLUME 1010 -#define IDC_SAVESTATE_BROWSE 1011 -#define IDC_MONOCOLOR 1012 -#define IDC_HDD1 1013 -#define IDC_HDD2 1014 -#define IDC_DISK1 1015 -#define IDC_DISK2 1016 -#define IDC_EDIT_DISK1 1017 -#define IDC_EDIT_DISK2 1018 -#define IDC_PASTE_FROM_CLIPBOARD 1018 -#define IDC_EDIT_HDD1 1019 -#define IDC_EDIT_HDD2 1020 -#define IDC_HDD_ENABLE 1021 -#define IDC_SPIN_XTRIM 1026 -#define IDC_SPIN_YTRIM 1027 -#define IDC_PHASOR_ENABLE 1029 -#define IDC_SAM_ENABLE 1030 -#define IDC_SOUNDCARD_DISABLE 1031 - -#define IDC_TFE_SETTINGS_ENABLE_T 1032 -#define IDC_TFE_SETTINGS_ENABLE 1033 -#define IDC_TFE_SETTINGS_INTERFACE_T 1034 -#define IDC_TFE_SETTINGS_INTERFACE 1035 -#define IDC_TFE_SETTINGS_INTERFACE_NAME 1036 -#define IDC_TFE_SETTINGS_INTERFACE_DESC 1037 -#define IDS_TFE_CAPTION 1038 -#define IDS_TFE_ETHERNET 1039 -#define IDS_TFE_INTERFACE 1040 -#define IDS_OK 1041 -#define IDS_CANCEL 1042 -#define IDC_ETHERNET 1043 -#define IDC_SCROLLLOCK_TOGGLE 1044 -#define IDC_MOUSE_IN_SLOT4 1045 -#define IDC_THE_FREEZES_F8_ROM_FW 1046 -#define IDC_MOUSE_CROSSHAIR 1047 -#define IDC_CLONETYPE 1048 -#define IDC_MOUSE_RESTRICT_TO_WINDOW 1049 -#define IDC_CIDERPRESS_BROWSE 1050 -#define IDC_CIDERPRESS_FILENAME 1051 -#define IDC_CPM_CONFIG 1052 -#define IDC_DUMPTOPRINTER 1053 -#define IDC_PRINTER_DUMP_FILENAME 1054 -#define IDC_PRINTER_DUMP_FILENAME_BROWSE 1055 -#define IDC_PRINTER_CONVERT_ENCODING 1056 -#define IDC_PRINTER_FILTER_UNPRINTABLE 1057 -#define IDC_PRINTER_APPEND 1058 -#define IDC_SPIN_PRINTER_IDLE 1059 - -#define IDC_CHECK_HALF_SCAN_LINES 1060 -#define IDC_GPL_TEXT 1061 -#define IDC_GPL_BORDER 1063 -#define IDC_APPLEWIN_VERSION 1064 -#define IDC_APPLEWIN_ICON 1065 -#define IDC_CURSORCONTROL 1066 -#define IDC_AUTOFIRE 1067 -#define IDC_CENTERINGCONTROL 1068 -#define IDC_COMBO_HDD1 1078 -#define IDC_COMBO_HDD2 1079 -#define IDC_COMBO_DISK1 1080 -#define IDC_COMBO_DISK2 1081 -#define IDM_EXIT 40001 -#define IDM_HELP 40002 -#define IDM_ABOUT 40003 -#define ID_DISKMENU_EJECT 40004 -#define ID_DISKMENU_WRITEPROTECTION_ON 40005 -#define ID_DISKMENU_WRITEPROTECTION_OFF 40006 -#define ID_DISKMENU_SENDTO_CIDERPRESS 40007 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 147 -#define _APS_NEXT_COMMAND_VALUE 40012 -#define _APS_NEXT_CONTROL_VALUE 1082 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Applewin.rc +// +#define IDC_COMPUTER 101 +#define IDC_JOYSTICK0 102 +#define IDC_SOUNDTYPE 103 +#define IDC_SERIALPORT 104 +#define IDR_ACCELERATOR1 105 +#define IDC_VIDEOTYPE 106 +#define IDD_PROPPAGE_INPUT 107 +#define IDC_AUTHENTIC_SPEED 108 +#define IDD_PROPPAGE_CONFIG 109 +#define IDC_CUSTOM_SPEED 110 +#define IDC_SLIDER_CPU_SPEED 111 +#define IDD_PROPPAGE_SOUND 112 +#define IDC_DISKTYPE 113 +#define IDC_JOYSTICK1 115 +#define IDD_PROPPAGE_DISK 116 +#define IDC_BENCHMARK 117 +#define IDC_LOADSTATE 118 +#define IDR_HDDRVR_FW 119 +#define IDC_0_5_MHz 120 +#define IDB_APPLEWIN 121 +#define IDC_1_0_MHz 122 +#define IDC_2_0_MHz 123 +#define IDC_MAX_MHz 124 +#define IDR_MENU 125 +#define IDR_APPLE2_ROM 126 +#define IDR_APPLE2_PLUS_ROM 127 +#define IDR_APPLE2E_ROM 128 +#define IDR_APPLE2E_ENHANCED_ROM 129 +#define IDC_MB_ENABLE 130 +#define IDD_TFE_SETTINGS_DIALOG 131 +#define IDR_PRINTDRVR_FW 132 +#define IDD_PROPPAGE_ADVANCED 132 +#define IDR_DISK2_FW 133 +#define IDR_SSC_FW 134 +#define IDR_MOCKINGBOARD_D_FW 135 +#define IDR_MOUSEINTERFACE_FW 136 +#define IDR_THUNDERCLOCKPLUS_FW 137 +#define IDR_FREEZES_F8_ROM 138 +#define IDR_PRAVETS_82_ROM 139 +#define IDR_PRAVETS_8M_ROM 140 +#define IDR_PRAVETS_8C_ROM 142 +#define IDR_MENU_DISK_POPUP 143 +#define IDD_ABOUT 145 +#define IDC_CHECK_CONFIRM_REBOOT 146 +#define IDR_TK3000_2E_ROM 147 +#define IDR_TKCLOCK_FW 148 +#define IDC_KEYB_BUFFER_ENABLE 1005 +#define IDC_SAVESTATE 1006 +#define IDC_SAVESTATE_ON_EXIT 1007 +#define IDC_SAVESTATE_FILENAME 1008 +#define IDC_SPKR_VOLUME 1009 +#define IDC_MB_VOLUME 1010 +#define IDC_SAVESTATE_BROWSE 1011 +#define IDC_MONOCOLOR 1012 +#define IDC_HDD1 1013 +#define IDC_HDD2 1014 +#define IDC_DISK1 1015 +#define IDC_DISK2 1016 +#define IDC_EDIT_DISK1 1017 +#define IDC_EDIT_DISK2 1018 +#define IDC_PASTE_FROM_CLIPBOARD 1018 +#define IDC_EDIT_HDD1 1019 +#define IDC_EDIT_HDD2 1020 +#define IDC_HDD_ENABLE 1021 +#define IDC_SPIN_XTRIM 1026 +#define IDC_SPIN_YTRIM 1027 +#define IDC_PHASOR_ENABLE 1029 +#define IDC_SAM_ENABLE 1030 +#define IDC_SOUNDCARD_DISABLE 1031 + +#define IDC_TFE_SETTINGS_ENABLE_T 1032 +#define IDC_TFE_SETTINGS_ENABLE 1033 +#define IDC_TFE_SETTINGS_INTERFACE_T 1034 +#define IDC_TFE_SETTINGS_INTERFACE 1035 +#define IDC_TFE_SETTINGS_INTERFACE_NAME 1036 +#define IDC_TFE_SETTINGS_INTERFACE_DESC 1037 +#define IDS_TFE_CAPTION 1038 +#define IDS_TFE_ETHERNET 1039 +#define IDS_TFE_INTERFACE 1040 +#define IDS_OK 1041 +#define IDS_CANCEL 1042 +#define IDC_ETHERNET 1043 +#define IDC_SCROLLLOCK_TOGGLE 1044 +#define IDC_MOUSE_IN_SLOT4 1045 +#define IDC_THE_FREEZES_F8_ROM_FW 1046 +#define IDC_MOUSE_CROSSHAIR 1047 +#define IDC_CLONETYPE 1048 +#define IDC_MOUSE_RESTRICT_TO_WINDOW 1049 +#define IDC_CIDERPRESS_BROWSE 1050 +#define IDC_CIDERPRESS_FILENAME 1051 +#define IDC_CPM_CONFIG 1052 +#define IDC_DUMPTOPRINTER 1053 +#define IDC_PRINTER_DUMP_FILENAME 1054 +#define IDC_PRINTER_DUMP_FILENAME_BROWSE 1055 +#define IDC_PRINTER_CONVERT_ENCODING 1056 +#define IDC_PRINTER_FILTER_UNPRINTABLE 1057 +#define IDC_PRINTER_APPEND 1058 +#define IDC_SPIN_PRINTER_IDLE 1059 + +#define IDC_CHECK_HALF_SCAN_LINES 1060 +#define IDC_GPL_TEXT 1061 +#define IDC_GPL_BORDER 1063 +#define IDC_APPLEWIN_VERSION 1064 +#define IDC_APPLEWIN_ICON 1065 +#define IDC_CURSORCONTROL 1066 +#define IDC_AUTOFIRE 1067 +#define IDC_CENTERINGCONTROL 1068 +#define IDC_COMBO_HDD1 1078 +#define IDC_COMBO_HDD2 1079 +#define IDC_COMBO_DISK1 1080 +#define IDC_COMBO_DISK2 1081 +#define IDM_EXIT 40001 +#define IDM_HELP 40002 +#define IDM_ABOUT 40003 +#define ID_DISKMENU_EJECT 40004 +#define ID_DISKMENU_WRITEPROTECTION_ON 40005 +#define ID_DISKMENU_WRITEPROTECTION_OFF 40006 +#define ID_DISKMENU_SENDTO_CIDERPRESS 40007 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 149 +#define _APS_NEXT_COMMAND_VALUE 40012 +#define _APS_NEXT_CONTROL_VALUE 1082 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/source/Applewin.cpp b/source/Applewin.cpp index b7423717..8bb4bac7 100644 --- a/source/Applewin.cpp +++ b/source/Applewin.cpp @@ -441,6 +441,7 @@ void SetCharsetType(void) case A2TYPE_APPLE2PLUS: g_nCharsetType = 0; break; case A2TYPE_APPLE2E: g_nCharsetType = 0; break; case A2TYPE_APPLE2EENHANCED:g_nCharsetType = 0; break; + case A2TYPE_TK30002E: g_nCharsetType = 0; break; case A2TYPE_PRAVETS82: g_nCharsetType = 1; break; case A2TYPE_PRAVETS8M: g_nCharsetType = 2; break; //This charset has a very small difference with the PRAVETS82 one, and probably has some misplaced characters. case A2TYPE_PRAVETS8A: g_nCharsetType = 3; break; diff --git a/source/CPU.cpp b/source/CPU.cpp index 52fe8794..b2d525be 100644 --- a/source/CPU.cpp +++ b/source/CPU.cpp @@ -171,7 +171,7 @@ void SetMainCpu(eCpuType cpu) static bool IsCpu65C02(eApple2Type apple2Type) { // NB. All Pravets clones are 6502 (GH#307) - return (apple2Type == A2TYPE_APPLE2EENHANCED) || (apple2Type & A2TYPE_APPLE2C); + return (apple2Type == A2TYPE_APPLE2EENHANCED) || (apple2Type == A2TYPE_TK30002E) || (apple2Type & A2TYPE_APPLE2C); } eCpuType ProbeMainCpuDefault(eApple2Type apple2Type) diff --git a/source/CPU.h b/source/CPU.h index 5086e9e1..8fb02e3a 100644 --- a/source/CPU.h +++ b/source/CPU.h @@ -36,7 +36,7 @@ void CpuWrite(USHORT addr, BYTE a, ULONG uExecutedCycles); DWORD CpuGetEmulationTime_ms(void); -enum eCpuType {CPU_6502=1, CPU_65C02, CPU_Z80}; // Don't change! Persisted to Registry +enum eCpuType {CPU_UNKNOWN=0, CPU_6502=1, CPU_65C02, CPU_Z80}; // Don't change! Persisted to Registry eCpuType GetMainCpu(void); void SetMainCpu(eCpuType cpu); diff --git a/source/Common.h b/source/Common.h index 32c76ef1..d0a27a9a 100644 --- a/source/Common.h +++ b/source/Common.h @@ -63,6 +63,7 @@ enum AppMode_e #define TITLE_PRAVETS_82 TEXT("Pravets 82 Emulator") #define TITLE_PRAVETS_8M TEXT("Pravets 8M Emulator") #define TITLE_PRAVETS_8A TEXT("Pravets 8A Emulator") +#define TITLE_TK3000_2E TEXT("TK3000 //e Emulator") #define TITLE_PAUSED TEXT("* PAUSED *") #define TITLE_STEPPING TEXT("Stepping") @@ -184,6 +185,7 @@ enum eApple2Type { A2TYPE_BAD_PRAVETS82=A2TYPE_PRAVETS|APPLE2E_MASK, // Wrongly tagged as Apple //e clone (< AppleWin 1.26) A2TYPE_BAD_PRAVETS8M, // Wrongly tagged as Apple //e clone (< AppleWin 1.26) A2TYPE_PRAVETS8A, // Apple //e clone + A2TYPE_TK30002E, // Apple //e enhanced clone A2TYPE_MAX }; diff --git a/source/Configuration/PageAdvanced.cpp b/source/Configuration/PageAdvanced.cpp index c50cf5c7..a46d12c6 100644 --- a/source/Configuration/PageAdvanced.cpp +++ b/source/Configuration/PageAdvanced.cpp @@ -33,12 +33,12 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA CPageAdvanced* CPageAdvanced::ms_this = 0; // reinit'd in ctor -enum CLONECHOICE {MENUITEM_CLONEMIN, MENUITEM_PRAVETS82=MENUITEM_CLONEMIN, MENUITEM_PRAVETS8M, MENUITEM_PRAVETS8A, MENUITEM_CLONEMAX}; +enum CLONECHOICE {MENUITEM_CLONEMIN, MENUITEM_PRAVETS82=MENUITEM_CLONEMIN, MENUITEM_PRAVETS8M, MENUITEM_PRAVETS8A, MENUITEM_TK30002E, MENUITEM_CLONEMAX}; const TCHAR CPageAdvanced::m_CloneChoices[] = TEXT("Pravets 82\0") // Bulgarian - TEXT("Pravets 8M\0") // Bulgarian - TEXT("Pravets 8A\0"); // Bulgarian - + TEXT("Pravets 8M\0") // Bulgarian + TEXT("Pravets 8A\0") // Bulgarian + TEXT("TK3000 //e"); // Brazilian BOOL CALLBACK CPageAdvanced::DlgProc(HWND hWnd, UINT message, WPARAM wparam, LPARAM lparam) { @@ -117,6 +117,7 @@ BOOL CPageAdvanced::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPAR const DWORD NewCloneMenuItem = (DWORD) SendDlgItemMessage(hWnd, IDC_CLONETYPE, CB_GETCURSEL, 0, 0); const eApple2Type NewCloneType = GetCloneType(NewCloneMenuItem); m_PropertySheetHelper.GetConfigNew().m_Apple2Type = NewCloneType; + m_PropertySheetHelper.GetConfigNew().m_CpuType = ProbeMainCpuDefault(NewCloneType); } break; } @@ -221,6 +222,7 @@ eApple2Type CPageAdvanced::GetCloneType(DWORD NewMenuItem) case MENUITEM_PRAVETS82: return A2TYPE_PRAVETS82; case MENUITEM_PRAVETS8M: return A2TYPE_PRAVETS8M; case MENUITEM_PRAVETS8A: return A2TYPE_PRAVETS8A; + case MENUITEM_TK30002E: return A2TYPE_TK30002E; default: return A2TYPE_PRAVETS82; } } diff --git a/source/Configuration/PageConfig.cpp b/source/Configuration/PageConfig.cpp index 44be7a0e..a6834fcb 100644 --- a/source/Configuration/PageConfig.cpp +++ b/source/Configuration/PageConfig.cpp @@ -131,7 +131,16 @@ BOOL CPageConfig::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM const DWORD NewComputerMenuItem = (DWORD) SendDlgItemMessage(hWnd, IDC_COMPUTER, CB_GETCURSEL, 0, 0); const eApple2Type NewApple2Type = GetApple2Type(NewComputerMenuItem); m_PropertySheetHelper.GetConfigNew().m_Apple2Type = NewApple2Type; - m_PropertySheetHelper.GetConfigNew().m_CpuType = ProbeMainCpuDefault(NewApple2Type); + if (NewApple2Type != A2TYPE_CLONE) + { + m_PropertySheetHelper.GetConfigNew().m_CpuType = ProbeMainCpuDefault(NewApple2Type); + } + else // A2TYPE_CLONE + { + // NB. A2TYPE_CLONE could be either 6502(Pravets) or 65C02(TK3000 //e) + // - Set correctly in PageAdvanced.cpp for IDC_CLONETYPE + m_PropertySheetHelper.GetConfigNew().m_CpuType = CPU_UNKNOWN; + } } break; @@ -170,6 +179,7 @@ BOOL CPageConfig::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM case A2TYPE_PRAVETS82: nCurrentChoice = MENUITEM_CLONE; break; case A2TYPE_PRAVETS8M: nCurrentChoice = MENUITEM_CLONE; break; case A2TYPE_PRAVETS8A: nCurrentChoice = MENUITEM_CLONE; break; + case A2TYPE_TK30002E: nCurrentChoice = MENUITEM_CLONE; break; } m_PropertySheetHelper.FillComboBox(hWnd, IDC_COMPUTER, m_ComputerChoices, nCurrentChoice); diff --git a/source/Configuration/PropertySheetHelper.cpp b/source/Configuration/PropertySheetHelper.cpp index a6ec332a..faf51d75 100644 --- a/source/Configuration/PropertySheetHelper.cpp +++ b/source/Configuration/PropertySheetHelper.cpp @@ -324,6 +324,18 @@ void CPropertySheetHelper::PostMsgAfterClose(HWND hWnd, PAGETYPE page) UINT uAfterClose = 0; + if (m_ConfigNew.m_Apple2Type == A2TYPE_CLONE) + { + MessageBox(hWnd, "Error - Unable to change configuration\n\nReason: A specific clone wasn't selected from the Advanced tab", g_pAppTitle, MB_ICONSTOP | MB_SETFOREGROUND); + return; + } + + _ASSERT(m_ConfigNew.m_CpuType != CPU_UNKNOWN); // NB. Could only ever be CPU_UNKNOWN for a clone (and only if a mistake was made when adding a new clone) + if (m_ConfigNew.m_CpuType == CPU_UNKNOWN) + { + m_ConfigNew.m_CpuType = ProbeMainCpuDefault(m_ConfigNew.m_Apple2Type); + } + if (IsConfigChanged()) { if (!CheckChangesForRestart(hWnd)) diff --git a/source/Frame.cpp b/source/Frame.cpp index c43380a4..3020acaf 100644 --- a/source/Frame.cpp +++ b/source/Frame.cpp @@ -204,13 +204,14 @@ static void GetAppleWindowTitle() switch (g_Apple2Type) { default: - case A2TYPE_APPLE2: _tcscpy(g_pAppleWindowTitle, TITLE_APPLE_2 ); break; - case A2TYPE_APPLE2PLUS: _tcscpy(g_pAppleWindowTitle, TITLE_APPLE_2_PLUS ); break; - case A2TYPE_APPLE2E: _tcscpy(g_pAppleWindowTitle, TITLE_APPLE_2E ); break; - case A2TYPE_APPLE2EENHANCED:_tcscpy(g_pAppleWindowTitle, TITLE_APPLE_2E_ENHANCED); break; - case A2TYPE_PRAVETS82: _tcscpy(g_pAppleWindowTitle, TITLE_PRAVETS_82 ); break; - case A2TYPE_PRAVETS8M: _tcscpy(g_pAppleWindowTitle, TITLE_PRAVETS_8M ); break; - case A2TYPE_PRAVETS8A: _tcscpy(g_pAppleWindowTitle, TITLE_PRAVETS_8A ); break; + case A2TYPE_APPLE2: _tcscpy(g_pAppleWindowTitle, TITLE_APPLE_2 ); break; + case A2TYPE_APPLE2PLUS: _tcscpy(g_pAppleWindowTitle, TITLE_APPLE_2_PLUS ); break; + case A2TYPE_APPLE2E: _tcscpy(g_pAppleWindowTitle, TITLE_APPLE_2E ); break; + case A2TYPE_APPLE2EENHANCED:_tcscpy(g_pAppleWindowTitle, TITLE_APPLE_2E_ENHANCED); break; + case A2TYPE_PRAVETS82: _tcscpy(g_pAppleWindowTitle, TITLE_PRAVETS_82 ); break; + case A2TYPE_PRAVETS8M: _tcscpy(g_pAppleWindowTitle, TITLE_PRAVETS_8M ); break; + case A2TYPE_PRAVETS8A: _tcscpy(g_pAppleWindowTitle, TITLE_PRAVETS_8A ); break; + case A2TYPE_TK30002E: _tcscpy(g_pAppleWindowTitle, TITLE_TK3000_2E ); break; } #if _DEBUG @@ -312,6 +313,9 @@ static void CreateGdiObjects(void) case A2TYPE_PRAVETS8A: buttonbitmap[BTN_RUN] = (HBITMAP)LOADBUTTONBITMAP(TEXT("RUNP_BUTTON")); break; + case A2TYPE_TK30002E: + buttonbitmap[BTN_RUN] = (HBITMAP)LOADBUTTONBITMAP(TEXT("RUN3000E_BUTTON")); + break; default: buttonbitmap[BTN_RUN] = (HBITMAP)LOADBUTTONBITMAP(TEXT("RUN_BUTTON")); break; diff --git a/source/Keyboard.cpp b/source/Keyboard.cpp index be0001ef..47f1687d 100644 --- a/source/Keyboard.cpp +++ b/source/Keyboard.cpp @@ -34,6 +34,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "Pravets.h" #include "Tape.h" #include "YamlHelper.h" +#include "Video.h" // Needed by TK3000 //e, to refresh the frame at each |Mode| change static bool g_bKeybBufferEnable = false; @@ -48,6 +49,8 @@ bool g_bShiftKey = false; bool g_bCtrlKey = false; bool g_bAltKey = false; +static bool g_bTK3KModeKey = false; //TK3000 //e |Mode| key + static bool g_bCapsLock = true; //Caps lock key for Apple2 and Lat/Cyr lock for Pravets8 static bool g_bP8CapsLock = true; //Caps lock key of Pravets 8A/C static int lastvirtkey = 0; // Current PC keycode @@ -173,7 +176,7 @@ void KeybQueueKeypress (int key, BOOL bASCII) } g_bFreshReset = false; - if (key > 0x7F) + if ((key > 0x7F) && !g_bTK3KModeKey) // When in TK3000 mode, we have special keys which need remapping return; if (!IS_APPLE2) @@ -279,6 +282,32 @@ void KeybQueueKeypress (int key, BOOL bASCII) } } } + // Remap for the TK3000 //e, which had a special |Mode| key for displaying accented chars on screen + // Borrowed from Fábio Belavenuto's TK3000e emulator (Copyright (C) 2004) - http://code.google.com/p/tk3000e/ + if (g_bTK3KModeKey) // We already switch this on only if the the TK3000 is currently being emulated + { + if ((key >= 0xC0) && (key <= 0xDA)) key += 0x20; // Convert uppercase to lowercase + switch (key) + { + case 0xE0: key = '_'; break; // à + case 0xE1: key = '@'; break; // á + case 0xE2: key = '\\'; break; // â + case 0xE3: key = '['; break; // ã + case 0xE7: key = ']'; break; // ç + case 0xE9: key = '`'; break; // é + case 0xEA: key = '&'; break; // ê + case 0xED: key = '{'; break; // í + case 0xF3: key = '~'; break; // ó + case 0xF4: key = '}'; break; // ô + case 0xF5: key = '#'; break; // õ + case 0xFA: key = '|'; break; // ú + } + if (key > 0x7F) return; // Get out + if ((key >= 'a') && (key <= 'z') && (g_bCapsLock)) + keycode = key - ('a'-'A'); + else + keycode = key; + } } else { @@ -315,6 +344,16 @@ void KeybQueueKeypress (int key, BOOL bASCII) return; } + if (key == VK_SCROLL) + { // For the TK3000 //e we use Scroll Lock to switch between Apple ][ and accented chars modes + if (g_Apple2Type == A2TYPE_TK30002E) + { + g_bTK3KModeKey = (GetKeyState(VK_SCROLL) & 1) ? true : false; // Sync with the Scroll Lock status + FrameRefreshStatus(DRAW_LEDS); // TODO: Implement |Mode| LED in the UI; make it appear only when in TK3000 mode + VideoRedrawScreen(); // TODO: Still need to implement page mode switching and 'whatnot' + } + } + if (!((key >= VK_LEFT) && (key <= VK_DELETE) && asciicode[IS_APPLE2 ? 0 : 1][key - VK_LEFT])) return; diff --git a/source/Memory.cpp b/source/Memory.cpp index f69112ed..1ddba2f1 100644 --- a/source/Memory.cpp +++ b/source/Memory.cpp @@ -1176,6 +1176,7 @@ void MemInitializeROM(void) case A2TYPE_PRAVETS82: hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_PRAVETS_82_ROM ), "ROM"); ROM_SIZE = Apple2RomSize ; break; case A2TYPE_PRAVETS8M: hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_PRAVETS_8M_ROM ), "ROM"); ROM_SIZE = Apple2RomSize ; break; case A2TYPE_PRAVETS8A: hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_PRAVETS_8C_ROM ), "ROM"); ROM_SIZE = Apple2eRomSize; break; + case A2TYPE_TK30002E: hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_TK3000_2E_ROM ), "ROM"); ROM_SIZE = Apple2eRomSize; break; } if(hResInfo == NULL) @@ -1190,6 +1191,7 @@ void MemInitializeROM(void) case A2TYPE_PRAVETS82: _tcscpy(sRomFileName, TEXT("PRAVETS82.ROM" )); break; case A2TYPE_PRAVETS8M: _tcscpy(sRomFileName, TEXT("PRAVETS8M.ROM" )); break; case A2TYPE_PRAVETS8A: _tcscpy(sRomFileName, TEXT("PRAVETS8C.ROM" )); break; + case A2TYPE_TK30002E: _tcscpy(sRomFileName, TEXT("TK3000e.ROM" )); break; default: { _tcscpy(sRomFileName, TEXT("Unknown type!"));