From bd3fe6054f584a0e5b7a311e0d5d68673c3e6915 Mon Sep 17 00:00:00 2001 From: Gwenhael Le Moine Date: Tue, 19 Mar 2024 23:35:29 +0100 Subject: [PATCH] 2007-08-04: Updated to version 1.44 Signed-off-by: Gwenhael Le Moine --- CP_48G3.BMP | Bin 217526 -> 217526 bytes CP_48S3.BMP | Bin 217526 -> 217526 bytes EMU48.EXE | Bin 262144 -> 253952 bytes EMU48.TXT | 73 +++++---- Emu48.url | 2 +- KML_20.DOC | 65 ++++++-- Macro/Mac2txt.exe | Bin 24576 -> 24576 bytes Macro/Mac2txt.txt | 6 +- MkShared.exe | Bin 28672 -> 32768 bytes PROBLEMS.TXT | 10 +- Sources/Emu48/CHANGES.TXT | 297 ++++++++++++++++++++++++++++++++-- Sources/Emu48/DDESERV.C | 25 ++- Sources/Emu48/DEBUGGER.C | 110 +++++++------ Sources/Emu48/DISASM.C | 81 ++++------ Sources/Emu48/DISPLAY.C | 10 +- Sources/Emu48/EMU48.C | 292 +++++++++++++++++++++++---------- Sources/Emu48/EMU48.DSP | 4 + Sources/Emu48/EMU48.H | 39 +++-- Sources/Emu48/EMU48.RC | 84 +++++----- Sources/Emu48/ENGINE.C | 2 + Sources/Emu48/EXTERNAL.C | 4 +- Sources/Emu48/FILES.C | 230 ++++++++++++++++++-------- Sources/Emu48/KEYBOARD.C | 14 +- Sources/Emu48/KEYMACRO.C | 6 +- Sources/Emu48/KML.C | 127 ++++++++------- Sources/Emu48/KML.H | 2 +- Sources/Emu48/LOWBAT.C | 118 ++++++++++++++ Sources/Emu48/MOPS.C | 58 +++++-- Sources/Emu48/OPCODES.C | 18 +-- Sources/Emu48/OPS.H | 34 +--- Sources/Emu48/PCH.H | 5 + Sources/Emu48/RESOURCE.H | 248 ++++++++++++++-------------- Sources/Emu48/RPL.C | 97 +++++++---- Sources/Emu48/SERIAL.C | 2 +- Sources/Emu48/SETTINGS.C | 20 ++- Sources/Emu48/STACK.C | 35 +++- Sources/Emu48/TIMER.C | 16 +- Sources/GCCPatch/EMU48GCC.RC | 84 +++++----- Sources/GCCPatch/Makefile | 12 +- Sources/GCCPatch/PCH.H | 5 + Sources/GCCPatch/README.TXT | 22 ++- Sources/MkShared/MKSHARED.C | 43 ++--- Sources/MkShared/MKSHARED.RC | 27 ++-- Sources/MkShared/MKSHARED.XML | 22 +++ uninst.exe | Bin 61128 -> 61596 bytes 45 files changed, 1590 insertions(+), 759 deletions(-) create mode 100644 Sources/Emu48/LOWBAT.C create mode 100644 Sources/MkShared/MKSHARED.XML diff --git a/CP_48G3.BMP b/CP_48G3.BMP index 56e6045a72e9d1ef6f9288d70bf359cb32312213..0d12215386247720ec5626dbdc9adfe751f7c2c1 100644 GIT binary patch delta 58 zcmV-A0LA~dqYbvB4X{s_0TP2ym$y)t0YM;_QD*`mlX7<$mpcdn372p?0u+;)cNLfK QGXV*Q1h@gW1h@jSnRAU4p#T5? delta 35 tcmV+;0Nnq!qYbvB4X{s_0eXW_m$y)t0YM;_f#U%ihpe{&x2(4U3Yrxr4+;PP diff --git a/CP_48S3.BMP b/CP_48S3.BMP index 2a2827dd55b4ba30a4dbad936f78bae211898e7c..b41cca62bd8f8b05eebac1defb45c3c6a0dd6e5d 100644 GIT binary patch delta 1036 zcma)4&ubGw6z09ebfe7=o2W5K<2DwN1e$^#lp?(dDK^ju9`qjwvc)k42@8TJt*|jCVH3t2_i<&L#c0O6O$Axon79%*?HeL-?wj8%AS?7=j{|I z{4R_7HqM=PoW*RyF_6zXQ&^s%)m@)H7HBnDY!9ngw2GDtnI-7VUg-@9m`OMym``&b z9tOyX254(HUa{Fs-I>t+#Xn86OW|Gc-6bFVFQ~pR63yBc(L>_J_yRS$NVI!EEXX)jhBpS635-;knsF6_m?V(lcw5?xv$PN;5JK>0;*G*xO z>Ya9XHO*Y2tiIHV4dU`GHuJM{A&eR1MsAFQ z`GvV7_;!ZeRp)z3O=Gkvy^Kw=%WqXGmOOTl3D+|m5Kf~Ilb)B-d=U2{JdB;6f>@65 z2OB$;VXvWq-56vuY+z$TLOIGOh2j9dL^*}e5k7{{Am7JYiTYHT=O5_JLAj>pIynoM z1Skxrgu#!UPZUHm%Exgb#*Z|^Q8`+@O1O%x4D_4AFegRyc8n8RbbrgAE>i_TTsgsu zwve?6_Ta%f4d70O-O9FYA!%|F&(h-KrpYzD9w!6yL!wS<`|-6&htUYpp{`=>{P~a+ iZ+<6tz!p|f^0dUBza#<;vhXC%$;Y)gS8H*{uaQ4G0jd)K delta 993 zcmb7C&rcI!5X}tjQWIfIK>5*jyOtlp3wXo>@j}D{iA~_Z4UKxRYQlv(Two7qNE$l@ zB{r#E)PsqYz12GhN;q+Ygg=2u%jp=?EC89*44PBdee9-fZjQ2a(!DL%SJgv- z+7PEas@;(Nm&c~XcYzvfSan|txSAlFD(?-^XlO&Y)Z(Qn%|e&|*iI)kwvDe5W1^KM zq!Y8k!u;}K2BOQcOCJI$51REDxfM9_?IqX)y7LL9iussT96KE-E)FI9yH%L)p_LOz z`Colld*XOC{&DcaBuJ&gHG*?+ggR!)UoISH&?WZ@!G(D3|ipOz)#9 zNYLjr4ziB+lEb&^AdTb5RBajDXaO4`5%As_U%SH$jv8=M1ohBd7W-+^!PN{)Ql$cJ zovr0SeLRb|1x|l{fpuMMaiicodOX8dZZ?Y*ks$~Cit+@0-%O)L6D|%b53eIZ&s?mx zpaf_hA=WKLQTZ80y}gBX$7t4-ix3^lK{e~j)4KA69LPB(v*^g^wR#TydamvF*k2Sn Bv+w`_ diff --git a/EMU48.EXE b/EMU48.EXE index b4834624e6962a0af95ca01117d2032ae3b6a602..faa28daf4eac592152a7b9daae12ce1571d9972d 100755 GIT binary patch literal 253952 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

