From b5151d003d8de4a904978c3116ba349025ecf901 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Sun, 25 Jul 1999 11:27:36 +0000 Subject: [PATCH] Relay code for Win16 register functions converts arguments. New 'interrupt' keyword added (for Win16 interrupt handlers). Adapted .spec files and implementations of register routines. --- if1632/kernel.spec | 4 +- if1632/relay.c | 28 +-- if1632/wprocs.spec | 514 +++++++++++++++++++++---------------------- memory/global.c | 7 +- tools/build-spec.txt | 1 + tools/build.c | 64 +++++- 6 files changed, 326 insertions(+), 292 deletions(-) diff --git a/if1632/kernel.spec b/if1632/kernel.spec index 0fe876dafc2..1620601b01d 100644 --- a/if1632/kernel.spec +++ b/if1632/kernel.spec @@ -55,8 +55,8 @@ file krnl386.exe 52 pascal16 FreeProcInstance(segptr) FreeProcInstance16 53 stub CallProcInstance 54 pascal16 GetInstanceData(word word word) GetInstanceData16 -55 register Catch(segptr) Catch16 -56 register Throw(segptr word) Throw16 +55 register Catch(ptr) Catch16 +56 register Throw(ptr word) Throw16 57 pascal16 GetProfileInt(str str s_word) GetProfileInt16 58 pascal16 GetProfileString(str str str ptr word) GetProfileString16 59 pascal16 WriteProfileString(str str str) WriteProfileString16 diff --git a/if1632/relay.c b/if1632/relay.c index 1c0d8264f36..a47d2e9b648 100644 --- a/if1632/relay.c +++ b/if1632/relay.c @@ -85,7 +85,8 @@ void RELAY_DebugCallFrom16( CONTEXT86 *context ) usecdecl = ( *args == 'c' ); args += 2; - reg_func = ( memcmp( args, "regs_", 5 ) == 0 ); + reg_func = ( memcmp( args, "regs_", 5 ) == 0 + || memcmp( args, "intr_", 5 ) == 0 ); args += 5; if (usecdecl) @@ -219,7 +220,8 @@ void RELAY_DebugCallFrom16Ret( CONTEXT86 *context, int ret_val ) DPRINTF( "retval=0x%04x ret=%04x:%04x ds=%04x\n", ret_val & 0xffff, frame->cs, frame->ip, frame->ds ); } - else if ( memcmp( args+2, "regs_", 5 ) == 0 ) + else if ( memcmp( args+2, "regs_", 5 ) == 0 + || memcmp( args+2, "intr_", 5 ) == 0 ) { DPRINTF("retval=none ret=%04x:%04x ds=%04x\n", (WORD)CS_reg(context), IP_reg(context), (WORD)DS_reg(context)); @@ -324,17 +326,8 @@ void RELAY_DebugCallTo16Ret( int ret_val ) * Real prototype is: * INT16 WINAPI Catch( LPCATCHBUF lpbuf ); */ -void WINAPI Catch16( CONTEXT86 *context ) +void WINAPI Catch16( LPCATCHBUF lpbuf, CONTEXT86 *context ) { - VA_LIST16 valist; - SEGPTR buf; - LPCATCHBUF lpbuf; - - VA_START16( valist ); - buf = VA_ARG16( valist, SEGPTR ); - lpbuf = (LPCATCHBUF)PTR_SEG_TO_LIN( buf ); - VA_END16( valist ); - /* Note: we don't save the current ss, as the catch buffer is */ /* only 9 words long. Hopefully no one will have the silly */ /* idea to change the current stack before calling Throw()... */ @@ -371,20 +364,13 @@ void WINAPI Catch16( CONTEXT86 *context ) * Real prototype is: * INT16 WINAPI Throw( LPCATCHBUF lpbuf, INT16 retval ); */ -void WINAPI Throw16( CONTEXT86 *context ) +void WINAPI Throw16( LPCATCHBUF lpbuf, INT16 retval, CONTEXT86 *context ) { - VA_LIST16 valist; - SEGPTR buf; - LPCATCHBUF lpbuf; STACK16FRAME *pFrame; STACK32FRAME *frame32; TEB *teb = NtCurrentTeb(); - VA_START16( valist ); - AX_reg(context) = VA_ARG16( valist, WORD ); /* retval */ - buf = VA_ARG16( valist, SEGPTR ); - lpbuf = (LPCATCHBUF)PTR_SEG_TO_LIN( buf ); - VA_END16( valist ); + AX_reg(context) = retval; /* Find the frame32 corresponding to the frame16 we are jumping to */ pFrame = THREAD_STACK16(teb); diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec index c492f4eca94..eb8b57892d9 100644 --- a/if1632/wprocs.spec +++ b/if1632/wprocs.spec @@ -6,264 +6,264 @@ type win16 28 pascal MyAlloc(word word word) NE_AllocateSegment # Interrupt vectors 0-255 are ordinals 100-355 -# The 'word' parameter are the flags pushed on the stack by the interrupt -100 register INT_Int00Handler(word) BUILTIN_DefaultIntHandler -101 register INT_Int01Handler(word) BUILTIN_DefaultIntHandler -102 register INT_Int02Handler(word) BUILTIN_DefaultIntHandler -103 register INT_Int03Handler(word) BUILTIN_DefaultIntHandler -104 register INT_Int04Handler(word) BUILTIN_DefaultIntHandler -105 register INT_Int05Handler(word) BUILTIN_DefaultIntHandler -106 register INT_Int06Handler(word) BUILTIN_DefaultIntHandler -107 register INT_Int07Handler(word) BUILTIN_DefaultIntHandler -108 register INT_Int08Handler(word) BUILTIN_DefaultIntHandler -109 register INT_Int09Handler(word) BUILTIN_DefaultIntHandler -110 register INT_Int0aHandler(word) BUILTIN_DefaultIntHandler -111 register INT_Int0bHandler(word) BUILTIN_DefaultIntHandler -112 register INT_Int0cHandler(word) BUILTIN_DefaultIntHandler -113 register INT_Int0dHandler(word) BUILTIN_DefaultIntHandler -114 register INT_Int0eHandler(word) BUILTIN_DefaultIntHandler -115 register INT_Int0fHandler(word) BUILTIN_DefaultIntHandler -116 register INT_Int10Handler(word) INT_Int10Handler -117 register INT_Int11Handler(word) INT_Int11Handler -118 register INT_Int12Handler(word) INT_Int12Handler -119 register INT_Int13Handler(word) INT_Int13Handler -120 register INT_Int14Handler(word) BUILTIN_DefaultIntHandler -121 register INT_Int15Handler(word) INT_Int15Handler -122 register INT_Int16Handler(word) BUILTIN_DefaultIntHandler -123 register INT_Int17Handler(word) BUILTIN_DefaultIntHandler -124 register INT_Int18Handler(word) BUILTIN_DefaultIntHandler -125 register INT_Int19Handler(word) BUILTIN_DefaultIntHandler -126 register INT_Int1aHandler(word) INT_Int1aHandler -127 register INT_Int1bHandler(word) BUILTIN_DefaultIntHandler -128 register INT_Int1cHandler(word) BUILTIN_DefaultIntHandler -129 register INT_Int1dHandler(word) BUILTIN_DefaultIntHandler -130 register INT_Int1eHandler(word) BUILTIN_DefaultIntHandler -131 register INT_Int1fHandler(word) BUILTIN_DefaultIntHandler -132 register INT_Int20Handler(word) INT_Int20Handler -133 register INT_Int21Handler(word) DOS3Call -134 register INT_Int22Handler(word) BUILTIN_DefaultIntHandler -135 register INT_Int23Handler(word) BUILTIN_DefaultIntHandler -136 register INT_Int24Handler(word) BUILTIN_DefaultIntHandler +# The 'interrupt' keyword takes care of the flags pushed on the stack by the interrupt +100 interrupt INT_Int00Handler() BUILTIN_DefaultIntHandler +101 interrupt INT_Int01Handler() BUILTIN_DefaultIntHandler +102 interrupt INT_Int02Handler() BUILTIN_DefaultIntHandler +103 interrupt INT_Int03Handler() BUILTIN_DefaultIntHandler +104 interrupt INT_Int04Handler() BUILTIN_DefaultIntHandler +105 interrupt INT_Int05Handler() BUILTIN_DefaultIntHandler +106 interrupt INT_Int06Handler() BUILTIN_DefaultIntHandler +107 interrupt INT_Int07Handler() BUILTIN_DefaultIntHandler +108 interrupt INT_Int08Handler() BUILTIN_DefaultIntHandler +109 interrupt INT_Int09Handler() BUILTIN_DefaultIntHandler +110 interrupt INT_Int0aHandler() BUILTIN_DefaultIntHandler +111 interrupt INT_Int0bHandler() BUILTIN_DefaultIntHandler +112 interrupt INT_Int0cHandler() BUILTIN_DefaultIntHandler +113 interrupt INT_Int0dHandler() BUILTIN_DefaultIntHandler +114 interrupt INT_Int0eHandler() BUILTIN_DefaultIntHandler +115 interrupt INT_Int0fHandler() BUILTIN_DefaultIntHandler +116 interrupt INT_Int10Handler() INT_Int10Handler +117 interrupt INT_Int11Handler() INT_Int11Handler +118 interrupt INT_Int12Handler() INT_Int12Handler +119 interrupt INT_Int13Handler() INT_Int13Handler +120 interrupt INT_Int14Handler() BUILTIN_DefaultIntHandler +121 interrupt INT_Int15Handler() INT_Int15Handler +122 interrupt INT_Int16Handler() BUILTIN_DefaultIntHandler +123 interrupt INT_Int17Handler() BUILTIN_DefaultIntHandler +124 interrupt INT_Int18Handler() BUILTIN_DefaultIntHandler +125 interrupt INT_Int19Handler() BUILTIN_DefaultIntHandler +126 interrupt INT_Int1aHandler() INT_Int1aHandler +127 interrupt INT_Int1bHandler() BUILTIN_DefaultIntHandler +128 interrupt INT_Int1cHandler() BUILTIN_DefaultIntHandler +129 interrupt INT_Int1dHandler() BUILTIN_DefaultIntHandler +130 interrupt INT_Int1eHandler() BUILTIN_DefaultIntHandler +131 interrupt INT_Int1fHandler() BUILTIN_DefaultIntHandler +132 interrupt INT_Int20Handler() INT_Int20Handler +133 interrupt INT_Int21Handler() DOS3Call +134 interrupt INT_Int22Handler() BUILTIN_DefaultIntHandler +135 interrupt INT_Int23Handler() BUILTIN_DefaultIntHandler +136 interrupt INT_Int24Handler() BUILTIN_DefaultIntHandler # Note: int 25 and 26 don't pop the flags from the stack -137 register INT_Int25Handler() INT_Int25Handler -138 register INT_Int26Handler() INT_Int26Handler -139 register INT_Int27Handler(word) BUILTIN_DefaultIntHandler -140 register INT_Int28Handler(word) BUILTIN_DefaultIntHandler -141 register INT_Int29Handler(word) BUILTIN_DefaultIntHandler -142 register INT_Int2aHandler(word) INT_Int2aHandler -143 register INT_Int2bHandler(word) BUILTIN_DefaultIntHandler -144 register INT_Int2cHandler(word) BUILTIN_DefaultIntHandler -145 register INT_Int2dHandler(word) BUILTIN_DefaultIntHandler -146 register INT_Int2eHandler(word) BUILTIN_DefaultIntHandler -147 register INT_Int2fHandler(word) INT_Int2fHandler -148 register INT_Int30Handler(word) BUILTIN_DefaultIntHandler -149 register INT_Int31Handler(word) INT_Int31Handler -150 register INT_Int32Handler(word) BUILTIN_DefaultIntHandler -151 register INT_Int33Handler(word) BUILTIN_DefaultIntHandler -152 register INT_Int34Handler(word) BUILTIN_DefaultIntHandler -153 register INT_Int35Handler(word) BUILTIN_DefaultIntHandler -154 register INT_Int36Handler(word) BUILTIN_DefaultIntHandler -155 register INT_Int37Handler(word) BUILTIN_DefaultIntHandler -156 register INT_Int38Handler(word) BUILTIN_DefaultIntHandler -157 register INT_Int39Handler(word) BUILTIN_DefaultIntHandler -158 register INT_Int3aHandler(word) BUILTIN_DefaultIntHandler -159 register INT_Int3bHandler(word) BUILTIN_DefaultIntHandler -160 register INT_Int3cHandler(word) BUILTIN_DefaultIntHandler -161 register INT_Int3dHandler(word) INT_Int3dHandler -162 register INT_Int3eHandler(word) BUILTIN_DefaultIntHandler -163 register INT_Int3fHandler(word) BUILTIN_DefaultIntHandler -164 register INT_Int40Handler(word) BUILTIN_DefaultIntHandler -165 register INT_Int41Handler(word) INT_Int41Handler -166 register INT_Int42Handler(word) BUILTIN_DefaultIntHandler -167 register INT_Int43Handler(word) BUILTIN_DefaultIntHandler -168 register INT_Int44Handler(word) BUILTIN_DefaultIntHandler -169 register INT_Int45Handler(word) BUILTIN_DefaultIntHandler -170 register INT_Int46Handler(word) BUILTIN_DefaultIntHandler -171 register INT_Int47Handler(word) BUILTIN_DefaultIntHandler -172 register INT_Int48Handler(word) BUILTIN_DefaultIntHandler -173 register INT_Int49Handler(word) BUILTIN_DefaultIntHandler -174 register INT_Int4aHandler(word) BUILTIN_DefaultIntHandler -175 register INT_Int4bHandler(word) INT_Int4bHandler -176 register INT_Int4cHandler(word) BUILTIN_DefaultIntHandler -177 register INT_Int4dHandler(word) BUILTIN_DefaultIntHandler -178 register INT_Int4eHandler(word) BUILTIN_DefaultIntHandler -179 register INT_Int4fHandler(word) BUILTIN_DefaultIntHandler -180 register INT_Int50Handler(word) BUILTIN_DefaultIntHandler -181 register INT_Int51Handler(word) BUILTIN_DefaultIntHandler -182 register INT_Int52Handler(word) BUILTIN_DefaultIntHandler -183 register INT_Int53Handler(word) BUILTIN_DefaultIntHandler -184 register INT_Int54Handler(word) BUILTIN_DefaultIntHandler -185 register INT_Int55Handler(word) BUILTIN_DefaultIntHandler -186 register INT_Int56Handler(word) BUILTIN_DefaultIntHandler -187 register INT_Int57Handler(word) BUILTIN_DefaultIntHandler -188 register INT_Int58Handler(word) BUILTIN_DefaultIntHandler -189 register INT_Int59Handler(word) BUILTIN_DefaultIntHandler -190 register INT_Int5aHandler(word) BUILTIN_DefaultIntHandler -191 register INT_Int5bHandler(word) BUILTIN_DefaultIntHandler -192 register INT_Int5cHandler(word) NetBIOSCall16 -193 register INT_Int5dHandler(word) BUILTIN_DefaultIntHandler -194 register INT_Int5eHandler(word) BUILTIN_DefaultIntHandler -195 register INT_Int5fHandler(word) BUILTIN_DefaultIntHandler -196 register INT_Int60Handler(word) BUILTIN_DefaultIntHandler -197 register INT_Int61Handler(word) BUILTIN_DefaultIntHandler -198 register INT_Int62Handler(word) BUILTIN_DefaultIntHandler -199 register INT_Int63Handler(word) BUILTIN_DefaultIntHandler -200 register INT_Int64Handler(word) BUILTIN_DefaultIntHandler -201 register INT_Int65Handler(word) BUILTIN_DefaultIntHandler -202 register INT_Int66Handler(word) BUILTIN_DefaultIntHandler -203 register INT_Int67Handler(word) BUILTIN_DefaultIntHandler -204 register INT_Int68Handler(word) BUILTIN_DefaultIntHandler -205 register INT_Int69Handler(word) BUILTIN_DefaultIntHandler -206 register INT_Int6aHandler(word) BUILTIN_DefaultIntHandler -207 register INT_Int6bHandler(word) BUILTIN_DefaultIntHandler -208 register INT_Int6cHandler(word) BUILTIN_DefaultIntHandler -209 register INT_Int6dHandler(word) BUILTIN_DefaultIntHandler -210 register INT_Int6eHandler(word) BUILTIN_DefaultIntHandler -211 register INT_Int6fHandler(word) BUILTIN_DefaultIntHandler -212 register INT_Int70Handler(word) BUILTIN_DefaultIntHandler -213 register INT_Int71Handler(word) BUILTIN_DefaultIntHandler -214 register INT_Int72Handler(word) BUILTIN_DefaultIntHandler -215 register INT_Int73Handler(word) BUILTIN_DefaultIntHandler -216 register INT_Int74Handler(word) BUILTIN_DefaultIntHandler -217 register INT_Int75Handler(word) BUILTIN_DefaultIntHandler -218 register INT_Int76Handler(word) BUILTIN_DefaultIntHandler -219 register INT_Int77Handler(word) BUILTIN_DefaultIntHandler -220 register INT_Int78Handler(word) BUILTIN_DefaultIntHandler -221 register INT_Int79Handler(word) BUILTIN_DefaultIntHandler -222 register INT_Int7aHandler(word) BUILTIN_DefaultIntHandler -223 register INT_Int7bHandler(word) BUILTIN_DefaultIntHandler -224 register INT_Int7cHandler(word) BUILTIN_DefaultIntHandler -225 register INT_Int7dHandler(word) BUILTIN_DefaultIntHandler -226 register INT_Int7eHandler(word) BUILTIN_DefaultIntHandler -227 register INT_Int7fHandler(word) BUILTIN_DefaultIntHandler -228 register INT_Int80Handler(word) BUILTIN_DefaultIntHandler -229 register INT_Int81Handler(word) BUILTIN_DefaultIntHandler -230 register INT_Int82Handler(word) BUILTIN_DefaultIntHandler -231 register INT_Int83Handler(word) BUILTIN_DefaultIntHandler -232 register INT_Int84Handler(word) BUILTIN_DefaultIntHandler -233 register INT_Int85Handler(word) BUILTIN_DefaultIntHandler -234 register INT_Int86Handler(word) BUILTIN_DefaultIntHandler -235 register INT_Int87Handler(word) BUILTIN_DefaultIntHandler -236 register INT_Int88Handler(word) BUILTIN_DefaultIntHandler -237 register INT_Int89Handler(word) BUILTIN_DefaultIntHandler -238 register INT_Int8aHandler(word) BUILTIN_DefaultIntHandler -239 register INT_Int8bHandler(word) BUILTIN_DefaultIntHandler -240 register INT_Int8cHandler(word) BUILTIN_DefaultIntHandler -241 register INT_Int8dHandler(word) BUILTIN_DefaultIntHandler -242 register INT_Int8eHandler(word) BUILTIN_DefaultIntHandler -243 register INT_Int8fHandler(word) BUILTIN_DefaultIntHandler -244 register INT_Int90Handler(word) BUILTIN_DefaultIntHandler -245 register INT_Int91Handler(word) BUILTIN_DefaultIntHandler -246 register INT_Int92Handler(word) BUILTIN_DefaultIntHandler -247 register INT_Int93Handler(word) BUILTIN_DefaultIntHandler -248 register INT_Int94Handler(word) BUILTIN_DefaultIntHandler -249 register INT_Int95Handler(word) BUILTIN_DefaultIntHandler -250 register INT_Int96Handler(word) BUILTIN_DefaultIntHandler -251 register INT_Int97Handler(word) BUILTIN_DefaultIntHandler -252 register INT_Int98Handler(word) BUILTIN_DefaultIntHandler -253 register INT_Int99Handler(word) BUILTIN_DefaultIntHandler -254 register INT_Int9aHandler(word) BUILTIN_DefaultIntHandler -255 register INT_Int9bHandler(word) BUILTIN_DefaultIntHandler -256 register INT_Int9cHandler(word) BUILTIN_DefaultIntHandler -257 register INT_Int9dHandler(word) BUILTIN_DefaultIntHandler -258 register INT_Int9eHandler(word) BUILTIN_DefaultIntHandler -259 register INT_Int9fHandler(word) BUILTIN_DefaultIntHandler -260 register INT_Inta0Handler(word) BUILTIN_DefaultIntHandler -261 register INT_Inta1Handler(word) BUILTIN_DefaultIntHandler -262 register INT_Inta2Handler(word) BUILTIN_DefaultIntHandler -263 register INT_Inta3Handler(word) BUILTIN_DefaultIntHandler -264 register INT_Inta4Handler(word) BUILTIN_DefaultIntHandler -265 register INT_Inta5Handler(word) BUILTIN_DefaultIntHandler -266 register INT_Inta6Handler(word) BUILTIN_DefaultIntHandler -267 register INT_Inta7Handler(word) BUILTIN_DefaultIntHandler -268 register INT_Inta8Handler(word) BUILTIN_DefaultIntHandler -269 register INT_Inta9Handler(word) BUILTIN_DefaultIntHandler -270 register INT_IntaaHandler(word) BUILTIN_DefaultIntHandler -271 register INT_IntabHandler(word) BUILTIN_DefaultIntHandler -272 register INT_IntacHandler(word) BUILTIN_DefaultIntHandler -273 register INT_IntadHandler(word) BUILTIN_DefaultIntHandler -274 register INT_IntaeHandler(word) BUILTIN_DefaultIntHandler -275 register INT_IntafHandler(word) BUILTIN_DefaultIntHandler -276 register INT_Intb0Handler(word) BUILTIN_DefaultIntHandler -277 register INT_Intb1Handler(word) BUILTIN_DefaultIntHandler -278 register INT_Intb2Handler(word) BUILTIN_DefaultIntHandler -279 register INT_Intb3Handler(word) BUILTIN_DefaultIntHandler -280 register INT_Intb4Handler(word) BUILTIN_DefaultIntHandler -281 register INT_Intb5Handler(word) BUILTIN_DefaultIntHandler -282 register INT_Intb6Handler(word) BUILTIN_DefaultIntHandler -283 register INT_Intb7Handler(word) BUILTIN_DefaultIntHandler -284 register INT_Intb8Handler(word) BUILTIN_DefaultIntHandler -285 register INT_Intb9Handler(word) BUILTIN_DefaultIntHandler -286 register INT_IntbaHandler(word) BUILTIN_DefaultIntHandler -287 register INT_IntbbHandler(word) BUILTIN_DefaultIntHandler -288 register INT_IntbcHandler(word) BUILTIN_DefaultIntHandler -289 register INT_IntbdHandler(word) BUILTIN_DefaultIntHandler -290 register INT_IntbeHandler(word) BUILTIN_DefaultIntHandler -291 register INT_IntbfHandler(word) BUILTIN_DefaultIntHandler -292 register INT_Intc0Handler(word) BUILTIN_DefaultIntHandler -293 register INT_Intc1Handler(word) BUILTIN_DefaultIntHandler -294 register INT_Intc2Handler(word) BUILTIN_DefaultIntHandler -295 register INT_Intc3Handler(word) BUILTIN_DefaultIntHandler -296 register INT_Intc4Handler(word) BUILTIN_DefaultIntHandler -297 register INT_Intc5Handler(word) BUILTIN_DefaultIntHandler -298 register INT_Intc6Handler(word) BUILTIN_DefaultIntHandler -299 register INT_Intc7Handler(word) BUILTIN_DefaultIntHandler -300 register INT_Intc8Handler(word) BUILTIN_DefaultIntHandler -301 register INT_Intc9Handler(word) BUILTIN_DefaultIntHandler -302 register INT_IntcaHandler(word) BUILTIN_DefaultIntHandler -303 register INT_IntcbHandler(word) BUILTIN_DefaultIntHandler -304 register INT_IntccHandler(word) BUILTIN_DefaultIntHandler -305 register INT_IntcdHandler(word) BUILTIN_DefaultIntHandler -306 register INT_IntceHandler(word) BUILTIN_DefaultIntHandler -307 register INT_IntcfHandler(word) BUILTIN_DefaultIntHandler -308 register INT_Intd0Handler(word) BUILTIN_DefaultIntHandler -309 register INT_Intd1Handler(word) BUILTIN_DefaultIntHandler -310 register INT_Intd2Handler(word) BUILTIN_DefaultIntHandler -311 register INT_Intd3Handler(word) BUILTIN_DefaultIntHandler -312 register INT_Intd4Handler(word) BUILTIN_DefaultIntHandler -313 register INT_Intd5Handler(word) BUILTIN_DefaultIntHandler -314 register INT_Intd6Handler(word) BUILTIN_DefaultIntHandler -315 register INT_Intd7Handler(word) BUILTIN_DefaultIntHandler -316 register INT_Intd8Handler(word) BUILTIN_DefaultIntHandler -317 register INT_Intd9Handler(word) BUILTIN_DefaultIntHandler -318 register INT_IntdaHandler(word) BUILTIN_DefaultIntHandler -319 register INT_IntdbHandler(word) BUILTIN_DefaultIntHandler -320 register INT_IntdcHandler(word) BUILTIN_DefaultIntHandler -321 register INT_IntddHandler(word) BUILTIN_DefaultIntHandler -322 register INT_IntdeHandler(word) BUILTIN_DefaultIntHandler -323 register INT_IntdfHandler(word) BUILTIN_DefaultIntHandler -324 register INT_Inte0Handler(word) BUILTIN_DefaultIntHandler -325 register INT_Inte1Handler(word) BUILTIN_DefaultIntHandler -326 register INT_Inte2Handler(word) BUILTIN_DefaultIntHandler -327 register INT_Inte3Handler(word) BUILTIN_DefaultIntHandler -328 register INT_Inte4Handler(word) BUILTIN_DefaultIntHandler -329 register INT_Inte5Handler(word) BUILTIN_DefaultIntHandler -330 register INT_Inte6Handler(word) BUILTIN_DefaultIntHandler -331 register INT_Inte7Handler(word) BUILTIN_DefaultIntHandler -332 register INT_Inte8Handler(word) BUILTIN_DefaultIntHandler -333 register INT_Inte9Handler(word) BUILTIN_DefaultIntHandler -334 register INT_InteaHandler(word) BUILTIN_DefaultIntHandler -335 register INT_IntebHandler(word) BUILTIN_DefaultIntHandler -336 register INT_IntecHandler(word) BUILTIN_DefaultIntHandler -337 register INT_IntedHandler(word) BUILTIN_DefaultIntHandler -338 register INT_InteeHandler(word) BUILTIN_DefaultIntHandler -339 register INT_IntefHandler(word) BUILTIN_DefaultIntHandler -340 register INT_Intf0Handler(word) BUILTIN_DefaultIntHandler -341 register INT_Intf1Handler(word) BUILTIN_DefaultIntHandler -342 register INT_Intf2Handler(word) BUILTIN_DefaultIntHandler -343 register INT_Intf3Handler(word) BUILTIN_DefaultIntHandler -344 register INT_Intf4Handler(word) BUILTIN_DefaultIntHandler -345 register INT_Intf5Handler(word) BUILTIN_DefaultIntHandler -346 register INT_Intf6Handler(word) BUILTIN_DefaultIntHandler -347 register INT_Intf7Handler(word) BUILTIN_DefaultIntHandler -348 register INT_Intf8Handler(word) BUILTIN_DefaultIntHandler -349 register INT_Intf9Handler(word) BUILTIN_DefaultIntHandler -350 register INT_IntfaHandler(word) BUILTIN_DefaultIntHandler -351 register INT_IntfbHandler(word) BUILTIN_DefaultIntHandler -352 register INT_IntfcHandler(word) BUILTIN_DefaultIntHandler -353 register INT_IntfdHandler(word) BUILTIN_DefaultIntHandler -354 register INT_IntfeHandler(word) BUILTIN_DefaultIntHandler -355 register INT_IntffHandler(word) BUILTIN_DefaultIntHandler +137 register INT_Int25Handler() INT_Int25Handler +138 register INT_Int26Handler() INT_Int26Handler +139 interrupt INT_Int27Handler() BUILTIN_DefaultIntHandler +140 interrupt INT_Int28Handler() BUILTIN_DefaultIntHandler +141 interrupt INT_Int29Handler() BUILTIN_DefaultIntHandler +142 interrupt INT_Int2aHandler() INT_Int2aHandler +143 interrupt INT_Int2bHandler() BUILTIN_DefaultIntHandler +144 interrupt INT_Int2cHandler() BUILTIN_DefaultIntHandler +145 interrupt INT_Int2dHandler() BUILTIN_DefaultIntHandler +146 interrupt INT_Int2eHandler() BUILTIN_DefaultIntHandler +147 interrupt INT_Int2fHandler() INT_Int2fHandler +148 interrupt INT_Int30Handler() BUILTIN_DefaultIntHandler +149 interrupt INT_Int31Handler() INT_Int31Handler +150 interrupt INT_Int32Handler() BUILTIN_DefaultIntHandler +151 interrupt INT_Int33Handler() BUILTIN_DefaultIntHandler +152 interrupt INT_Int34Handler() BUILTIN_DefaultIntHandler +153 interrupt INT_Int35Handler() BUILTIN_DefaultIntHandler +154 interrupt INT_Int36Handler() BUILTIN_DefaultIntHandler +155 interrupt INT_Int37Handler() BUILTIN_DefaultIntHandler +156 interrupt INT_Int38Handler() BUILTIN_DefaultIntHandler +157 interrupt INT_Int39Handler() BUILTIN_DefaultIntHandler +158 interrupt INT_Int3aHandler() BUILTIN_DefaultIntHandler +159 interrupt INT_Int3bHandler() BUILTIN_DefaultIntHandler +160 interrupt INT_Int3cHandler() BUILTIN_DefaultIntHandler +161 interrupt INT_Int3dHandler() INT_Int3dHandler +162 interrupt INT_Int3eHandler() BUILTIN_DefaultIntHandler +163 interrupt INT_Int3fHandler() BUILTIN_DefaultIntHandler +164 interrupt INT_Int40Handler() BUILTIN_DefaultIntHandler +165 interrupt INT_Int41Handler() INT_Int41Handler +166 interrupt INT_Int42Handler() BUILTIN_DefaultIntHandler +167 interrupt INT_Int43Handler() BUILTIN_DefaultIntHandler +168 interrupt INT_Int44Handler() BUILTIN_DefaultIntHandler +169 interrupt INT_Int45Handler() BUILTIN_DefaultIntHandler +170 interrupt INT_Int46Handler() BUILTIN_DefaultIntHandler +171 interrupt INT_Int47Handler() BUILTIN_DefaultIntHandler +172 interrupt INT_Int48Handler() BUILTIN_DefaultIntHandler +173 interrupt INT_Int49Handler() BUILTIN_DefaultIntHandler +174 interrupt INT_Int4aHandler() BUILTIN_DefaultIntHandler +175 interrupt INT_Int4bHandler() INT_Int4bHandler +176 interrupt INT_Int4cHandler() BUILTIN_DefaultIntHandler +177 interrupt INT_Int4dHandler() BUILTIN_DefaultIntHandler +178 interrupt INT_Int4eHandler() BUILTIN_DefaultIntHandler +179 interrupt INT_Int4fHandler() BUILTIN_DefaultIntHandler +180 interrupt INT_Int50Handler() BUILTIN_DefaultIntHandler +181 interrupt INT_Int51Handler() BUILTIN_DefaultIntHandler +182 interrupt INT_Int52Handler() BUILTIN_DefaultIntHandler +183 interrupt INT_Int53Handler() BUILTIN_DefaultIntHandler +184 interrupt INT_Int54Handler() BUILTIN_DefaultIntHandler +185 interrupt INT_Int55Handler() BUILTIN_DefaultIntHandler +186 interrupt INT_Int56Handler() BUILTIN_DefaultIntHandler +187 interrupt INT_Int57Handler() BUILTIN_DefaultIntHandler +188 interrupt INT_Int58Handler() BUILTIN_DefaultIntHandler +189 interrupt INT_Int59Handler() BUILTIN_DefaultIntHandler +190 interrupt INT_Int5aHandler() BUILTIN_DefaultIntHandler +191 interrupt INT_Int5bHandler() BUILTIN_DefaultIntHandler +192 interrupt INT_Int5cHandler() NetBIOSCall16 +193 interrupt INT_Int5dHandler() BUILTIN_DefaultIntHandler +194 interrupt INT_Int5eHandler() BUILTIN_DefaultIntHandler +195 interrupt INT_Int5fHandler() BUILTIN_DefaultIntHandler +196 interrupt INT_Int60Handler() BUILTIN_DefaultIntHandler +197 interrupt INT_Int61Handler() BUILTIN_DefaultIntHandler +198 interrupt INT_Int62Handler() BUILTIN_DefaultIntHandler +199 interrupt INT_Int63Handler() BUILTIN_DefaultIntHandler +200 interrupt INT_Int64Handler() BUILTIN_DefaultIntHandler +201 interrupt INT_Int65Handler() BUILTIN_DefaultIntHandler +202 interrupt INT_Int66Handler() BUILTIN_DefaultIntHandler +203 interrupt INT_Int67Handler() BUILTIN_DefaultIntHandler +204 interrupt INT_Int68Handler() BUILTIN_DefaultIntHandler +205 interrupt INT_Int69Handler() BUILTIN_DefaultIntHandler +206 interrupt INT_Int6aHandler() BUILTIN_DefaultIntHandler +207 interrupt INT_Int6bHandler() BUILTIN_DefaultIntHandler +208 interrupt INT_Int6cHandler() BUILTIN_DefaultIntHandler +209 interrupt INT_Int6dHandler() BUILTIN_DefaultIntHandler +210 interrupt INT_Int6eHandler() BUILTIN_DefaultIntHandler +211 interrupt INT_Int6fHandler() BUILTIN_DefaultIntHandler +212 interrupt INT_Int70Handler() BUILTIN_DefaultIntHandler +213 interrupt INT_Int71Handler() BUILTIN_DefaultIntHandler +214 interrupt INT_Int72Handler() BUILTIN_DefaultIntHandler +215 interrupt INT_Int73Handler() BUILTIN_DefaultIntHandler +216 interrupt INT_Int74Handler() BUILTIN_DefaultIntHandler +217 interrupt INT_Int75Handler() BUILTIN_DefaultIntHandler +218 interrupt INT_Int76Handler() BUILTIN_DefaultIntHandler +219 interrupt INT_Int77Handler() BUILTIN_DefaultIntHandler +220 interrupt INT_Int78Handler() BUILTIN_DefaultIntHandler +221 interrupt INT_Int79Handler() BUILTIN_DefaultIntHandler +222 interrupt INT_Int7aHandler() BUILTIN_DefaultIntHandler +223 interrupt INT_Int7bHandler() BUILTIN_DefaultIntHandler +224 interrupt INT_Int7cHandler() BUILTIN_DefaultIntHandler +225 interrupt INT_Int7dHandler() BUILTIN_DefaultIntHandler +226 interrupt INT_Int7eHandler() BUILTIN_DefaultIntHandler +227 interrupt INT_Int7fHandler() BUILTIN_DefaultIntHandler +228 interrupt INT_Int80Handler() BUILTIN_DefaultIntHandler +229 interrupt INT_Int81Handler() BUILTIN_DefaultIntHandler +230 interrupt INT_Int82Handler() BUILTIN_DefaultIntHandler +231 interrupt INT_Int83Handler() BUILTIN_DefaultIntHandler +232 interrupt INT_Int84Handler() BUILTIN_DefaultIntHandler +233 interrupt INT_Int85Handler() BUILTIN_DefaultIntHandler +234 interrupt INT_Int86Handler() BUILTIN_DefaultIntHandler +235 interrupt INT_Int87Handler() BUILTIN_DefaultIntHandler +236 interrupt INT_Int88Handler() BUILTIN_DefaultIntHandler +237 interrupt INT_Int89Handler() BUILTIN_DefaultIntHandler +238 interrupt INT_Int8aHandler() BUILTIN_DefaultIntHandler +239 interrupt INT_Int8bHandler() BUILTIN_DefaultIntHandler +240 interrupt INT_Int8cHandler() BUILTIN_DefaultIntHandler +241 interrupt INT_Int8dHandler() BUILTIN_DefaultIntHandler +242 interrupt INT_Int8eHandler() BUILTIN_DefaultIntHandler +243 interrupt INT_Int8fHandler() BUILTIN_DefaultIntHandler +244 interrupt INT_Int90Handler() BUILTIN_DefaultIntHandler +245 interrupt INT_Int91Handler() BUILTIN_DefaultIntHandler +246 interrupt INT_Int92Handler() BUILTIN_DefaultIntHandler +247 interrupt INT_Int93Handler() BUILTIN_DefaultIntHandler +248 interrupt INT_Int94Handler() BUILTIN_DefaultIntHandler +249 interrupt INT_Int95Handler() BUILTIN_DefaultIntHandler +250 interrupt INT_Int96Handler() BUILTIN_DefaultIntHandler +251 interrupt INT_Int97Handler() BUILTIN_DefaultIntHandler +252 interrupt INT_Int98Handler() BUILTIN_DefaultIntHandler +253 interrupt INT_Int99Handler() BUILTIN_DefaultIntHandler +254 interrupt INT_Int9aHandler() BUILTIN_DefaultIntHandler +255 interrupt INT_Int9bHandler() BUILTIN_DefaultIntHandler +256 interrupt INT_Int9cHandler() BUILTIN_DefaultIntHandler +257 interrupt INT_Int9dHandler() BUILTIN_DefaultIntHandler +258 interrupt INT_Int9eHandler() BUILTIN_DefaultIntHandler +259 interrupt INT_Int9fHandler() BUILTIN_DefaultIntHandler +260 interrupt INT_Inta0Handler() BUILTIN_DefaultIntHandler +261 interrupt INT_Inta1Handler() BUILTIN_DefaultIntHandler +262 interrupt INT_Inta2Handler() BUILTIN_DefaultIntHandler +263 interrupt INT_Inta3Handler() BUILTIN_DefaultIntHandler +264 interrupt INT_Inta4Handler() BUILTIN_DefaultIntHandler +265 interrupt INT_Inta5Handler() BUILTIN_DefaultIntHandler +266 interrupt INT_Inta6Handler() BUILTIN_DefaultIntHandler +267 interrupt INT_Inta7Handler() BUILTIN_DefaultIntHandler +268 interrupt INT_Inta8Handler() BUILTIN_DefaultIntHandler +269 interrupt INT_Inta9Handler() BUILTIN_DefaultIntHandler +270 interrupt INT_IntaaHandler() BUILTIN_DefaultIntHandler +271 interrupt INT_IntabHandler() BUILTIN_DefaultIntHandler +272 interrupt INT_IntacHandler() BUILTIN_DefaultIntHandler +273 interrupt INT_IntadHandler() BUILTIN_DefaultIntHandler +274 interrupt INT_IntaeHandler() BUILTIN_DefaultIntHandler +275 interrupt INT_IntafHandler() BUILTIN_DefaultIntHandler +276 interrupt INT_Intb0Handler() BUILTIN_DefaultIntHandler +277 interrupt INT_Intb1Handler() BUILTIN_DefaultIntHandler +278 interrupt INT_Intb2Handler() BUILTIN_DefaultIntHandler +279 interrupt INT_Intb3Handler() BUILTIN_DefaultIntHandler +280 interrupt INT_Intb4Handler() BUILTIN_DefaultIntHandler +281 interrupt INT_Intb5Handler() BUILTIN_DefaultIntHandler +282 interrupt INT_Intb6Handler() BUILTIN_DefaultIntHandler +283 interrupt INT_Intb7Handler() BUILTIN_DefaultIntHandler +284 interrupt INT_Intb8Handler() BUILTIN_DefaultIntHandler +285 interrupt INT_Intb9Handler() BUILTIN_DefaultIntHandler +286 interrupt INT_IntbaHandler() BUILTIN_DefaultIntHandler +287 interrupt INT_IntbbHandler() BUILTIN_DefaultIntHandler +288 interrupt INT_IntbcHandler() BUILTIN_DefaultIntHandler +289 interrupt INT_IntbdHandler() BUILTIN_DefaultIntHandler +290 interrupt INT_IntbeHandler() BUILTIN_DefaultIntHandler +291 interrupt INT_IntbfHandler() BUILTIN_DefaultIntHandler +292 interrupt INT_Intc0Handler() BUILTIN_DefaultIntHandler +293 interrupt INT_Intc1Handler() BUILTIN_DefaultIntHandler +294 interrupt INT_Intc2Handler() BUILTIN_DefaultIntHandler +295 interrupt INT_Intc3Handler() BUILTIN_DefaultIntHandler +296 interrupt INT_Intc4Handler() BUILTIN_DefaultIntHandler +297 interrupt INT_Intc5Handler() BUILTIN_DefaultIntHandler +298 interrupt INT_Intc6Handler() BUILTIN_DefaultIntHandler +299 interrupt INT_Intc7Handler() BUILTIN_DefaultIntHandler +300 interrupt INT_Intc8Handler() BUILTIN_DefaultIntHandler +301 interrupt INT_Intc9Handler() BUILTIN_DefaultIntHandler +302 interrupt INT_IntcaHandler() BUILTIN_DefaultIntHandler +303 interrupt INT_IntcbHandler() BUILTIN_DefaultIntHandler +304 interrupt INT_IntccHandler() BUILTIN_DefaultIntHandler +305 interrupt INT_IntcdHandler() BUILTIN_DefaultIntHandler +306 interrupt INT_IntceHandler() BUILTIN_DefaultIntHandler +307 interrupt INT_IntcfHandler() BUILTIN_DefaultIntHandler +308 interrupt INT_Intd0Handler() BUILTIN_DefaultIntHandler +309 interrupt INT_Intd1Handler() BUILTIN_DefaultIntHandler +310 interrupt INT_Intd2Handler() BUILTIN_DefaultIntHandler +311 interrupt INT_Intd3Handler() BUILTIN_DefaultIntHandler +312 interrupt INT_Intd4Handler() BUILTIN_DefaultIntHandler +313 interrupt INT_Intd5Handler() BUILTIN_DefaultIntHandler +314 interrupt INT_Intd6Handler() BUILTIN_DefaultIntHandler +315 interrupt INT_Intd7Handler() BUILTIN_DefaultIntHandler +316 interrupt INT_Intd8Handler() BUILTIN_DefaultIntHandler +317 interrupt INT_Intd9Handler() BUILTIN_DefaultIntHandler +318 interrupt INT_IntdaHandler() BUILTIN_DefaultIntHandler +319 interrupt INT_IntdbHandler() BUILTIN_DefaultIntHandler +320 interrupt INT_IntdcHandler() BUILTIN_DefaultIntHandler +321 interrupt INT_IntddHandler() BUILTIN_DefaultIntHandler +322 interrupt INT_IntdeHandler() BUILTIN_DefaultIntHandler +323 interrupt INT_IntdfHandler() BUILTIN_DefaultIntHandler +324 interrupt INT_Inte0Handler() BUILTIN_DefaultIntHandler +325 interrupt INT_Inte1Handler() BUILTIN_DefaultIntHandler +326 interrupt INT_Inte2Handler() BUILTIN_DefaultIntHandler +327 interrupt INT_Inte3Handler() BUILTIN_DefaultIntHandler +328 interrupt INT_Inte4Handler() BUILTIN_DefaultIntHandler +329 interrupt INT_Inte5Handler() BUILTIN_DefaultIntHandler +330 interrupt INT_Inte6Handler() BUILTIN_DefaultIntHandler +331 interrupt INT_Inte7Handler() BUILTIN_DefaultIntHandler +332 interrupt INT_Inte8Handler() BUILTIN_DefaultIntHandler +333 interrupt INT_Inte9Handler() BUILTIN_DefaultIntHandler +334 interrupt INT_InteaHandler() BUILTIN_DefaultIntHandler +335 interrupt INT_IntebHandler() BUILTIN_DefaultIntHandler +336 interrupt INT_IntecHandler() BUILTIN_DefaultIntHandler +337 interrupt INT_IntedHandler() BUILTIN_DefaultIntHandler +338 interrupt INT_InteeHandler() BUILTIN_DefaultIntHandler +339 interrupt INT_IntefHandler() BUILTIN_DefaultIntHandler +340 interrupt INT_Intf0Handler() BUILTIN_DefaultIntHandler +341 interrupt INT_Intf1Handler() BUILTIN_DefaultIntHandler +342 interrupt INT_Intf2Handler() BUILTIN_DefaultIntHandler +343 interrupt INT_Intf3Handler() BUILTIN_DefaultIntHandler +344 interrupt INT_Intf4Handler() BUILTIN_DefaultIntHandler +345 interrupt INT_Intf5Handler() BUILTIN_DefaultIntHandler +346 interrupt INT_Intf6Handler() BUILTIN_DefaultIntHandler +347 interrupt INT_Intf7Handler() BUILTIN_DefaultIntHandler +348 interrupt INT_Intf8Handler() BUILTIN_DefaultIntHandler +349 interrupt INT_Intf9Handler() BUILTIN_DefaultIntHandler +350 interrupt INT_IntfaHandler() BUILTIN_DefaultIntHandler +351 interrupt INT_IntfbHandler() BUILTIN_DefaultIntHandler +352 interrupt INT_IntfcHandler() BUILTIN_DefaultIntHandler +353 interrupt INT_IntfdHandler() BUILTIN_DefaultIntHandler +354 interrupt INT_IntfeHandler() BUILTIN_DefaultIntHandler +355 interrupt INT_IntffHandler() BUILTIN_DefaultIntHandler # VxDs. The first Vxd is at 400 # diff --git a/memory/global.c b/memory/global.c index 89a530865dc..16fcb258a99 100644 --- a/memory/global.c +++ b/memory/global.c @@ -456,12 +456,9 @@ BOOL16 WINAPI GlobalUnlock16( * *all* registers, even AX/DX ! * */ -void WINAPI GlobalChangeLockCount16( CONTEXT86 *context ) +void WINAPI GlobalChangeLockCount16( HGLOBAL16 handle, INT16 delta, + CONTEXT86 *context ) { - LPWORD args = PTR_SEG_OFF_TO_LIN( SS_reg( context ), SP_reg( context ) ); - HGLOBAL16 handle = (HGLOBAL16)args[3]; - INT16 delta = (INT16) args[2]; - if ( delta == 1 ) GlobalLock16( handle ); else if ( delta == -1 ) diff --git a/tools/build-spec.txt b/tools/build-spec.txt index f7b5065baf4..050d76ddbd0 100644 --- a/tools/build-spec.txt +++ b/tools/build-spec.txt @@ -69,6 +69,7 @@ by the ordinal number corresponding to the function. - "pascal16" for a Win16 function returning a 16-bit value - "pascal" for a Win16 function returning a 32-bit value - "register" for a function using CPU register to pass arguments +- "interrupt" for a Win16 interrupt handler routine - "stdcall" for a normal Win32 function - "cdecl" for a Win32 function using the C calling convention - "varargs" for a Win32 function taking a variable number of arguments diff --git a/tools/build.c b/tools/build.c index e2af4aff537..e9b655edf4d 100644 --- a/tools/build.c +++ b/tools/build.c @@ -50,6 +50,7 @@ typedef enum TYPE_PASCAL, /* pascal function with 32-bit return (Win16) */ TYPE_ABS, /* absolute value (Win16) */ TYPE_REGISTER, /* register function */ + TYPE_INTERRUPT, /* interrupt handler function (Win16) */ TYPE_STUB, /* unimplemented stub */ TYPE_STDCALL, /* stdcall function (Win32) */ TYPE_CDECL, /* cdecl function (Win32) */ @@ -69,6 +70,7 @@ static const char * const TypeNames[TYPE_NBTYPES] = "pascal", /* TYPE_PASCAL */ "equate", /* TYPE_ABS */ "register", /* TYPE_REGISTER */ + "interrupt", /* TYPE_INTERRUPT */ "stub", /* TYPE_STUB */ "stdcall", /* TYPE_STDCALL */ "cdecl", /* TYPE_CDECL */ @@ -549,6 +551,42 @@ static int ParseVarargs( ORDDEF *odp ) return 0; } +/******************************************************************* + * ParseInterrupt + * + * Parse an 'interrupt' definition. + */ +static int ParseInterrupt( ORDDEF *odp ) +{ + char *token; + + if (SpecType == SPEC_WIN32) + { + fprintf( stderr, "%s:%d: 'interrupt' not supported for Win32\n", + SpecName, Line ); + return -1; + } + + token = GetToken(); + if (*token != '(') + { + fprintf(stderr, "%s:%d: Expected '(' got '%s'\n", + SpecName, Line, token); + return -1; + } + token = GetToken(); + if (*token != ')') + { + fprintf(stderr, "%s:%d: Expected ')' got '%s'\n", + SpecName, Line, token); + return -1; + } + + odp->u.func.arg_types[0] = '\0'; + strcpy( odp->u.func.link_name, GetToken() ); + return 0; +} + /******************************************************************* * ParseExtern @@ -643,6 +681,8 @@ static int ParseOrdinal(int ordinal) case TYPE_STDCALL: case TYPE_CDECL: return ParseExportFunction( odp ); + case TYPE_INTERRUPT: + return ParseInterrupt( odp ); case TYPE_ABS: return ParseEquate( odp ); case TYPE_STUB: @@ -944,6 +984,7 @@ static int BuildModule16( FILE *outfile, int max_code_offset, case TYPE_PASCAL: case TYPE_PASCAL_16: case TYPE_REGISTER: + case TYPE_INTERRUPT: case TYPE_STUB: selector = 1; /* Code selector */ break; @@ -1238,10 +1279,12 @@ static int Spec16TypeCompare( const void *e1, const void *e2 ) int type1 = (odp1->type == TYPE_CDECL) ? 0 : (odp1->type == TYPE_REGISTER) ? 3 + : (odp1->type == TYPE_INTERRUPT) ? 4 : (odp1->type == TYPE_PASCAL_16) ? 1 : 2; int type2 = (odp2->type == TYPE_CDECL) ? 0 : (odp2->type == TYPE_REGISTER) ? 3 + : (odp2->type == TYPE_INTERRUPT) ? 4 : (odp2->type == TYPE_PASCAL_16) ? 1 : 2; int retval = type1 - type2; @@ -1285,6 +1328,7 @@ static int BuildSpec16File( char * specfile, FILE *outfile ) switch (odp->type) { case TYPE_REGISTER: + case TYPE_INTERRUPT: case TYPE_CDECL: case TYPE_PASCAL: case TYPE_PASCAL_16: @@ -1315,6 +1359,7 @@ static int BuildSpec16File( char * specfile, FILE *outfile ) DLLName, (typelist[i]->type == TYPE_CDECL) ? "c" : "p", (typelist[i]->type == TYPE_REGISTER) ? "regs" : + (typelist[i]->type == TYPE_INTERRUPT) ? "intr" : (typelist[i]->type == TYPE_PASCAL_16) ? "word" : "long", typelist[i]->u.func.arg_types ); @@ -1328,6 +1373,7 @@ static int BuildSpec16File( char * specfile, FILE *outfile ) switch(odp->type) { case TYPE_REGISTER: + case TYPE_INTERRUPT: case TYPE_CDECL: case TYPE_PASCAL: case TYPE_PASCAL_16: @@ -1372,6 +1418,7 @@ static int BuildSpec16File( char * specfile, FILE *outfile ) break; case TYPE_REGISTER: + case TYPE_INTERRUPT: case TYPE_CDECL: case TYPE_PASCAL: case TYPE_PASCAL_16: @@ -1382,6 +1429,7 @@ static int BuildSpec16File( char * specfile, FILE *outfile ) DLLName, (odp->type == TYPE_CDECL) ? "c" : "p", (odp->type == TYPE_REGISTER) ? "regs" : + (odp->type == TYPE_INTERRUPT) ? "intr" : (odp->type == TYPE_PASCAL_16) ? "word" : "long", odp->u.func.arg_types ); @@ -1461,12 +1509,16 @@ static int BuildSpecFile( FILE *outfile, char *specname ) * * Build a 16-bit-to-Wine callback glue function. The syntax of the function * profile is: call_type_xxxxx, where 'call' is the letter 'c' or 'p' for C or - * Pascal calling convention, 'type' is one of 'regs', 'word' or + * Pascal calling convention, 'type' is one of 'regs', 'intr', 'word' or * 'long' and each 'x' is an argument ('w'=word, 's'=signed word, * 'l'=long, 'p'=linear pointer, 't'=linear pointer to null-terminated string, * 'T'=segmented pointer to null-terminated string). - * For register functions, the arguments are ignored, but they are still - * removed from the stack upon return. !! FIXME !! + * For register functions, the arguments (if present) are converted just + * the same as for normal functions, but in addition a CONTEXT pointer + * filled with the current register values is passed to the 32-bit routine. + * A 'intr' interrupt handler routine is treated like a register routine + * without arguments, except that upon return, the flags word pushed onto + * the stack by the interrupt is removed. * * This glue function contains only that part of the 16->32 thunk that is * variable (depending on the type and number of arguments); the glue routine @@ -1526,6 +1578,7 @@ static void BuildCallFrom16Func( FILE *outfile, char *profile, char *prefix ) if (!strncmp( "word_", profile + 2, 5 )) short_ret = 1; else if (!strncmp( "regs_", profile + 2, 5 )) reg_func = 1; + else if (!strncmp( "intr_", profile + 2, 5 )) reg_func = 2; else if (strncmp( "long_", profile + 2, 5 )) { fprintf( stderr, "Invalid function name '%s', ignored\n", profile ); @@ -1590,8 +1643,6 @@ static void BuildCallFrom16Func( FILE *outfile, char *profile, char *prefix ) prefix, profile, prefix, profile, STACK16OFFSET(relay)); -if ( !reg_func ) /* FIXME */ -{ /* Copy the arguments */ pos = (usecdecl? argsize : 0) + sizeof( STACK16FRAME ); args = profile + 7; @@ -1636,13 +1687,12 @@ if ( !reg_func ) /* FIXME */ default: fprintf( stderr, "Unknown arg type '%c'\n", args[i] ); } -} /* Call entry point */ fprintf( outfile, "\tcall *%d(%%edx)\n", STACK16OFFSET(entry_point) ); if ( reg_func ) - fprintf( outfile, "\tmovl $%d, %%eax\n", argsize ); + fprintf( outfile, "\tmovl $%d, %%eax\n", reg_func == 2 ? 2 : argsize ); fprintf( outfile, "\tret\n" );