*m4x3kp4`lYC)%-xBZW18k79IZ@ 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�b@gPI0WTOxnkVLql+&)sI? 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

1a@zB!t7FqHS{~lB%=`AXn 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 delta 396 zcmZoTz}Rqral#8054MSp6W=s2t>Bs5$mBhFC*yn|b8{5a7GHH%24)5Z1`7s;238;) z0i@Z0bOn&+1JVdh_eE{;(fIN=LwE^Oi3XBX5Kn@as z2v|&B8z9aYF!^qPI7hnX*iN z5V3;MU~*@qHKWPqqmdh#I6*4F7H+POF=YhGZH=vEG?{E1XUpme3`W<S_krBk~j&FfH4lF3@6Sf`7(WJ9O9Hv(j?faLLtUBc`^P7@iP$A z&7mYJ)MN`>q(&2)U~4Bju?fwcmQ8IHK?YRnCc4ozs;Vv3*p`-b$|kg>g7NmdwiC>k z_7ChzzxR9hcg{WM-1DyA^WZcc98`?f(W#S0ds3gV_6Pox->Y3Q_~(^dNNh}#bh?y2 zMTh}{aPptUbdYIjQJQ2T#KC>KA*dgkdY9youBeW+SPud%#c^adkrHAFy`xist)X{ydEg`W zmf@QI+P@VG_tL@8m7_BXsY{>6EyI=sLSl==sa9-b4gw0DW@ndW1*am(#TjTKj|9Uk zq}}7VC%cYJ@|>4c*qp4M<9gY|eK9no%Z0f>mI*Q5LWK11oX0$U$b+l#i-@o;BHThS zvn1&M#NU~K{xp2 zOjh%uoe9{_wV-~pRBR4(;t=r1CCYeSXjw|6 zg}BMZ%{epN9&G=UeTC+SoKHjo$9iae(b6WXl_()D-r^}99SxauN=r!6DXk&nH2Y0f zGrh}l)P|r2WrXIB%Chu=MI=i6)bP90ad8eyRH19;;SVHD`;L&l5aLKDjs0FCz80(e z@z%gsFLz--8(~Hh20^=UrY?_T(`5JM#S(UeW?izVLV;q(8i6>@!Ax3NWp)NV#+tLY z(INIm_6BNTm$J3=7510x06oFFa-7Q3h=@Zr%C6-M&=cY3a$ll!EPQ5pkkayS-pW!1 zJ;S!=7tjkVkpBWb&nEM?XT6Cvq06`0kIpLsEwy(7DYE(kTffRktC(}uJ|y{Q)mwC& z9bDa+{tkDIG$04%kF!6nuH1YP+U{L1cO9KHT`rq&k!mzgBzTvlpPoP|hhQF__@VhF zfk^6^xfH@*G3jyz7i9Ij;Wo{y3RQW;DUdlbyz`zci?`WLZM}M~0Zp3uJR@?*Muxj_ zD8w7AW^F#b&N|nwNA-hiHz;{YNK?puw)PYi!;Lx@rQPgeK^E;}zb<$kQtP@frDwy5 zg|O@l`=0qY0o17fu7XNzx_AgCr{RqR+QI%)Rz`QSlJe!b4g{^edVEVtAWJ@=vMyA6 zmhCB*sDph{{_~PL6R*Doj-mP5J5o=mq7(O`0kT#819m)N!H!!+O;iw5!tYgBDQ#uy zO@<9E5Z@P@?r6;AC(icnLTW%>QUjJtq(xVR9afR}2{f zXM#JyxnK==Id~o~;T7Ns@JjG8a2~iDdHOIg_>shAn&Pg7}Oo7>Twyis7#SCVc#0^TEd`8)~y0aCz z5egdUqh860_(jmTg^^oIxZe2$U3`Lm=n49p9=tc={PB4qLviy3SAm50*wT`NbW6`}%!$r{C}EukW{uy^_-|1^Q7~XH{j)!E5tizHMK-XzO=6VxlzA2k~I9 zx2zOOG0*C7`h)iV-aZLi-@M>nR}6Vkjd=Ary{OARfHk}#M%KRFudZBYg)?Tl}chFzd;PZHVUVVelEA{)_{@8XF)-Cp^l6PpaM+@fv z)vNpY`vQC1z4oonfezn3Cr(0TMRmoV%JP!(a=U$RiDU0WdEGW|Pr%lLmTri%@V4^Q zyorzY=)M~1WnHn&pBz0ySjOD0^5i7`g~vz=zwN4^v?BbceZ`#8J^xUI2Ni{>{{=bT B!C(LY delta 2937 zcmeHJ`)^ZK96#r-NYRdUYj0Oz9dqksOpv;V+koPobfdtKvaxnJ97Q*|DMQfQA{vtx zw?*L6xOo;KhA1c!VvJe5J}^O3+0>a3gNjO&n3KdUQAE*cpvOJS~*kDUiFcSZHQ#hTj))Mcp!Ls{#Zb_v0{41^mbST zxJ{T4Ih{QstehedVx~Q}&Sa;khh{MKRHI0y<{za-Yk?N?fq~RYSi8{AELe}VCbS0IF#9Ftd9-#&?*p-Yr5>0cd^*ow>?N%gtSJI73v5N{?P!HlOz1VWVU>R`u+ zpfv9snGQ9h>syHGn{Ep_@|ggpIc^juo@F0o+GBhQnBXup*@&Wxry(7KHEG#7z@wkA z!a^6%K`u>R(bP`29ixT1jsiyEpYhBq=x20p#?w1u2!)0)idcT-?)g7)tt$ZyzD7N# zSuo3)^9U;J7_eRyJXLT*i0#RmJ(W~roxMY>FKZU{) z(7)c$d{wNyZVS7^=F06w=40eOlh4nyVH*tT zU#^V)e19{(1Sf_=y7(lhr8K#r-#C67`Y)GZRDg+`fq|EAd35EWy2gzXj#Ys_D)HK6 z9S0GiEHH^syqNKF$d46m>A&%~WQ=3yuH-V3HmYM0T{g2hj$3J*EqAP1lr41y9()H7IocA z53&K*YWo5BsQsf29g{+|Zqc7ni!L5!b8@}Z!`gB;BgtpEuh2gB*zBf^*SM*%#MxM& zKK9-0yOtb|ZAlMI0Wt5Pr#I=;d6{ z#W%J3yr%@~Ji{nzOLVROTi4|=b}qkK9A1iT82&!XII@YZFqTw4$rcv4=pbtJbiZaQ!pK@}>)bEXKsEE97ic>h zTF{B1HqX8^TF3q>Ev0MOonk)L($GdASQMe#KQ88KK(WeKfhJ(ZjA z{JqkR)yb`@!S6|HRcSs?hcmc1%Z%!*eefb{**kjBoVFH-=rM3bwjzc^CFT2C+J>RVVmk>+%ea$VDU8sFD zgVJSfim!dsQsvS1xKN^50^KyW19yTMt6B%12F?TD48CxW#IGE3 z3Y-Z(2*$-ho&?*#0k9M71kV7ES4(6j_!xK=I1bJMH-UG6{ou#JmEb49Mc@krsoZ$M zzZk@>71ocWhfE|59S;Ib0SCa-!7`Xv6F2_wa=8ioqbK{J3*f%%#wlrqKFGF&vxOnT zUI;s4lmB5f)kKJuN4ly}!u7lx=$;$s(hc+gbblLJN{lI9OytMZ2rvC&3vVRkN4^9X wn?FKG{-q9h8~PK1c4XtsY0SUHGtFeopAeI_b4xj;W!gIrFW~gk*58DG04v!DIsgCw diff --git a/PROBLEMS.TXT b/PROBLEMS.TXT index b44af79..d50cc8c 100644 --- a/PROBLEMS.TXT +++ b/PROBLEMS.TXT @@ -1,15 +1,15 @@ -Known bugs and restrictions of Emu48 V1.42 +Known bugs and restrictions of Emu48 V1.44 ------------------------------------------ - the following I/O bits aren't emulated (incomplete) DTEST (0x102) [VDIG LID TRIM] DSPCTL (0x103) [LRT LRTD LRTC BIN] - LPD (0x108) [LB2 LB1 LB0 VLBI] - LPE (0x109) [ELBI EVLBI GRST RST] + LPD (0x108) [LB2 LB1] + LPE (0x109) [GRST RST] CMODE (0x10A) Mode register IOC (0x110) [ERBZ] RCS (0x111) [RX RER RBZ] - SRQ1 (0x118) [ISQR VSRQ] + SRQ1 (0x118) [ISQR] SRQ2 (0x119) [LSRQ] IRC (0x11A) [IRI EIRU EIRI IRE] LCR (0x11C) [LED ELBE LBZ LBF] @@ -53,4 +53,4 @@ Known bugs and restrictions of Emu48 V1.42 - quitting the emulator while programming the flash isn't allowed, because the content of flash state machine isn't saved so far -08/22/06 (c) by Christoph Gießelink, c dot giesselink at gmx dot de +05/22/07 (c) by Christoph Gießelink, c dot giesselink at gmx dot de diff --git a/Sources/Emu48/CHANGES.TXT b/Sources/Emu48/CHANGES.TXT index e9f0fe4..3e72d9b 100644 --- a/Sources/Emu48/CHANGES.TXT +++ b/Sources/Emu48/CHANGES.TXT @@ -1,3 +1,272 @@ +Service Pack 44 for Emu48 Version 1.0 + +DEBUGGER.C +- added new function OnSetCursor(), message handler for + "Activation Follows Mouse" implementation +- changed function Debugger(), added "Always On Top" and + "Activation Follows Mouse" handling +- bugfix in function OnToolDebug(), argument for owner window handle + was wrong, but over the years I has liked this debugger dialog + behavior so I put in the correct argument for this behavior + +DISASM.C +- disabled automatic inline code +- fixed source file formatting error +- changed function append_field(), defined as inline code +- changed function append_r_addr(), code optimization + +DISPLAY.C +- changed function ResizeWindow(), added "Always on top" feature + +EMU48.C +- removed definition of MAXPORTS +- removed global variable bClassicCursor +- added function ForceForegroundWindow() forcing window to + foreground +- changed function SetCommList(), don't try all possible COM ports + any more, get current serial device list from registry + "HKLM\Hardware\\DeviceMap\\SerialComm" and fill both combo boxes + at one loop for speed up scanning +- changed function SettingsProc(), added "Always On Top" and + "Activation Follows Mouse" checkbox handling, adjusted to new CRC + handling of port2 and adjusted to new prototype of function + SetCommList() +- bugfix in function OnFileNew(), function SaveBackup() was called + when emulator engine was running -> this may caused inconsistent + backup data +- changed function OnMouseMove(), added "Activation follows mouse" + feature +- added function OnNcMouseMove() for "Activation follows mouse" + feature in non client area +- changed function MainWndProc(), added WM_NCMOUSEMOVE message + handler +- bugfix in function WinMain(), moved additional DDE stuff just + behind DDE server initialization, added StartupBackup handling, + adjusted length for cutted filenames preventing negative values + and call ShowWindow() before asking for a new document preventing + a KML script dialog without a parent window + +EMU48.H +- removed declaration of bClassicCursor +- extern declaration of global variables and functions +- changed function prototypes + +EMU48.RC +- added item "Always On Top" and "Activation Follows Mouse" in + settings dialog +- cosmetic changes in dialog IDD_CHOOSEKML to improve WinXP style +- changed version + +FILES.C +- added global variables holding the patched ROM checksum and the + port2 CRC +- changed function GetCutPathName(), better support for UNC names +- changed function SetWindowPathTitle(), adjusted length for cutted + filename +- changed function CrcRom(), change function prototype, added + unpacked data check and made function public +- bugfix in function CrcRom(), hadn't detected address content + changes at addresses ending with a 0x2 and 0x3 because only lower + 16 bit of checksum was used -> modified function cause a warmstart + because of new checksum +- changed function MapRom(), removed check for packed ROM image -> + a more complete check is implemented in InitKML() now +- changed function UnmapRom(), added reset of ROM checksum variable +- changed function CrcPort2(), change function prototype and added + unpacked data check +- changed function MapPort2(), added CRC calculation with saving + result in global variable and added unpacked data check +- changed function UnmapPort2(), added reset of port2 CRC variable +- new function IsDataPacked() for unpacked data check +- changed function OpenDocument(), use ROM checksum made in + InitKML() and port2 CRC made in MapPort2() and added checks for + packed memory data +- changed function SaveDocument(), changed document signature to + "Emu48 Document\xFE" without the calculator model dependent + variations and adjusted implementation to new prototypes of + CrcRom() and CrcPort2() +- changed function SaveBackup(), added assertion for checking + emulator engine state +- bugfix in function GetSaveAsFilename(), removed "Win48 Document" + from filter list because Emu48 cannot create such a document +- changed function WriteStack(), adjusted to new prototype of + function RPL_ObjectSize() and added new error state for bad + objects +- changed function LoadObject(), added error message for bad objects + +KML.C +- bugfix in function KillKML(), class member variable wasn't reset +- changed function MouseMovesTo(), removed bClassicCursor switch + for using arrow cursor over button +- changed function InitKML(), added full check for unpacked ROM + image and build checksum of patched ROM + +OPCODES.C +- changed function o83n(), o88n() and o89n(), speed optimization + +OPS.H +- changed function Tbit0(), Tbit1(), Ta(), Tb(), Tae() and Tbe(), + speed optimization + +PCH.H +- added include stddef.h +- restricted DWORD_PTR type definition for MSVC6.0 and earlier + +RESOURCE.H +- added some definitions + +RPL.C +- bugfix in RPL_ObjectSize(), changed function prototype for adding + buffer size parameter preventing reading outside buffer area when + decoding bad objects + +SERIAL.C +- changed function CommOpen(), increased buffer size for device name + +SETTINGS.C +- changed function ReadSettings() and WriteSettings(), added item + "StartupBackup" in section [Files] and item "ActFollowsMouse" and + "AlwaysOnTop" in section [Emulator], removed item "ClassicCursor" + from [KML] section in the INI-File + + +Service Pack 43 for Emu48 Version 1.0 + +DDESERV.C +- removed warnings when compiling under VS2005 +- changed function DdeCallback(), case XTYP_POKE and XTYP_REQUEST + now decode the item name for the stack level + +DEBUGGER.C +- removed warnings when compiling under VS2005 + +DISASM.C +- bugfix in function disasm_8(), the ?HS=0 n opcode showed always as + ?=0 opcode + +DISPLAY.C +- changed function StopDisplayGray() and StopDisplayBW(), adjusted + to new prototype of ReadIO() + +EMU48.C +- removed warnings when compiling under VS2005 +- moved CF_HPOBJ definition to EMU48.H +- replaced function IsPort2Writeable() with IsFileWriteable() +- bugfix in function SettingsProc(), in case IDC_PORT2LOAD an update + of the port2 writeable checkbox was missing, in case IDOK a + changed port2 writeable checkbox made a warmstart even if there's + no port2 filename, changed behavior of port2 area if port2 + filename is given by the command line argument: show actual port2 + file in disabled port2 filename edit field now, also changes of + the port2 shared and writeable checkboxes have affect now +- changed function OnFileClose(), removed call of KillKML() because + will be done in ResetDocument() + +EMU48.DSP +- added lowbat.c sources + +EMU48.H +- added CF_HPOBJ definition from EMU48.C +- changed function prototypes +- extern declaration of global functions + +EMU48.RC +- replaced CREATEPROCESS_MANIFEST_RESOURCE_ID definition in manifest + declaration by 1 +- changed version and copyright + +ENGINE.C +- changed function WorkerThread(), added control of battery + measurement thread + +EXTERNAL.C +- changed function BeepWave(), removed VS2005 warning +- changed function BeepWin9x(), disabled implementation for x64 + architecture + +FILES.C +- changed function PatchNibble(), added saving state that ROM + address is patched +- bugfix in function UpdatePatches(), the function maybe called for + patching the ROM when it's already patched, in this case the patch + restore list was overwritten with the patched data +- changed function PatchRom(), removed VS2005 warning +- changed function MapPort2(), improved checking for valid size +- bugfix in function GetLoadObjectFilename(), removed call of + HeapFree() which was a remainder of the implementation prior to + SP42 +- changed function WriteStack(), added stack level argument +- changed function LoadObject(), adjusted call of WriteStack() to + new function prototype + +KEYBOARD.C +- bugfix in function ScanKeyboard(), if keyboard reading wasn't + active a released ON key wasn't cleared in the "in" register + +KEYMACRO.C +- removed warnings when compiling under VS2005 +- changed function OnToolMacroNew(), minor optimization writing + macro file header + +KML.C +- removed warnings when compiling under VS2005 +- changed function DisplayChooseKml(), changed return type of dialog + box +- changed function ParseLine(), change typecast of szLexString from + DWORD to DWORD_PTR +- bugfix in function TransparentCircle(), there was no radius value + check for preventing division by 0 and color low adjust value + wasn't reached because of wrong color offset divisor -> adjusted + LOWADJ definition to get similar output to buggy earlier version + +KML.H +- changed variable type of nParam[] element of KmlLine structure + because element is also used as pointer + +LOWBAT.C +- new module with battery measurement + +MOPS.C +- changed function Npeek() and Nread(), adjusted to new prototype of + ReadIO() +- changed prototype of function ReadIO(), added update argument +- bugfix in function ReadIO(), the LPE (0x109), RBR LSB (0x114) and + RBR MSB (0x115) register access had to differ between peek and + read mode and added implementation of the LB0 and VLBI bits in the + LPD (0x108) and implementation of the ELBI and EVLBI bits in the + LPE (0x109) register + +OPCODES.C +- bugfix in function o807(), Chipset.in register must be refreshed + before checking for a pressed key + +PCH.H +- added _CRT_SECURE_NO_DEPRECATE definition +- added DWORD_PTR type definition + +RESOURCE.H +- removed CREATEPROCESS_MANIFEST_RESOURCE_ID and RT_MANIFEST + definition + +RPL.C +- added definition of EDITLINE +- added function RPL_Depth() returning stack depth +- changed function RPL_Pick(), added check of stack depth +- changed function RPL_Push(), new implementation with stack level + argument + +STACK.C +- adjusted calls of RPL_Push() to new function prototype +- changed function RPL_SetBcd(), removed compiler warning +- bugfix in function OnStackPaste(), case "any other format" must be + treated as string and not as binary object + +TIMER.C +- removed warnings when compiling under VS2005 +- changed function CalcT2(), in the case of a pending timer2 + interrupt return always the timer2 value 0xFFFFFFFF + + Service Pack 42 for Emu48 Version 1.0 EMU48.C @@ -267,7 +536,7 @@ SETTINGS.C "WaveBeep" and "WaveVolume" in section [Emulator] in the INI-File STACK.C -- new modul with the message handler functions OnStackCopy() and +- new module with the message handler functions OnStackCopy() and OnStackPaste() prior located in EMU48.C - changed function OnStackCopy() and OnStackPaste(), they can now also copy real numbers from and to the clipboard @@ -457,7 +726,7 @@ KEYBOARD.C too big out codes on Chipset.Keyboard_Row array KEYMACRO.C -- new modul supporting keyboard macro functions +- new module supporting keyboard macro functions KML.C - added function ReloadButtons(), update internal button state from @@ -584,7 +853,7 @@ TIMER.C Service Pack 34 for Emu48 Version 1.0 CURSOR.C -- new modul to create a hand cursor +- new module to create a hand cursor DEBUGGER.C - bugfix in function NewValue(), EnterAddr(), EnterBreakpoint(), @@ -1931,7 +2200,7 @@ FILES.C flash memory structure I28F160.C -- new modul with I28F160 flash memory implementation +- new module with I28F160 flash memory implementation I28F160.H - header file for flash memory implementation @@ -2188,7 +2457,7 @@ SERIAL.H - renamed to IO.H SETTINGS.C -- new modul to handle the INI file +- new module to handle the INI file TIMER.C - removed timer I/O definitions, replaced by include file IO.H @@ -2215,7 +2484,7 @@ DDESERV.C - added different files headers for HP48/49 DEBUGGER.C -- new modul for debugger routines +- new module for debugger routines DEBUGGER.H - header file for debugger part @@ -2331,10 +2600,10 @@ ENGINE.C - made function AdjKeySpeed() public - replaced opcode handling include files by a function call, decoder now works with tables instead of case switching -- deleted unused code parts in modul +- deleted unused code parts in module FETCH.C -- new modul with opcode dispatcher +- new module with opcode dispatcher FETCH.H - file deleted, replaced by FETCH.C @@ -2344,7 +2613,7 @@ FILES.C interpreter failed on lower case hex digits in arguments OPCODES.C -- new modul with opcode implementation +- new module with opcode implementation OPCODES.H - file content changed, replaced by OPCODES.C @@ -2722,7 +2991,7 @@ TIMER.C Service Pack 7 for Emu48 Version 1.0 DISASM.C -- new modul with disassembler +- new module with disassembler DISPLAY.C - bugfixes in function UpdateDisplayPointers(), next line offset was @@ -2846,7 +3115,7 @@ OPCODES.H - update field select table in "EXTENSION opcode o81B1" TIMER.C -- moved static lFreq variable to modul EMU48.C +- moved static lFreq variable to module EMU48.C Service Pack 5a for Emu48 Version 1.0 @@ -2886,7 +3155,7 @@ FILES.C MOPS.C - bugfix in MapP0(), data offset was wrong - bugfix in MapP1(), data offset was wrong -- bugfix in MapP2(), data offset was wrong and real size of modul +- bugfix in MapP2(), data offset was wrong and real size of module was zero - bugfix in MapBS(), wrong pointer in mirrored data page - bugfix in MapROM(), wrong pointer in mirrored data page @@ -2954,7 +3223,7 @@ TIMER.C Service Pack 3 for Emu48 Version 1.0 DDESERV.C -- new modul for DDE communication +- new module for DDE communication EMU48.C - init DDE callback function and name service @@ -2994,7 +3263,7 @@ RESOURCE.H - added IDC_WIRE and IDC_IR SERIAL.C -- new modul for serial support +- new module for serial support SERIAL.H - new header with serial definitions diff --git a/Sources/Emu48/DDESERV.C b/Sources/Emu48/DDESERV.C index 61fdc16..f6913b2 100644 --- a/Sources/Emu48/DDESERV.C +++ b/Sources/Emu48/DDESERV.C @@ -14,10 +14,11 @@ HDDEDATA CALLBACK DdeCallback(UINT iType,UINT iFmt,HCONV hConv, HSZ hsz1,HSZ hsz2,HDDEDATA hData, DWORD dwData1,DWORD dwData2) { - TCHAR szBuffer[32]; + TCHAR *psz,szBuffer[32]; HDDEDATA hReturn; LPBYTE lpData,lpHeader; DWORD dwAddress,dwSize,dwLoop,dwIndex; + UINT nStkLvl; BOOL bSuccess; // disable stack loading items on HP38G, HP39/40G @@ -26,17 +27,25 @@ HDDEDATA CALLBACK DdeCallback(UINT iType,UINT iFmt,HCONV hConv, switch (iType) { case XTYP_CONNECT: + // get service name DdeQueryString(idDdeInst,hsz2,szBuffer,ARRAYSIZEOF(szBuffer),0); if (0 != lstrcmp(szBuffer,szAppName)) return (HDDEDATA) FALSE; + // get topic name DdeQueryString(idDdeInst,hsz1,szBuffer,ARRAYSIZEOF(szBuffer),0); - return (HDDEDATA) (0==lstrcmp(szBuffer,szTopic)); + return (HDDEDATA) (INT_PTR) (0 == lstrcmp(szBuffer,szTopic)); case XTYP_POKE: // quit on models without stack or illegal data format or not in running state if (!bStackEnable || iFmt != uCF_HpObj || nState != SM_RUN) return (HDDEDATA) DDE_FNOTPROCESSED; + // get item name + DdeQueryString(idDdeInst,hsz2,szBuffer,ARRAYSIZEOF(szBuffer),0); + nStkLvl = _tcstoul(szBuffer,&psz,10); + if (*psz != 0 || nStkLvl < 1) // invalid number format + return (HDDEDATA) DDE_FNOTPROCESSED; + DdeAccessData(hData,&dwSize); // fetch data size DdeUnaccessData(hData); @@ -69,7 +78,7 @@ HDDEDATA CALLBACK DdeCallback(UINT iType,UINT iFmt,HCONV hConv, if (dwIndex <= dwSize - sizeof(DWORD)) dwSize = dwIndex; dwSize = DdeGetData(hData,lpData+dwSize,dwSize,sizeof(DWORD)); - bSuccess = (WriteStack(lpData,dwSize) == S_ERR_NO); + bSuccess = (WriteStack(nStkLvl,lpData,dwSize) == S_ERR_NO); HeapFree(hHeap,0,lpData); // free memory SwitchToState(SM_RUN); // run state @@ -98,13 +107,19 @@ cancel: if (!bStackEnable || iFmt != uCF_HpObj || nState != SM_RUN) return NULL; + // get item name + DdeQueryString(idDdeInst,hsz2,szBuffer,ARRAYSIZEOF(szBuffer),0); + nStkLvl = _tcstoul(szBuffer,&psz,10); + if (*psz != 0 || nStkLvl < 1) // invalid number format + return NULL; + if (WaitForSleepState()) // wait for cpu SHUTDN then sleep state return NULL; while (nState!=nNextState) Sleep(0); _ASSERT(nState==SM_SLEEP); - dwAddress = RPL_Pick(1); // pick address of level1 object + dwAddress = RPL_Pick(nStkLvl); // pick address of stack level "item" object if (dwAddress == 0) { SwitchToState(SM_RUN); // run state @@ -115,7 +130,7 @@ cancel: lpHeader = (Chipset.type != 'X') ? BINARYHEADER48 : BINARYHEADER49; // length of binary header - dwIndex = strlen(lpHeader); + dwIndex = (DWORD) strlen(lpHeader); // size of objectsize + header + object dwSize += dwIndex + sizeof(DWORD); diff --git a/Sources/Emu48/DEBUGGER.C b/Sources/Emu48/DEBUGGER.C index 0e3d948..f37c4da 100644 --- a/Sources/Emu48/DEBUGGER.C +++ b/Sources/Emu48/DEBUGGER.C @@ -171,15 +171,14 @@ static BOOL bRegUpdate[REG_SIZE]; // register update table static HBITMAP hBmpCheckBox; // checked and unchecked bitmap // function prototypes -static BOOL OnMemFind(HWND hDlg); -static BOOL OnProfile(HWND hDlg); -static INT OnNewValue(LPTSTR lpszValue); -static VOID OnEnterAddress(HWND hDlg, DWORD *dwValue); -static BOOL OnEditBreakpoint(HWND hDlg); -static BOOL OnInfoIntr(HWND hDlg); -static BOOL OnInfoWoRegister(HWND hDlg); - -static VOID UpdateProfileWnd(HWND hDlg); +static BOOL OnMemFind(HWND hDlg); +static BOOL OnProfile(HWND hDlg); +static INT_PTR OnNewValue(LPTSTR lpszValue); +static VOID OnEnterAddress(HWND hDlg, DWORD *dwValue); +static BOOL OnEditBreakpoint(HWND hDlg); +static BOOL OnInfoIntr(HWND hDlg); +static BOOL OnInfoWoRegister(HWND hDlg); +static VOID UpdateProfileWnd(HWND hDlg); //################ //# @@ -514,7 +513,7 @@ static VOID UpdateCodeWnd(HWND hDlg) HWND hWnd = GetDlgItem(hDlg,IDC_DEBUG_CODE); - j = SendMessage(hWnd,LB_GETCOUNT,0,0); // no. of items in table + j = (INT) SendMessage(hWnd,LB_GETCOUNT,0,0); // no. of items in table // seach for actual address in code area for (i = 0; i < j; ++i) @@ -670,14 +669,14 @@ static VOID UpdateStackWnd(HWND hDlg) HWND hWnd = GetDlgItem(hDlg,IDC_DEBUG_STACK); SendMessage(hWnd,WM_SETREDRAW,FALSE,0); - nPos = SendMessage(hWnd,LB_GETTOPINDEX,0,0); + nPos = (LONG) SendMessage(hWnd,LB_GETTOPINDEX,0,0); SendMessage(hWnd,LB_RESETCONTENT,0,0); for (i = 1; i <= ARRAYSIZEOF(Chipset.rstk); ++i) { INT j; wsprintf(szBuffer,_T("%d: %05X"), i, Chipset.rstk[(Chipset.rstkp-i)&7]); - j = SendMessage(hWnd,LB_ADDSTRING,0,(LPARAM) szBuffer); + j = (INT) SendMessage(hWnd,LB_ADDSTRING,0,(LPARAM) szBuffer); SendMessage(hWnd,LB_SETITEMDATA,j,Chipset.rstk[(Chipset.rstkp-i)&7]); } SendMessage(hWnd,LB_SETTOPINDEX,nPos,0); @@ -823,7 +822,7 @@ static BOOL OnKeyF2(HWND hDlg) LONG i; hWnd = GetDlgItem(hDlg,IDC_DEBUG_CODE); - i = SendMessage(hWnd,LB_GETCURSEL,0,0); // get selected item + i = (LONG) SendMessage(hWnd,LB_GETCURSEL,0,0); // get selected item ToggleBreakpoint(dwAdrLine[i]); // toggle breakpoint at address // update region of toggled item SendMessage(hWnd,LB_GETITEMRECT,i,(LPARAM)&rc); @@ -845,7 +844,7 @@ static BOOL OnKeyF5(HWND hDlg) DisableMenuKeys(hDlg); // disable menu keys hWnd = GetDlgItem(hDlg,IDC_DEBUG_CODE); - nPos = SendMessage(hWnd,LB_GETCURSEL,0,0); + nPos = (INT) SendMessage(hWnd,LB_GETCURSEL,0,0); // clear "->" in code window for (i = 0; i < MAXCODELINES; ++i) @@ -855,7 +854,7 @@ static BOOL OnKeyF5(HWND hDlg) { szBuf[5] = szBuf[6] = _T(' '); SendMessage(hWnd,LB_DELETESTRING,i,0); - SendMessage(hWnd,LB_INSERTSTRING,i,(LPARAM)(LPTSTR)szBuf); + SendMessage(hWnd,LB_INSERTSTRING,i,(LPARAM) szBuf); break; } } @@ -877,7 +876,7 @@ static BOOL OnKeyF6(HWND hDlg) if (nDbgState != DBG_RUN) // emulation stopped { // get address of selected item - INT nPos = SendDlgItemMessage(hDlg,IDC_DEBUG_CODE,LB_GETCURSEL,0,0); + INT nPos = (INT) SendDlgItemMessage(hDlg,IDC_DEBUG_CODE,LB_GETCURSEL,0,0); dwDbgStopPC = dwAdrLine[nPos]; OnKeyF5(hDlg); // run emulation @@ -1094,7 +1093,7 @@ static BOOL OnStackPush(HWND hDlg) hWnd = GetDlgItem(hDlg,IDC_DEBUG_STACK); - i = SendMessage(hWnd,LB_GETCURSEL,0,0); + i = (INT) SendMessage(hWnd,LB_GETCURSEL,0,0); if (LB_ERR == i) return TRUE; // no selection if (IDOK != OnNewValue(szBuffer)) // canceled function @@ -1126,7 +1125,7 @@ static BOOL OnStackPop(HWND hDlg) hWnd = GetDlgItem(hDlg,IDC_DEBUG_STACK); - i = SendMessage(hWnd,LB_GETCURSEL,0,0); + i = (INT) SendMessage(hWnd,LB_GETCURSEL,0,0); if (LB_ERR == i) return TRUE; // no selection // pop stack element @@ -1153,7 +1152,7 @@ static BOOL OnStackModify(HWND hDlg) hWnd = GetDlgItem(hDlg,IDC_DEBUG_STACK); - i = SendMessage(hWnd,LB_GETCURSEL,0,0); + i = (INT) SendMessage(hWnd,LB_GETCURSEL,0,0); if (LB_ERR == i) return TRUE; // no selection SendMessage(hWnd,LB_GETTEXT,i,(LPARAM) szBuffer); @@ -1307,8 +1306,8 @@ static BOOL OnDblClick(HWND hWnd, WORD wId) if (wId == IDC_DEBUG_STACK) // stack list box { // get cpu address of selected item - i = SendMessage(hWnd,LB_GETCURSEL,0,0); - dwAddress = SendMessage(hWnd,LB_GETITEMDATA,i,0); + i = (INT) SendMessage(hWnd,LB_GETCURSEL,0,0); + dwAddress = (DWORD) SendMessage(hWnd,LB_GETITEMDATA,i,0); // show code of this address ViewCodeWnd(GetDlgItem(GetParent(hWnd),IDC_DEBUG_CODE),dwAddress); @@ -1325,7 +1324,7 @@ static BOOL OnDblClick(HWND hWnd, WORD wId) // calculate address of byte dwAddress = i * 2; - i = SendMessage(hWnd,LB_GETCARETINDEX,0,0); + i = (INT) SendMessage(hWnd,LB_GETCARETINDEX,0,0); dwAddress += MAXMEMITEMS * i + dwAdrMem; // enter new value @@ -1375,6 +1374,19 @@ static VOID OnContextMenu(HWND hDlg, LPARAM lParam, WPARAM wParam) return; } +// +// mouse setting for capturing window +// +static BOOL OnSetCursor(HWND hDlg) +{ + // debugger not active but cursor is over debugger window + if (bActFollowsMouse && GetActiveWindow() != hDlg) + { + ForceForegroundWindow(hDlg); // force debugger window to foreground + } + return FALSE; +} + //################ //# //# Dialog handler @@ -1503,7 +1515,7 @@ static __inline BOOL OnDrawCodeWnd(LPDRAWITEMSTRUCT lpdis) return TRUE; // get item text - SendMessage(lpdis->hwndItem,LB_GETTEXT,lpdis->itemID,(LONG)(LPTSTR)szBuf); + SendMessage(lpdis->hwndItem,LB_GETTEXT,lpdis->itemID,(LPARAM) szBuf); // check for codebreakpoint bBrk = CheckBreakpoint(dwAdrLine[lpdis->itemID],1,BP_EXEC); @@ -1697,7 +1709,7 @@ quit: return hWndToolbar; } -static BOOL CALLBACK Debugger(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK Debugger(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HMENU hMenuMainCode,hMenuMainMem,hMenuMainStack; @@ -1711,6 +1723,7 @@ static BOOL CALLBACK Debugger(HWND hDlg, UINT message, DWORD wParam, LONG lParam { case WM_INITDIALOG: SetWindowLocation(hDlg,nDbgPosX,nDbgPosY); + if (bAlwaysOnTop) SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE); SendMessage(hDlg,WM_SETICON,ICON_BIG,(LPARAM) LoadIcon(hApp,MAKEINTRESOURCE(IDI_EMU48))); hWndToolbar = CreateToolbar(hDlg); // add toolbar CheckMenuItem(GetMenu(hDlg),ID_BREAKPOINTS_NOP3, bDbgNOP3 ? MF_CHECKED : MF_UNCHECKED); @@ -1811,7 +1824,7 @@ static BOOL CALLBACK Debugger(HWND hDlg, UINT message, DWORD wParam, LONG lParam return OnDblClick((HWND) lParam, LOWORD(wParam)); case LBN_SETFOCUS: - i = SendMessage((HWND) lParam,LB_GETCARETINDEX,0,0); + i = (INT) SendMessage((HWND) lParam,LB_GETCARETINDEX,0,0); SendMessage((HWND) lParam,LB_SETCURSEL,i,0); return TRUE; @@ -1915,13 +1928,16 @@ static BOOL CALLBACK Debugger(HWND hDlg, UINT message, DWORD wParam, LONG lParam OnContextMenu(hDlg, lParam, wParam); break; + case WM_SETCURSOR: + return OnSetCursor(hDlg); + case WM_CTLCOLORSTATIC: // register color highlighting // highlight text? if (OnCtlColorStatic((HWND) lParam)) { SetTextColor((HDC) wParam, COLOR_RED); SetBkColor((HDC) wParam, GetSysColor(COLOR_BTNFACE)); - return (BOOL) GetStockObject(NULL_BRUSH); // transparent brush + return (INT_PTR) GetStockObject(NULL_BRUSH); // transparent brush } break; @@ -1960,9 +1976,9 @@ static BOOL CALLBACK Debugger(HWND hDlg, UINT message, DWORD wParam, LONG lParam return FALSE; } -LRESULT OnToolDebug() // debugger dialogbox call +LRESULT OnToolDebug(VOID) // debugger dialogbox call { - if ((hDlgDebug = CreateDialog(hApp,MAKEINTRESOURCE(IDD_DEBUG),GetParent(hWnd), + if ((hDlgDebug = CreateDialog(hApp,MAKEINTRESOURCE(IDD_DEBUG),NULL, (DLGPROC)Debugger)) == NULL) AbortMessage(_T("Debugger Dialog Box Creation Error !")); return 0; @@ -2090,7 +2106,7 @@ static __inline BOOL OnFindOK(HWND hDlg,BOOL bASCII,DWORD *pdwAddrLast) // // enter find dialog // -static BOOL CALLBACK Find(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK Find(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static DWORD dwAddrEntry; static BOOL bASCII = FALSE; @@ -2163,7 +2179,7 @@ static VOID UpdateProfileWnd(HWND hDlg) lVar = *(QWORD *)&Chipset.cycles - *(QWORD *)&OldChipset.cycles; // cycle counts - _stprintf(szBuffer,_T("%I64u"),lVar); + _sntprintf(szBuffer,ARRAYSIZEOF(szBuffer),_T("%I64u"),lVar); SetDlgItemText(hDlg,IDC_PROFILE_LASTCYCLES,szBuffer); // CPU frequency @@ -2183,7 +2199,7 @@ static VOID UpdateProfileWnd(HWND hDlg) lVar = (2 * lVar + dwFreq) / (2 * dwFreq); _ASSERT(i < ARRAYSIZEOF(pcUnit)); - _stprintf(szBuffer,_T("%I64u %s"),lVar,pcUnit[i]); + _sntprintf(szBuffer,ARRAYSIZEOF(szBuffer),_T("%I64u %s"),lVar,pcUnit[i]); SetDlgItemText(hDlg,IDC_PROFILE_LASTTIME,szBuffer); return; #undef SX_CLK @@ -2194,7 +2210,7 @@ static VOID UpdateProfileWnd(HWND hDlg) // // enter profile dialog // -static BOOL CALLBACK Profile(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK Profile(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { @@ -2241,7 +2257,7 @@ static BOOL OnProfile(HWND hDlg) // // enter new value dialog // -static BOOL CALLBACK NewValue(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK NewValue(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static LPTSTR lpszBuffer; // handle of buffer static int nBufferlen; // length of buffer @@ -2287,9 +2303,9 @@ static BOOL CALLBACK NewValue(HWND hDlg, UINT message, DWORD wParam, LONG lParam UNREFERENCED_PARAMETER(wParam); } -static INT OnNewValue(LPTSTR lpszValue) +static INT_PTR OnNewValue(LPTSTR lpszValue) { - INT nResult; + INT_PTR nResult; if ((nResult = DialogBoxParam(hApp, MAKEINTRESOURCE(IDD_NEWVALUE), @@ -2311,7 +2327,7 @@ static INT OnNewValue(LPTSTR lpszValue) // // enter goto address dialog // -static BOOL CALLBACK EnterAddr(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK EnterAddr(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static DWORD *dwAddress; @@ -2368,7 +2384,7 @@ static VOID OnEnterAddress(HWND hDlg, DWORD *dwValue) // // enter breakpoint dialog // -static BOOL CALLBACK EnterBreakpoint(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK EnterBreakpoint(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static BP_T *sBp; @@ -2459,7 +2475,7 @@ static __inline BOOL OnDrawBreakWnd(LPDRAWITEMSTRUCT lpdis) crBkColor = SetBkColor(lpdis->hDC,crBkColor); crTextColor = SetTextColor(lpdis->hDC,crTextColor); - SendMessage(lpdis->hwndItem,LB_GETTEXT,lpdis->itemID,(LONG)(LPTSTR)szBuf); + SendMessage(lpdis->hwndItem,LB_GETTEXT,lpdis->itemID,(LPARAM) szBuf); ExtTextOut(lpdis->hDC,(int)(lpdis->rcItem.left)+17,(int)(lpdis->rcItem.top), ETO_OPAQUE,(LPRECT)&lpdis->rcItem,szBuf,lstrlen(szBuf),NULL); @@ -2467,7 +2483,7 @@ static __inline BOOL OnDrawBreakWnd(LPDRAWITEMSTRUCT lpdis) SetTextColor(lpdis->hDC,crTextColor); // draw checkbox - i = SendMessage(lpdis->hwndItem,LB_GETITEMDATA,lpdis->itemID,0); + i = (INT) SendMessage(lpdis->hwndItem,LB_GETITEMDATA,lpdis->itemID,0); hdcMem = CreateCompatibleDC(lpdis->hDC); _ASSERT(hBmpCheckBox); hBmpOld = SelectObject(hdcMem,hBmpCheckBox); @@ -2493,7 +2509,7 @@ static BOOL ToggleBreakpointItem(HWND hWnd, INT nItem) RECT rc; // get breakpoint number - INT i = SendMessage(hWnd,LB_GETITEMDATA,nItem,0); + INT i = (INT) SendMessage(hWnd,LB_GETITEMDATA,nItem,0); sBreakpoint[i].bEnable = !sBreakpoint[i].bEnable; // update region of toggled item @@ -2532,7 +2548,7 @@ static VOID DrawBreakpoint(HWND hWnd, INT i) _ASSERT(0); } wsprintf(szBuffer,_T("%05X (%s)"),sBreakpoint[i].dwAddr,szText); - nItem = SendMessage(hWnd,LB_ADDSTRING,0,(LPARAM) szBuffer); + nItem = (INT) SendMessage(hWnd,LB_ADDSTRING,0,(LPARAM) szBuffer); SendMessage(hWnd,LB_SETITEMDATA,nItem,i); return; } @@ -2540,7 +2556,7 @@ static VOID DrawBreakpoint(HWND hWnd, INT i) // // enter edit breakpoint dialog // -static BOOL CALLBACK EditBreakpoint(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK EditBreakpoint(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { TEXTMETRIC tm; @@ -2581,7 +2597,7 @@ static BOOL CALLBACK EditBreakpoint(HWND hDlg, UINT message, DWORD wParam, LONG case LBN_DBLCLK: if (LOWORD(wParam) == IDC_BREAKEDIT_WND) { - if ((nItem = SendMessage(hWnd,LB_GETCURSEL,0,0)) == LB_ERR) + if ((nItem = (INT) SendMessage(hWnd,LB_GETCURSEL,0,0)) == LB_ERR) return FALSE; return ToggleBreakpointItem(hWnd,nItem); @@ -2650,14 +2666,14 @@ static BOOL CALLBACK EditBreakpoint(HWND hDlg, UINT message, DWORD wParam, LONG INT j; // get breakpoint index - i = SendMessage(hWnd,LB_GETITEMDATA,nItem,0); + i = (INT) SendMessage(hWnd,LB_GETITEMDATA,nItem,0); SendMessage(hWnd,LB_DELETESTRING,nItem,0); --wBreakpointCount; // update remaining list box references for (j = 0; j < wBreakpointCount; ++j) { - INT k = SendMessage(hWnd,LB_GETITEMDATA,j,0); + INT k = (INT) SendMessage(hWnd,LB_GETITEMDATA,j,0); if (k > i) SendMessage(hWnd,LB_SETITEMDATA,j,k-1); } @@ -2733,7 +2749,7 @@ static BOOL OnEditBreakpoint(HWND hDlg) // // view last instructions // -static BOOL CALLBACK InfoIntr(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK InfoIntr(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hWnd; TCHAR szBuffer[64]; @@ -2757,7 +2773,7 @@ static BOOL CALLBACK InfoIntr(HWND hDlg, UINT message, DWORD wParam, LONG lParam { j = wsprintf(szBuffer,_T("%05lX "),pdwInstrArray[i]); disassemble(pdwInstrArray[i],&szBuffer[j],VIEW_SHORT); - lIndex = SendMessage(hWnd,LB_ADDSTRING,0,(LPARAM) szBuffer); + lIndex = (LONG) SendMessage(hWnd,LB_ADDSTRING,0,(LPARAM) szBuffer); } SendMessage(hWnd,WM_SETREDRAW,TRUE,0); SendMessage(hWnd,LB_SETCARETINDEX,lIndex,TRUE); diff --git a/Sources/Emu48/DISASM.C b/Sources/Emu48/DISASM.C index c67717f..1e87fe2 100644 --- a/Sources/Emu48/DISASM.C +++ b/Sources/Emu48/DISASM.C @@ -10,6 +10,8 @@ #include "pch.h" #include "Emu48.h" +#pragma inline_depth(0) + #define TAB_SKIP 8 BOOL disassembler_mode = HP_MNEMONICS; @@ -209,7 +211,7 @@ static LPCTSTR hst_bits[8] = /* * Class Mnemonics */ - _T("xm"), _T("sb"), _T("sr"), _T("mp"), + _T("xm"), _T("sb"), _T("sr"), _T("mp") }; @@ -317,7 +319,7 @@ static LPTSTR append_tab (LPTSTR buf) return p; } -static LPTSTR append_field (LPTSTR buf, BYTE fn) +static __inline LPTSTR append_field (LPTSTR buf, BYTE fn) { return append_str (buf, field_tbl[fn + 16 * disassembler_mode]); } @@ -371,47 +373,25 @@ static LPTSTR append_addr (LPTSTR buf, DWORD addr) return buf; } -static LPTSTR append_r_addr (LPTSTR buf, DWORD * pc, long disp, int n, int offset) +static LPTSTR append_r_addr (LPTSTR buf, DWORD *pc, long disp, int n, int offset) { long sign; sign = 1 << (n * 4 - 1); - if (disp & sign) - disp |= ~(sign - 1); + if (disp & sign) // negative value? + disp |= ~(sign - 1); // expand it to long *pc += disp; - - switch (disassembler_mode) + if (disp < 0) { - case HP_MNEMONICS: - if (disp < 0) - { - buf = append_str(buf, _T("-")); - disp = -disp - offset; - } - else - { - buf = append_str(buf, _T("+")); - disp += offset; - } - buf = append_addr(buf, disp); - break; - case CLASS_MNEMONICS: - if (disp < 0) - { - buf = append_str(buf, _T("-")); - disp = -disp - offset; - } - else - { - buf = append_str(buf, _T("+")); - disp += offset; - } - buf = append_addr(buf, disp); - break; - default: - buf = append_str (buf, _T("Unknown disassembler mode")); - break; + buf = append_str(buf, _T("-")); + disp = -disp - offset; } + else + { + buf = append_str(buf, _T("+")); + disp += offset; + } + buf = append_addr(buf, disp); return buf; } @@ -435,8 +415,8 @@ static LPTSTR append_pc_comment (LPTSTR buf, DWORD pc, BOOL view) p = append_addr (p, pc); break; default: - p = append_str (p, _T("Unknown disassembler mode")); - break; + p = append_str (p, _T("Unknown disassembler mode")); + break; } } else // output of address in brackets @@ -1184,10 +1164,20 @@ static LPTSTR disasm_8 (DWORD *addr, LPTSTR out, BOOL view) switch (disassembler_mode) { case HP_MNEMONICS: - p = append_str (out, _T("?")); - p = append_hst_bits (p, n); - p = append_str (p, _T("=0")); - p = append_tab (out); + if (n != 1 && n != 2 && n != 4 && n != 8) + { + p = append_str (out, _T("?HS=0")); + p = append_tab (out); + wsprintf (buf, _T("%d, "), n); + p = append_str (p, buf); + } + else + { + p = append_str (out, _T("?")); + p = append_hst_bits (p, n); + p = append_str (p, _T("=0")); + p = append_tab (out); + } if (disp != 0) { p = append_str (p, _T("GOYES ")); @@ -1894,9 +1884,9 @@ DWORD disassemble (DWORD addr, LPTSTR out, BOOL view) { wsprintf (buf, p, hp_reg_1_af[n], hp_reg_2_af[n]); } - p = append_str (out, buf); - p = append_tab (out); - p = append_field (p, fn); + p = append_str (out, buf); + p = append_tab (out); + p = append_field (p, fn); break; case CLASS_MNEMONICS: @@ -1924,4 +1914,3 @@ DWORD disassemble (DWORD addr, LPTSTR out, BOOL view) return addr; } - diff --git a/Sources/Emu48/DISPLAY.C b/Sources/Emu48/DISPLAY.C index a04c2d0..a0b8806 100644 --- a/Sources/Emu48/DISPLAY.C +++ b/Sources/Emu48/DISPLAY.C @@ -833,16 +833,16 @@ VOID ResizeWindow(VOID) rectWindow.right = nBackgroundW; rectWindow.bottom = nBackgroundH; AdjustWindowRect(&rectWindow, WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_OVERLAPPED, TRUE); - SetWindowPos (hWnd, (HWND)NULL, 0, 0, + SetWindowPos(hWnd, bAlwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, rectWindow.right - rectWindow.left, rectWindow.bottom - rectWindow.top, - SWP_NOMOVE | SWP_NOZORDER); + SWP_NOMOVE); GetClientRect(hWnd, &rectClient); AdjustWindowRect(&rectClient, WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_OVERLAPPED, TRUE); if (rectClient.bottom < rectWindow.bottom) { rectWindow.bottom += (rectWindow.bottom - rectClient.bottom); - SetWindowPos (hWnd, (HWND)NULL, 0, 0, + SetWindowPos (hWnd, NULL, 0, 0, rectWindow.right - rectWindow.left, rectWindow.bottom - rectWindow.top, SWP_NOMOVE | SWP_NOZORDER); @@ -920,7 +920,7 @@ static VOID StartDisplayGray(BYTE byInitial) static VOID StopDisplayGray(VOID) { BYTE a[2]; - ReadIO(a,LINECOUNT,2); // update VBL at display off time + ReadIO(a,LINECOUNT,2,TRUE); // update VBL at display off time if (uLcdTimerId == 0) // timer stopped return; // -> quit @@ -970,6 +970,6 @@ static VOID StartDisplayBW(BYTE byInitial) static VOID StopDisplayBW(VOID) { BYTE a[2]; - ReadIO(a,LINECOUNT,2); // update VBL at display off time + ReadIO(a,LINECOUNT,2,TRUE); // update VBL at display off time return; } diff --git a/Sources/Emu48/EMU48.C b/Sources/Emu48/EMU48.C index e72c59e..b58516a 100644 --- a/Sources/Emu48/EMU48.C +++ b/Sources/Emu48/EMU48.C @@ -13,17 +13,14 @@ #include "kml.h" #include "debugger.h" -#define VERSION "1.42" -#define CF_HPOBJ "CF_HPOBJ" // clipboard format for DDE - -#define MAXPORTS 256 // number of COM ports +#define VERSION "1.44" // #define MONOCHROME // CF_BITMAP clipboard format #ifdef _DEBUG -LPTSTR szNoTitle = _T("Emu48 ")_T(VERSION)_T(" Debug"); +LPCTSTR szNoTitle = _T("Emu48 ")_T(VERSION)_T(" Debug"); #else -LPTSTR szNoTitle = _T("Emu48 ")_T(VERSION); +LPCTSTR szNoTitle = _T("Emu48 ")_T(VERSION); #endif LPTSTR szAppName = _T("Emu48"); // application name for DDE server LPTSTR szTopic = _T("Stack"); // topic for DDE server @@ -77,12 +74,15 @@ HPALETTE hPalette = NULL; HPALETTE hOldPalette = NULL; // old palette of hWindowDC HCURSOR hCursorArrow = NULL; HCURSOR hCursorHand = NULL; -BOOL bClassicCursor = FALSE; // use hand instead of arrow cursor BOOL bAutoSave = FALSE; BOOL bAutoSaveOnExit = TRUE; BOOL bSaveDefConfirm = TRUE; // yes +BOOL bStartupBackup = FALSE; BOOL bAlwaysDisplayLog = TRUE; BOOL bLoadObjectWarning = TRUE; +BOOL bAlwaysOnTop = FALSE; // emulator window always on top +BOOL bActFollowsMouse = FALSE; // emulator window activation follows mouse + //################ @@ -147,6 +147,18 @@ VOID UpdateWindowStatus(VOID) return; } +VOID ForceForegroundWindow(HWND hWnd) +{ + // force window to foreground + DWORD dwEmuThreadID = GetCurrentThreadId(); + DWORD dwActThreadID = GetWindowThreadProcessId(GetForegroundWindow(),NULL); + + AttachThreadInput(dwEmuThreadID,dwActThreadID,TRUE); + SetForegroundWindow(hWnd); + AttachThreadInput(dwEmuThreadID,dwActThreadID,FALSE); + return; +} + //################ @@ -161,7 +173,7 @@ VOID CopyItemsToClipboard(HWND hWnd) // save selected Listbox Items to Clipboar LPINT lpnCount; // get number of selections - if ((i = SendMessage(hWnd,LB_GETSELCOUNT,0,0)) == 0) + if ((i = (LONG) SendMessage(hWnd,LB_GETSELCOUNT,0,0)) == 0) return; // no items selected if ((lpnCount = HeapAlloc(hHeap,0,i * sizeof(INT))) != NULL) @@ -171,11 +183,11 @@ VOID CopyItemsToClipboard(HWND hWnd) // save selected Listbox Items to Clipboar LONG j,lMem = 0; // get indexes of selected items - i = SendMessage(hWnd,LB_GETSELITEMS,i,(LPARAM) lpnCount); + i = (LONG) SendMessage(hWnd,LB_GETSELITEMS,i,(LPARAM) lpnCount); for (j = 0;j < i;++j) // scan all selected items { // calculate total amount of characters - lMem += SendMessage(hWnd,LB_GETTEXTLEN,lpnCount[j],0) + 2; + lMem += (LONG) SendMessage(hWnd,LB_GETTEXTLEN,lpnCount[j],0) + 2; } // allocate clipboard data if ((hClipObj = GlobalAlloc(GMEM_MOVEABLE,(lMem + 1) * sizeof(*lpszData))) != NULL) @@ -222,57 +234,103 @@ VOID CopyItemsToClipboard(HWND hWnd) // save selected Listbox Items to Clipboar //# //################ -// get R/W state of port2 file -static BOOL IsPort2Writeable(VOID) +// get R/W state of file +static BOOL IsFileWriteable(LPCTSTR szFilename) { DWORD dwFileAtt; BOOL bWriteable = FALSE; SetCurrentDirectory(szEmuDirectory); - dwFileAtt = GetFileAttributes(szPort2Filename); + dwFileAtt = GetFileAttributes(szFilename); if (dwFileAtt != 0xFFFFFFFF) bWriteable = ((dwFileAtt & FILE_ATTRIBUTE_READONLY) == 0); SetCurrentDirectory(szCurrentDirectory); return bWriteable; } -// set listfield for serial combobox -static VOID SetCommList(HWND hDlg,int nIDDlgItem,LPCTSTR szSetting) +// set listfield for serial combo boxes +static VOID SetCommList(HWND hDlg,LPCTSTR szWireSetting,LPCTSTR szIrSetting) { - HANDLE hComm; - BOOL bAdd; - WORD wCount, wIndex = 1; - TCHAR szBuffer[16]; + WPARAM wSelectWire,wSelectIr; + HKEY hKey; - WPARAM wSelect = 0; // set select to disabled - SendDlgItemMessage(hDlg,nIDDlgItem,CB_ADDSTRING,0,(LPARAM) _T(NO_SERIAL)); + wSelectWire = wSelectIr = 0; // set selections to disabled + SendDlgItemMessage(hDlg,IDC_WIRE,CB_ADDSTRING,0,(LPARAM) _T(NO_SERIAL)); + SendDlgItemMessage(hDlg,IDC_IR ,CB_ADDSTRING,0,(LPARAM) _T(NO_SERIAL)); - for (wCount = 1;wCount <= MAXPORTS;++wCount) + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, + _T("Hardware\\DeviceMap\\SerialComm"), + 0, + KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, + &hKey) == ERROR_SUCCESS) { - wsprintf(szBuffer,_T("\\\\.\\COM%u"),wCount); - if ((bAdd = (lstrcmp(&szBuffer[4],szSetting) == 0))) - wSelect = wIndex; + HANDLE hComm; + TCHAR szBuffer[256],cKey[256],cData[256]; + DWORD dwKeySize,dwDataSize; + WPARAM wSelIndexWire,wSelIndexIr; + BOOL bAddWire,bAddIr; + DWORD dwType,dwEnumVal; + LONG lRet; - // test if COM port is valid - hComm = CreateFile(szBuffer,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); - if(hComm != INVALID_HANDLE_VALUE) - { - VERIFY(CloseHandle(hComm)); - bAdd = TRUE; - } + wSelIndexWire = wSelIndexIr = 1; // preset selector - if (bAdd) // add item to combobox + dwEnumVal = 0; + do { - SendDlgItemMessage(hDlg,nIDDlgItem,CB_ADDSTRING,0,(LPARAM) &szBuffer[4]); - ++wIndex; + dwKeySize = ARRAYSIZEOF(cKey); // init return buffer sizes + dwDataSize = sizeof(cData); + + lRet = RegEnumValue(hKey,dwEnumVal++, + cKey,&dwKeySize, + NULL,&dwType, + (LPBYTE) cData,&dwDataSize); + + if (lRet == ERROR_SUCCESS && dwType == REG_SZ) + { + wsprintf(szBuffer,_T("\\\\.\\%s"),cData); + if ((bAddWire = (lstrcmp(&szBuffer[4],szWireSetting) == 0))) + wSelectWire = wSelIndexWire; + if ((bAddIr = (lstrcmp(&szBuffer[4],szIrSetting) == 0))) + wSelectIr = wSelIndexIr; + + // test if COM port is valid + hComm = CreateFile(szBuffer,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); + if(hComm != INVALID_HANDLE_VALUE) + { + VERIFY(CloseHandle(hComm)); + bAddWire = bAddIr = TRUE; + } + + if (bAddWire) // add item to wire combobox + { + SendDlgItemMessage(hDlg,IDC_WIRE,CB_ADDSTRING,0,(LPARAM) &szBuffer[4]); + ++wSelIndexWire; + } + if (bAddIr) // add item to ir combobox + { + SendDlgItemMessage(hDlg,IDC_IR,CB_ADDSTRING,0,(LPARAM) &szBuffer[4]); + ++wSelIndexIr; + } + } } + while (lRet == ERROR_SUCCESS); + _ASSERT(lRet == ERROR_NO_MORE_ITEMS); + RegCloseKey(hKey); } - SendDlgItemMessage(hDlg,nIDDlgItem,CB_SETCURSEL,wSelect,0L); + + // set cursors + SendDlgItemMessage(hDlg,IDC_WIRE,CB_SETCURSEL,wSelectWire,0L); + SendDlgItemMessage(hDlg,IDC_IR ,CB_SETCURSEL,wSelectIr ,0L); + return; } -static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK SettingsProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { + HWND hWndInsertAfter; + + LPCTSTR szActPort2Filename = _T(""); + BOOL bPort2CfgChange = FALSE; BOOL bPort2AttChange = FALSE; @@ -281,11 +339,13 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP case WM_INITDIALOG: // init speed checkbox CheckDlgButton(hDlg,IDC_REALSPEED,bRealSpeed); + CheckDlgButton(hDlg,IDC_GRAYSCALE,bGrayscale); + CheckDlgButton(hDlg,IDC_ALWAYSONTOP,bAlwaysOnTop); + CheckDlgButton(hDlg,IDC_ACTFOLLOWSMOUSE,bActFollowsMouse); CheckDlgButton(hDlg,IDC_AUTOSAVE,bAutoSave); CheckDlgButton(hDlg,IDC_AUTOSAVEONEXIT,bAutoSaveOnExit); CheckDlgButton(hDlg,IDC_OBJECTLOADWARNING,bLoadObjectWarning); CheckDlgButton(hDlg,IDC_ALWAYSDISPLOG,bAlwaysDisplayLog); - CheckDlgButton(hDlg,IDC_GRAYSCALE,bGrayscale); // set disassebler mode CheckDlgButton(hDlg,(disassembler_mode == HP_MNEMONICS) ? IDC_DISASM_HP : IDC_DISASM_CLASS,BST_CHECKED); @@ -300,8 +360,7 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP EnableWindow(GetDlgItem(hDlg,IDC_SOUND_SLIDER),bWaveBeep); // set combobox parameter - SetCommList(hDlg,IDC_WIRE,szSerialWire); - SetCommList(hDlg,IDC_IR,szSerialIr); + SetCommList(hDlg,szSerialWire,szSerialIr); if (bCommInit) // disable when port open { EnableWindow(GetDlgItem(hDlg,IDC_WIRE),FALSE); @@ -314,10 +373,22 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP // init port1 enable checkbox CheckDlgButton(hDlg,IDC_PORT1EN,(Chipset.cards_status & PORT1_PRESENT) != 0); CheckDlgButton(hDlg,IDC_PORT1WR,(Chipset.cards_status & PORT1_WRITE) != 0); + + if (nArgc < 3) // port2 filename from Emu48.ini file + { + szActPort2Filename = szPort2Filename; + } + else // port2 filename given from command line + { + szActPort2Filename = ppArgv[2]; + EnableWindow(GetDlgItem(hDlg,IDC_PORT2),FALSE); + EnableWindow(GetDlgItem(hDlg,IDC_PORT2LOAD),FALSE); + } + // init port2 shared and writeable checkbox and set port2 filename CheckDlgButton(hDlg,IDC_PORT2ISSHARED,bPort2IsShared); - CheckDlgButton(hDlg,IDC_PORT2WR,IsPort2Writeable()); - SetDlgItemText(hDlg,IDC_PORT2,szPort2Filename); + CheckDlgButton(hDlg,IDC_PORT2WR,IsFileWriteable(szActPort2Filename)); + SetDlgItemText(hDlg,IDC_PORT2,szActPort2Filename); if (nState == SM_INVALID) // Invalid State { EnableWindow(GetDlgItem(hDlg,IDC_PORT1EN),FALSE); @@ -364,6 +435,9 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP lstrcpy(szBufferFilename,lpFilePart); } SetDlgItemText(hDlg,IDC_PORT2,szBufferFilename); + + // adjust R/W checkbox + CheckDlgButton(hDlg,IDC_PORT2WR,IsFileWriteable(szBufferFilename)); } return TRUE; case IDOK: @@ -398,26 +472,31 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP if(cCurrentRomType=='S' || cCurrentRomType=='G' || cCurrentRomType==0) { TCHAR szFilename[MAX_PATH]; - BOOL bPortShared; + BOOL bOldPort2IsShared = bPort2IsShared; + + szActPort2Filename = (nArgc < 3) ? szPort2Filename : ppArgv[2]; // shared port - bPortShared = IsDlgButtonChecked(hDlg,IDC_PORT2ISSHARED); - if (bPort2IsShared != bPortShared) + bPort2IsShared = IsDlgButtonChecked(hDlg,IDC_PORT2ISSHARED); + if (bPort2IsShared != bOldPort2IsShared) { - bPort2IsShared = bPortShared; bPort2CfgChange = TRUE; // slot2 configuration changed } - // get current filename and notify difference - GetDlgItemText(hDlg,IDC_PORT2,szFilename,ARRAYSIZEOF(szFilename)); - if (lstrcmp(szPort2Filename,szFilename) != 0) + if (nArgc < 3) // port2 filename from Emu48.ini file { - lstrcpyn(szPort2Filename,szFilename,ARRAYSIZEOF(szPort2Filename)); - bPort2CfgChange = TRUE; // slot2 configuration changed + // get current filename and notify difference + GetDlgItemText(hDlg,IDC_PORT2,szFilename,ARRAYSIZEOF(szFilename)); + if (lstrcmp(szPort2Filename,szFilename) != 0) + { + lstrcpyn(szPort2Filename,szFilename,ARRAYSIZEOF(szPort2Filename)); + bPort2CfgChange = TRUE; // slot2 configuration changed + } } // R/W port - if (IsDlgButtonChecked(hDlg,IDC_PORT2WR) != (UINT) IsPort2Writeable()) + if ( *szActPort2Filename != 0 + && (BOOL) IsDlgButtonChecked(hDlg,IDC_PORT2WR) != IsFileWriteable(szActPort2Filename)) { bPort2AttChange = TRUE; // slot2 file R/W attribute changed bPort2CfgChange = TRUE; // slot2 configuration changed @@ -425,10 +504,12 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP } // get speed checkbox value bRealSpeed = IsDlgButtonChecked(hDlg,IDC_REALSPEED); - bAutoSave = IsDlgButtonChecked(hDlg, IDC_AUTOSAVE); - bAutoSaveOnExit = IsDlgButtonChecked(hDlg, IDC_AUTOSAVEONEXIT); - bLoadObjectWarning = IsDlgButtonChecked(hDlg, IDC_OBJECTLOADWARNING); - bAlwaysDisplayLog = IsDlgButtonChecked(hDlg, IDC_ALWAYSDISPLOG); + bAlwaysOnTop = IsDlgButtonChecked(hDlg,IDC_ALWAYSONTOP); + bActFollowsMouse = IsDlgButtonChecked(hDlg,IDC_ACTFOLLOWSMOUSE); + bAutoSave = IsDlgButtonChecked(hDlg,IDC_AUTOSAVE); + bAutoSaveOnExit = IsDlgButtonChecked(hDlg,IDC_AUTOSAVEONEXIT); + bLoadObjectWarning = IsDlgButtonChecked(hDlg,IDC_OBJECTLOADWARNING); + bAlwaysDisplayLog = IsDlgButtonChecked(hDlg,IDC_ALWAYSDISPLOG); SetSpeed(bRealSpeed); // set speed // LCD grayscale checkbox has been changed if (bGrayscale != (BOOL) IsDlgButtonChecked(hDlg,IDC_GRAYSCALE)) @@ -448,7 +529,7 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP DWORD dwFileAtt; SetCurrentDirectory(szEmuDirectory); - dwFileAtt = GetFileAttributes(szPort2Filename); + dwFileAtt = GetFileAttributes(szActPort2Filename); if (dwFileAtt != 0xFFFFFFFF) { if (IsDlgButtonChecked(hDlg,IDC_PORT2WR)) @@ -456,17 +537,17 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP else dwFileAtt |= FILE_ATTRIBUTE_READONLY; - SetFileAttributes(szPort2Filename,dwFileAtt); + SetFileAttributes(szActPort2Filename,dwFileAtt); } SetCurrentDirectory(szCurrentDirectory); } if (cCurrentRomType) // ROM defined { - // use 2nd command line argument if defined - MapPort2((nArgc < 3) ? szPort2Filename : ppArgv[2]); + MapPort2(szActPort2Filename); + // port2 changed and card detection enabled - if ( (bPort2AttChange || Chipset.wPort2Crc != CrcPort2()) + if ( (bPort2AttChange || Chipset.wPort2Crc != wPort2Crc) && (Chipset.IORam[CARDCTL] & ECDT) != 0 && (Chipset.IORam[TIMER2_CTRL] & RUN) != 0 ) { @@ -476,19 +557,26 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP bInterrupt = TRUE; } // save fingerprint of port2 - Chipset.wPort2Crc = CrcPort2(); + Chipset.wPort2Crc = wPort2Crc; } SwitchToState(nOldState); } // set disassembler mode disassembler_mode = IsDlgButtonChecked(hDlg,IDC_DISASM_HP) ? HP_MNEMONICS : CLASS_MNEMONICS; // set sound data - dwWaveVol = SendDlgItemMessage(hDlg,IDC_SOUND_SLIDER,TBM_GETPOS,0,0); + dwWaveVol = (DWORD) SendDlgItemMessage(hDlg,IDC_SOUND_SLIDER,TBM_GETPOS,0,0); bWaveBeep = IsDlgButtonChecked(hDlg,IDC_SOUND_WAVE); // set combobox parameter GetDlgItemText(hDlg,IDC_WIRE,szSerialWire,ARRAYSIZEOF(szSerialWire)); if (cCurrentRomType!='X') // HP49G Ir port is not connected GetDlgItemText(hDlg,IDC_IR,szSerialIr,ARRAYSIZEOF(szSerialIr)); + // set window Z order + hWndInsertAfter = bAlwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST; + SetWindowPos(hWnd,hWndInsertAfter,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE); + if (hDlgDebug != NULL) + { + SetWindowPos(hDlgDebug,hWndInsertAfter,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE); + } // no break case IDCANCEL: EndDialog(hDlg, LOWORD(wParam)); @@ -496,7 +584,7 @@ static BOOL CALLBACK SettingsProc(HWND hDlg, UINT message, DWORD wParam, LONG lP break; } return FALSE; - UNREFERENCED_PARAMETER(lParam); + UNREFERENCED_PARAMETER(lParam); } @@ -727,12 +815,13 @@ cancel: // static LRESULT OnFileNew(VOID) { - SaveBackup(); if (pbyRom) { SwitchToState(SM_INVALID); if (IDCANCEL == SaveChanges(bAutoSave)) goto cancel; + + SaveBackup(); } if (NewDocument()) SetWindowTitle(_T("Untitled")); UpdateWindowStatus(); @@ -810,7 +899,6 @@ static LRESULT OnFileClose(VOID) if (SaveChanges(bAutoSave)!=IDCANCEL) { DisableDebugger(); - KillKML(); ResetDocument(); SetWindowTitle(NULL); } @@ -889,7 +977,7 @@ static LRESULT OnViewCopy(VOID) if (wBits != 24) // a 24 bitcount DIB has no color table { // add size for color table - dwLen += (1 << wBits) * sizeof(RGBQUAD); + dwLen += (DWORD) (1 << wBits) * sizeof(RGBQUAD); } // memory allocation for clipboard data @@ -1151,7 +1239,7 @@ static LRESULT OnObjectSave(VOID) // // ID_TOOL_DISASM // -static BOOL CALLBACK Disasm(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK Disasm(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static DWORD dwAddress, dwAddressMax; @@ -1222,7 +1310,7 @@ static BOOL CALLBACK Disasm(HWND hDlg, UINT message, DWORD wParam, LONG lParam) return FALSE; i = wsprintf(szAddress,(dwAddress <= 0xFFFFF) ? _T("%05lX ") : _T("%06lX "),dwAddress); dwAddress = disassemble(dwAddress,&szAddress[i],VIEW_LONG); - i = SendDlgItemMessage(hDlg,IDC_DISASM_WIN,LB_ADDSTRING,0,(LPARAM) szAddress); + i = (LONG) SendDlgItemMessage(hDlg,IDC_DISASM_WIN,LB_ADDSTRING,0,(LPARAM) szAddress); SendDlgItemMessage(hDlg,IDC_DISASM_WIN,LB_SELITEMRANGE,FALSE,MAKELPARAM(0,i)); SendDlgItemMessage(hDlg,IDC_DISASM_WIN,LB_SETSEL,TRUE,i); SendDlgItemMessage(hDlg,IDC_DISASM_WIN,LB_SETTOPINDEX,i,0); @@ -1238,13 +1326,13 @@ static BOOL CALLBACK Disasm(HWND hDlg, UINT message, DWORD wParam, LONG lParam) break; } return FALSE; - UNREFERENCED_PARAMETER(lParam); + UNREFERENCED_PARAMETER(lParam); } // // ID_ABOUT // -static BOOL CALLBACK About(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { @@ -1262,7 +1350,7 @@ static BOOL CALLBACK About(HWND hDlg, UINT message, DWORD wParam, LONG lParam) break; } return FALSE; - UNREFERENCED_PARAMETER(lParam); + UNREFERENCED_PARAMETER(lParam); } static LRESULT OnToolDisasm(VOID) // disasm dialogbox call @@ -1297,12 +1385,31 @@ static LRESULT OnLButtonUp(UINT nFlags, WORD x, WORD y) static LRESULT OnMouseMove(UINT nFlags, WORD x, WORD y) { + // emulator not active but cursor is over emulator window + if (bActFollowsMouse && GetActiveWindow() != hWnd) + { + ForceForegroundWindow(hWnd); // force emulator window to foreground + } + if (nMacroState == MACRO_PLAY) return 0; // playing macro if (nState == SM_RUN) MouseMovesTo(nFlags, x,y); return 0; } -static LRESULT OnKeyDown(int nVirtKey, DWORD lKeyData) +static LRESULT OnNcMouseMove(UINT nFlags, WORD x, WORD y) +{ + // emulator not active but cursor is over emulator window + if (bActFollowsMouse && GetActiveWindow() != hWnd) + { + ForceForegroundWindow(hWnd); // force emulator window to foreground + } + return 0; + UNREFERENCED_PARAMETER(nFlags); + UNREFERENCED_PARAMETER(x); + UNREFERENCED_PARAMETER(y); +} + +static LRESULT OnKeyDown(int nVirtKey, LPARAM lKeyData) { if (nMacroState == MACRO_PLAY) return 0; // playing macro // call RunKey() only once (suppress autorepeat feature) @@ -1311,7 +1418,7 @@ static LRESULT OnKeyDown(int nVirtKey, DWORD lKeyData) return 0; } -static LRESULT OnKeyUp(int nVirtKey, DWORD lKeyData) +static LRESULT OnKeyUp(int nVirtKey, LPARAM lKeyData) { if (nMacroState == MACRO_PLAY) return 0; // playing macro if (nState == SM_RUN) RunKey((BYTE)nVirtKey, FALSE); @@ -1388,9 +1495,10 @@ LRESULT CALLBACK MainWndProc(HWND hWindow, UINT uMsg, WPARAM wParam, LPARAM lPar } break; case WM_RBUTTONDOWN: - case WM_LBUTTONDOWN: return OnLButtonDown(wParam, LOWORD(lParam), HIWORD(lParam)); - case WM_LBUTTONUP: return OnLButtonUp(wParam, LOWORD(lParam), HIWORD(lParam)); - case WM_MOUSEMOVE: return OnMouseMove(wParam, LOWORD(lParam), HIWORD(lParam)); + case WM_LBUTTONDOWN: return OnLButtonDown((UINT) wParam, LOWORD(lParam), HIWORD(lParam)); + case WM_LBUTTONUP: return OnLButtonUp((UINT) wParam, LOWORD(lParam), HIWORD(lParam)); + case WM_MOUSEMOVE: return OnMouseMove((UINT) wParam, LOWORD(lParam), HIWORD(lParam)); + case WM_NCMOUSEMOVE: return OnNcMouseMove((UINT) wParam, LOWORD(lParam), HIWORD(lParam)); case WM_KEYUP: return OnKeyUp((int)wParam, lParam); case WM_KEYDOWN: return OnKeyDown((int)wParam, lParam); } @@ -1404,7 +1512,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC RECT rectWindow; HACCEL hAccel; HSZ hszService, hszTopic; // variables for DDE server - DWORD dwAffMask; + DWORD_PTR dwAffMask; hApp = hInst; #if defined _UNICODE @@ -1516,6 +1624,12 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC return FALSE; } + // init clipboard format and name service + uCF_HpObj = RegisterClipboardFormat(_T(CF_HPOBJ)); + hszService = DdeCreateStringHandle(idDdeInst,szAppName,0); + hszTopic = DdeCreateStringHandle(idDdeInst,szTopic,0); + DdeNameService(idDdeInst,hszService,NULL,DNS_REGISTER); + _ASSERT(hWnd != NULL); _ASSERT(hWindowDC != NULL); @@ -1531,24 +1645,23 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC _ASSERT(hWnd != NULL); VERIFY(GetClientRect(hWnd,&rectClient)); - GetCutPathName(szBufferFilename,&szTemp[8],MAX_PATH,rectClient.right/10-8); + GetCutPathName(szBufferFilename,&szTemp[8],MAX_PATH,rectClient.right/11); SetWindowTitle(szTemp); if (OpenDocument(szBufferFilename)) + { + ShowWindow(hWnd,nCmdShow); goto start; + } } + SetWindowTitle(_T("New Document")); + ShowWindow(hWnd,nCmdShow); // show emulator menu + // no default document, ask for new one - SetWindowTitle(NewDocument() ? _T("Untitled") : _T("New Document")); + if (NewDocument()) SetWindowTitle(_T("Untitled")); start: - // init clipboard format and name service - uCF_HpObj = RegisterClipboardFormat(_T(CF_HPOBJ)); - hszService = DdeCreateStringHandle(idDdeInst,szAppName,0); - hszTopic = DdeCreateStringHandle(idDdeInst,szTopic,0); - DdeNameService(idDdeInst,hszService,NULL,DNS_REGISTER); - - ShowWindow(hWnd, nCmdShow); - + if (bStartupBackup) SaveBackup(); // make a RAM backup at startup if (pbyRom) SwitchToState(SM_RUN); while (GetMessage(&msg, NULL, 0, 0)) @@ -1576,12 +1689,13 @@ start: _ASSERT(nState == SM_RETURN); // emulation thread down? ResetDocument(); ResetBackup(); + _ASSERT(pbyRom == NULL); // rom file unmapped _ASSERT(pbyPort2 == NULL); // port2 file unmapped _ASSERT(pKml == NULL); // KML script not closed _ASSERT(szTitle == NULL); // freed allocated memory _ASSERT(hPalette == NULL); // freed resource memory - return msg.wParam; + return (int) msg.wParam; UNREFERENCED_PARAMETER(lpCmdLine); UNREFERENCED_PARAMETER(hPrevInst); } diff --git a/Sources/Emu48/EMU48.DSP b/Sources/Emu48/EMU48.DSP index 3c0391f..39f90bc 100644 --- a/Sources/Emu48/EMU48.DSP +++ b/Sources/Emu48/EMU48.DSP @@ -210,6 +210,10 @@ SOURCE=.\kml.c # End Source File # Begin Source File +SOURCE=.\lowbat.c +# End Source File +# Begin Source File + SOURCE=.\mops.c # End Source File # Begin Source File diff --git a/Sources/Emu48/EMU48.H b/Sources/Emu48/EMU48.H index a7e923b..85cdf78 100644 --- a/Sources/Emu48/EMU48.H +++ b/Sources/Emu48/EMU48.H @@ -22,6 +22,8 @@ #define BINARYHEADER48 "HPHP48-W" #define BINARYHEADER49 "HPHP49-W" +#define CF_HPOBJ "CF_HPOBJ" // clipboard format for DDE + // CPU cycles in 16384 Hz time frame #define T2CYCLES ((cCurrentRomType=='S')?dwSXCycles:dwGXCycles) @@ -31,8 +33,11 @@ #define SM_SLEEP 3 #define S_ERR_NO 0 // stack errorcodes -#define S_ERR_BINARY 1 -#define S_ERR_ASCII 2 +#define S_ERR_OBJECT 1 +#define S_ERR_BINARY 2 +#define S_ERR_ASCII 3 + +#define BAD_OB (0xFFFFFFFF) // bad object #define NO_SERIAL "disabled" // port not open @@ -94,17 +99,20 @@ extern HWND hDlgProfile; extern HDC hWindowDC; extern HCURSOR hCursorArrow; extern HCURSOR hCursorHand; -extern BOOL bClassicCursor; extern BOOL bAutoSave; extern BOOL bAutoSaveOnExit; extern BOOL bSaveDefConfirm; +extern BOOL bStartupBackup; extern BOOL bAlwaysDisplayLog; extern BOOL bLoadObjectWarning; +extern BOOL bAlwaysOnTop; +extern BOOL bActFollowsMouse; extern HANDLE hThread; extern DWORD lThreadId; extern VOID SetWindowTitle(LPCTSTR szString); extern VOID CopyItemsToClipboard(HWND hWnd); extern VOID UpdateWindowStatus(VOID); +extern VOID ForceForegroundWindow(HWND hWnd); // Settings.c extern VOID ReadSettings(VOID); @@ -191,25 +199,28 @@ extern TCHAR szCurrentFilename[MAX_PATH]; extern TCHAR szBackupFilename[MAX_PATH]; extern TCHAR szBufferFilename[MAX_PATH]; extern TCHAR szPort2Filename[MAX_PATH]; -extern LPBYTE pbyRom; -extern DWORD dwRomSize; extern BYTE cCurrentRomType; extern UINT nCurrentClass; +extern LPBYTE pbyRom; extern BOOL bRomWriteable; +extern DWORD dwRomSize; +extern WORD wRomCrc; extern LPBYTE pbyPort2; extern BOOL bPort2Writeable; extern BOOL bPort2IsShared; extern DWORD dwPort2Size; extern DWORD dwPort2Mask; +extern WORD wPort2Crc; extern BOOL bBackup; extern VOID SetWindowLocation(HWND hWnd,INT nPosX,INT nPosY); extern DWORD GetCutPathName(LPCTSTR szFileName,LPTSTR szBuffer,DWORD dwBufferLength,INT nCutLength); extern VOID SetWindowPathTitle(LPCTSTR szFileName); extern VOID UpdatePatches(BOOL bPatch); extern BOOL PatchRom(LPCTSTR szFilename); +extern BOOL CrcRom(WORD *pwChk); extern BOOL MapRom(LPCTSTR szFilename); extern VOID UnmapRom(VOID); -extern WORD CrcPort2(VOID); +extern BOOL CrcPort2(WORD *pwCrc); extern BOOL MapPort2(LPCTSTR szFilename); extern VOID UnmapPort2(VOID); extern VOID ResetDocument(VOID); @@ -224,7 +235,7 @@ extern BOOL GetOpenFilename(VOID); extern BOOL GetSaveAsFilename(VOID); extern BOOL GetLoadObjectFilename(VOID); extern BOOL GetSaveObjectFilename(VOID); -extern WORD WriteStack(LPBYTE lpBuf,DWORD dwSize); +extern WORD WriteStack(UINT nStkLevel,LPBYTE lpBuf,DWORD dwSize); extern BOOL LoadObject(LPCTSTR szFilename); extern BOOL SaveObject(LPCTSTR szFilename); extern HBITMAP LoadBitmapFile(LPCTSTR szFilename); @@ -238,7 +249,7 @@ extern VOID SetT2(DWORD dwValue); extern BYTE ReadT1(VOID); extern VOID SetT1(BYTE byValue); -// MOps.c +// Mops.c extern BOOL bFlashRomArray; extern BYTE disp; extern LPBYTE RMap[256]; @@ -259,9 +270,14 @@ extern DWORD Read5(DWORD d); extern VOID Write5(DWORD d, DWORD n); extern VOID Write2(DWORD d, BYTE n); extern VOID IOBit(DWORD d, BYTE b, BOOL s); -extern VOID ReadIO(BYTE *a, DWORD b, DWORD s); +extern VOID ReadIO(BYTE *a, DWORD b, DWORD s, BOOL bUpdate); extern VOID WriteIO(BYTE *a, DWORD b, DWORD s); +// Lowbat.c +extern VOID StartBatMeasure(VOID); +extern VOID StopBatMeasure(VOID); +extern VOID GetBatteryState(BOOL *pbLBI, BOOL *pbVLBI); + // Keyboard.c extern VOID ScanKeyboard(BOOL bActive, BOOL bReset); extern VOID KeyboardEvent(BOOL bPress, UINT out, UINT in); @@ -283,11 +299,12 @@ extern LRESULT OnStackPaste(VOID); // RPL.c extern BOOL RPL_GetSystemFlag(INT nFlag); extern DWORD RPL_SkipOb(DWORD d); -extern DWORD RPL_ObjectSize(BYTE *o); +extern DWORD RPL_ObjectSize(BYTE *o,DWORD s); extern DWORD RPL_CreateTemp(DWORD l); +extern UINT RPL_Depth(VOID); extern DWORD RPL_Pick(UINT l); extern VOID RPL_Replace(DWORD n); -extern VOID RPL_Push(DWORD n); +extern VOID RPL_Push(UINT l,DWORD n); // External.c extern BOOL bWaveBeep; diff --git a/Sources/Emu48/EMU48.RC b/Sources/Emu48/EMU48.RC index ca4b77f..c9c6317 100644 --- a/Sources/Emu48/EMU48.RC +++ b/Sources/Emu48/EMU48.RC @@ -74,7 +74,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 160 TOPMARGIN, 4 - BOTTOMMARGIN, 256 + BOTTOMMARGIN, 270 END IDD_CHOOSEKML, DIALOG @@ -225,14 +225,14 @@ FONT 8, "MS Sans Serif" BEGIN ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP - LTEXT "Copyright © 2006 Sébastien Carlier && Christoph Gießelink", + LTEXT "Copyright © 2007 Sébastien Carlier && Christoph Gießelink", IDC_STATIC,29,18,181,8 DEFPUSHBUTTON "OK",IDOK,215,12,39,14 EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY END -IDD_SETTINGS DIALOG DISCARDABLE 0, 0, 167, 263 +IDD_SETTINGS DIALOG DISCARDABLE 0, 0, 167, 287 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Settings" FONT 8, "MS Sans Serif" @@ -241,49 +241,53 @@ BEGIN BS_AUTOCHECKBOX | WS_TABSTOP,13,13,100,10 CONTROL "Enable Virtual LCD Delay",IDC_GRAYSCALE,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,25,100,10 + CONTROL "Always On Top",IDC_ALWAYSONTOP,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,37,65,10 + CONTROL "Activation Follows Mouse",IDC_ACTFOLLOWSMOUSE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,49,100,10 CONTROL "Automatically Save Files",IDC_AUTOSAVE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,37,89,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,61,89,10 CONTROL "Automatically Save Files On Exit",IDC_AUTOSAVEONEXIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,49,114,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73,114,10 CONTROL "Show Load Object Warning",IDC_OBJECTLOADWARNING,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,61,102,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,85,102,10 CONTROL "Always Show KML Compilation Result",IDC_ALWAYSDISPLOG, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73,133,10 - GROUPBOX "General",IDC_STATIC,7,4,153,83 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,97,133,10 + GROUPBOX "General",IDC_STATIC,7,4,153,107 CONTROL "HP Mnemonics",IDC_DISASM_HP,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,13,101,65,11 + WS_GROUP | WS_TABSTOP,13,125,65,11 CONTROL "Class Mnemonics",IDC_DISASM_CLASS,"Button", - BS_AUTORADIOBUTTON,84,101,70,11 - GROUPBOX "Disassembler",IDC_STATIC,7,90,153,28 - LTEXT "Volume",IDC_STATIC,13,134,24,8 + BS_AUTORADIOBUTTON,84,125,70,11 + GROUPBOX "Disassembler",IDC_STATIC,7,114,153,28 + LTEXT "Volume",IDC_STATIC,13,158,24,8 CONTROL "Slider1",IDC_SOUND_SLIDER,"msctls_trackbar32", - TBS_AUTOTICKS | WS_TABSTOP,39,129,68,18 + TBS_AUTOTICKS | WS_TABSTOP,39,153,68,18 CONTROL "Speaker",IDC_SOUND_SPEAKER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,111,128,43,10 + WS_GROUP | WS_TABSTOP,111,152,43,10 CONTROL "Wave",IDC_SOUND_WAVE,"Button",BS_AUTORADIOBUTTON,111, - 139,43,10 - GROUPBOX "Sound",IDC_STATIC,7,120,153,34 + 163,43,10 + GROUPBOX "Sound",IDC_STATIC,7,144,153,34 CONTROL "Port 1 is Plugged",IDC_PORT1EN,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,13,165,67,10 + WS_TABSTOP,13,189,67,10 CONTROL "Port 1 is Writeable",IDC_PORT1WR,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,84,165,69,10 + BS_AUTOCHECKBOX | WS_TABSTOP,84,189,69,10 CONTROL "Port 2 is Shared",IDC_PORT2ISSHARED,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,177,65,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,201,65,10 CONTROL "Port 2 is Writeable",IDC_PORT2WR,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,84,177,69,10 - LTEXT "Port 2 File :",IDC_STATIC,13,192,37,8 - EDITTEXT IDC_PORT2,51,190,94,12,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_PORT2LOAD,145,190,10,12 - GROUPBOX "Memory Cards",IDC_STATIC,7,156,153,51 - LTEXT "Wire:",IDC_STATIC,13,221,17,8 - COMBOBOX IDC_WIRE,31,219,48,42,CBS_DROPDOWNLIST | WS_VSCROLL | + BS_AUTOCHECKBOX | WS_TABSTOP,84,201,69,10 + LTEXT "Port 2 File :",IDC_STATIC,13,216,37,8 + EDITTEXT IDC_PORT2,51,214,94,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_PORT2LOAD,145,214,10,12 + GROUPBOX "Memory Cards",IDC_STATIC,7,180,153,51 + LTEXT "Wire:",IDC_STATIC,13,245,17,8 + COMBOBOX IDC_WIRE,31,243,48,42,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "IR:",IDC_STATIC,89,221,9,8 - COMBOBOX IDC_IR,107,219,48,43,CBS_DROPDOWNLIST | WS_VSCROLL | + LTEXT "IR:",IDC_STATIC,89,245,9,8 + COMBOBOX IDC_IR,107,243,48,43,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Serial Ports",IDC_STATIC,7,209,153,27 - DEFPUSHBUTTON "&Ok",IDOK,9,242,50,14 - PUSHBUTTON "&Cancel",IDCANCEL,107,242,50,14 + GROUPBOX "Serial Ports",IDC_STATIC,7,233,153,27 + DEFPUSHBUTTON "&Ok",IDOK,9,266,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,107,266,50,14 END IDD_CHOOSEKML DIALOG DISCARDABLE 0, 0, 195, 66 @@ -295,9 +299,9 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,138,27,50,14 COMBOBOX IDC_KMLSCRIPT,7,47,181,120,CBS_DROPDOWNLIST | CBS_OEMCONVERT | CBS_SORT | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_EMUDIR,7,17,107,14,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_EMUDIRSEL,114,17,10,14 - PUSHBUTTON "V",IDC_UPDATE,124,17,10,14 + EDITTEXT IDC_EMUDIR,7,17,106,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_EMUDIRSEL,113,17,10,14 + PUSHBUTTON "V",IDC_UPDATE,123,17,10,14 LTEXT "Emu48 Directory :",IDC_STATIC,7,7,115,8 LTEXT "Current KML Script :",IDC_STATIC,7,37,115,8 END @@ -549,8 +553,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,4,2,0 - PRODUCTVERSION 1,4,2,0 + FILEVERSION 1,4,4,0 + PRODUCTVERSION 1,4,4,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -567,12 +571,12 @@ BEGIN BEGIN VALUE "CompanyName", "Sebastien Carlier & Christoph Gießelink\0" VALUE "FileDescription", "HP38/39/40/48/49 Emulator\0" - VALUE "FileVersion", "1, 4, 2, 0\0" + VALUE "FileVersion", "1, 4, 4, 0\0" VALUE "InternalName", "Emu48\0" - VALUE "LegalCopyright", "Copyright © 2006\0" + VALUE "LegalCopyright", "Copyright © 2007\0" VALUE "OriginalFilename", "Emu48.exe\0" VALUE "ProductName", "Emu48\0" - VALUE "ProductVersion", "1, 4, 2, 0\0" + VALUE "ProductVersion", "1, 4, 4, 0\0" END END BLOCK "VarFileInfo" @@ -780,7 +784,7 @@ END // 24 // -CREATEPROCESS_MANIFEST_RESOURCE_ID 24 MOVEABLE PURE "Emu48.xml" +1 24 MOVEABLE PURE "Emu48.xml" ///////////////////////////////////////////////////////////////////////////// // diff --git a/Sources/Emu48/ENGINE.C b/Sources/Emu48/ENGINE.C index 3dde5be..e920d37 100644 --- a/Sources/Emu48/ENGINE.C +++ b/Sources/Emu48/ENGINE.C @@ -559,6 +559,7 @@ loop: QueryPerformanceCounter(&lDummyInt); dwSpeedRef = lDummyInt.LowPart; SetHP48Time(); // update HP48 time & date + StartBatMeasure(); // start battery measurement StartTimers(); // start display counter/update engine StartDisplay((BYTE)(((Chipset.IORam[LINECOUNT+1]<<4)|Chipset.IORam[LINECOUNT])&0x3F)); @@ -618,6 +619,7 @@ loop: _ASSERT(nNextState != SM_RUN); StopDisplay(); // stop display counter/update + StopBatMeasure(); // stop battery measurement StopTimers(); while (nNextState == SM_SLEEP) // go into sleep state diff --git a/Sources/Emu48/EXTERNAL.C b/Sources/Emu48/EXTERNAL.C index 71315da..013cb4f 100644 --- a/Sources/Emu48/EXTERNAL.C +++ b/Sources/Emu48/EXTERNAL.C @@ -58,7 +58,7 @@ static __inline VOID BeepWave(DWORD dwFrequency,DWORD dwDuration) wf.wBitsPerSample = 8; wf.cbSize = 0; - if (waveOutOpen(&hSoundDevice,WAVE_MAPPER,&wf,(DWORD)hEventSound,0,CALLBACK_EVENT) != 0) + if (waveOutOpen(&hSoundDevice,WAVE_MAPPER,&wf,(DWORD_PTR)hEventSound,0,CALLBACK_EVENT) != 0) { CloseHandle(hEventSound); // no sound available return; @@ -93,6 +93,7 @@ static __inline VOID BeepWave(DWORD dwFrequency,DWORD dwDuration) static __inline VOID BeepWin9x(DWORD dwFrequency,DWORD dwDuration) { +#if !defined _WIN64 #define PIT8254_CNT2 0x42 #define PIT8254_MCR 0x43 #define PPI8255_PBO 0x61 @@ -125,6 +126,7 @@ static __inline VOID BeepWin9x(DWORD dwFrequency,DWORD dwDuration) #undef PIT8254_CNT2 #undef PIT8254_MCR #undef PPI8255_PBO +#endif } static __inline VOID Return(CHIPSET* w) diff --git a/Sources/Emu48/FILES.C b/Sources/Emu48/FILES.C index f449188..bd00c56 100644 --- a/Sources/Emu48/FILES.C +++ b/Sources/Emu48/FILES.C @@ -23,21 +23,27 @@ TCHAR szBackupFilename[MAX_PATH]; TCHAR szBufferFilename[MAX_PATH]; TCHAR szPort2Filename[MAX_PATH]; -LPBYTE pbyRom = NULL; -static HANDLE hRomFile = NULL; -static HANDLE hRomMap = NULL; -DWORD dwRomSize = 0; BYTE cCurrentRomType = 0; // Model -> hardware UINT nCurrentClass = 0; // Class -> derivate -BOOL bRomWriteable = TRUE; // flag if ROM writeable -static HANDLE hPort2File = NULL; -static HANDLE hPort2Map = NULL; +LPBYTE pbyRom = NULL; +BOOL bRomWriteable = TRUE; // flag if ROM writeable +DWORD dwRomSize = 0; +WORD wRomCrc = 0; // fingerprint of patched ROM + LPBYTE pbyPort2 = NULL; BOOL bPort2Writeable = FALSE; BOOL bPort2IsShared = FALSE; DWORD dwPort2Size = 0; // size of mapped port2 DWORD dwPort2Mask = 0; +WORD wPort2Crc = 0; // fingerprint of port2 + +BOOL bBackup = FALSE; + +static HANDLE hRomFile = NULL; +static HANDLE hRomMap = NULL; +static HANDLE hPort2File = NULL; +static HANDLE hPort2Map = NULL; // document signatures static BYTE pbySignatureA[16] = "Emu38 Document\xFE"; @@ -49,8 +55,6 @@ static HANDLE hCurrentFile = NULL; static CHIPSET BackupChipset; -BOOL bBackup = FALSE; - //################ //# //# Window Position Tools @@ -110,10 +114,35 @@ DWORD GetCutPathName(LPCTSTR szFileName, LPTSTR szBuffer, DWORD dwBufferLength, if (nPathLen > nMaxPathLen) // have to cut path { - TCHAR cDirTemp[_MAX_DIR] = _T("\\..."); + TCHAR cDirTemp[_MAX_DIR] = _T(""); LPTSTR szPtr; - nMaxPathLen -= 4; // need 4 chars for additional "\..." + // UNC name + if (cDir[0] == _T('\\') && cDir[1] == _T('\\')) + { + // skip server + if ((szPtr = _tcschr(cDir + 2,_T('\\'))) != NULL) + { + // skip share + if ((szPtr = _tcschr(szPtr + 1,_T('\\'))) != NULL) + { + INT nLength = szPtr - cDir; + + *szPtr = 0; // set EOS behind share + + // enough room for \\server\\share and "\...\" + if (nLength + 5 <= nMaxPathLen) + { + lstrcpyn(cDirTemp,cDir,ARRAYSIZEOF(cDirTemp)); + nMaxPathLen -= nLength; + } + + } + } + } + + lstrcat(cDirTemp,_T("\\...")); + nMaxPathLen -= 5; // need 6 chars for additional "\..." + "\" if (nMaxPathLen < 0) nMaxPathLen = 0; // get earliest possible '\' character @@ -141,7 +170,7 @@ VOID SetWindowPathTitle(LPCTSTR szFileName) { _ASSERT(hWnd != NULL); VERIFY(GetClientRect(hWnd,&rectClient)); - GetCutPathName(szFileName,cPath,ARRAYSIZEOF(cPath),rectClient.right/10); + GetCutPathName(szFileName,cPath,ARRAYSIZEOF(cPath),rectClient.right/11); SetWindowTitle(cPath); } return; @@ -169,6 +198,7 @@ static __inline BYTE Asc2Nib(BYTE c) // functions to restore ROM patches typedef struct tnode { + BOOL bPatch; // TRUE = ROM address patched DWORD dwAddress; // patch address BYTE byROM; // original ROM value BYTE byPatch; // patched ROM value @@ -185,6 +215,7 @@ static BOOL PatchNibble(DWORD dwAddress, BYTE byPatch) if((p = HeapAlloc(hHeap,0,sizeof(TREENODE))) == NULL) return TRUE; + p->bPatch = TRUE; // address patched p->dwAddress = dwAddress; // save current values p->byROM = pbyRom[dwAddress]; p->byPatch = byPatch; @@ -219,16 +250,27 @@ VOID UpdatePatches(BOOL bPatch) _ASSERT(pbyRom); // ROM defined while (p != NULL) { - if (bPatch) + if (bPatch) // patch ROM { - // save original data and patch address - p->byROM = pbyRom[p->dwAddress]; - pbyRom[p->dwAddress] = p->byPatch; + if (!p->bPatch) // patch only if not patched + { + // use original data for patch restore + p->byROM = pbyRom[p->dwAddress]; + + // restore patch data + pbyRom[p->dwAddress] = p->byPatch; + p->bPatch = TRUE; // address patched + } + else + { + _ASSERT(FALSE); // call ROM patch on a patched ROM + } } - else + else // restore ROM { // restore original data pbyRom[p->dwAddress] = p->byROM; + p->bPatch = FALSE; // address not patched } p = p->next; // next node @@ -296,7 +338,7 @@ BOOL PatchRom(LPCTSTR szFilename) continue; } dwAddress = strtoul(&lpBuf[nPos], &lpStop, 16); - nPos += lpStop-&lpBuf[nPos]+1; + nPos += (UINT) (lpStop - &lpBuf[nPos]) + 1; if (*lpStop != ':' || *lpStop == 0) continue; while (lpBuf[nPos]) @@ -320,21 +362,28 @@ BOOL PatchRom(LPCTSTR szFilename) //# //################ -static WORD CrcRom(VOID) // calculate fingerprint of ROM +BOOL CrcRom(WORD *pwChk) // calculate fingerprint of ROM { - DWORD dwCount; - DWORD dwFileSize; - DWORD dwCrc = 0; - - dwFileSize = GetFileSize(hRomFile, &dwCount); // get real filesize - _ASSERT(dwCount == 0); // isn't created by MapRom() + DWORD *pdwData,dwSize; + DWORD dwChk = 0; _ASSERT(pbyRom); // view on ROM - // use checksum, because it's faster - for (dwCount = 0;dwCount < dwFileSize; dwCount+=sizeof(dwCrc)) - dwCrc += *((DWORD *) &pbyRom[dwCount]); + pdwData = (DWORD *) pbyRom; - return (WORD) dwCrc; + _ASSERT((dwRomSize % sizeof(*pdwData)) == 0); + dwSize = dwRomSize / sizeof(*pdwData); // file size in DWORD's + + // use checksum, because it's faster + while (dwSize-- > 0) + { + DWORD dwData = *pdwData++; + if ((dwData & 0xF0F0F0F0) != 0) // data packed? + return FALSE; + dwChk += dwData; + } + + *pwChk = (WORD) ((dwChk >> 16) + (dwChk & 0xFFFF)); + return TRUE; } BOOL MapRom(LPCTSTR szFilename) @@ -416,19 +465,12 @@ BOOL MapRom(LPCTSTR szFilename) dwRomSize = 0; return FALSE; } - // check for packed ROM image - if ((*(DWORD *) pbyRom & 0xF0F0F0F0) != 0) - { - UnmapRom(); // free memory - AbortMessage(_T("Packed ROM image detected!")); - return FALSE; - } return TRUE; } VOID UnmapRom(VOID) { - if (pbyRom==NULL) return; + if (pbyRom == NULL) return; RestorePatches(); // restore ROM Patches UnmapViewOfFile(pbyRom); CloseHandle(hRomMap); @@ -437,6 +479,7 @@ VOID UnmapRom(VOID) hRomMap = NULL; hRomFile = NULL; dwRomSize = 0; + wRomCrc = 0; return; } @@ -448,28 +491,33 @@ VOID UnmapRom(VOID) //# //################ -WORD CrcPort2(VOID) // calculate fingerprint of port2 +BOOL CrcPort2(WORD *pwCrc) // calculate fingerprint of port2 { DWORD dwCount; DWORD dwFileSize; - WORD wCrc = 0; + + *pwCrc = 0; // port2 CRC isn't available - if (pbyPort2 == NULL) return wCrc; + if (pbyPort2 == NULL) return TRUE; dwFileSize = GetFileSize(hPort2File, &dwCount); // get real filesize _ASSERT(dwCount == 0); // isn't created by MapPort2() for (dwCount = 0;dwCount < dwFileSize; ++dwCount) - wCrc = (wCrc >> 4) ^ (((wCrc ^ ((WORD) pbyPort2[dwCount])) & 0xf) * 0x1081); - return wCrc; + { + if ((pbyPort2[dwCount] & 0xF0) != 0) // data packed? + return FALSE; + + *pwCrc = (*pwCrc >> 4) ^ (((*pwCrc ^ ((WORD) pbyPort2[dwCount])) & 0xf) * 0x1081); + } + return TRUE; } BOOL MapPort2(LPCTSTR szFilename) { - DWORD dwFileSizeLo; - DWORD dwFileSizeHi; - + DWORD dwFileSizeLo,dwFileSizeHi,dwCount; + if (pbyPort2 != NULL) return FALSE; bPort2Writeable = TRUE; dwPort2Size = 0; // reset size of port2 @@ -509,14 +557,23 @@ BOOL MapPort2(LPCTSTR szFilename) bPort2Writeable = FALSE; return FALSE; } - if (dwFileSizeLo & 0x2FFFF) - { // file size is wrong + + // count number of set bits + for (dwCount = 0, dwFileSizeHi = dwFileSizeLo; dwFileSizeHi != 0;dwFileSizeHi >>= 1) + { + if ((dwFileSizeHi & 0x1) != 0) ++dwCount; + } + + // size not 32, 128, 256, 512, 1024, 2048 or 4096 KB + if (dwCount != 1 || (dwFileSizeLo & 0xFF02FFFF) != 0) + { CloseHandle(hPort2File); hPort2File = NULL; dwPort2Mask = 0; bPort2Writeable = FALSE; return FALSE; } + dwPort2Mask = (dwFileSizeLo - 1) >> 18; // mask for valid address lines of the BS-FF hPort2Map = CreateFileMapping(hPort2File, NULL, bPort2Writeable ? PAGE_READWRITE : PAGE_READONLY, 0, dwFileSizeLo, NULL); @@ -540,12 +597,19 @@ BOOL MapPort2(LPCTSTR szFilename) return FALSE; } dwPort2Size = dwFileSizeLo / 2048; // mapping size of port2 + + if (CrcPort2(&wPort2Crc) == FALSE) // calculate fingerprint of port2 + { + UnmapPort2(); // free memory + AbortMessage(_T("Packed Port 2 image detected!")); + return FALSE; + } return TRUE; } VOID UnmapPort2(VOID) { - if (pbyPort2==NULL) return; + if (pbyPort2 == NULL) return; UnmapViewOfFile(pbyPort2); CloseHandle(hPort2Map); CloseHandle(hPort2File); @@ -555,6 +619,7 @@ VOID UnmapPort2(VOID) dwPort2Size = 0; // reset size of port2 dwPort2Mask = 0; bPort2Writeable = FALSE; + wPort2Crc = 0; return; } @@ -566,6 +631,19 @@ VOID UnmapPort2(VOID) //# //################ +static BOOL IsDataPacked(VOID *pMem, DWORD dwSize) +{ + _ASSERT((dwSize % sizeof(DWORD)) == 0); + if ((dwSize % sizeof(DWORD)) != 0) return TRUE; + + for (dwSize /= sizeof(DWORD); dwSize-- > 0;) + { + if ((*((DWORD *) pMem)++ & 0xF0F0F0F0) != 0) + return TRUE; + } + return FALSE; +} + VOID ResetDocument(VOID) { if (szCurrentKml[0]) @@ -691,6 +769,8 @@ restore: BOOL OpenDocument(LPCTSTR szFilename) { + #define CHECKAREA(s,e) (offsetof(CHIPSET,e)-offsetof(CHIPSET,s)+sizeof(((CHIPSET *)NULL)->e)) + HANDLE hFile = INVALID_HANDLE_VALUE; DWORD lBytesRead,lSizeofChipset; BYTE pbyFileSignature[16]; @@ -840,6 +920,8 @@ BOOL OpenDocument(LPCTSTR szFilename) ReadFile(hFile, Chipset.Port0, Chipset.Port0Size*2048, &lBytesRead, NULL); if (lBytesRead != Chipset.Port0Size*2048) goto read_err; + + if (IsDataPacked(Chipset.Port0,Chipset.Port0Size*2048)) goto read_err; } if (Chipset.Port1Size) @@ -853,6 +935,8 @@ BOOL OpenDocument(LPCTSTR szFilename) ReadFile(hFile, Chipset.Port1, Chipset.Port1Size*2048, &lBytesRead, NULL); if (lBytesRead != Chipset.Port1Size*2048) goto read_err; + + if (IsDataPacked(Chipset.Port1,Chipset.Port1Size*2048)) goto read_err; } // HP48SX/GX @@ -860,7 +944,7 @@ BOOL OpenDocument(LPCTSTR szFilename) { MapPort2((nArgc < 3) ? szPort2Filename : ppArgv[2]); // port2 changed and card detection enabled - if ( Chipset.wPort2Crc != CrcPort2() + if ( Chipset.wPort2Crc != wPort2Crc && (Chipset.IORam[CARDCTL] & ECDT) != 0 && (Chipset.IORam[TIMER2_CTRL] & RUN) != 0 ) { @@ -884,20 +968,26 @@ BOOL OpenDocument(LPCTSTR szFilename) ReadFile(hFile, Chipset.Port2, Chipset.Port2Size*2048, &lBytesRead, NULL); if (lBytesRead != Chipset.Port2Size*2048) goto read_err; + if (IsDataPacked(Chipset.Port2,Chipset.Port2Size*2048)) goto read_err; + bPort2Writeable = TRUE; Chipset.cards_status = 0xF; } } - LoadBreakpointList(hFile); // load debugger breakpoint list RomSwitch(Chipset.Bank_FF); // reload ROM view of HP49G and map memory - if (Chipset.wRomCrc != CrcRom()) // ROM changed + if (Chipset.wRomCrc != wRomCrc) // ROM changed { CpuReset(); Chipset.Shutdn = FALSE; // automatic restart } + // check CPU main registers + if (IsDataPacked(Chipset.A,CHECKAREA(A,R4))) goto read_err; + + LoadBreakpointList(hFile); // load debugger breakpoint list + lstrcpy(szCurrentFilename, szFilename); _ASSERT(hCurrentFile == NULL); hCurrentFile = hFile; @@ -924,13 +1014,13 @@ restore: MapPort2((nArgc < 3) ? szPort2Filename : ppArgv[2]); } return FALSE; + #undef CHECKAREA } BOOL SaveDocument(VOID) { DWORD lBytesWritten; DWORD lSizeofChipset; - LPBYTE pbySig; UINT nLength; WINDOWPLACEMENT wndpl; @@ -944,18 +1034,14 @@ BOOL SaveDocument(VOID) SetFilePointer(hCurrentFile,0,NULL,FILE_BEGIN); - // get document signature - pbySig = (Chipset.type=='6' || Chipset.type=='A') - ? pbySignatureA : (Chipset.type=='E' ? pbySignatureB : ((Chipset.type!='X') ? pbySignatureE : pbySignatureV)); - - if (!WriteFile(hCurrentFile, pbySig, 16, &lBytesWritten, NULL)) + if (!WriteFile(hCurrentFile, pbySignatureE, sizeof(pbySignatureE), &lBytesWritten, NULL)) { AbortMessage(_T("Could not write into file !")); return FALSE; } - Chipset.wRomCrc = CrcRom(); // save fingerprint of ROM - Chipset.wPort2Crc = CrcPort2(); // save fingerprint of port2 + CrcRom(&Chipset.wRomCrc); // save fingerprint of ROM + CrcPort2(&Chipset.wPort2Crc); // save fingerprint of port2 nLength = lstrlen(szCurrentKml); WriteFile(hCurrentFile, &nLength, sizeof(nLength), &lBytesWritten, NULL); @@ -1027,6 +1113,8 @@ BOOL SaveBackup(VOID) if (pbyRom == NULL) return FALSE; + _ASSERT(nState != SM_RUN); // emulation engine is running + // save window position _ASSERT(hWnd); // window open wndpl.length = sizeof(wndpl); // update saved window position @@ -1185,7 +1273,6 @@ BOOL GetSaveAsFilename(VOID) _T("Emu39 Document (*.E39)\0*.E39\0") _T("Emu48 Document (*.E48)\0*.E48\0") _T("Emu49 Document (*.E49)\0*.E49\0") - _T("Win48 Document (*.W48)\0*.W48\0") _T("\0\0"); ofn.lpstrDefExt = _T("E48"); // HP48SX/GX ofn.nFilterIndex = 3; @@ -1229,7 +1316,6 @@ BOOL GetLoadObjectFilename(VOID) if (GetOpenFileName(&ofn) == FALSE) return FALSE; _ASSERT(ARRAYSIZEOF(szBufferFilename) == ofn.nMaxFile); lstrcpy(szBufferFilename, ofn.lpstrFile); - HeapFree(hHeap,0,ofn.lpstrFile); return TRUE; } @@ -1259,7 +1345,7 @@ BOOL GetSaveObjectFilename(VOID) //# //################ -WORD WriteStack(LPBYTE lpBuf,DWORD dwSize) // separated from LoadObject() +WORD WriteStack(UINT nStkLevel,LPBYTE lpBuf,DWORD dwSize) // separated from LoadObject() { BOOL bBinary; DWORD dwAddress, i; @@ -1272,31 +1358,32 @@ WORD WriteStack(LPBYTE lpBuf,DWORD dwSize) // separated from LoadObject() && (lpBuf[dwSize+5]==((cCurrentRomType!='X') ? '8' : '9')) && (lpBuf[dwSize+6]=='-')); - for (i = 0; i < dwSize; i++) + for (dwAddress = 0, i = 0; i < dwSize; i++) { BYTE byTwoNibs = lpBuf[i+dwSize]; - lpBuf[i*2 ] = (BYTE)(byTwoNibs&0xF); - lpBuf[i*2+1] = (BYTE)(byTwoNibs>>4); + lpBuf[dwAddress++] = (BYTE)(byTwoNibs&0xF); + lpBuf[dwAddress++] = (BYTE)(byTwoNibs>>4); } + dwSize = dwAddress; // unpacked buffer size + if (bBinary == TRUE) { // load as binary - dwSize = RPL_ObjectSize(lpBuf+16); + dwSize = RPL_ObjectSize(lpBuf+16,dwSize-16); + if (dwSize == BAD_OB) return S_ERR_OBJECT; dwAddress = RPL_CreateTemp(dwSize); if (dwAddress == 0) return S_ERR_BINARY; - Nwrite(lpBuf+16,dwAddress,dwSize); } else { // load as string - dwSize *= 2; dwAddress = RPL_CreateTemp(dwSize+10); if (dwAddress == 0) return S_ERR_ASCII; Write5(dwAddress,0x02A2C); // String Write5(dwAddress+5,dwSize+5); // length of String Nwrite(lpBuf,dwAddress+10,dwSize); // data } - RPL_Push(dwAddress); + RPL_Push(nStkLevel,dwAddress); return S_ERR_NO; } @@ -1331,7 +1418,10 @@ BOOL LoadObject(LPCTSTR szFilename) // separated stack writing part ReadFile(hFile, lpBuf+dwFileSizeLow, dwFileSizeLow, &dwFileSizeHigh, NULL); CloseHandle(hFile); - wError = WriteStack(lpBuf,dwFileSizeLow); + wError = WriteStack(1,lpBuf,dwFileSizeLow); + + if (wError == S_ERR_OBJECT) + AbortMessage(_T("This isn't a valid binary file.")); if (wError == S_ERR_BINARY) AbortMessage(_T("The calculator does not have enough\nfree memory to load this binary file.")); diff --git a/Sources/Emu48/KEYBOARD.C b/Sources/Emu48/KEYBOARD.C index c4c82b6..53d3dab 100644 --- a/Sources/Emu48/KEYBOARD.C +++ b/Sources/Emu48/KEYBOARD.C @@ -14,6 +14,7 @@ static WORD Keyboard_GetIR(VOID) { WORD r = 0; + // OR[0:8] are wired on Clarke/Yorke chip if (Chipset.out==0) return 0; if (Chipset.out&0x001) r|=Chipset.Keyboard_Row[0]; if (Chipset.out&0x002) r|=Chipset.Keyboard_Row[1]; @@ -34,10 +35,17 @@ VOID ScanKeyboard(BOOL bActive, BOOL bReset) // bReset = TRUE -> Reset Chipset.in interrupt state register // FALSE -> generate interrupt only for new pressed keys - // keyboard read active? + // keyboard read not active? if (!( bActive || Chipset.Shutdn || Chipset.IR15X || (Chipset.intk && (Chipset.IORam[TIMER2_CTRL]&RUN) != 0))) - return; // -> no + { + EnterCriticalSection(&csKeyLock); + { + Chipset.in &= ~0x8000; // remove ON key + } + LeaveCriticalSection(&csKeyLock); + return; + } EnterCriticalSection(&csKeyLock); // synchronize { @@ -106,6 +114,8 @@ VOID KeyboardEvent(BOOL bPress, UINT out, UINT in) // "out" is outside Keyboard_Row if (out >= ARRAYSIZEOF(Chipset.Keyboard_Row)) return; + // in &= 0x1FF; // only IR[0:8] are wired on Clarke/Yorke chip + _ASSERT(out < ARRAYSIZEOF(Chipset.Keyboard_Row)); if (bPress) // key pressed Chipset.Keyboard_Row[out] |= in; // set key marker in keyboard row diff --git a/Sources/Emu48/KEYMACRO.C b/Sources/Emu48/KEYMACRO.C index dc41644..37be34f 100644 --- a/Sources/Emu48/KEYMACRO.C +++ b/Sources/Emu48/KEYMACRO.C @@ -153,7 +153,7 @@ LRESULT OnToolMacroNew(VOID) if (hMacroFile == INVALID_HANDLE_VALUE) return 0; // write header - WriteFile(hMacroFile,KEYMACROHEAD,strlen(KEYMACROHEAD),&dwWritten,NULL); + WriteFile(hMacroFile,KEYMACROHEAD,sizeof(KEYMACROHEAD) - 1,&dwWritten,NULL); _ASSERT(dwWritten == (DWORD) strlen(KEYMACROHEAD)); // write extension length @@ -294,7 +294,7 @@ static VOID SliderEnable(HWND hDlg,BOOL bEnable) // // Macro settings dialog // -static BOOL CALLBACK MacroProc(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK MacroProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { @@ -319,7 +319,7 @@ static BOOL CALLBACK MacroProc(HWND hDlg, UINT message, DWORD wParam, LONG lPara return TRUE; case IDOK: // get macro data - nMacroTimeout = MAX_SPEED - SendDlgItemMessage(hDlg,IDC_MACRO_SLIDER,TBM_GETPOS,0,0); + nMacroTimeout = MAX_SPEED - (INT) SendDlgItemMessage(hDlg,IDC_MACRO_SLIDER,TBM_GETPOS,0,0); bMacroRealSpeed = IsDlgButtonChecked(hDlg,IDC_MACRO_REAL); // no break case IDCANCEL: diff --git a/Sources/Emu48/KML.C b/Sources/Emu48/KML.C index b52c7c2..1e5d421 100644 --- a/Sources/Emu48/KML.C +++ b/Sources/Emu48/KML.C @@ -195,7 +195,7 @@ static VOID __cdecl PrintfToLog(LPCTSTR lpFormat, ...) return; } -static BOOL CALLBACK KMLLogProc(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK KMLLogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { LPCTSTR szString; @@ -203,7 +203,7 @@ static BOOL CALLBACK KMLLogProc(HWND hDlg, UINT message, DWORD wParam, LONG lPar { case WM_INITDIALOG: // set OK - EnableWindow(GetDlgItem(hDlg,IDOK),lParam); + EnableWindow(GetDlgItem(hDlg,IDOK),(BOOL) lParam); // set IDC_TITLE szString = GetStringParam(pKml, TOK_GLOBAL, TOK_TITLE, 0); if (szString == NULL) szString = _T("Untitled"); @@ -384,7 +384,7 @@ static VOID BrowseFolder(HWND hDlg) return; } -static BOOL CALLBACK ChooseKMLProc(HWND hDlg, UINT message, DWORD wParam, LONG lParam) +static INT_PTR CALLBACK ChooseKMLProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hList; KmlScript* pList; @@ -399,7 +399,7 @@ static BOOL CALLBACK ChooseKMLProc(HWND hDlg, UINT message, DWORD wParam, LONG l pList = pKmlList; while (pList) { - nIndex = SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)pList->szTitle); + nIndex = (UINT) SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)pList->szTitle); SendMessage(hList, CB_SETITEMDATA, nIndex, (LPARAM)pList->nId); pList = pList->pNext; } @@ -420,7 +420,7 @@ static BOOL CALLBACK ChooseKMLProc(HWND hDlg, UINT message, DWORD wParam, LONG l pList = pKmlList; while (pList) { - nIndex = SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)pList->szTitle); + nIndex = (UINT) SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)pList->szTitle); SendMessage(hList, CB_SETITEMDATA, nIndex, (LPARAM)pList->nId); pList = pList->pNext; } @@ -429,8 +429,8 @@ static BOOL CALLBACK ChooseKMLProc(HWND hDlg, UINT message, DWORD wParam, LONG l case IDOK: GetDlgItemText(hDlg,IDC_EMUDIR,szEmuDirectory,ARRAYSIZEOF(szEmuDirectory)); hList = GetDlgItem(hDlg,IDC_KMLSCRIPT); - nIndex = SendMessage(hList, CB_GETCURSEL, 0, 0); - nIndex = SendMessage(hList, CB_GETITEMDATA, nIndex, 0); + nIndex = (UINT) SendMessage(hList, CB_GETCURSEL, 0, 0); + nIndex = (UINT) SendMessage(hList, CB_GETITEMDATA, nIndex, 0); pList = pKmlList; while (pList) { @@ -454,12 +454,12 @@ static BOOL CALLBACK ChooseKMLProc(HWND hDlg, UINT message, DWORD wParam, LONG l BOOL DisplayChooseKml(CHAR cType) { - BOOL bResult; + INT_PTR nResult; cKmlType = cType; CreateKmlList(); - bResult = DialogBox(hApp, MAKEINTRESOURCE(IDD_CHOOSEKML), hWnd, (DLGPROC)ChooseKMLProc); + nResult = DialogBox(hApp, MAKEINTRESOURCE(IDD_CHOOSEKML), hWnd, (DLGPROC)ChooseKMLProc); DestroyKmlList(); - return (bResult == IDOK); + return (nResult == IDOK); } @@ -775,7 +775,7 @@ loop: PrintfToLog(_T("%i: Parameter %i of %s must be a string."), nLexLine, j+1, pLexToken[i].szName); goto errline; // free memory of arguments } - pLine->nParam[j++] = (DWORD)szLexString; + pLine->nParam[j++] = (DWORD_PTR) szLexString; nParams >>= 3; goto loop; } @@ -1111,11 +1111,11 @@ static VOID InitGlobal(KmlBlock* pBlock) PrintfToLog(_T("Calculator Model : %c"), cCurrentRomType); break; case TOK_CLASS: - nCurrentClass = pLine->nParam[0]; + nCurrentClass = (UINT) pLine->nParam[0]; PrintfToLog(_T("Calculator Class : %u"), nCurrentClass); break; case TOK_DEBUG: - bDebug = pLine->nParam[0]&1; + bDebug = (BOOL) pLine->nParam[0]&1; PrintfToLog(_T("Debug %s"), bDebug?_T("On"):_T("Off")); break; case TOK_ROM: @@ -1174,12 +1174,12 @@ static KmlLine* InitBackground(KmlBlock* pBlock) switch (pLine->eCommand) { case TOK_OFFSET: - nBackgroundX = pLine->nParam[0]; - nBackgroundY = pLine->nParam[1]; + nBackgroundX = (UINT) pLine->nParam[0]; + nBackgroundY = (UINT) pLine->nParam[1]; break; case TOK_SIZE: - nBackgroundW = pLine->nParam[0]; - nBackgroundH = pLine->nParam[1]; + nBackgroundW = (UINT) pLine->nParam[0]; + nBackgroundH = (UINT) pLine->nParam[1]; break; case TOK_END: return pLine; @@ -1199,16 +1199,17 @@ static KmlLine* InitLcd(KmlBlock* pBlock) switch (pLine->eCommand) { case TOK_OFFSET: - nLcdX = pLine->nParam[0]; - nLcdY = pLine->nParam[1]; + nLcdX = (UINT) pLine->nParam[0]; + nLcdY = (UINT) pLine->nParam[1]; break; case TOK_ZOOM: - nLcdZoom = pLine->nParam[0]; + nLcdZoom = (UINT) pLine->nParam[0]; if (!(nLcdZoom >= 1 && nLcdZoom <= 4)) nLcdZoom = 1; break; case TOK_COLOR: - SetLcdColor(pLine->nParam[0],pLine->nParam[1],pLine->nParam[2],pLine->nParam[3]); + SetLcdColor((UINT) pLine->nParam[0],(UINT) pLine->nParam[1], + (UINT) pLine->nParam[2],(UINT) pLine->nParam[3]); break; case TOK_END: return pLine; @@ -1235,16 +1236,16 @@ static KmlLine* InitAnnunciator(KmlBlock* pBlock) switch (pLine->eCommand) { case TOK_OFFSET: - pAnnunciator[nId].nOx = pLine->nParam[0]; - pAnnunciator[nId].nOy = pLine->nParam[1]; + pAnnunciator[nId].nOx = (UINT) pLine->nParam[0]; + pAnnunciator[nId].nOy = (UINT) pLine->nParam[1]; break; case TOK_DOWN: - pAnnunciator[nId].nDx = pLine->nParam[0]; - pAnnunciator[nId].nDy = pLine->nParam[1]; + pAnnunciator[nId].nDx = (UINT) pLine->nParam[0]; + pAnnunciator[nId].nDy = (UINT) pLine->nParam[1]; break; case TOK_SIZE: - pAnnunciator[nId].nCx = pLine->nParam[0]; - pAnnunciator[nId].nCy = pLine->nParam[1]; + pAnnunciator[nId].nCx = (UINT) pLine->nParam[0]; + pAnnunciator[nId].nCy = (UINT) pLine->nParam[1]; break; case TOK_END: return pLine; @@ -1281,23 +1282,23 @@ static VOID InitButton(KmlBlock* pBlock) switch (pLine->eCommand) { case TOK_TYPE: - pButton[nButtons].nType = pLine->nParam[0]; + pButton[nButtons].nType = (UINT) pLine->nParam[0]; break; case TOK_OFFSET: - pButton[nButtons].nOx = pLine->nParam[0]; - pButton[nButtons].nOy = pLine->nParam[1]; + pButton[nButtons].nOx = (UINT) pLine->nParam[0]; + pButton[nButtons].nOy = (UINT) pLine->nParam[1]; break; case TOK_DOWN: - pButton[nButtons].nDx = pLine->nParam[0]; - pButton[nButtons].nDy = pLine->nParam[1]; + pButton[nButtons].nDx = (UINT) pLine->nParam[0]; + pButton[nButtons].nDy = (UINT) pLine->nParam[1]; break; case TOK_SIZE: - pButton[nButtons].nCx = pLine->nParam[0]; - pButton[nButtons].nCy = pLine->nParam[1]; + pButton[nButtons].nCx = (UINT) pLine->nParam[0]; + pButton[nButtons].nCy = (UINT) pLine->nParam[1]; break; case TOK_OUTIN: - pButton[nButtons].nOut = pLine->nParam[0]; - pButton[nButtons].nIn = pLine->nParam[1]; + pButton[nButtons].nOut = (UINT) pLine->nParam[0]; + pButton[nButtons].nIn = (UINT) pLine->nParam[1]; break; case TOK_ONDOWN: pButton[nButtons].pOnDown = pLine; @@ -1397,15 +1398,15 @@ static KmlLine* RunLine(KmlLine* pLine) { case TOK_MAP: if (byVKeyMap[pLine->nParam[0]&0xFF]&1) - PressButtonById(pLine->nParam[1]); + PressButtonById((UINT) pLine->nParam[1]); else - ReleaseButtonById(pLine->nParam[1]); + ReleaseButtonById((UINT) pLine->nParam[1]); break; case TOK_PRESS: - PressButtonById(pLine->nParam[0]); + PressButtonById((UINT) pLine->nParam[0]); break; case TOK_RELEASE: - ReleaseButtonById(pLine->nParam[0]); + ReleaseButtonById((UINT) pLine->nParam[0]); break; case TOK_MENUITEM: PostMessage(hWnd, WM_COMMAND, 0x19C40+(pLine->nParam[0]&0xFF), 0); @@ -1519,6 +1520,7 @@ VOID KillKML(VOID) nBackgroundH = 0; nLcdZoom = 1; cCurrentRomType = 0; + nCurrentClass = 0; UpdateWindowStatus(); ResizeWindow(); return; @@ -1564,7 +1566,7 @@ static DWORD GetIntegerParam(KmlBlock* pBlock, TokenId eBlock, TokenId eCommand, { if (pLine->eCommand == eCommand) { - return pLine->nParam[nParam]; + return (DWORD) pLine->nParam[nParam]; } pLine = pLine->pNext; } @@ -1626,23 +1628,27 @@ static VOID AdjustPixel(UINT x, UINT y, BYTE byOffset) static __inline VOID TransparentCircle(UINT cx, UINT cy, UINT r) { #define HIGHADJ 0x80 // color incr. at center - #define LOWADJ 0x08 // color incr. at border + #define LOWADJ 0x10 // color incr. at border - INT x, y; - INT rr = r * r; // calculate r^2 + UINT x, y, rr, rrc; + + if (r < 2) return; // radius 2 pixel minimum + + rr = r * r; // calculate r^2 + rrc = (r-1) * (r-1); // calculate (r-1)^2 for color steps // y-rows of circle - for (y = 0; y < (INT) r; ++y) + for (y = 0; y < r; ++y) { - INT yy = y * y; // calculate y^2 + UINT yy = y * y; // calculate y^2 // x-columns of circle - INT nXWidth = iSqrt(rr-yy); + UINT nXWidth = iSqrt(rr-yy); for (x = 0; x < nXWidth; ++x) { - // color offset, sqrt(x*x+y*y) <= r !!! - BYTE byOff = HIGHADJ - (BYTE) (iSqrt((x*x+yy) * (HIGHADJ-LOWADJ)*(HIGHADJ-LOWADJ) / rr)); + // color offset, sqrt(x*x+y*y) < r !!! + BYTE byOff = HIGHADJ - (BYTE) (iSqrt((x*x+yy) * (HIGHADJ-LOWADJ)*(HIGHADJ-LOWADJ) / rrc)); AdjustPixel(cx+x, cy+y, byOff); if (x != 0) AdjustPixel(cx-x, cy+y, byOff); @@ -2002,19 +2008,20 @@ VOID MouseMovesTo(UINT nFlags, DWORD x, DWORD y) _ASSERT(hCursorArrow); _ASSERT(hCursorHand); hCursor = hCursorArrow; // normal arrow cursor - if (!bClassicCursor) + for (i = 0; i < nButtons; i++) // scan all buttons { - for (i = 0; i < nButtons; i++) // scan all buttons + if (ClipButton(x,y,i)) // cursor over button? { - if (ClipButton(x,y,i)) // cursor over button? - { - hCursor = hCursorHand; // hand cursor - break; - } + hCursor = hCursorHand; // hand cursor + break; } } // make sure that class cursor is NULL - _ASSERT(GetClassLong(hWnd,GCL_HCURSOR) == 0); + #if defined _WIN64 + _ASSERT(GetClassLong(hWnd,GCLP_HCURSOR) == 0); + #else + _ASSERT(GetClassLong(hWnd,GCL_HCURSOR) == 0); + #endif SetCursor(hCursor); if (!(nFlags&MK_LBUTTON)) return; // left mouse key not pressed -> quit @@ -2224,6 +2231,12 @@ BOOL InitKML(LPCTSTR szFilename, BOOL bNoLog) AddToLog(_T("This KML Script doesn't specify the background bitmap, or bitmap could not be loaded.")); goto quit; } + if (!CrcRom(&wRomCrc)) // build patched ROM fingerprint and check for unpacked data + { + AddToLog(_T("Packed ROM image detected.")); + UnmapRom(); // free memory + goto quit; + } CreateLcdBitmap(); diff --git a/Sources/Emu48/KML.H b/Sources/Emu48/KML.H index 69b772b..0d188dd 100644 --- a/Sources/Emu48/KML.H +++ b/Sources/Emu48/KML.H @@ -77,7 +77,7 @@ typedef struct KmlLine { struct KmlLine* pNext; TokenId eCommand; - DWORD nParam[6]; + DWORD_PTR nParam[6]; } KmlLine; typedef struct KmlBlock diff --git a/Sources/Emu48/LOWBAT.C b/Sources/Emu48/LOWBAT.C new file mode 100644 index 0000000..c082e21 --- /dev/null +++ b/Sources/Emu48/LOWBAT.C @@ -0,0 +1,118 @@ +/* + * lowbat.c + * + * This file is part of Emu48 + * + * Copyright (C) 2006 Christoph Gießelink + * + */ +#include "pch.h" +#include "Emu48.h" +#include "io.h" // I/O definitions + +// #define BAT_SIMULATION // switch low bat simulation + +#define BAT_FREQ (60*1000) // bat update time in ms (real machine = 60us, HP28C = 60s) + +static HANDLE hCThreadBat = NULL; +static HANDLE hEventBat; + +static DWORD WINAPI LowBatThread(LPVOID pParam) +{ + BOOL bLBI,bVLBI; + + do + { + GetBatteryState(&bLBI,&bVLBI); // get battery state + + // very low bat detection + bVLBI = bVLBI && (Chipset.IORam[LPE] & EVLBI) != 0; + + IOBit(LPD,VLBI,bVLBI); // set VLBI + IOBit(SRQ1,VSRQ,bVLBI); // and service bit + + if (bVLBI) // VLBI detected + { + Chipset.SoftInt = TRUE; + bInterrupt = TRUE; + + if (Chipset.Shutdn) // CPU shut down + { + Chipset.bShutdnWake = TRUE; // wake up from SHUTDN mode + SetEvent(hEventShutdn); // wake up emulation thread + } + } + } + while (WaitForSingleObject(hEventBat,BAT_FREQ) == WAIT_TIMEOUT); + + return 0; + UNREFERENCED_PARAMETER(pParam); +} + +VOID StartBatMeasure(VOID) +{ + if (hCThreadBat) // Bat measuring thread running + return; // -> quit + + // event to cancel Bat refresh loop + hEventBat = CreateEvent(NULL,FALSE,FALSE,NULL); + + VERIFY(hCThreadBat = CreateThread(NULL,0,&LowBatThread,NULL,0,NULL)); + return; +} + +VOID StopBatMeasure(VOID) +{ + if (hCThreadBat == NULL) // thread stopped + return; // -> quit + + SetEvent(hEventBat); // leave Bat update thread + WaitForSingleObject(hCThreadBat,INFINITE); + CloseHandle(hCThreadBat); + hCThreadBat = NULL; // set flag Bat update stopped + CloseHandle(hEventBat); // close Bat event + return; +} + +VOID GetBatteryState(BOOL *pbLBI, BOOL *pbVLBI) +{ +#if defined BAT_SIMULATION + switch (GetPrivateProfileInt(_T("LowBat"),_T("Level"),2,_T(".\\Lowbat.ini"))) + { + case 0: // empty + *pbLBI = TRUE; + *pbVLBI = TRUE; + break; + case 1: // low + *pbLBI = TRUE; + *pbVLBI = FALSE; + break; + default: // full + *pbLBI = FALSE; + *pbVLBI = FALSE; + break; + } +#else + SYSTEM_POWER_STATUS sSps; + + *pbLBI = FALSE; // no battery warning + *pbVLBI = FALSE; + + VERIFY(GetSystemPowerStatus(&sSps)); + + // battery powered + if (sSps.ACLineStatus == AC_LINE_OFFLINE) + { + // on critical battery state make sure that lowbat flag is also set + if ((sSps.BatteryFlag & BATTERY_FLAG_CRITICAL) != 0) + sSps.BatteryFlag |= BATTERY_FLAG_LOW; + + // low bat detection + *pbLBI = ((sSps.BatteryFlag & BATTERY_FLAG_LOW) != 0); + + // very low bat detection + *pbVLBI = ((sSps.BatteryFlag & BATTERY_FLAG_CRITICAL) != 0); + } +#endif + return; +} diff --git a/Sources/Emu48/MOPS.C b/Sources/Emu48/MOPS.C index 8e2d939..f814f1b 100644 --- a/Sources/Emu48/MOPS.C +++ b/Sources/Emu48/MOPS.C @@ -721,7 +721,7 @@ VOID Npeek(BYTE *a, DWORD d, UINT s) c = MIN(s,0x40-v); } while (0); - ReadIO(a,v,c); + ReadIO(a,v,c,FALSE); } while (0); } @@ -772,7 +772,7 @@ VOID Nread(BYTE *a, DWORD d, UINT s) { v = d&0x3F; c = MIN(s,0x40-v); - ReadIO(a,v,c); + ReadIO(a,v,c,TRUE); // reading MSB of timer2 update the CRC register if (v+c == 0x40) UpCRC(a[c-1]); // timer2 MSB touched, update the CRC register @@ -987,10 +987,10 @@ VOID IOBit(DWORD d, BYTE b, BOOL s) // set/clear bit in I/O section LeaveCriticalSection(&csIOLock); } -VOID ReadIO(BYTE *a, DWORD d, DWORD s) +VOID ReadIO(BYTE *a, DWORD d, DWORD s, BOOL bUpdate) { - BOOL bNINT; - BOOL bNINT2; + BOOL bNINT,bNINT2; + BOOL bLBI,bVLBI; BYTE c = 0xFF; // LINECOUNT not initialized BOOL rbr_acc = FALSE; // flag to receive data @@ -1015,10 +1015,28 @@ VOID ReadIO(BYTE *a, DWORD d, DWORD s) case 0x05: *a = (Chipset.crc>> 4)&0xF; break; case 0x06: *a = (Chipset.crc>> 8)&0xF; break; case 0x07: *a = (Chipset.crc>>12)&0xF; break; - case 0x08: *a = 0; break; + case 0x08: // LPD + // LB2 and LB1 not emulated, must be 0 + _ASSERT((Chipset.IORam[LPD] & (LB2 | LB1)) == 0); + + GetBatteryState(&bLBI,&bVLBI); // get battery state + + // check if battery states enabled + bLBI = bLBI && ((Chipset.IORam[LPE] & ELBI) != 0); + bVLBI = bVLBI && ((Chipset.IORam[LPE] & EVLBI) != 0); + + // set IO bits + IOBit(LPD,LB0,bLBI); + IOBit(LPD,VLBI,bVLBI); + IOBit(SRQ1,VSRQ,bVLBI); + *a = Chipset.IORam[d]; + break; case 0x09: // LPE *a = Chipset.IORam[d]; - Chipset.IORam[d] &= ~RST; // clear RST bit after reading + if (bUpdate) + { + Chipset.IORam[d] &= ~RST; // clear RST bit after reading + } break; case 0x0A: *a = 0; break; // case 0x0B: *a = Chipset.IORam[d]; break; @@ -1091,17 +1109,25 @@ VOID ReadIO(BYTE *a, DWORD d, DWORD s) break; case 0x14: // RBR LSB case 0x15: // RBR MSB - Chipset.IORam[RCS]&=~RBF; - *a = Chipset.IORam[d]; // return RBR value - UpdateUSRQ(); // update USRQ - rbr_acc = TRUE; // search for new RBR value - #if defined DEBUG_SERIAL + if (bUpdate) { - TCHAR buffer[256]; - wsprintf(buffer,_T("%.5lx: RBR %s Read: %x\n"),Chipset.pc,(d==0x14) ? "LSB" : "MSB",*a); - OutputDebugString(buffer); + Chipset.IORam[RCS] &= ~RBF; + *a = Chipset.IORam[d]; // return RBR value + UpdateUSRQ(); // update USRQ + rbr_acc = TRUE; // search for new RBR value + #if defined DEBUG_SERIAL + { + TCHAR buffer[256]; + wsprintf(buffer,_T("%.5lx: RBR %s Read: %x\n"),Chipset.pc,(d==0x14) ? "LSB" : "MSB",*a); + OutputDebugString(buffer); + } + #endif + } + else + { + *a = Chipset.IORam[d]; // return RBR value + UpdateUSRQ(); // update USRQ } - #endif break; // case 0x16: *a = Chipset.IORam[d]; break; // TBR LSB // case 0x17: *a = Chipset.IORam[d]; break; // TBR MSB diff --git a/Sources/Emu48/OPCODES.C b/Sources/Emu48/OPCODES.C index d94aa24..f3d9bcc 100644 --- a/Sources/Emu48/OPCODES.C +++ b/Sources/Emu48/OPCODES.C @@ -1028,7 +1028,8 @@ VOID o807(LPBYTE I) // SHUTDN bShutdn = FALSE; // don't shut down } } - if (w.in==0 && bShutdn) // shut down only when enabled + ScanKeyboard(TRUE,FALSE); // update Chipset.in register (direct) + if (w.in == 0 && bShutdn) // shut down only when enabled { w.Shutdn = TRUE; // set mode before exit emulation loop bInterrupt = TRUE; @@ -1797,10 +1798,7 @@ VOID o83n(LPBYTE I) // ?HST=0 m { w.cycles+=6; w.pc+=3; - if ((w.HST&I[2])==0) - w.carry=TRUE; - else - w.carry=FALSE; + w.carry=((w.HST&I[2])==0); GOYES3; } @@ -1840,10 +1838,7 @@ VOID o88n(LPBYTE I) // ?P# n { w.cycles+=6; w.pc+=3; - if (w.P!=I[2]) - w.carry=TRUE; - else - w.carry=FALSE; + w.carry=(w.P!=I[2]); GOYES3; } @@ -1851,10 +1846,7 @@ VOID o89n(LPBYTE I) // ?P= n { w.cycles+=6; w.pc+=3; - if (w.P==I[2]) - w.carry=TRUE; - else - w.carry=FALSE; + w.carry=(w.P==I[2]); GOYES3; } diff --git a/Sources/Emu48/OPS.H b/Sources/Emu48/OPS.H index 8b6b939..5d6aa6a 100644 --- a/Sources/Emu48/OPS.H +++ b/Sources/Emu48/OPS.H @@ -63,7 +63,7 @@ static __inline void rstkpush(DWORD d) Chipset.rstkp=(Chipset.rstkp+1)&7; } -static __inline DWORD rstkpop() +static __inline DWORD rstkpop(VOID) { DWORD r; @@ -167,7 +167,7 @@ static __inline void Nincx(BYTE *a, UINT s) } a[i] -= 16; } - Chipset.carry=TRUE; + Chipset.carry = TRUE; } static __inline void Ndec(BYTE *a, UINT s, UINT d) @@ -371,18 +371,12 @@ static __inline void Nbit1(BYTE *a, UINT b) static __inline void Tbit0(BYTE *a, UINT b) { - if (a[b>>2] & (1<<(b&3))) - Chipset.carry = FALSE; - else - Chipset.carry = TRUE; + Chipset.carry = ((a[b>>2] & (1<<(b&3))) == 0); } static __inline void Tbit1(BYTE *a, UINT b) { - if (a[b>>2] & (1<<(b&3))) - Chipset.carry = TRUE; - else - Chipset.carry = FALSE; + Chipset.carry = ((a[b>>2] & (1<<(b&3))) != 0); } static __inline void Te(BYTE *a, BYTE *b, UINT s) @@ -440,35 +434,23 @@ static __inline void Tnz(BYTE *a, UINT s) static __inline void Ta(BYTE *a, BYTE *b, UINT s) { while (--s) if (a[s]!=b[s]) break; - if (a[s]>b[s]) - Chipset.carry = TRUE; - else - Chipset.carry = FALSE; + Chipset.carry = (a[s]>b[s]); } static __inline void Tb(BYTE *a, BYTE *b, UINT s) { while (--s) if (a[s]!=b[s]) break; - if (a[s]=b[s]) - Chipset.carry = TRUE; - else - Chipset.carry = FALSE; + Chipset.carry = (a[s]>=b[s]); } static __inline void Tbe(BYTE *a, BYTE *b, UINT s) { while (--s) if (a[s]!=b[s]) break; - if (a[s]<=b[s]) - Chipset.carry = TRUE; - else - Chipset.carry = FALSE; + Chipset.carry = (a[s]<=b[s]); } diff --git a/Sources/Emu48/PCH.H b/Sources/Emu48/PCH.H index 34d1989..8e5f784 100644 --- a/Sources/Emu48/PCH.H +++ b/Sources/Emu48/PCH.H @@ -3,6 +3,7 @@ // #define _WIN32_IE 0x0200 +#define _CRT_SECURE_NO_DEPRECATE #include #include @@ -10,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -28,3 +30,6 @@ #define IDC_HAND MAKEINTRESOURCE(32649) #endif +#if _MSC_VER <= 1200 // missing type definition in the MSVC6.0 SDK and earlier +typedef SIZE_T DWORD_PTR, *PDWORD_PTR; +#endif diff --git a/Sources/Emu48/RESOURCE.H b/Sources/Emu48/RESOURCE.H index 1c2ccfb..4d9155e 100644 --- a/Sources/Emu48/RESOURCE.H +++ b/Sources/Emu48/RESOURCE.H @@ -2,8 +2,6 @@ // Microsoft Developer Studio generated include file. // Used by Emu48.rc // -#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1 -#define RT_MANIFEST 24 #define IDI_EMU48 100 #define IDR_MENU 101 #define IDR_DEBUG 102 @@ -29,127 +27,129 @@ #define IDD_MACROSET 122 #define IDC_REALSPEED 1000 #define IDC_GRAYSCALE 1001 -#define IDC_AUTOSAVE 1002 -#define IDC_AUTOSAVEONEXIT 1003 -#define IDC_OBJECTLOADWARNING 1004 -#define IDC_ALWAYSDISPLOG 1005 -#define IDC_PORT1EN 1006 -#define IDC_PORT1WR 1007 -#define IDC_PORT2ISSHARED 1008 -#define IDC_PORT2WR 1009 -#define IDC_PORT2 1010 -#define IDC_PORT2LOAD 1011 -#define IDC_WIRE 1012 -#define IDC_IR 1013 -#define IDC_EMUDIR 1014 -#define IDC_EMUDIRSEL 1015 -#define IDC_UPDATE 1016 -#define IDC_KMLSCRIPT 1017 -#define IDC_AUTHOR 1018 -#define IDC_TITLE 1019 -#define IDC_KMLLOG 1020 -#define IDC_VERSION 1021 -#define IDC_LICENSE 1022 -#define IDC_DISASM_WIN 1023 -#define IDC_DISASM_MAP 1024 -#define IDC_DISASM_ROM 1025 -#define IDC_DISASM_RAM 1026 -#define IDC_DISASM_PORT1 1027 -#define IDC_DISASM_PORT2 1028 -#define IDC_DISASM_MODULE 1029 -#define IDC_DISASM_HP 1030 -#define IDC_DISASM_CLASS 1031 -#define IDC_ADDRESS 1032 -#define IDC_DISASM_ADR 1033 -#define IDC_DISASM_NEXT 1034 -#define IDC_DISASM_COPY 1035 -#define IDC_DEBUG_CODE 1036 -#define IDC_STATIC_CODE 1037 -#define IDC_STATIC_REGISTERS 1038 -#define IDC_STATIC_MEMORY 1039 -#define IDC_STATIC_STACK 1040 -#define IDC_REG_A 1041 -#define IDC_REG_B 1042 -#define IDC_REG_C 1043 -#define IDC_REG_D 1044 -#define IDC_REG_R0 1045 -#define IDC_REG_R1 1046 -#define IDC_REG_R2 1047 -#define IDC_REG_R3 1048 -#define IDC_REG_R4 1049 -#define IDC_REG_D0 1050 -#define IDC_REG_D1 1051 -#define IDC_REG_P 1052 -#define IDC_REG_PC 1053 -#define IDC_REG_OUT 1054 -#define IDC_REG_IN 1055 -#define IDC_REG_ST 1056 -#define IDC_REG_CY 1057 -#define IDC_REG_MODE 1058 -#define IDC_REG_MP 1059 -#define IDC_REG_SR 1060 -#define IDC_REG_SB 1061 -#define IDC_REG_XM 1062 -#define IDC_MISC_INT 1063 -#define IDC_MISC_KEY 1064 -#define IDC_MISC_BS 1065 -#define IDC_NEWVALUE 1066 -#define IDC_ENTERADR 1067 -#define IDC_DEBUG_MEM 1068 -#define IDC_DEBUG_MEM_ADDR 1069 -#define IDC_DEBUG_MEM_COL0 1070 -#define IDC_DEBUG_MEM_COL1 1071 -#define IDC_DEBUG_MEM_COL2 1072 -#define IDC_DEBUG_MEM_COL3 1073 -#define IDC_DEBUG_MEM_COL4 1074 -#define IDC_DEBUG_MEM_COL5 1075 -#define IDC_DEBUG_MEM_COL6 1076 -#define IDC_DEBUG_MEM_COL7 1077 -#define IDC_DEBUG_MEM_TEXT 1078 -#define IDC_DEBUG_STACK 1079 -#define IDC_STATIC_BREAKPOINT 1080 -#define IDC_BREAKEDIT_ADD 1081 -#define IDC_BREAKEDIT_DELETE 1082 -#define IDC_BREAKEDIT_WND 1083 -#define IDC_STATIC_MMU 1084 -#define IDC_MMU_IO_A 1085 -#define IDC_MMU_NCE2_A 1086 -#define IDC_MMU_CE1_A 1087 -#define IDC_MMU_CE2_A 1088 -#define IDC_MMU_NCE3_A 1089 -#define IDC_MMU_IO_S 1090 -#define IDC_MMU_CE1_S 1091 -#define IDC_MMU_CE2_S 1092 -#define IDC_MMU_NCE2_S 1093 -#define IDC_MMU_NCE3_S 1094 -#define IDC_STATIC_MISC 1095 -#define IDC_MISC_BS_TXT 1096 -#define IDC_INSTR_TEXT 1097 -#define IDC_INSTR_CODE 1098 -#define IDC_INSTR_COPY 1099 -#define IDC_INSTR_CLEAR 1100 -#define IDC_PROFILE_LASTCYCLES 1101 -#define IDC_PROFILE_LASTTIME 1102 -#define IDC_BPCODE 1103 -#define IDC_BPRPL 1104 -#define IDC_BPACCESS 1105 -#define IDC_BPREAD 1106 -#define IDC_BPWRITE 1107 -#define IDC_FIND_DATA 1108 -#define IDC_FIND_ASCII 1109 -#define IDC_FIND_CASE 1110 -#define IDC_ADDR20_24 1111 -#define IDC_ADDR25_27 1112 -#define IDC_ADDR28_29 1113 -#define IDC_ADDR30_34 1114 -#define IDC_MACRO_SLOW 1115 -#define IDC_MACRO_FAST 1116 -#define IDC_MACRO_SLIDER 1117 -#define IDC_MACRO_REAL 1118 -#define IDC_MACRO_MANUAL 1119 -#define IDC_SOUND_SLIDER 1120 -#define IDC_SOUND_SPEAKER 1121 -#define IDC_SOUND_WAVE 1122 +#define IDC_ALWAYSONTOP 1002 +#define IDC_ACTFOLLOWSMOUSE 1003 +#define IDC_AUTOSAVE 1004 +#define IDC_AUTOSAVEONEXIT 1005 +#define IDC_OBJECTLOADWARNING 1006 +#define IDC_ALWAYSDISPLOG 1007 +#define IDC_PORT1EN 1008 +#define IDC_PORT1WR 1009 +#define IDC_PORT2ISSHARED 1010 +#define IDC_PORT2WR 1011 +#define IDC_PORT2 1012 +#define IDC_PORT2LOAD 1013 +#define IDC_WIRE 1014 +#define IDC_IR 1015 +#define IDC_EMUDIR 1016 +#define IDC_EMUDIRSEL 1017 +#define IDC_UPDATE 1018 +#define IDC_KMLSCRIPT 1019 +#define IDC_AUTHOR 1020 +#define IDC_TITLE 1021 +#define IDC_KMLLOG 1022 +#define IDC_VERSION 1023 +#define IDC_LICENSE 1024 +#define IDC_DISASM_WIN 1025 +#define IDC_DISASM_MAP 1026 +#define IDC_DISASM_ROM 1027 +#define IDC_DISASM_RAM 1028 +#define IDC_DISASM_PORT1 1029 +#define IDC_DISASM_PORT2 1030 +#define IDC_DISASM_MODULE 1031 +#define IDC_DISASM_HP 1032 +#define IDC_DISASM_CLASS 1033 +#define IDC_ADDRESS 1034 +#define IDC_DISASM_ADR 1035 +#define IDC_DISASM_NEXT 1036 +#define IDC_DISASM_COPY 1037 +#define IDC_DEBUG_CODE 1038 +#define IDC_STATIC_CODE 1039 +#define IDC_STATIC_REGISTERS 1040 +#define IDC_STATIC_MEMORY 1041 +#define IDC_STATIC_STACK 1042 +#define IDC_REG_A 1043 +#define IDC_REG_B 1044 +#define IDC_REG_C 1045 +#define IDC_REG_D 1046 +#define IDC_REG_R0 1047 +#define IDC_REG_R1 1048 +#define IDC_REG_R2 1049 +#define IDC_REG_R3 1050 +#define IDC_REG_R4 1051 +#define IDC_REG_D0 1052 +#define IDC_REG_D1 1053 +#define IDC_REG_P 1054 +#define IDC_REG_PC 1055 +#define IDC_REG_OUT 1056 +#define IDC_REG_IN 1057 +#define IDC_REG_ST 1058 +#define IDC_REG_CY 1059 +#define IDC_REG_MODE 1060 +#define IDC_REG_MP 1061 +#define IDC_REG_SR 1062 +#define IDC_REG_SB 1063 +#define IDC_REG_XM 1064 +#define IDC_MISC_INT 1065 +#define IDC_MISC_KEY 1066 +#define IDC_MISC_BS 1067 +#define IDC_NEWVALUE 1068 +#define IDC_ENTERADR 1069 +#define IDC_DEBUG_MEM 1070 +#define IDC_DEBUG_MEM_ADDR 1071 +#define IDC_DEBUG_MEM_COL0 1072 +#define IDC_DEBUG_MEM_COL1 1073 +#define IDC_DEBUG_MEM_COL2 1074 +#define IDC_DEBUG_MEM_COL3 1075 +#define IDC_DEBUG_MEM_COL4 1076 +#define IDC_DEBUG_MEM_COL5 1077 +#define IDC_DEBUG_MEM_COL6 1078 +#define IDC_DEBUG_MEM_COL7 1079 +#define IDC_DEBUG_MEM_TEXT 1080 +#define IDC_DEBUG_STACK 1081 +#define IDC_STATIC_BREAKPOINT 1082 +#define IDC_BREAKEDIT_ADD 1083 +#define IDC_BREAKEDIT_DELETE 1084 +#define IDC_BREAKEDIT_WND 1085 +#define IDC_STATIC_MMU 1086 +#define IDC_MMU_IO_A 1087 +#define IDC_MMU_NCE2_A 1088 +#define IDC_MMU_CE1_A 1089 +#define IDC_MMU_CE2_A 1090 +#define IDC_MMU_NCE3_A 1091 +#define IDC_MMU_IO_S 1092 +#define IDC_MMU_CE1_S 1093 +#define IDC_MMU_CE2_S 1094 +#define IDC_MMU_NCE2_S 1095 +#define IDC_MMU_NCE3_S 1096 +#define IDC_STATIC_MISC 1097 +#define IDC_MISC_BS_TXT 1098 +#define IDC_INSTR_TEXT 1099 +#define IDC_INSTR_CODE 1100 +#define IDC_INSTR_COPY 1101 +#define IDC_INSTR_CLEAR 1102 +#define IDC_PROFILE_LASTCYCLES 1103 +#define IDC_PROFILE_LASTTIME 1104 +#define IDC_BPCODE 1105 +#define IDC_BPRPL 1106 +#define IDC_BPACCESS 1107 +#define IDC_BPREAD 1108 +#define IDC_BPWRITE 1109 +#define IDC_FIND_DATA 1110 +#define IDC_FIND_ASCII 1111 +#define IDC_FIND_CASE 1112 +#define IDC_ADDR20_24 1113 +#define IDC_ADDR25_27 1114 +#define IDC_ADDR28_29 1115 +#define IDC_ADDR30_34 1116 +#define IDC_MACRO_SLOW 1117 +#define IDC_MACRO_FAST 1118 +#define IDC_MACRO_SLIDER 1119 +#define IDC_MACRO_REAL 1120 +#define IDC_MACRO_MANUAL 1121 +#define IDC_SOUND_SLIDER 1122 +#define IDC_SOUND_SPEAKER 1123 +#define IDC_SOUND_WAVE 1124 #define ID_FILE_NEW 40001 #define ID_FILE_OPEN 40002 #define ID_FILE_SAVE 40003 @@ -221,7 +221,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 123 #define _APS_NEXT_COMMAND_VALUE 40067 -#define _APS_NEXT_CONTROL_VALUE 1122 +#define _APS_NEXT_CONTROL_VALUE 1125 #define _APS_NEXT_SYMED_VALUE 108 #endif #endif diff --git a/Sources/Emu48/RPL.C b/Sources/Emu48/RPL.C index 0324e48..e300175 100644 --- a/Sources/Emu48/RPL.C +++ b/Sources/Emu48/RPL.C @@ -16,14 +16,16 @@ //#F068D #806EE #806EE #7056F #806EE #806EE =TEMPTOP //#F0692 #806F3 #806F3 #70574 #806F3 #806F3 =RSKTOP (B) //#F0697 #806F8 #806F8 #70579 #806F8 #806F8 =DSKTOP (D1) +//#F069C #806FD #806FD #7057E #806FD #806FD =EDITLINE //#F0DEA #80E9B #80E9B #7066E #807ED #80E9B =AVMEM (D) //#F0705 #8076B #8076B #705B0 #8072F #8076B =INTRPPTR (D0) -// #80F02 #80F02 #706C5 #80843 #80F02 =SystemFlags +//#F0E42 #80F02 #80F02 #706C5 #80843 #80F02 =SystemFlags #define TEMPOB ((cCurrentRomType=='S')?0x7056A:0x806E9) #define TEMPTOP ((cCurrentRomType=='S')?0x7056F:0x806EE) #define RSKTOP ((cCurrentRomType=='S')?0x70574:0x806F3) #define DSKTOP ((cCurrentRomType=='S')?0x70579:0x806F8) +#define EDITLINE ((cCurrentRomType=='S')?0x7057E:0x806FD) #define AVMEM ((cCurrentRomType!='X')?((cCurrentRomType=='S')?0x7066E:0x807ED):0x80E9B) #define INTRPPTR ((cCurrentRomType!='X')?((cCurrentRomType=='S')?0x705B0:0x8072F):0x8076B) #define SYSTEMFLAGS ((cCurrentRomType!='X')?((cCurrentRomType=='S')?0x706C5:0x80843):0x80F02) @@ -237,11 +239,12 @@ DWORD RPL_SkipOb(DWORD d) return d+l; } -DWORD RPL_ObjectSize(BYTE *o) +DWORD RPL_ObjectSize(BYTE *o,DWORD s) { DWORD n, l = 0; - n = Npack(o, 5); // read prolog + if (s < 5) return BAD_OB; // size too small for prolog + n = Npack(o,5); // read prolog switch (n) { case DOFLASHP: l = (cCurrentRomType!='X') ? 5 : 12; break; // Flash PTR (HP49G) @@ -263,29 +266,45 @@ DWORD RPL_ObjectSize(BYTE *o) case DOSYMB: // Algebraic case DOEXT: // Unit case DOCOL: // Program - n=5; - do { l+=n; o+=n; n=RPL_ObjectSize(o); } while (n); + n = 5; // prolog length + do + { + l += n; + if (l > s) return BAD_OB; // prevent negative size argument + n = RPL_ObjectSize(o+l,s-l); // get new object + if (n == BAD_OB) return BAD_OB; // buffer overflow + } + while (n); l += 5; break; case SEMI: l = 0; break; // SEMI case DOIDNT: // Global Name case DOLAM: // Local Name case DOTAG: // Tagged - n = 7 + Npack(o+5,2)*2; - l = n + RPL_ObjectSize(o+n); + if (s < 5 + 2) return BAD_OB; + l = 7 + Npack(o+5,2) * 2; // prolog + name length + if (l > s) return BAD_OB; // prevent negative size argument + n = RPL_ObjectSize(o+l,s-l); // get new object + if (n == BAD_OB) return BAD_OB; // buffer overflow + l += n; break; case DORRP: // Directory + if (s < 8 + 5) return BAD_OB; n = Npack(o+8,5); - if (n==0) // empty dir + if (n == 0) // empty dir { - l=13; + l = 13; } else { - l = 8+n; - n = Npack(o+l,2)*2 + 4; + l = 8 + n; + if (s < l + 2) return BAD_OB; + n = Npack(o+l,2) * 2 + 4; + l += n; + if (l > s) return BAD_OB; // prevent negative size argument + n = RPL_ObjectSize(o+l,s-l); // next rrp + if (n == BAD_OB) return BAD_OB; // buffer overflow l += n; - l += RPL_ObjectSize(o+l); } break; case DOINT: // Precision Integer (HP49G) @@ -308,13 +327,16 @@ DWORD RPL_ObjectSize(BYTE *o) case DOEXT3: // Reserved 2 case DOEXT4: // Reserved 3 case DOCODE: // Code + if (s < 5 + 5) return BAD_OB; l = 5 + Npack(o+5,5); break; case DOLNGREAL: // Precision Real (HP49G) l = 5; if (cCurrentRomType=='X') { + if (s < l + 5) return BAD_OB; l += Npack(o+l,5); + if (s < l + 5) return BAD_OB; l += Npack(o+l,5); } break; @@ -322,15 +344,19 @@ DWORD RPL_ObjectSize(BYTE *o) l = 5; if (cCurrentRomType=='X') { + if (s < l + 5) return BAD_OB; l += Npack(o+l,5); + if (s < l + 5) return BAD_OB; l += Npack(o+l,5); + if (s < l + 5) return BAD_OB; l += Npack(o+l,5); + if (s < l + 5) return BAD_OB; l += Npack(o+l,5); } break; - default: l=5; + default: l = 5; } - return l; + return (s >= l) ? l : BAD_OB; } DWORD RPL_CreateTemp(DWORD l) @@ -360,18 +386,23 @@ DWORD RPL_CreateTemp(DWORD l) return (a+1); // return base address of new object } +UINT RPL_Depth(VOID) +{ + return (Read5(EDITLINE) - Read5(DSKTOP)) / 5 - 1; +} + DWORD RPL_Pick(UINT l) { DWORD stkp; - _ASSERT(l > 0); // first stack elememt is one - if (l==0) return 0; + _ASSERT(l > 0); // first stack element is one + if (l == 0) return 0; if (METAKERNEL) ++l; // Metakernel support + if (RPL_Depth() < l) return 0; // not enough elements on stack stkp = Read5(DSKTOP) + (l-1)*5; - return Read5(stkp); + return Read5(stkp); // return object address } -#if 0 // function not needed yet VOID RPL_Replace(DWORD n) { DWORD stkp; @@ -381,28 +412,30 @@ VOID RPL_Replace(DWORD n) Write5(stkp,n); return; } -#endif -VOID RPL_Push(DWORD n) +VOID RPL_Push(UINT l,DWORD n) { + UINT i; DWORD stkp, avmem; + if (l > RPL_Depth() + 1) return; // invalid stack level + avmem = Read5(AVMEM); // amount of free memory - if (avmem==0) return; // no memory free + if (avmem == 0) return; // no memory free avmem--; // fetch memory Write5(AVMEM,avmem); // save new amount of free memory - stkp = Read5(DSKTOP); // get pointer to stack level 1 - if (METAKERNEL) // Metakernel running ? + + if (METAKERNEL) ++l; // Metakernel, save MK object on stack level 1 + + stkp = Read5(DSKTOP) - 5; // get pointer of new stack level 1 + Write5(DSKTOP,stkp); // save it + + for (i = 1; i < l; ++i) // move down stack level entries before insert pos { - Write5(stkp-5,Read5(stkp)); // copy object pointer of stack level 1 to new stack level 1 entry - Write5(stkp,n); // save pointer to new object on stack level 2 - stkp-=5; // fetch new stack entry + Write5(stkp,Read5(stkp+5)); // move down stack level entry + stkp += 5; // next stack entry } - else - { - stkp-=5; // fetch new stack entry - Write5(stkp,n); // save pointer to new object on stack level 1 - } - Write5(DSKTOP,stkp); // save new pointer to stack level 1 + + Write5(stkp,n); // save pointer of new object on given stack level return; } diff --git a/Sources/Emu48/SERIAL.C b/Sources/Emu48/SERIAL.C index 0f3dcf8..752101c 100644 --- a/Sources/Emu48/SERIAL.C +++ b/Sources/Emu48/SERIAL.C @@ -104,7 +104,7 @@ BOOL CommOpen(LPTSTR strWirePort,LPTSTR strIrPort) if (lstrcmp(strPort, _T(NO_SERIAL))) // port defined { - TCHAR szDevice[16] = _T("\\\\.\\"); + TCHAR szDevice[256] = _T("\\\\.\\"); // check if device buffer is big enough _ASSERT(lstrlen(szDevice) + lstrlen(strPort) < ARRAYSIZEOF(szDevice)); diff --git a/Sources/Emu48/SETTINGS.C b/Sources/Emu48/SETTINGS.C index 0a68aa7..c505cfe 100644 --- a/Sources/Emu48/SETTINGS.C +++ b/Sources/Emu48/SETTINGS.C @@ -142,22 +142,24 @@ VOID ReadSettings(VOID) bAutoSave = ReadInt(_T("Files"),_T("AutoSave"),bAutoSave); bAutoSaveOnExit = ReadInt(_T("Files"),_T("AutoSaveOnExit"),bAutoSaveOnExit); bSaveDefConfirm = ReadInt(_T("Files"),_T("SaveDefaultConfirm"),bSaveDefConfirm); + bStartupBackup = ReadInt(_T("Files"),_T("StartupBackup"),bStartupBackup); bLoadObjectWarning = ReadInt(_T("Files"),_T("LoadObjectWarning"),bLoadObjectWarning); // Port2 bPort2IsShared = ReadInt(_T("Port2"),_T("IsShared"),bPort2IsShared); ReadString(_T("Port2"),_T("Filename"),_T("SHARED.BIN"),szPort2Filename,ARRAYSIZEOF(szPort2Filename)); // KML bAlwaysDisplayLog = ReadInt(_T("KML"),_T("AlwaysDisplayLog"),bAlwaysDisplayLog); - bClassicCursor = ReadInt(_T("KML"),_T("ClassicCursor"),bClassicCursor); // Disassembler disassembler_mode = ReadInt(_T("Disassembler"),_T("Mnemonics"),disassembler_mode); // Emulator - bRealSpeed = ReadInt(_T("Emulator"),_T("RealSpeed"),bRealSpeed); - dwSXCycles = ReadInt(_T("Emulator"),_T("SXCycles"),dwSXCycles); - dwGXCycles = ReadInt(_T("Emulator"),_T("GXCycles"),dwGXCycles); - bGrayscale = ReadInt(_T("Emulator"),_T("Grayscale"),bGrayscale); - bWaveBeep = ReadInt(_T("Emulator"),_T("WaveBeep"),bWaveBeep); - dwWaveVol = ReadInt(_T("Emulator"),_T("WaveVolume"),dwWaveVol); + bAlwaysOnTop = ReadInt(_T("Emulator"),_T("AlwaysOnTop"),bAlwaysOnTop); + bActFollowsMouse = ReadInt(_T("Emulator"),_T("ActivationFollowsMouse"),bActFollowsMouse); + bRealSpeed = ReadInt(_T("Emulator"),_T("RealSpeed"),bRealSpeed); + dwSXCycles = ReadInt(_T("Emulator"),_T("SXCycles"),dwSXCycles); + dwGXCycles = ReadInt(_T("Emulator"),_T("GXCycles"),dwGXCycles); + bGrayscale = ReadInt(_T("Emulator"),_T("Grayscale"),bGrayscale); + bWaveBeep = ReadInt(_T("Emulator"),_T("WaveBeep"),bWaveBeep); + dwWaveVol = ReadInt(_T("Emulator"),_T("WaveVolume"),dwWaveVol); SetSpeed(bRealSpeed); // set speed // Macro bMacroRealSpeed = ReadInt(_T("Macro"),_T("RealSpeed"),bMacroRealSpeed); @@ -178,16 +180,18 @@ VOID WriteSettings(VOID) WriteInt(_T("Files"),_T("AutoSave"),bAutoSave); WriteInt(_T("Files"),_T("AutoSaveOnExit"),bAutoSaveOnExit); WriteInt(_T("Files"),_T("SaveDefaultConfirm"),bSaveDefConfirm); + WriteInt(_T("Files"),_T("StartupBackup"),bStartupBackup); WriteInt(_T("Files"),_T("LoadObjectWarning"),bLoadObjectWarning); // Port2 WriteInt(_T("Port2"),_T("IsShared"),bPort2IsShared); WriteString(_T("Port2"),_T("Filename"),szPort2Filename); // KML WriteInt(_T("KML"),_T("AlwaysDisplayLog"),bAlwaysDisplayLog); - WriteInt(_T("KML"),_T("ClassicCursor"),bClassicCursor); // Disassembler WriteInt(_T("Disassembler"),_T("Mnemonics"),disassembler_mode); // Emulator + WriteInt(_T("Emulator"),_T("AlwaysOnTop"),bAlwaysOnTop); + WriteInt(_T("Emulator"),_T("ActivationFollowsMouse"),bActFollowsMouse); WriteInt(_T("Emulator"),_T("RealSpeed"),bRealSpeed); WriteInt(_T("Emulator"),_T("SXCycles"),dwSXCycles); WriteInt(_T("Emulator"),_T("GXCycles"),dwGXCycles); diff --git a/Sources/Emu48/STACK.C b/Sources/Emu48/STACK.C index 48f6e50..66a9bdd 100644 --- a/Sources/Emu48/STACK.C +++ b/Sources/Emu48/STACK.C @@ -303,7 +303,7 @@ static INT RPL_SetBcd(LPCTSTR cp,INT nMantLen,INT nExpLen,CONST TCHAR cDec,LPBYT for (i = nExpLen; i > 0; --i) // convert number into digits { - byNum[nMantLen + i] = lExp % 10; + byNum[nMantLen + i] = (BYTE) (lExp % 10); lExp /= 10; } @@ -574,7 +574,7 @@ LRESULT OnStackPaste(VOID) // paste data to stack Nwrite(byNumber,dwAddress+10,s); // data // push object to stack - RPL_Push(dwAddress); + RPL_Push(1,dwAddress); } break; } @@ -593,7 +593,7 @@ LRESULT OnStackPaste(VOID) // paste data to stack Nwrite(byNumber,dwAddress+5,s); // data // push object to stack - RPL_Push(dwAddress); + RPL_Push(1,dwAddress); } break; } @@ -603,6 +603,9 @@ LRESULT OnStackPaste(VOID) // paste data to stack DWORD dwSize = lstrlen(lpstrClipdata); if ((lpbyData = HeapAlloc(hHeap,0,dwSize * 2))) { + LPBYTE lpbySrc,lpbyDest; + DWORD dwLoop; + #if defined _UNICODE // copy data UNICODE -> ASCII WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, @@ -612,7 +615,31 @@ LRESULT OnStackPaste(VOID) // paste data to stack // copy data memcpy(lpbyData+dwSize,lpstrClipdata,dwSize); #endif - bSuccess = (WriteStack(lpbyData,dwSize) == S_ERR_NO); + + // unpack data + lpbySrc = lpbyData+dwSize; + lpbyDest = lpbyData; + dwLoop = dwSize; + while (dwLoop-- > 0) + { + BYTE byTwoNibs = *lpbySrc++; + *lpbyDest++ = (BYTE) (byTwoNibs & 0xF); + *lpbyDest++ = (BYTE) (byTwoNibs >> 4); + } + + dwSize *= 2; // size in nibbles + + // get TEMPOB memory for string object + dwAddress = RPL_CreateTemp(dwSize+10); + if ((bSuccess = (dwAddress > 0))) + { + Write5(dwAddress,DOCSTR); // String + Write5(dwAddress+5,dwSize+5); // length of String + Nwrite(lpbyData,dwAddress+10,dwSize); // data + + // push object to stack + RPL_Push(1,dwAddress); + } HeapFree(hHeap,0,lpbyData); } } diff --git a/Sources/Emu48/TIMER.C b/Sources/Emu48/TIMER.C index 0c04bad..d71cea9 100644 --- a/Sources/Emu48/TIMER.C +++ b/Sources/Emu48/TIMER.C @@ -42,7 +42,7 @@ static UINT uT2MaxTicks; // max. timer2 ticks handled by one timer event static DWORD dwT2Ref; // timer2 value at last timer2 access static DWORD dwT2Cyc; // cpu cycle counter at last timer2 access -static void CALLBACK TimeProc(UINT uEventId, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2); +static void CALLBACK TimeProc(UINT uEventId, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2); static DWORD CalcT2(VOID) // calculate timer2 value { @@ -89,6 +89,18 @@ static DWORD CalcT2(VOID) // calculate timer2 value // valid actual time -> new synchronizing dwT2Cyc = (DWORD) (Chipset.cycles & 0xFFFFFFFF) - dwCycPerTick; } + + // check if timer2 interrupt is active -> no timer2 value below 0xFFFFFFFF + if ( Chipset.inte + && (dwT2 & 0x80000000) != 0 + && (!Chipset.Shutdn || (Chipset.IORam[TIMER2_CTRL]&WKE)) + && (Chipset.IORam[TIMER2_CTRL]&INTR) + ) + { + dwT2 = 0xFFFFFFFF; + dwT2Cyc = (DWORD) (Chipset.cycles & 0xFFFFFFFF) - dwCycPerTick; + } + dwT2Ref = dwT2; // new reference time } return dwT2; @@ -195,7 +207,7 @@ static VOID AbortT2(VOID) return; } -static void CALLBACK TimeProc(UINT uEventId, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) +static void CALLBACK TimeProc(UINT uEventId, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) { _ASSERT(uEventId); // illegal EventId diff --git a/Sources/GCCPatch/EMU48GCC.RC b/Sources/GCCPatch/EMU48GCC.RC index 8606479..c3c5254 100644 --- a/Sources/GCCPatch/EMU48GCC.RC +++ b/Sources/GCCPatch/EMU48GCC.RC @@ -74,7 +74,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 160 TOPMARGIN, 4 - BOTTOMMARGIN, 256 + BOTTOMMARGIN, 270 END IDD_CHOOSEKML, DIALOG @@ -225,14 +225,14 @@ FONT 8, "MS Sans Serif" BEGIN ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP - LTEXT "Copyright © 2006 Sébastien Carlier && Christoph Gießelink", + LTEXT "Copyright © 2007 Sébastien Carlier && Christoph Gießelink", IDC_STATIC,29,18,181,8 DEFPUSHBUTTON "OK",IDOK,215,12,39,14 EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY END -IDD_SETTINGS DIALOG DISCARDABLE 0, 0, 167, 263 +IDD_SETTINGS DIALOG DISCARDABLE 0, 0, 167, 287 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Settings" FONT 8, "MS Sans Serif" @@ -241,49 +241,53 @@ BEGIN BS_AUTOCHECKBOX | WS_TABSTOP,13,13,100,10 CONTROL "Enable Virtual LCD Delay",IDC_GRAYSCALE,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,25,100,10 + CONTROL "Always On Top",IDC_ALWAYSONTOP,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,37,65,10 + CONTROL "Activation Follows Mouse",IDC_ACTFOLLOWSMOUSE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,49,100,10 CONTROL "Automatically Save Files",IDC_AUTOSAVE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,37,89,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,61,89,10 CONTROL "Automatically Save Files On Exit",IDC_AUTOSAVEONEXIT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,49,114,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73,114,10 CONTROL "Show Load Object Warning",IDC_OBJECTLOADWARNING,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,61,102,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,85,102,10 CONTROL "Always Show KML Compilation Result",IDC_ALWAYSDISPLOG, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,73,133,10 - GROUPBOX "General",IDC_STATIC,7,4,153,83 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,97,133,10 + GROUPBOX "General",IDC_STATIC,7,4,153,107 CONTROL "HP Mnemonics",IDC_DISASM_HP,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,13,101,65,11 + WS_GROUP | WS_TABSTOP,13,125,65,11 CONTROL "Class Mnemonics",IDC_DISASM_CLASS,"Button", - BS_AUTORADIOBUTTON,84,101,70,11 - GROUPBOX "Disassembler",IDC_STATIC,7,90,153,28 - LTEXT "Volume",IDC_STATIC,13,134,24,8 + BS_AUTORADIOBUTTON,84,125,70,11 + GROUPBOX "Disassembler",IDC_STATIC,7,114,153,28 + LTEXT "Volume",IDC_STATIC,13,158,24,8 CONTROL "Slider1",IDC_SOUND_SLIDER,"msctls_trackbar32", - TBS_AUTOTICKS | WS_TABSTOP,39,129,68,18 + TBS_AUTOTICKS | WS_TABSTOP,39,153,68,18 CONTROL "Speaker",IDC_SOUND_SPEAKER,"Button",BS_AUTORADIOBUTTON | - WS_GROUP | WS_TABSTOP,111,128,43,10 + WS_GROUP | WS_TABSTOP,111,152,43,10 CONTROL "Wave",IDC_SOUND_WAVE,"Button",BS_AUTORADIOBUTTON,111, - 139,43,10 - GROUPBOX "Sound",IDC_STATIC,7,120,153,34 + 163,43,10 + GROUPBOX "Sound",IDC_STATIC,7,144,153,34 CONTROL "Port 1 is Plugged",IDC_PORT1EN,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,13,165,67,10 + WS_TABSTOP,13,189,67,10 CONTROL "Port 1 is Writeable",IDC_PORT1WR,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,84,165,69,10 + BS_AUTOCHECKBOX | WS_TABSTOP,84,189,69,10 CONTROL "Port 2 is Shared",IDC_PORT2ISSHARED,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,177,65,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,201,65,10 CONTROL "Port 2 is Writeable",IDC_PORT2WR,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,84,177,69,10 - LTEXT "Port 2 File :",IDC_STATIC,13,192,37,8 - EDITTEXT IDC_PORT2,51,190,94,12,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_PORT2LOAD,145,190,10,12 - GROUPBOX "Memory Cards",IDC_STATIC,7,156,153,51 - LTEXT "Wire:",IDC_STATIC,13,221,17,8 - COMBOBOX IDC_WIRE,31,219,48,42,CBS_DROPDOWNLIST | WS_VSCROLL | + BS_AUTOCHECKBOX | WS_TABSTOP,84,201,69,10 + LTEXT "Port 2 File :",IDC_STATIC,13,216,37,8 + EDITTEXT IDC_PORT2,51,214,94,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_PORT2LOAD,145,214,10,12 + GROUPBOX "Memory Cards",IDC_STATIC,7,180,153,51 + LTEXT "Wire:",IDC_STATIC,13,245,17,8 + COMBOBOX IDC_WIRE,31,243,48,42,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "IR:",IDC_STATIC,89,221,9,8 - COMBOBOX IDC_IR,107,219,48,43,CBS_DROPDOWNLIST | WS_VSCROLL | + LTEXT "IR:",IDC_STATIC,89,245,9,8 + COMBOBOX IDC_IR,107,243,48,43,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Serial Ports",IDC_STATIC,7,209,153,27 - DEFPUSHBUTTON "&Ok",IDOK,9,242,50,14 - PUSHBUTTON "&Cancel",IDCANCEL,107,242,50,14 + GROUPBOX "Serial Ports",IDC_STATIC,7,233,153,27 + DEFPUSHBUTTON "&Ok",IDOK,9,266,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,107,266,50,14 END IDD_CHOOSEKML DIALOG DISCARDABLE 0, 0, 195, 66 @@ -295,9 +299,9 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,138,27,50,14 COMBOBOX IDC_KMLSCRIPT,7,47,181,120,CBS_DROPDOWNLIST | CBS_OEMCONVERT | CBS_SORT | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_EMUDIR,7,17,107,14,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_EMUDIRSEL,114,17,10,14 - PUSHBUTTON "V",IDC_UPDATE,124,17,10,14 + EDITTEXT IDC_EMUDIR,7,17,106,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_EMUDIRSEL,113,17,10,14 + PUSHBUTTON "V",IDC_UPDATE,123,17,10,14 LTEXT "Emu48 Directory :",IDC_STATIC,7,7,115,8 LTEXT "Current KML Script :",IDC_STATIC,7,37,115,8 END @@ -577,8 +581,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,4,2,0 - PRODUCTVERSION 1,4,2,0 + FILEVERSION 1,4,4,0 + PRODUCTVERSION 1,4,4,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -595,12 +599,12 @@ BEGIN BEGIN VALUE "CompanyName", "Sebastien Carlier & Christoph Gießelink\0" VALUE "FileDescription", "HP38/39/40/48/49 Emulator\0" - VALUE "FileVersion", "1, 4, 2, 0\0" + VALUE "FileVersion", "1, 4, 4, 0\0" VALUE "InternalName", "Emu48\0" - VALUE "LegalCopyright", "Copyright © 2006\0" + VALUE "LegalCopyright", "Copyright © 2007\0" VALUE "OriginalFilename", "Emu48.exe\0" VALUE "ProductName", "Emu48\0" - VALUE "ProductVersion", "1, 4, 2, 0\0" + VALUE "ProductVersion", "1, 4, 4, 0\0" END END BLOCK "VarFileInfo" @@ -839,7 +843,7 @@ END // Manifest // -CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "Emu48.xml" +1 24 MOVEABLE PURE "Emu48.xml" #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/Sources/GCCPatch/Makefile b/Sources/GCCPatch/Makefile index 6f5fdbc..908aa2d 100644 --- a/Sources/GCCPatch/Makefile +++ b/Sources/GCCPatch/Makefile @@ -5,9 +5,8 @@ LD=gcc # This is to make GCC not bitch at things M$ allows -CFLAGS= -Wall -Wno-missing-braces -Wno-format -Wno-uninitialized -O3 - -# Things we need around to compile successfully +CFLAGS= -Wall -Wno-missing-braces -Wno-format -Wno-uninitialized \ + -Wno-strict-aliasing -Wno-unused-function -O3 DEFINES= -DIDC_STATIC=-1 @@ -24,8 +23,8 @@ RSRCOBJ=$(PRJ).o OBJS=cursor.o disasm.o display.o debugger.o ddeserv.o \ emu48.o engine.o external.o fetch.o files.o i28f160.o keyboard.o \ - keymacro.o kml.o mops.o opcodes.o rpl.o serial.o settings.o stack.o \ - timer.o \ + keymacro.o kml.o lowbat.o mops.o opcodes.o rpl.o serial.o settings.o \ + stack.o timer.o \ $(RSRCOBJ) LIBS=-lwinmm -lcomctl32 @@ -92,6 +91,9 @@ keymacro.o: keymacro.c pch.h resource.h Emu48.h kml.h kml.o: kml.c pch.h resource.h emu48.h types.h kml.h $(CC) $(CFLAGS) $(DEFINES) -c -o kml.o kml.c +lowbat.o: lowbat.c pch.h Emu48.h io.h + $(CC) $(CFLAGS) $(DEFINES) -c -o lowbat.o lowbat.c + mops.o: mops.c pch.h emu48.h types.h opcodes.h io.h \ i28f160.h $(CC) $(CFLAGS) $(DEFINES) -c -o mops.o mops.c diff --git a/Sources/GCCPatch/PCH.H b/Sources/GCCPatch/PCH.H index 7a94210..c0ab333 100644 --- a/Sources/GCCPatch/PCH.H +++ b/Sources/GCCPatch/PCH.H @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,10 @@ #define __min(a,b) (((a) < (b)) ? (a) : (b)) #endif +// normally defined in CONIO.H +int __cdecl _inp(unsigned short); +int __cdecl _outp(unsigned short, int); + // normally defined in missing CRTDBG.H #if !defined _ASSERT #define _ASSERT(a) diff --git a/Sources/GCCPatch/README.TXT b/Sources/GCCPatch/README.TXT index eace99f..6b68aa0 100644 --- a/Sources/GCCPatch/README.TXT +++ b/Sources/GCCPatch/README.TXT @@ -8,18 +8,6 @@ of the compiler and the necessary files is MinGW at www.mingw.org. Emu48 was tested with the following MinGW file versions: -MinGW-3.1.0-1.exe - -or - -MinGW-3.1.0-1.exe -w32api-2.5.tar.gz -mingw-runtime-3.3.tar.gz -binutils-2.15.90-20040222-1.tar.gz -gcc-core-3.4.1-20040711-1.tar.gz - -or - MinGW-3.1.0-1.exe w32api-3.3.tar.gz mingw-runtime-3.8.tar.gz @@ -34,6 +22,14 @@ mingw-runtime-3.9.tar.gz binutils-2.16.91-20060119-1.tar.gz gcc-core-3.4.5-20060117-1.tar.gz +or + +MinGW-3.1.0-1.exe +w32api-3.8.tar.gz +mingw-runtime-3.11.tar.gz +binutils-2.16.91-20060119-1.tar.gz +gcc-core-3.4.5-20060117-1.tar.gz + Older versions of the MinGW package might not work, because there are several bug fixes, especially in the header files, made in the last time. @@ -45,4 +41,4 @@ Many thanks to Pedro A. Arranda Guti compatible. -08/16/06 (c) by Christoph Gießelink +04/12/07 (c) by Christoph Gießelink diff --git a/Sources/MkShared/MKSHARED.C b/Sources/MkShared/MKSHARED.C index 9f9844e..9a7172f 100644 --- a/Sources/MkShared/MKSHARED.C +++ b/Sources/MkShared/MKSHARED.C @@ -21,6 +21,7 @@ #define WIN32_EXTRA_LEAN #include #include +#include #include #include "resource.h" @@ -72,25 +73,6 @@ static BOOL WriteCardFile(LPCTSTR strFilename,INT nBlocks) return TRUE; } -static HBRUSH OnCtlColorStatic(HDC hDC,HWND hWnd) -{ - if (GetDlgCtrlID(hWnd) == IDC_RESULT) - { - switch (eState) - { - case STATE_GOOD: - SetTextColor(hDC,(COLORREF) 0xFFFFFF); // white - SetBkMode(hDC,TRANSPARENT); - return hBrushGreen; - case STATE_FAIL: - SetTextColor(hDC,(COLORREF) 0xFFFFFF); // white - SetBkMode(hDC,TRANSPARENT); - return hBrushRed; - } - } - return NULL; // original color -} - static LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static WORD wSize; @@ -161,7 +143,21 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lPar } return 0; case WM_CTLCOLORSTATIC: - return (LRESULT) OnCtlColorStatic((HDC) wParam,(HWND) lParam); + if (GetDlgCtrlID((HWND) lParam) == IDC_RESULT) + { + switch (eState) + { + case STATE_GOOD: + SetTextColor((HDC) wParam,(COLORREF) 0xFFFFFF); // white + SetBkMode((HDC) wParam,TRANSPARENT); + return (LRESULT) hBrushGreen; + case STATE_FAIL: + SetTextColor((HDC) wParam,(COLORREF) 0xFFFFFF); // white + SetBkMode((HDC) wParam,TRANSPARENT); + return (LRESULT) hBrushRed; + } + } + break; // default handler for all other windows case WM_DESTROY: PostQuitMessage(0); return 0; @@ -178,6 +174,8 @@ INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpszCmdLine,INT nCmdSho // RECT rc; HFONT hFont; + InitCommonControls(); + // create background brushes hBrushGreen = CreateSolidBrush(0x008000); hBrushRed = CreateSolidBrush(0x0000FF); @@ -207,7 +205,10 @@ INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpszCmdLine,INT nCmdSho #endif // initialization - hFont = CreateFont(20,0,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,DEFAULT_PITCH|TMPF_TRUETYPE|FF_ROMAN,"Times New Roman"); + hFont = CreateFont(20,0,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET, + OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS, + PROOF_QUALITY,DEFAULT_PITCH|TMPF_TRUETYPE|FF_ROMAN, + _T("Times New Roman")); _ASSERT(hFont); SendDlgItemMessage(hWnd,IDC_STATIC_TITLE,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(TRUE,0)); SendDlgItemMessage(hWnd,IDC_RESULT,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(TRUE,0)); diff --git a/Sources/MkShared/MKSHARED.RC b/Sources/MkShared/MKSHARED.RC index fb02357..79d01a5 100644 --- a/Sources/MkShared/MKSHARED.RC +++ b/Sources/MkShared/MKSHARED.RC @@ -15,11 +15,11 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources +// English (U.S.) resources -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 @@ -121,7 +121,16 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_MKSHARED ICON DISCARDABLE "MKSHARED.ICO" +IDI_MKSHARED ICON DISCARDABLE "MkShared.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// 24 +// + +1 24 MOVEABLE PURE "MkShared.xml" + #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// @@ -130,8 +139,8 @@ IDI_MKSHARED ICON DISCARDABLE "MKSHARED.ICO" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,4,0,0 - PRODUCTVERSION 1,4,0,0 + FILEVERSION 1,5,0,0 + PRODUCTVERSION 1,5,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -148,12 +157,12 @@ BEGIN BEGIN VALUE "CompanyName", "Christoph Gießelink\0" VALUE "FileDescription", "HP48 RAM Card Creator for Emu48\0" - VALUE "FileVersion", "1, 4, 0, 0\0" + VALUE "FileVersion", "1, 5, 0, 0\0" VALUE "InternalName", "MkShared\0" VALUE "LegalCopyright", "Copyright © 2006\0" VALUE "OriginalFilename", "MkShared.exe\0" VALUE "ProductName", "MkShared\0" - VALUE "ProductVersion", "1, 4, 0, 0\0" + VALUE "ProductVersion", "1, 5, 0, 0\0" END END BLOCK "VarFileInfo" @@ -164,7 +173,7 @@ END #endif // !_MAC -#endif // German (Germany) resources +#endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/Sources/MkShared/MKSHARED.XML b/Sources/MkShared/MKSHARED.XML new file mode 100644 index 0000000..fac6375 --- /dev/null +++ b/Sources/MkShared/MKSHARED.XML @@ -0,0 +1,22 @@ + + + +MkShared + + + + + + diff --git a/uninst.exe b/uninst.exe index 1d672e0a0ee94d4a5430c53067b7d2be35ab27c3..0bae7a5285c08c36b31cfec1492197d089396ddc 100755 GIT binary patch delta 29475 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 Cn*9v` delta 28515 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

?{L59e2x|u$usHX`5E7-qrK%LI z4R6i>D&O(b04lhA5m#F-R!ogCI_=s};tFdk^GWNX@}vQ<07_2@w!#NE3QA*ffd$p{K()OZ7b2_n9- z9J0o(SYwW=E=Sc^MD6?Kuu0*~22R9MGcMAwM~q+-8YxVORY{l9D|JO~tv$6+ZYf>g z6-ba6+6J`9DlQ<)($?~qcf}m}FgE-S?bMD~FFgj^0P#;&qr$&9$SeV)tJDhTJW-{b zG!WBYx>4BMD;r9%2{8OD;)!OYJ^5I){~13kkIm47XQwFnS?O%%bxPtirD|?QTGcRB zLV{{Gw)x;v{)$YDZyC+g!c`rB<0p@oqZY7pnImJWn!|`1^OBl_f2Q`+{xtMO8CMk$ zBx+Xj#54neGITalB=};gi~Q&+_;`E0uyjh1Xe0`=|ay0Tk}MX z3LLL}ktEbQi8fkMT`;!6tbIr`s+!+tgHysokd<26fNArx?qVi6bu_f!A*cm34>`Bp; zn7rY(=7nj2Ggj_Zg7djlmKVW$tzZi52>!D%3Iaz;Texl{esHo6rZ9{gPKcbtUXUnF zG`2jgxu(joUR22`pm5~SninKt9;G>Bro>ml%NrOmT0`?VeuGtw`PLX$Ao^`_l971$lTWsX`*b4V+CVat zw$UpvhCw_-bO1qJ=no?}i81J@SQb$6kT*e!ao#+N zLU}HFN$5`KKu56k{LByxeV!l(Vo1 zlN^*W%I+R^V!9UA7E0y-v~wan91K&^zqzT*h3S3Vl;6|)xU-8xo_ux3I)|vyWhuI# zO2rW_<7Hk^tv9qxpZF7s$3@H<-X86X`K7cQf>l~N>%D4H5UVK4!9Z;&x@v0;mKpur zCiD+gnhgtXNcj@naPAi9m^?nc6Gha9euP%oNVV9_Mzk)4dcEX%PE?QR&p^rt{S2y??aMWnocGeHeq4=M4RM-IdC3epeQ zrPD!Z(Z_`}Pzhx6OQd`g`GH=h)6S^G9(72Kp@LvN=%H9iKG_=15msud++qvJRV4i$ zB1jJC=~$?CSS0Ql=WC@=`5RDop6VS&ncR|@l#hsEQX}Xq?i96^l=Z!+92w%S;-BXr zqi{z!3@pudl+jl(YhFa3=HRl_PVy&MoLK!^%v7x*Tj?MVOETObLVO;gn~cuIuQ-;T zhrY4&1Qs3moW~up$XGfPrE(#VlSmXC#q{68Od`7lkuX!5#bV|>g#hBCRlE0!dS&A4&E}A$6`|wUCM> zkv)}lEL8YkWc_>MD%ZyvBNr7TE0aoySgP71k?m5B66T&PCy-!Ssx~9}osvAcI}D~UgAa4y5sX`@!3*K#)~v2M2Dy;?aemf7qUu~a4-NEv zNt#1vAWcqRabq=?946$`V*G)T#u*o3M$Hd1l_Sm&-jT!!=y>@*=n%I*u?mz+>iV|Wc)=0`wIF#AP{JHHEK=_}}`_r?#Q454bPRs1Vd=vnqqS| ziWjN!hc;thft18*)jmXcn0rAi@0G1&h+%QCa2Oe57hKH-62{QiG5EQONU<6kOK-(q z#iTmM()*Dxxh$st!8aDj5_JXHd34r2LUw*u5jN-`bAIM=vQaNKHB-3+nGs3jXW8SB zLk0o8i4gx~BTr?#BHK4vi9{V4wOVjzq-nG{c7wu7?MwC2-H%vd8wHpAbx zjT{qk9wvIo&m_lJCe>SEE~XzLNi4ls{vA^Fi>7#$AxJ_8wgP1dNP{{8JjGCYxDf#1 zj2cc%0#;>B|8p1CkoUWo7z4Q(k(5$QU~v0gPH<;f1=4sD2`4iiMVTg)M7t=JvnG^` zOYxPh6jrDs~)9PYeec0=`y=PU`RJkO^e9wJ_yr z^#dKaT64TROV_RNU*h3S%#_LwufIt2MsOB8H4=0~J8&o3A&0{;^Zua=4CvO9SoS>A zb65c7Rjv(!r=Xh?;KP}$`#ZoZVkL&hn-Z{G&PF=OJs)e#DkZcKrP@Fum%xf6AIpm4 zefA-oRw&22HOq!d;F+$o4Q$UN=wSOX=mG=VJ4Zr1q0stCkfMwHV`b``oMWys<+O*mqWK)U?k^49zlo)c(RAAn7IRAf)uEl<#mubHt0G| zH@sJ%x6y2A)OJp|k|2oM{UYssm?eWNW+(PTh2wRkjqXsdcCM^#%_mx@GRr3#g`qjD z7P2&_dv&!HBaHBy9P|}k``%8iiS$cw=T@an3egJtlvG<~lu}}yxOba@OYJC-u(Ba75r=V!tyURFoDtNu;5iF%yH% z*eCJkp*vr9rjJWhD7uo@l$!WPRA_E8ct=D=w_s`YpKBXDlmerqvg-BR#_T-p$O{UDsY(k>;p(ZZ6c+TI>$=B5?S{5NY(7ZU ztg;CTBxtG3=;N^RIc$bJLuDVh(!J1%4TZ8nLrt1B2PXld3o2(cVh_{wE}gKio3+?T zAY05ZK$p;Wrgb#5A6GMQ^yo0%tG@07?R0P&iOGh7N@;sk6R{xA5KS6EtvU>#x#TD% zLc>})dJpc=e#K$60@mZQ!L!n#!QQNkA;X&>2)d=*3ar4}Ss+I#LlD{0tqGpW@z8w> zb_pU5nh{^b>R5KMuU7pTh!K&|9P%2emY?MWnSoF!xCO=N0q;&XJj8MMD1z%RCv^j` zlSdAN5y0(va}FL+uzr+GVXo+)uv6F-j3kW(0kA)EhGM9K2zH@0(55aZV*(>=bmu~b zaysfPLkE*LwU6&y^X?A$4 z$fJjsk+g%dKNCng(Ds;43!7PdS+`i&L-6VnW+xRvzg`Ky#tUZMCE<28;U+(KI_t{g zeiT8`K3GjYG15Wv?34})Gx`)nPpoK?ldDg<0dWr?;s!)if%Rr{(4C|7CJ*}@+>9?x z`D= zs`Qr?k@pX*wUNql*g|>@YUZ>b2nrLSCeqFh0L``gbr%t66st{`Zv5Cd zW9VK}=rF2A5y{OTYyz&U_f;osuwhMRUgy_14hkB8*S%u`0 zKmk#%U+=%MC$TX)OEVIrgB{$YTNUm&OnQ;^(5;Q9p)6b)!+&F)E%rSbJq5S1#sE`3 z*^mDF&OAhd$L*nHk^YZ=t7@9AF}$;yHMyZ=6P25Q9ooooTH!>jGA9}tWAdkuOL^a|ZmngO~M3OwzQV1A9 zF{rPNt|Nv-w$Bu|tGm$OiI{nV!c4?6Li)sRxI$_DNmQ2^p|8O-s3q`xjmcvSicN{6u|a!ah1{TBjcVmCIe zzl%zchd6wyF60tQBCq*hVlRI@Tu5G)3M!!5(0CHKLI>6p2_zG$oTg=@*_oKC0)OLn zU%|sPwE7wDU(l4i`%}dl&*92Wig{&by0qLS=MWuhkxwq9t*c^_cH=qd;D+Yn^%Of^qw&Q-kv6%Szw zL_Kvs2Xw$k=QY)5|7HAqn{xBSF6K|m<2FFckosst-&K3N_2gdUfW;TY$;bjv~`}awq92IB* zPoAeO&v?Nw?I}$t2@_FDvl3dM^3;U#NKUOZ&-g@9j#LbL05c9@JQ!3MhhQ%mBMIfn zPA#L?Lul$n);yRdWgGBIh-M^~AvE5k>sO(vL>p(VdBwrw7-dW1_PL`BeYkkahg6Xq zhZR`LiRPF;>oLN*&TuL4Kp1%v*4>OY>@zqSJqATGdKiASm3dhwL3Odz3wifm!3vbN|QVlo!-w^Wxs47C$m^NE5ui2p1zoi ziyWz1LO(Xc=TK zQWB(Ug!r*f6AS}ov@J9S0uUmjL$FwRI)46(&s|nJRBc#%t`U6pW0%G23leiBXuP2} zpD-U$Zj^4&knS7@-P|F5oC&(ZA+Bn92XcMHMF%Op32P;RB$cUuv0;Ra z?gDliZE3pFYMBK%@-}3g@|D+5g9E(-by%rcJ!Pl7Eu{tMDy4737zUR~)h}pr=*P^g z>JZK0uPxD*u=@>m8VD~2KwE92PBhe^jnQw%%W|a?`j7>Yr#LEI($FAIy6(!*4xBYQ z!%!#AR-HvuFKc-egwW`NpVSSAa#Rn53~61GK;1I4THi2gSZox6kmo6^=^V+!jN%xF z4H-E8vdOYoDRYMiJaI~c%lIpJ_!h~#5^)E1&c@0wU>~V8;46)lN052to@A3Y`p$OR zN_nkGC@O#5Zw0XG(H89VM|>XK=iycvfqGm4qsbazsHHVO@PKO#iWCU-3O49?(f;0D z*nZ7;hy-~ZlV{pbPD;dd7O>KkS!v58CZ+7mV!ESldbF3C>?@2}Eo?oBcY^VnVk@}^ z+h-*^igJfA&!J!N1#NkX%`*FJhqePq_G~{;iq6Gy^GqQ89|wV-hgID`}u+7zi5tP$3G8$c1ri8Lb2I z277HOdF4agXN2S3(L+;e(EKz{aWGs$9|(x1obf6}T^Dw=*7!APWcg;WQSp|w$mS0U zH<;jeS&Pgo+0lG{)=)HQ37qgylK8Po+~vW0FV}q$cMr0M#f1Uk4jj15T>C7uSo>2M z6sz?i+8@$B)m(q1<<#))%FH#f$Id&oz(GsbHYq|MZL zQ49jv8gtexxs)x4NJ8oDkcFDC`@1s)p9goh5@iM}_8*E0?jo(=;CfH=S^>xH0S2lj zhS(Ilaa~W{fDxUzwLNt+M)V+`O(T??<45cz)>i8M6NJ==i9+f<-~wRDbRl&M&}x#9 zIy^;4IZqW*69BgW4S*BzLTVrC;wR&U8S48^!y_(~4@MtzIobevpiLwo0%-{#73oH_ z*PtDRc8sSSL}EOrCJPY`^qi>6kDG8L{eqmMUXA$GPCzC=3HT0p2dD&G1)KzsKksyS z5&(Nhbr`_9 zEx>EQcK~-j?$ZFSfB-;il#Rl7Dj*q<3D^YK2RI3+06YP_1AGTqFQ6zlKmb4phyqw) zjM}*rbr(+JqjoVJOb1Jegdp9p(DT>aAP6H2OI`$1uO^51B?em0@Qu*6NSM70PcX6 z018lt@--OjHNM^eSAaF(CrDWjs0Q2xTml>hYzM3XWCIofk^l;{Cw~>`6m=Z19YFq; zr2`4T)O4ynvN+nx6Xs4zn&CS&A%T)a4p1o*!xLvECB!S^b;l=mGmlD~GASWm_iSP} zU2U>6*K?|F_N1QbQA)Ni`!gA{O-#aws{fXSVEGAiu(JQr?gq+2&@SSCw3CB3QE1ng z^54Ez=}4oU+yCe*MOhb=$-!^@88P38!lYyfjw zroOR>C0lIV3yB^`mtGGw3W+rp2pK+q&Q&J{Pj}J?ncVuNkPmawA=q&m~ zPfAEgoN}aORt!hyp7>06h?{Li?&)T=!oO3CJ7Sgeo#Qk>HNiK2UOXjSByBkF<^@t@Kc zKcwC>CDbzo714>Q@dLYIMP#7xzT?EniPMuO&2k%vBG$nCDq!;wGm>>}Ci&PBawpFI zPf^$;U){cxZbxjDhq*eT%FM)sqI7;Lha*o?9XTAqk*{-iM_6(xQ;LI$xw>6v2b%>@ zepHa|>)8fQPu=@-!T9Z36vOGITUZo|^r@mj_~o4MkKY03hjJ}Vk1Rhg;Bb2c>2?&? z>!w_YUwz3z?b4H?%CXouZ1LE_@}~X>t(xi6Jf!yv|c!QT-~invuWnryA3P- z=Gi6xv;O5D@iF)29lRWTy7$LLe%}Asbs8M8&gOdF_9DZY2Q{@$(btb0TqW7PdFSXG z)Tbq)YP-R41BS2m_361`V^+6o zj}v)AcXgCE3~3)_+e&?4=gT!oFJxKWyZ_ZusSV7l+t|J_a!%LqS3^JSJrVI;9y9uo z``5b2AA&%eOTB{z2NloS8_lnrdbN=n(cb2COut8oCKvi|pIh8vL;p9Ox80v)7IycP zq-oQW`rZ>-*d)FmE=u30{rN;33SZaO7);j>J3D#L>YV|5ukZxip~8Q6 zzFFHNWow_5Z&i`eoFzwQHurlO^=`_Sz`|o2(s%ycdMYDnVcjC{%Bvr5)=Bc8bP0b^ zA&y%4cT7U5#kh4VTE{&aQ+K_S+@=4;SF+vTLPmN%Ozm4Yq3e|6qpYrr+uf0?zenxe zIdjCaeUINC{qo$+Yg=+?{@$5;iX3+DoKe>~rq(Rv$iLHH?1>G(kg#ak5U=QOW7R_M zWtIh7n4NR@&o^$o{I%e~_4NS>FG4^48T-SrWOUx=l3mHeGSt_*x4zT;$8=fvy-q15 z1AS(`lYDcXb6Q#7x_N$4=hV`|)i2inTbfg=UScK7S?}m09+dSU;%mdz~w$ zH}F#G4P?3o^a-cNfj=vMA+UGvU9 zYUSQpK7!}9J}E8l^DM?+yGgCs68A&y*bsl(G;CDRg%zsxWyfE&=(w=M?OjuETTcz1 zP&lgTSzHdInNqT)5 zu%qeq@!dxkjV|62X4a$ch&hkiZCv^z#<{dfchvUl3gPAV2U;&5e%AC*n@H)#<(?Pm z>2rQmn$ZSnzfbKVo4arNxWcyMi1LA%?wiKbgaFbT_4Z#N{6y@4bCtZm}xO+=s zO6P>ZpBB9F>ak8=v3_ji$KDO^(i*r+B4(U>7%?FAqyLk7ZqnI*T%#UGIc*tP@O9L?fWF%;)!VAaD=quD(aI}+ zRc8{L7JKDRnKNg2SM#NhUk^)s<@8Vc@v)I(eNC+sK5p6C`@U`0!;cN8K3=@gUU1v8 zTjQ$%4_of++xT_LUB|C4OCq*7p3NTLxHW01NvAB^>F*v+@7wWWx1E31yzF&vdj0e% z*3KzUdW`9#Q*ts3~+!b2?{#O!?(Q?q4JO<~WV2uE{LY;+`7L&R^r&Co<6XA{3-+J6d^_U(&#MI&)8&`G**$nk_v!xedG}cp z_`|mZ_)VV|Dp)$LuGPM;uHLPNURTzehMNs~(RO>--N+L&-!1=`w`a$(u&X8Wr2if} zt9D;;XWL7Ytb$dwI~TWeKQ~p>u}~c`W5n6_rH3uHzZckrbM@72GKST6-e+C3)hS`)CnP%vl-=jUr?^ie|;dak`56zBSXY@XBT>mhl%Kqe#QuEj+$6`}UG=YEDuA98{ z&lS+hOn9?-GtbwrqGOu@eunB(=SPeglQO7X^V#v?7W)U} z?Ko1Cv5b=*Y&o~!K=ZuB`>U2|-e#$b{l=SgeiYd7r1!##;?L)Xjdt4clKb=E#aFTS z`xoerHMYAwwXM^zUJ*;4S_BN|Ir$BGxeQy(`yE_RZbB)~r8w?c>9v+x6*J+r{t74xazVFC#}C zmNcko&!UPh74Pg^+YKMHElnL3yy@YS>aCL+Z!PVzG2y<8=ljTko0CH8BXalc%pSYX zXJP9O$L)I9@2(ou^l!pY|4kSESv+E}aI*d7fvpDjZ*c!=ez{t_XZLYkP5PPz*Z<7! zBD!-ux#;0NS<1TQ_cok3J^2q?bN6kwM`YtSnyFGgk6EYYTg1fGZnzLr`ZV%y6vdr-^Y$v3E4um4`iWR7vXJbHL^ z&+Wpr`4bfR=IPFT7eDxCmAdDsqn4wb8&BTouVb8V+9$qHZL@Ofw^gwDOzr3A5&rjs ztB!4spsH5wtx4tdy|yZA)L)j*{dqYzZ`vh@SLAU{of59`NgOb5lYEETv3zB=l}}aB z9iOhv;k&EKgHE@bvbAx*prm7=oex;(J8~8tF5b7OyL80dq_!rp#V0H-Zc3bUc->rm z5AA_l|NKa9Si3^4bN%azX~pWr)?b~@TsgAq*qDzW><+)KY5MTY^}*i@#X$=4ioQf^M7%vZQsx}i6#f`?)JNXC6RltEckK1L2EQgi)OD| zT5zD1>6=0Cea37zDcZEXU**>w|CG&rW$qfb=$RuuKe(>N=I2c& z-wV1=S>xF2&*$Tg-z$9D(kpe~oNK!U4R&otUJb7P`>B72ru83|7IdEY$gf@EN510K ztTtV>bziR^J>Y)UV)}N4TdTc?&N!XCnY-fHf(MtU=}+sP+o_xCkA_!Xtom+N{@3Y$ z=539dofmXG_sr)OE50t=)HmPz#viUj^g{QLiwO&^hYcN7l&|b|V!Nba_os;2vMb5M z7jJvvyqlZda?gQByLQ)m?fPDG&B~W+cfsec>zOyY#{4t;)Y#kN?x%j%OVSRCoTT4_{epi9vy-Pyy)O# zvsQa}W1Az)_4WTG^3P56a5|Me{_j@tVN}v2m*S@-M;`MsoUdE-<)%okYW3at?bKA= zyUwZ4Uv2+5;lsQZ63{!g!E3x~fsC*rOiw$O7-+K8?nDE~{t+|_q4CC!@nV^`*hUPl{Ef>lm&w`5lB zhu40n9y+;Z+Z(4e%PP*1kU6}8odfrIS=Jvq6?$pQr(+#{d>9_mi+hLH=h?2>ZI|oA z4=m^${^R2D&8eB$dnf;Kx41-Vck;^74`0uhF7TcI)DX2~>+ofpKils~uWLHLD0}3` zdLLWrv5!N$FY17frf){14spsD;r&=xHu7Bmc2-9ndGq69^ES)~$Qji7TwsqGf{a1p ziJL>l-H464nvxr?P~NkBzkk}^;zg}}WC`d`U@Gh$Lh zT&n}+Jnu!>-@F&~wR7Krt3N*JWOu7a{POn;-2yGosvjJ_KYD&)oBpE` z79H3q8|zZohc|PZbj;eo@0K3#Vs44-C$B2@+%l-`0iTM?I^Kdw>3RQ-xU8Q)WL1}V zrRuEYunp~(`uucq_WRJhl2c8~YGlJS=Dmx41ZVhvIVT!kW4N*O`GXwp7kXm-h6@U- z?i-5>7Z1OEw$HtYH6zE3j-RMLm9nDn+|2_|D(5Fnn&mvPa?FDr6w`b8i3a~|*E%(D z8>^VC$(!>&ZSHwFWoqK(_Wut0w_$Sr{Wrm=^OsIOULG_5lF82;)zEbdmJ5z{5BRf}-{UC9I=_Q1m%4pj@#S&r<9=6GHC_L? zLa}w^p`;6Mxodo>z1A)7aRc&_+blVKwjK4*e!u&-{)6L1AI7!no6s{&Ica@dURV2T zE$dcYAHI5PTi2SGu0@ox^OyRY&zDs88hhlr8TDB$ZaP)9U`lF21{KbK>E6b?lf&n@ zlHnEJ%WRkL5)D}QVg9bn`yW5g%X}abC9jyX<95HX9%nBG9SqNtO3EPr4ZtIo>Lvp=nS`D~i-h3!ta zU0DOK)SdiU;-e1V(7o*R$B+x{?8g^Y|FD(J{^#Pg&iy~lS-NW1lFXf|N9jJV^Rzo= z+~AaE{XJ8q^A4XXws?7a!4UnQYn;oD{WW6dd#9V{6S}P0Q5n>0|1uBrpE)J&Aw_mu zhgH3~q$;xC5i{yC=b-!dR~C-Wk~{rQyowLoGX0SB)Ty9_x6cK3-J_nfrCQ(~y5VKt zzLtWpk#Cv&&?i?HUn($s7u4-&z{53L`>|Hg%5g`>!`DmI z=2G{*e)8c{zKq@waJa0U=gYtWn;&@e{wLvBzfHY+u2|)$xpk!>e$f%(hc~Ma@e8X> z!^;+14mdGHl=#=ZlIK@$UR%@n(%`hDU#pQLpIoij;d5!;_$9BjUDNB_Bj;MKxIT8u zhLRhdJgd&z|Lr%A_o>yA5l5Rns$~~nzpLNWac%Sh`35VfDGIgSH83_rKWH?d{GwWw(na zui_fKf~!__k2wC?Y++2`tjYAsG&#p@n}cWgWkZX+5ZCIjGkIoh=AIt>WLw#cn!*46 zY+7{9w%^Dz&cW*H>v6?zB404wJ68!5OCo0dweiQ9E`>Xa?e`Vpf6RJh;^T-}lHe*Q zc~ZRBY~}N&2D5@cM*R79E5ljwc*W1}75x&AFB{H1=Xb(mc)vNzl74pN&aG+I%WT&z zon`iT+s(W8d;NJo;Zz6Z?S8(y2V6aAb33}n08hIJ%Z|PYmE|9t)#`RbT|$OcH>K^Z zmQS&~Gi<@p!n4&eX9`VEx9QtqPU!CV#b2+6&&=-s&CFxWd9fyU?fs+^DJw+(j+v0+ ze$#hHm+tpl-dTKUZ*k?2iQ&AgFn5W^sTPY0pGPTjM-N%Hr+)XsRfqrXH>`{DudjiY z_U+$W77T75vp1k~K#1S-yfp>h`_%7Lj-z(nZy~c96yK10>Ebk}v;Bl6^s}RqOAVdo zr~bH+x^d6f9zU60FDqs~`##z6OF`DVVWLOJp8l}Cy!-yi!JE&Id$aF#{bi}P#r|FX zzGvEbcCI_NaJCuW?${gC0qsmXb(pep$Ec4RRu6kPs7@Zcy?@hznQxbe&-rJ|983RJ zo>$a@Kf0f9{dY=5;F;HX2TB)yp@KphG879gjq>IW`RK3S-uc;Pd9`I#^tjdM+lzeS zgH&tmpSy)wKicE}Y{>lGyYg?|d+RnnO}gb+JnyRgD}Jl}S?_%9%f~QvjRCE1CLS;P z*juvT?3v8SHA(JnMK{C$zW!M^SG%KQ@2GiAOme=1dPiG}Ijedee9q;~cw4_Ub)V<6 zK^@No)P+_KZ?LkOw?o*mle}P(@9X%GxSJ!~;^)8qYMyp#*tNCGv*ri5j2K}OxVwG) zqm|-Yqk{(wk9G6b9bLY(QgiG2Uu)-1{^Rh;8~lvY&mV@(JTo}8OV{QNk6-6C1=U z<>Jm3_m4{d8fnuq;o`Q+N7KeS*mHI#zTOi%yVfV|hT0I_BB$w-YenA?Jv~LLm2J(x zKHuBvfOd)cHSbx%oAjqy9cJ(Tbov{;_0{{h4d45&dSYfKK_+qU=Z&$PtCZPlL+R+vn=aN^3=O*t#x4sTkpbF;nS$fdT= z-s}zgqB{2TO6%sz%lDtP4&D9e_?_A1XG;5R|6xBm^RKrte6DDBJL%cEm2e?BEH{i3iQUL4CjJ$L+cKf|c1 zAxnL7Yx2zd&l+`QobQo`wkPKDs!#3te#`vv7MF`<@3JrXnZ^lrcRcabW~q6^g)82H zBWrtK8of+z_D}2XcIoGCY>&K6^nN5v;Oya!0CB5VX4dC*!j#@%Sm(D&t>aopZQYt?1#F`LDvT+6(g+pxh9;Y2`gsIo5-CT97-jGdM9m8Uw`b8=*-Tz zdeOeehfG#&WoioVh71dm^w#XVyK%vxE8LCVTXT2s^^<)Z7k_ndG zCv4W4nb~K(BQ56qoUc(IZS(f*Tf0`u4kcHP?W%gazf-TjORCM*8qB^GsDl<1UFd)G zOH~Kmx#8o)qkgt{&^C4U(r-T!=eGa%azn@TH7_cATC6TzII{28$)Q1XNX{42PaQMo zm%YC^^*F6~_xJr(%%bf++{W_BU#=#2^}HwJI3MO6uJ$x_JM*dOPPNo;sO!+Tz2n;# zTjUoW&L6R5W%<=%(fEfp^W3&Ay&>FO;A(az0^A`4Ly`6O<45BC18a+tZ537ul%j9RMvYvw*R=~RSln~y(A3X(nb*hSao#oV;IF47 z7GLs2ZY`YPuadOJxAsPHVTc3iS?sd*cbdb0p!6O%OpjR!3sC~Iw|U_q0*3ef-3sm3 z!zmzjGYlC$;o{DWFGI8wr=`ywQVp9&7swCygFrWgShd?Ec zxPkP{3U0zsRrysQuS|pk%u_`RneXRA?Qiu@G`|gFfYQK!;T2-4 zRBNd{b+DRLYHWE4$w&G?6Yg-}q8QTzy!!mh>J6b@r|Rt+(uT5z-3~#2bJM434$p?I zDtpmmLR3M;=Kj5{OAoQ%@aPjaDO|0SN=I{|WlPECWH4a&?VbXn7k5Hu9LKvzD!q`* zMTc75bAXZyQf-8$lfVkr=%jx=lZ94wWm7bZ1?MF!Ft8bWqP5EUyoT z7UEP^|Du$e#e15JVjcuodD&aAUF0+LlkKq*$wd~Aj4VO?u_&Hjnz95KnObqSx;$xl z1(%`}yMnct>ld;_HKq4iOgc|(zQ1tD$$Yg~&dcNBx{wS|vIoO|bG{h(x(1HObw2h7Bz;-sImy}_>o^YjmOBQc`4@xS6v7%q>ALsY6Fgf0nTQ(p1r zH;3b$f5h(d%b}fD1olV^1fu3Ti496wmrDN|2%FAuD{%Ai$x%i24M1=d)qi;uzEcWAdcHW?oFF_A7QY-~688 zI(@*J0(KQp7U+FkSK!P@tp2DBGf*it$Qx>Chsy}eb$+0m|KAs!a>^>m4G}`ma9S$l zVjBF~M3rECvYC`JO`V2EId3Er!KGDs#XO>?|3n+muZ%l?Ai8?}g^6g(A#zP#34*&c z@Z)jWOxcuPbuP39pV*;pUH5;Wo^~KXy*Cx@T=&tS27X`&vZ^WXL5|9+ihJtcNG$D^e>y zix5UMnSTr$e4`n03UAY|$rE?``1fU{fRr8jO8!NyH_z7`t<2#`?mc>I^E%cE>DIuw z*XWG9Jc3Tsb~?6k^CjuFbc#>TH`MZ@L?$D_ku(8)|JVl_3 z;0hCE4Ddv!lo5*$!8>y%Xk|74*>UP;aI-3@Sn^sX?anNYI&UimJ<(vifO61te^lMT z?G=MUPcA6i+kK=tig|oIki+6!5DO*IuMkInf85Ktj)?!9m{53Lh86JxN)wcM95g|` z&&u@o@Bg>>EDQIZjJ+SY{#e0^$DczE3~p7v)b3h#3iU@Z8#TQDJUQHTxwrcm{E7Iblc znF~`tSJFg0Tu^WlLGU;dnugA2J8nOj<@SR9a zVv^Y0+yCs89^H0MR8vE17gJa~+CU)Pj9Nw8%$tDU)oK2c5R&0P_07CH8K5=j1taS* zQt@FzmvbpUi)!H0{6w|7z_Ip;q`yRbN2{~yOl>+e{)uw%a9Aasy zwz*VfC4Fu#Ka^$HxhI73NvrgGDSq7vBs&KB+tnI4pZVm21PGSEtY^6R`#6nD1YOcm z5o@;Q^Oer0>U-&Xt#FI?O%B~FLn~j|V5OkvvMZF0WEfiN(iUw{W4L{hPcB!_TYr{K z#BAH#FccWpRhs4FY15;S?Ygsnu8s8ir8mG5syo_>KuyiOWxts8-G(0tW`8--G%rf& z1wCCFzT3#BJ7Dd!y`h*Jrp0%e&*N1orZmMLdzURk9{GlFx=jcCvW z!35oX{g29CCmod?&9kX<05*Ll;~MMCHbzv||D%afE19zqW2K~9UdV2LBAnGnU|`Hpgg>5@DHJ2ypaa-|aimLCQZ{#t z31CHPC2^V+u2tO}CBOAM4kps0)Z39VU_CgkS&4v2w46*ZHw!1f-uYw z!zG&n=1lQM=tR<^tnQ~bics;j86Jav(75|fMF?bwudA741Z=Q>ILo$W%femLoWP#U zAA!x@c{m1l8(;nO7a5T><`Ro%tT-osYl12KP)BsGe}bzJZzgMm*D#yjfCe|PSQ)Mz zHJ&+;fQ#KMelIfX-lF-5rrYLp)-Q+qwj@I103aut^ssWfLeaiswVA8P>$F83l?J1x zrRbRIDc9||@3}jFk1u}Hc}3op#wg0XN_WlffHrwGyH8r4PtHTUSnML%Ac-xc>kT82 zYs}=BD92)8_vk{es5W`Z!c^Cev8R?z<*K>fe%?yvD#K~7p!JT-E%beheCXJ#c(Yam zx=>%a|8#ue-c@w=G%>lkYZfJ}sF55=eJFMQD3Ea%>v1}N2L|cQ0Wr&4btz^n5Q~y4 zt)}$T+4tUsQ|NdGD&Du}0}&K~*JZ3RmYRpt?Hh#+BxWcCe?x~SNj2lXW( zJEhD`;5sNxniRpbZ*{M_>;DT*MUyc#z@=hm@%5%Av*)x$&I2;Ck!4 zn2gKtysPzp$}aLuJa*Vk%NK;d;o7x7j=69tP-fMMZHsLTA>%zI zGqO0M`TZE0YM*yAHumvc!ObA9f38|E#P|b zhtXJ%L??5K?Oc99$Z&No`*!v0qEM>O3L2|h@4hud($)?=hfkK!ap>?}tINJY-Lv5} z4MDGenQQGUXc?U?&Eqv0!sB)f&E65dDixFlma*lKj2E;&MR|aq-o_{=zNuydKvf~0 z0Q0f4)+P|?p}3cS5@+v8m<7ZA6Q*`qu1WlTzi)W(DdEI~ zL{$xH;0s7Sa8gd>FzYF}%k#_ztI6eH;#G?*uOD%{#@?)j)_$eN+Iscx8XO#ZHI=sc zqc8hx)tNE0)_j%G~Z>x);z(#)&Fz9I5VG)GC+&IZ=wHXWR$Ol#Kh zh|6AJ$`nYU8lv?!&9CJ_bd6L}bGlLkukpCmngyC-N+g6#aA;oz-UABxtF+~fY*hl?#l@MZtwHnUyN)Wgi<6(^P3~h+6f5+Nr?mBu5^NtA3xdFC7 zwB?KDm3Zd_%}&90162J$_~bx;BE_Qfs-7LvELp*){>GV%i;GTJUbVH><`H+}vDFTY zL)lGAEW9asTY@#Vwdjs-|5%Pkz;K1(>4NIRaCm6SL)M{eOy^BYZSrYB9gnj*^x>A> z{t(t)55?z|5tYR6_6qS&o9d8_sV7o|{;a`(>*35k`%M@3P03vHH2!0MuZ#zcz|rI1 zlNr_SCc5EJ)B%Mz+8tG|tp`3|t&x$j1L`H9iSAH-<40y4hI&C&9=k-`KoZ9`-CYTN z9im3&=JVD{=eA^VmhX?=Xqs$!ADX<5Al%d$dFM5lND^yl3N7XT&<>OM>l&w$JyfZ6sNniSe8uQXqazM<