diff options
-rw-r--r-- | dlog.h | 260 | ||||
-rw-r--r-- | int15ps2.h | 4 | ||||
-rw-r--r-- | mousetsr.c | 189 | ||||
-rw-r--r-- | mousew16.c | 34 | ||||
-rw-r--r-- | sfmain.c | 3 | ||||
-rw-r--r-- | sftsr.c | 202 | ||||
-rw-r--r-- | unixtime.h | 8 | ||||
-rw-r--r-- | vbox.c | 8 |
8 files changed, 318 insertions, 390 deletions
@@ -21,6 +21,9 @@ #define DLOG_H #include <conio.h> +#include <stdarg.h> +#include <stdbool.h> +#include <limits.h> // Customizable defines /** If 0, these routines become nops */ @@ -40,7 +43,7 @@ static void dlog_init(); /** Logs a single character to the debug message IO port. */ -static inline void dlog_putc(char c); +static inline void dputc(char c); #if DLOG_TARGET_SERIAL @@ -56,7 +59,7 @@ static void dlog_init() outp(DLOG_TARGET_PORT + 4, 0x03); // RTS/DSR set, IRQs disabled } -static inline void dlog_putc(char c) +static inline void dputc(char c) { while (!(inp(DLOG_TARGET_PORT + 5) & 0x20)); outp(DLOG_TARGET_PORT, c); @@ -64,64 +67,68 @@ static inline void dlog_putc(char c) #else /* DLOG_TARGET_SERIAL */ -static void dlog_init() +static inline void dlog_init() { + // No initialization required } -static inline void dlog_putc(char c) +static inline void dputc(char c) { outp(DLOG_TARGET_PORT, c); } #endif /* DLOG_TARGET_SERIAL */ -static void dlog_endline(void) +static void d_utoa(unsigned num, unsigned base) { - dlog_putc('\n'); -} + char buf[6]; + int i = 0; -/** Print string to log */ -static void dlog_print(const char *s) -{ - char c; - while (c = *s++) { - dlog_putc(c); - } -} + do { + unsigned digit = num % base; -/** Print (far) string to log */ -static void dlog_fprint(const char __far *s) -{ - char c; - while (c = *s++) { - dlog_putc(c); - } -} + if (digit < 10) { + buf[i] = '0' + digit; + } else { + buf[i] = 'a' + (digit - 10); + } -/** Print (far) string of fixed length to log */ -static void dlog_fnprint(const char __far *s, unsigned l) -{ - while (l > 0) { - dlog_putc(*s++); - l--; - } -} + i++; + num /= base; + } while (num > 0 && i < sizeof(buf)); -/** Print + newline */ -static void dlog_puts(const char *s) -{ - dlog_print(s); - dlog_endline(); + while (i--) { + dputc(buf[i]); + } } -/** Print unsigned number with base */ -static void dlog_printub(unsigned int num, int base) +static void d_ultoa(unsigned long num, unsigned base) { - char buf[8]; + char buf[12]; int i = 0; do { - int digit = num % base; + unsigned digit = 0; + + static inline void uldiv(void); +#pragma aux uldiv = \ + "push eax" \ + "push ecx" \ + "push edx" \ + "mov eax, [num]" \ + "movzx ecx, [base]" \ + "xor edx, edx" \ + \ + "div ecx" \ + \ + "mov [num], eax" \ + "mov [digit], dx" \ + \ + "pop edx" \ + "pop ecx" \ + "pop eax" \ + __modify __exact []; + uldiv(); if (digit < 10) { buf[i] = '0' + digit; @@ -130,63 +137,178 @@ static void dlog_printub(unsigned int num, int base) } i++; - num /= base; } while (num > 0 && i < sizeof(buf)); while (i--) { - dlog_putc(buf[i]); + dputc(buf[i]); } } -/** Print signed number with base */ -static void dlog_printdb(int num, int base) +static void d_itoa(int num, unsigned base) { - unsigned int unum; + unsigned unum; // TODO if (num < 0) { - dlog_putc('-'); + dputc('-'); unum = -num; } else { unum = num; } - dlog_printub(unum, base); + d_utoa(unum, base); +} + +static void d_ltoa(long num, unsigned base) +{ + unsigned long unum; + + // TODO + if (num < 0) { + dputc('-'); + unum = -num; + } else { + unum = num; + } + + d_ultoa(unum, base); +} + +static unsigned d_strtou(const char * __far *str) +{ + unsigned i = 0; + const char *s = *str; + char c = *s; + while (c >= '0' && c <= '9') { + i = (i * 10) + (c - '0'); + c = *(++s); + } + *str = s; + return i; } -/** Print unsigned number in base 16. */ -static void dlog_printu(unsigned int num) +static void d_printstr(const char __far *s, unsigned l) { - dlog_printub(num, 10); + while (l > 0 && *s) { + dputc(*s++); + l--; + } } -/** Print unsigned number in base 10. */ -static void dlog_printx(unsigned int num) +static void dprintf(const char *fmt, ...) { - dlog_printub(num, 16); + va_list va; + char c; + + va_start(va, fmt); + + while ((c = *(fmt++))) { + if (c == '%') { + unsigned width, precision, size; + bool is_far = false; + + width = d_strtou(&fmt); + + if ((c = *fmt) == '.') { + fmt++; + precision = d_strtou(&fmt); + } else { + precision = UINT_MAX; + } + + switch ((c = *fmt)) { + case 'l': + size = sizeof(long); + fmt++; + break; + case 'h': + size = sizeof(short); + fmt++; + break; + case 'F': + is_far = true; + fmt++; + break; + default: + size = sizeof(int); + break; + } + + switch ((c = *fmt)) { + case 'd': + switch (size) { + case sizeof(int): + d_itoa(va_arg(va, int), 10); + break; + case sizeof(long): + d_ltoa(va_arg(va, long), 10); + break; + } + break; + case 'u': + switch (size) { + case sizeof(int): + d_utoa(va_arg(va, int), 10); + break; + case sizeof(long): + d_ultoa(va_arg(va, long), 10); + break; + } + break; + case 'x': + switch (size) { + case sizeof(int): + d_utoa(va_arg(va, int), 16); + break; + case sizeof(long): + d_ultoa(va_arg(va, long), 16); + break; + } + break; + case 'p': + if (is_far) { + void __far *p = va_arg(va, void __far *); + d_utoa(FP_SEG(p), 16); + dputc(':'); + d_utoa(FP_OFF(p), 16); + } else { + d_utoa(va_arg(va, unsigned), 16); + } + break; + case 's': + d_printstr(is_far ? va_arg(va, const char __far *) + : va_arg(va, const char *), + precision); + break; + case '%': + dputc('%'); + break; + } + fmt++; + } else { + dputc(c); + } + } + + va_end(va); } -/** Print signed number in base 10. */ -static void dlog_printd(int num) +static void dputs(const char *s) { - dlog_printdb(num, 10); + char c; + while ((c = *(s++))) { + dputc(c); + } + dputc('\n'); } #else /* ENABLE_DLOG */ -#define dlog_nop() do { } while(0) -#define dlog_init() dlog_nop() -#define dlog_putc(c) dlog_nop() -#define dlog_endline() dlog_nop() -#define dlog_print(s) dlog_nop() -#define dlog_fprint(s) dlog_nop() -#define dlog_fnprint(s,n) dlog_nop() -#define dlog_puts(s) dlog_nop() -#define dlog_printub(n,b) dlog_nop() -#define dlog_printdb(n,b) dlog_nop() -#define dlog_printx(n) dlog_nop() -#define dlog_printu(n) dlog_nop() -#define dlog_printd(n) dlog_nop() +#define dlog_nop() do { } while(0) +#define dlog_init() dlog_nop() +#define dputc(c) dlog_nop() +#define dputs(s) dlog_nop() +#define dprintf(...) dlog_nop() #endif /* ENABLE_DLOG */ @@ -227,9 +227,7 @@ static bool ps2m_detect_wheel(void) if (device_id != PS2M_DEVICE_ID_PLAIN) { // TODO: Likely we have to accept more device IDs here - dlog_print("Unknown initial mouse device_id="); - dlog_printx(device_id); - dlog_endline(); + dprintf("Unknown initial mouse device_id=0x%x\n", device_id); return false; } @@ -460,12 +460,12 @@ static void load_cursor(void) } } - dlog_puts("Loading cursor to VBox"); + dputs("Loading cursor to VBox"); vbox_send_request(data.vb.iobase, data.vb.dds.physicalAddress); if (req->header.rc != 0) { - dlog_puts("Could not send cursor to VirtualBox"); + dputs("Could not send cursor to VirtualBox"); return; } @@ -504,13 +504,8 @@ static void reload_video_info(void) data.screen_granularity.y = 8; } - dlog_print("Current video mode="); - dlog_printx(data.video_mode.mode); - dlog_print(" screen_max="); - dlog_printd(data.screen_max.x); - dlog_putc(','); - dlog_printd(data.screen_max.y); - dlog_endline(); + dprintf("Current video mode=%x screen_max=%d,%d\n", + data.video_mode.mode, data.screen_max.x, data.screen_max.y); } /** True if the current video is different from what we have stored @@ -558,19 +553,8 @@ static void call_event_handler(void (__far *handler)(), uint16_t events, int16_t delta_x, int16_t delta_y) { #if TRACE_EVENTS - dlog_print("calling event handler events="); - dlog_printx(events); - dlog_print(" buttons="); - dlog_printx(buttons); - dlog_print(" x="); - dlog_printd(x); - dlog_print(" y="); - dlog_printd(y); - dlog_print(" dx="); - dlog_printd(delta_x); - dlog_print(" dy="); - dlog_printd(delta_y); - dlog_endline(); + dprintf("calling event handler events=0x%x buttons=0x%x x=%d y=%d dx=%d dy=%d\n", + events, buttons, x, y, delta_x, delta_y); #endif __asm { @@ -598,17 +582,8 @@ static void handle_mouse_event(uint16_t buttons, bool absolute, int x, int y, in int i; #if TRACE_EVENTS - dlog_print("handle mouse event"); - if (absolute) dlog_print(" absolute"); - dlog_print(" buttons="); - dlog_printx(buttons); - dlog_print(" x="); - dlog_printd(x); - dlog_print(" y="); - dlog_printd(y); - dlog_print(" z="); - dlog_printd(z); - dlog_endline(); + dprintf("handle mouse event %s buttons=0x%x x=%d y=%d z=%d\n", + absolute ? "absolute" : "relative", buttons, x, y, z); #endif if (absolute) { @@ -752,15 +727,7 @@ static void handle_ps2_packet(void) y = -(status & PS2M_STATUS_Y_NEG ? 0xFF00 | y : y); #if TRACE_EVENTS - dlog_print("ps2 packet "); - dlog_printx(status); - dlog_putc(' '); - dlog_printd(x); - dlog_putc(' '); - dlog_printd(y); - dlog_putc(' '); - dlog_printd(z); - dlog_endline(); + dprintf("ps2 packet %x %d %d %d\n", status, x, y, z); #endif /* TRACE_EVENTS */ #if USE_VIRTUALBOX @@ -789,11 +756,7 @@ static void handle_ps2_packet(void) uint16_t data_avail = vmwstatus & VMWARE_ABSPOINTER_STATUS_MASK_DATA; #if TRACE_EVENTS - dlog_print("vmware status=0x"); - dlog_printx(vmwstatus >> 16); - dlog_print(" "); - dlog_printx(vmwstatus & 0xFFFF); - dlog_endline(); + dprintf("vmware status=0x%lx\n", vmwstatus); #endif if (data_avail >= VMWARE_ABSPOINTER_DATA_PACKET_SIZE) { @@ -801,19 +764,14 @@ static void handle_ps2_packet(void) vmware_abspointer_data(VMWARE_ABSPOINTER_DATA_PACKET_SIZE, &vmw); #if TRACE_EVENTS - dlog_print("vmware pstatus=0x"); - dlog_printx(status); - dlog_print(" x=0x"); - dlog_printx(vmw.x); - dlog_print(" z="); - dlog_printd((int8_t) (uint8_t) vmw.z); - dlog_endline(); + dprintf("vmware pstatus=0x%x x=%d y=%d z=%d\n", + status, vmw.x, vmw.y, (int) (uint8_t) vmw.z); #endif if (vmw.status & VMWARE_ABSPOINTER_STATUS_RELATIVE) { x = (int16_t) vmw.x; y = (int16_t) vmw.y; - z = (int8_t) (uint8_t) vmw.z; + z = (uint8_t) vmw.z; } else { abs = true; // Scale to screen coordinates @@ -822,7 +780,7 @@ static void handle_ps2_packet(void) MAX(data.max.x, data.screen_max.x)); y = scaleu(vmw.y & 0xFFFFU, 0xFFFFU, MAX(data.max.y, data.screen_max.y)); - z = (int8_t) (uint8_t) vmw.z; + z = (uint8_t) vmw.z; } if (vmw.status & VMWARE_ABSPOINTER_STATUS_BUTTON_LEFT) { @@ -868,23 +826,15 @@ static void ps2_mouse_handler(uint16_t word0, uint16_t word1, uint16_t word2, ui // We have to compute synchronization ourselves. #if TRACE_EVENTS - dlog_print("ps2 callback byte "); - dlog_printd(1 + data.cur_packet_bytes); - dlog_putc('/'); - dlog_printd(data.packet_size); - dlog_putc('='); - dlog_printx(word0 & 0xFF); - dlog_endline(); + dprintf("ps2 callback byte %d/%d = %x\n", + 1 + data.cur_packet_bytes, data.packet_size, word0 & 0xFF); #endif /* TRACE_EVENTS */ if (data.cur_packet_bytes && ticks >= data.cur_packet_ticks + MAX_PS2_PACKET_DELAY) { // Assume the start of a new packet - dlog_print("dropping packet! prev ticks="); - dlog_printu(data.cur_packet_ticks); - dlog_print(" new_ticks="); - dlog_printu(ticks); - dlog_endline(); + dprintf("dropping packet! prev_ticks=%u new_ticks=%u\n", + data.cur_packet_ticks, ticks); data.cur_packet_bytes = 0; } if (data.cur_packet_bytes == 0) { @@ -943,10 +893,10 @@ static void set_absolute(bool enable) if (data.vbavail) { int err = vbox_set_mouse(&data.vb, enable, false); if (enable && !err) { - dlog_puts("VBox absolute mouse enabled"); + dputs("VBox absolute mouse enabled"); data.vbhaveabs = true; } else if (!enable) { - dlog_puts("VBox absolute mouse disabled"); + dputs("VBox absolute mouse disabled"); } } #endif /* USE_VIRTUALBOX */ @@ -960,12 +910,12 @@ static void set_absolute(bool enable) vmware_abspointer_data_clear(); vmware_abspointer_cmd(VMWARE_ABSPOINTER_CMD_REQUEST_ABSOLUTE); - dlog_puts("VMware absolute mouse enabled"); + dputs("VMware absolute mouse enabled"); } else { vmware_abspointer_cmd(VMWARE_ABSPOINTER_CMD_REQUEST_RELATIVE); vmware_abspointer_cmd(VMWARE_ABSPOINTER_CMD_DISABLE); - dlog_puts("VMware absolute mouse disabled"); + dputs("VMware absolute mouse disabled"); } } #endif /* USE_VMWARE */ @@ -992,7 +942,7 @@ static void reset_mouse_hardware() err = ps2m_get_device_id(&device_id); if (err || device_id != PS2M_DEVICE_ID_IMPS2) { // Our special driver is not running... - dlog_puts("Windows running, using plain packet size"); + dputs("Windows running, using plain packet size"); data.bios_packet_size = PS2M_PACKET_SIZE_PLAIN; } } @@ -1004,23 +954,23 @@ static void reset_mouse_hardware() if (err && data.bios_packet_size != PS2M_PACKET_SIZE_PLAIN) { // However, if there is an error, drop down to plain packet size // Emulators like DOSBox don't support anything but plain packet size - dlog_puts("BIOS didn't support streaming mode, using plain packet size"); + dputs("BIOS didn't support streaming mode, using plain packet size"); data.bios_packet_size = PS2M_PACKET_SIZE_PLAIN; err = ps2m_init(data.bios_packet_size); } if (err) { - dlog_puts("error on ps2m_init during reset, ignoring"); + dputs("error on ps2m_init during reset, ignoring"); } #if USE_WHEEL if (data.usewheel && data.bios_packet_size == PS2M_PACKET_SIZE_STREAMING && ps2m_detect_wheel()) { - dlog_puts("PS/2 wheel detected"); + dputs("PS/2 wheel detected"); data.haswheel = true; data.packet_size = PS2M_PACKET_SIZE_EXT; } else { - if (data.usewheel) dlog_puts("PS/2 wheel NOT detected"); + if (data.usewheel) dputs("PS/2 wheel NOT detected"); data.haswheel = false; } #if USE_VMWARE @@ -1129,7 +1079,7 @@ static void int33_handler(union INTPACK r) { switch (r.w.ax) { case INT33_RESET_MOUSE: - dlog_puts("Mouse reset"); + dputs("Mouse reset"); reload_video_info(); reset_mouse_settings(); reset_mouse_hardware(); @@ -1139,21 +1089,21 @@ static void int33_handler(union INTPACK r) break; case INT33_SHOW_CURSOR: #if TRACE_EVENTS - dlog_puts("Mouse show cursor"); + dputs("Mouse show cursor"); #endif data.visible_count++; refresh_cursor(); break; case INT33_HIDE_CURSOR: #if TRACE_EVENTS - dlog_puts("Mouse hide cursor"); + dputs("Mouse hide cursor"); #endif data.visible_count--; refresh_cursor(); break; case INT33_GET_MOUSE_POSITION: #if TRACE_EVENTS - dlog_puts("Mouse get position"); + dputs("Mouse get position"); #endif r.w.cx = snap_to_grid(data.pos.x, data.screen_granularity.x); r.w.dx = snap_to_grid(data.pos.y, data.screen_granularity.y); @@ -1167,7 +1117,7 @@ static void int33_handler(union INTPACK r) break; case INT33_SET_MOUSE_POSITION: #if TRACE_EVENTS - dlog_puts("Mouse set position"); + dputs("Mouse set position"); #endif data.pos.x = r.w.cx; data.pos.y = r.w.dx; @@ -1181,7 +1131,7 @@ static void int33_handler(union INTPACK r) break; case INT33_GET_BUTTON_PRESSED_COUNTER: #if TRACE_EVENTS - dlog_puts("Mouse get button pressed counter"); + dputs("Mouse get button pressed counter"); #endif r.w.ax = data.buttons; #if USE_WHEEL @@ -1200,7 +1150,7 @@ static void int33_handler(union INTPACK r) break; case INT33_GET_BUTTON_RELEASED_COUNTER: #if TRACE_EVENTS - dlog_puts("Mouse get button released counter"); + dputs("Mouse get button released counter"); #endif r.w.ax = data.buttons; #if USE_WHEEL @@ -1217,11 +1167,7 @@ static void int33_handler(union INTPACK r) &data.button[MIN(r.w.bx, NUM_BUTTONS - 1)].released); break; case INT33_SET_HORIZONTAL_WINDOW: - dlog_print("Mouse set horizontal window ["); - dlog_printd(r.w.cx); - dlog_putc(','); - dlog_printd(r.w.dx); - dlog_puts("]"); + dprintf("Mouse set horizontal window [%d,%d]\n", r.w.cx, r.w.dx); // Recheck in case someone changed the video mode refresh_video_info(); data.min.x = r.w.cx; @@ -1229,18 +1175,14 @@ static void int33_handler(union INTPACK r) bound_position_to_window(); break; case INT33_SET_VERTICAL_WINDOW: - dlog_print("Mouse set vertical window ["); - dlog_printd(r.w.cx); - dlog_putc(','); - dlog_printd(r.w.dx); - dlog_puts("]"); + dprintf("Mouse set vertical window [%d,%d]\n", r.w.cx, r.w.dx); refresh_video_info(); data.min.y = r.w.cx; data.max.y = r.w.dx; bound_position_to_window(); break; case INT33_SET_GRAPHICS_CURSOR: - dlog_puts("Mouse set graphics cursor"); + dputs("Mouse set graphics cursor"); hide_cursor(); data.cursor_hotspot.x = r.w.bx; data.cursor_hotspot.y = r.w.cx; @@ -1249,9 +1191,7 @@ static void int33_handler(union INTPACK r) refresh_cursor(); break; case INT33_SET_TEXT_CURSOR: - dlog_print("Mouse set text cursor "); - dlog_printd(r.w.bx); - dlog_endline(); + dprintf("Mouse set text cursor type=%d\n", r.w.bx); hide_cursor(); data.cursor_text_type = r.w.bx; data.cursor_text_and_mask = r.w.cx; @@ -1260,7 +1200,7 @@ static void int33_handler(union INTPACK r) break; case INT33_GET_MOUSE_MOTION: #if TRACE_EVENTS - dlog_puts("Mouse get motion"); + dputs("Mouse get motion"); #endif r.w.cx = data.delta.x; r.w.dx = data.delta.y; @@ -1268,27 +1208,21 @@ static void int33_handler(union INTPACK r) data.delta.y = 0; break; case INT33_SET_EVENT_HANDLER: - dlog_puts("Mouse set event handler"); + dputs("Mouse set event handler"); data.event_mask = r.w.cx; data.event_handler = MK_FP(r.w.es, r.w.dx); break; case INT33_SET_MOUSE_SPEED: - dlog_print("Mouse set speed x="); - dlog_printd(r.w.cx); - dlog_print(" y="); - dlog_printd(r.w.dx); - dlog_endline(); + dprintf("Mouse set speed x=%d y=%d\n", r.w.cx, r.w.dx); data.mickeysPerLine.x = r.w.cx; data.mickeysPerLine.y = r.w.dx; break; case INT33_SET_SPEED_DOUBLE_THRESHOLD: - dlog_print("Mouse set speed double threshold="); - dlog_printd(r.w.dx); - dlog_endline(); + dprintf("Mouse set speed double threshold=%d\n", r.w.dx); data.doubleSpeedThreshold = r.w.dx; break; case INT33_EXCHANGE_EVENT_HANDLER: - dlog_puts("Mouse exchange event handler"); + dputs("Mouse exchange event handler"); data.event_mask = r.w.cx; { void (__far *prev_event_handler)() = data.event_handler; @@ -1298,25 +1232,20 @@ static void int33_handler(union INTPACK r) } break; case INT33_GET_MOUSE_STATUS_SIZE: - dlog_puts("Mouse get status size"); + dputs("Mouse get status size"); r.w.bx = sizeof(TSRDATA); break; case INT33_SAVE_MOUSE_STATUS: - dlog_puts("Mouse save status"); + dputs("Mouse save status"); _fmemcpy(MK_FP(r.w.es, r.w.dx), &data, sizeof(TSRDATA)); break; case INT33_LOAD_MOUSE_STATUS: - dlog_puts("Mouse load status"); + dputs("Mouse load status"); _fmemcpy(&data, MK_FP(r.w.es, r.w.dx), sizeof(TSRDATA)); break; case INT33_SET_MOUSE_SENSITIVITY: - dlog_print("Mouse set sensitivity x="); - dlog_printd(r.w.bx); - dlog_print(" y="); - dlog_printd(r.w.cx); - dlog_print(" threshold="); - dlog_printd(r.w.dx); - dlog_endline(); + dprintf("Mouse set sensitivity x=%d y=%d threshold=%d\n", + r.w.bx, r.w.cx, r.w.dx); // TODO According to cutemouse, sensitivity != mickeysPerLine data.mickeysPerLine.x = r.w.bx; data.mickeysPerLine.y = r.w.cx; @@ -1328,7 +1257,7 @@ static void int33_handler(union INTPACK r) r.w.dx = data.doubleSpeedThreshold; break; case INT33_RESET_SETTINGS: - dlog_puts("Mouse reset settings"); + dputs("Mouse reset settings"); reload_video_info(); reset_mouse_settings(); if (!data.bios_packet_size || !data.packet_size) { @@ -1343,7 +1272,7 @@ static void int33_handler(union INTPACK r) r.w.bx = 0; break; case INT33_GET_DRIVER_INFO: - dlog_puts("Mouse get driver info"); + dputs("Mouse get driver info"); r.h.bh = REPORTED_VERSION_MAJOR; r.h.bl = REPORTED_VERSION_MINOR; r.h.ch = INT33_MOUSE_TYPE_PS2; @@ -1363,7 +1292,7 @@ static void int33_handler(union INTPACK r) #if USE_WHEEL // Wheel API extensions: case INT33_GET_CAPABILITIES: - dlog_puts("Mouse get capabitilies"); + dputs("Mouse get capabitilies"); r.w.ax = INT33_WHEEL_API_MAGIC; // Driver supports wheel API r.w.bx = 0; r.w.cx = data.haswheel ? INT33_CAPABILITY_MOUSE_API : 0; @@ -1372,14 +1301,12 @@ static void int33_handler(union INTPACK r) #endif // Our internal API extensions: case INT33_GET_TSR_DATA: - dlog_puts("Get TSR data"); + dputs("Get TSR data"); r.w.es = FP_SEG(&data); r.w.di = FP_OFF(&data); break; default: - dlog_print("Unknown mouse function ax="); - dlog_printx(r.w.ax); - dlog_endline(); + dprintf("Unknown mouse function ax=%x\n", r.w.ax); break; } } @@ -1421,12 +1348,12 @@ static void windows_mouse_handler(int action, int x, int y, int buttons, int eve handle_mouse_event(buttons, true, x, y, 0); break; case VMD_ACTION_HIDE_CURSOR: - dlog_puts("VMD_ACTION_HIDE_CURSOR"); + dputs("VMD_ACTION_HIDE_CURSOR"); data.w386cursor = true; refresh_cursor(); break; case VMD_ACTION_SHOW_CURSOR: - dlog_puts("VMD_ACTION_SHOW_CURSOR"); + dputs("VMD_ACTION_SHOW_CURSOR"); data.w386cursor = false; refresh_cursor(); break; @@ -1463,9 +1390,7 @@ static void int2f_handler(union INTPACK r) { switch (r.w.ax) { case INT2F_NOTIFY_WIN386_STARTUP: - dlog_print("Windows is starting, version="); - dlog_printx(r.w.di); - dlog_endline(); + dprintf("Windows is starting, version=0x%x\n", r.w.di); data.w386_startup.version = 3; data.w386_startup.next = MK_FP(r.w.es, r.w.bx); data.w386_startup.device_driver = 0; @@ -1480,7 +1405,7 @@ static void int2f_handler(union INTPACK r) data.haswin386 = true; break; case INT2F_NOTIFY_WIN386_SHUTDOWN: - dlog_puts("Windows is stopping"); + dputs("Windows is stopping"); data.haswin386 = false; data.w386cursor = false; break; @@ -102,9 +102,7 @@ static void send_wheel_movement(int8_t z) WPARAM wParam; #if TRACE_EVENTS - dlog_print("w16mouse: wheel="); - dlog_printd(z); - dlog_endline(); + dprintf("w16mouse: wheel=%d\n", z); #endif // TODO It's highly unlikely that we can call this many functions from @@ -156,19 +154,8 @@ static void FAR int33_mouse_callback(uint16_t events, uint16_t buttons, int16_t int status = 0; #if TRACE_EVENTS - dlog_print("w16mouse: events="); - dlog_printx(events); - dlog_print(" buttons="); - dlog_printx(buttons); - dlog_print(" x="); - dlog_printd(x); - dlog_print(" y="); - dlog_printd(y); - dlog_print(" dx="); - dlog_printd(delta_x); - dlog_print(" dy="); - dlog_printd(delta_y); - dlog_endline(); + dprintf("w16mouse: events=0x%x buttons=0x%x x=%d y=%d dx=%d dy=%d\n", + events, buttons, x, y, delta_x, delta_y); #endif if (events & INT33_EVENT_MASK_LEFT_BUTTON_PRESSED) status |= SF_B1_DOWN; @@ -214,15 +201,12 @@ static void FAR int33_mouse_callback(uint16_t events, uint16_t buttons, int16_t (void) buttons; #if TRACE_EVENTS - dlog_print("w16mouse: post status="); - dlog_printx(status); - dlog_print(" x="); - if (status & SF_ABSOLUTE) dlog_printu(x); - else dlog_printd(x); - dlog_print(" y="); - if (status & SF_ABSOLUTE) dlog_printu(y); - else dlog_printd(y); - dlog_endline(); + dprintf("w16mouse: post status=0x%x ", status); + if (status & SF_ABSOLUTE) { + dprintf("x=%u y=%u\n", x, y); + } else { + dprintf("x=%d y=%d\n", x, y); + } #endif send_event(status, x, y, MOUSE_NUM_BUTTONS, 0, 0); @@ -349,6 +349,9 @@ static int configure_driver(LPTSRDATA data) data->files[i].handle = SHFL_HANDLE_NIL; } + // Configure the debug logging port + dlog_init(); + // Initialize TSR data data->dossda = dos_get_swappable_dos_area(); @@ -141,15 +141,13 @@ static bool is_call_for_mounted_drive(union INTPACK __far *r) static void clear_dos_err(union INTPACK __far *r) { - dlog_puts("->ok"); + dputs("->ok"); r->w.flags &= ~INTR_CF; } static void set_dos_err(union INTPACK __far *r, int err) { - dlog_print("->dos error "); - dlog_printd(err); - dlog_endline(); + dprintf("->dos error %d\n", err); r->w.flags |= INTR_CF; r->w.ax = err; } @@ -190,15 +188,7 @@ static int vbox_err_to_dos(vboxerr err) static void set_vbox_err(union INTPACK __far *r, vboxerr err) { - dlog_print("->vbox error "); - if (err < INT16_MIN || err > INT16_MAX) { - dlog_printx(err >> 16); - dlog_print(":"); - dlog_printx(err & 0xFFFF); - } else { - dlog_printd(err); - } - dlog_endline(); + dprintf("->vbox error %ld\n", err); set_dos_err(r, vbox_err_to_dos(err)); } @@ -308,7 +298,10 @@ static bool copy_to_8_3_filename(char __far *dst, const SHFLSTRING *str) extlen = 0; } - if (namelen > 8) { + if (namelen == 0) { + // Skip files with extension but no name (e.g. ".hid") + valid_8_3 = false; + } else if (namelen > 8) { namelen = 8; valid_8_3 = false; } @@ -393,21 +386,19 @@ static inline void clear_sdb_openfile_index(DOSSDB __far *sdb) } /** Closes an openfile entry by index, and marks it as free. */ -static vboxerr close_openfile(unsigned index) +static vboxerr close_openfile(unsigned openfile) { vboxerr err; - dlog_print("close openfile="); - dlog_printu(index); - dlog_endline(); + dprintf("close openfile=%u\n", openfile); err = vbox_shfl_close(&data.vb, data.hgcm_client_id, - data.files[index].root, data.files[index].handle); + data.files[openfile].root, data.files[openfile].handle); // Even if we have an error on close, // assume the file is lost and leak the handle - data.files[index].root = SHFL_ROOT_NIL; - data.files[index].handle = SHFL_HANDLE_NIL; + data.files[openfile].root = SHFL_ROOT_NIL; + data.files[openfile].handle = SHFL_HANDLE_NIL; return err; } @@ -423,12 +414,7 @@ static void flush_sft_metadata(DOSSFT __far *sft) if (sft->dev_info & DOS_SFT_FLAG_TIME_SET) { unsigned buf_size = sizeof(SHFLFSOBJINFO); - dlog_puts("setting modified date/time"); - dlog_print("time="); - dlog_printx(sft->f_time); - dlog_print("date="); - dlog_printx(sft->f_date); - dlog_endline(); + dputs("setting modified date/time"); memset(&parms.objinfo, 0, sizeof(SHFLFSOBJINFO)); @@ -478,13 +464,7 @@ static void handle_create_open_ex(union INTPACK __far *r) break; } - dlog_print("handle_open for "); - dlog_fprint(path); - dlog_print(" act="); - dlog_printx(action); - dlog_print(" mode="); - dlog_printx(mode); - dlog_endline(); + dprintf("handle_open for %Fs act=%x mode=%x\n", path, action, mode); openfile = find_free_openfile(); if (openfile == INVALID_OPENFILE) { @@ -530,9 +510,7 @@ static void handle_create_open_ex(union INTPACK __far *r) parms.create.CreateFlags |= SHFL_CF_ACT_FAIL_IF_NEW; } - dlog_print("vbox create flags="); - dlog_printx(parms.create.CreateFlags); - dlog_endline(); + dprintf("vbox create flags=%lx\n", parms.create.CreateFlags); err = vbox_shfl_open(&data.vb, data.hgcm_client_id, root, &shflstr.shflstr, &parms.create); if (err) { @@ -540,11 +518,7 @@ static void handle_create_open_ex(union INTPACK __far *r) return; } - dlog_print("vbox success result="); - dlog_printd(parms.create.Result); - dlog_print(" openfile="); - dlog_printu(openfile); - dlog_endline(); + dprintf("vbox success result=%ld openfile=%u\n", parms.create.Result, openfile); switch (parms.create.Result) { case SHFL_PATH_NOT_FOUND: @@ -587,9 +561,7 @@ static void handle_close(union INTPACK __far *r) DOSSFT __far *sft = MK_FP(r->w.es, r->w.di); unsigned openfile = get_sft_openfile_index(sft); - dlog_print("handle_close openfile="); - dlog_printu(openfile); - dlog_endline(); + dprintf("handle_close openfile=%u\n", openfile); if (!is_valid_openfile_index(openfile)) { set_dos_err(r, DOS_ERROR_INVALID_HANDLE); @@ -624,11 +596,7 @@ static void handle_read(union INTPACK __far *r) unsigned bytes = r->w.cx; vboxerr err; - dlog_print("handle_read openfile="); - dlog_printu(openfile); - dlog_print(" bytes="); - dlog_printu(bytes); - dlog_endline(); + dprintf("handle_read openfile=%u bytes=%u\n", openfile, bytes); if (!is_valid_openfile_index(openfile)) { set_dos_err(r, DOS_ERROR_INVALID_HANDLE); @@ -643,9 +611,7 @@ static void handle_read(union INTPACK __far *r) return; } - dlog_print("handle_read bytes_read="); - dlog_printu(bytes); - dlog_endline(); + dprintf("handle_read bytes_read=%u\n", bytes); // Advance the file position sft->f_pos += bytes; @@ -663,11 +629,7 @@ static void handle_write(union INTPACK __far *r) unsigned bytes = r->w.cx; vboxerr err; - dlog_print("handle_write openfile="); - dlog_printu(openfile); - dlog_print(" bytes="); - dlog_printu(bytes); - dlog_endline(); + dprintf("handle_write openfile=%u bytes=%u\n", openfile, bytes); if (!is_valid_openfile_index(openfile)) { set_dos_err(r, DOS_ERROR_INVALID_HANDLE); @@ -682,9 +644,7 @@ static void handle_write(union INTPACK __far *r) return; } - dlog_print("handle_write bytes_written="); - dlog_printu(bytes); - dlog_endline(); + dprintf("handle_write bytes_written=%u\n", bytes); // Advance the file position sft->f_pos += bytes; @@ -705,9 +665,7 @@ static void handle_commit(union INTPACK __far *r) unsigned openfile = get_sft_openfile_index(sft); vboxerr err; - dlog_print("handle_commit openfile="); - dlog_printu(openfile); - dlog_endline(); + dprintf("handle_commit openfile=%u\n", openfile); if (!is_valid_openfile_index(openfile)) { set_dos_err(r, DOS_ERROR_INVALID_HANDLE); @@ -737,11 +695,7 @@ static void handle_lock(union INTPACK __far *r) DOSLOCK __far *ops = MK_FP(r->w.ds, r->w.dx); vboxerr err; - dlog_print("handle_lock "); - if (unlock) dlog_print("unlock"); - dlog_print(" numops="); - dlog_printu(numops); - dlog_endline(); + dprintf("handle_lock %s numops=%u\n", unlock ? "unlock" : "lock", numops); for (i = 0; i < numops; i++) { err = vbox_shfl_lock(&data.vb, data.hgcm_client_id, @@ -765,9 +719,7 @@ static void handle_seek_end(union INTPACK __far *r) unsigned buf_size = sizeof(SHFLFSOBJINFO); vboxerr err; - dlog_print("handle_seek_end offset="); - dlog_printd(offset); - dlog_endline(); + dprintf("handle_seek_end openfile=%u offset=%ld\n", openfile, offset); memset(&parms.objinfo, 0, sizeof(SHFLFSOBJINFO)); @@ -789,9 +741,7 @@ static void handle_seek_end(union INTPACK __far *r) // Update current file size sft->f_size = parms.objinfo.cbObject; - dlog_print("seek_end filesize="); - dlog_printd(sft->f_size); - dlog_endline(); + dprintf("seek_end filesize=%lu\n", sft->f_size); // Update the current offset pointer if (offset < 0 && sft->f_size < -offset ) { @@ -799,7 +749,7 @@ static void handle_seek_end(union INTPACK __far *r) set_dos_err(r, DOS_ERROR_SEEK); return; } else if (offset > 0) { - dlog_puts("seek_end enlarge"); + dputs("seek_end enlarge"); // Seeking past the end of the file, enlarge err = vbox_shfl_set_file_size(&data.vb, data.hgcm_client_id, data.files[openfile].root, data.files[openfile].handle, @@ -817,9 +767,7 @@ static void handle_seek_end(union INTPACK __far *r) sft->f_pos = sft->f_size + offset; } - dlog_print("seek_end new pos="); - dlog_printd(sft->f_pos); - dlog_endline(); + dprintf("seek_end new pos=%lu\n", sft->f_pos); // Return new file position in dx:ax r->w.dx = sft->f_pos >> 16; @@ -832,7 +780,7 @@ static void handle_close_all(union INTPACK __far *r) { unsigned i; - dlog_puts("handle_close_all"); + dputs("handle_close_all"); for (i = 0; i < NUM_FILES; ++i) { if (data.files[i].root != SHFL_ROOT_NIL) { @@ -850,9 +798,7 @@ static void handle_delete(union INTPACK __far *r) SHFLROOT root = data.drives[drive].root; vboxerr err; - dlog_print("handle_delete "); - dlog_fprint(path); - dlog_endline(); + dprintf("handle_delete %Fs\n", path); copy_drive_relative_filename(&shflstr.shflstr, path); translate_filename_to_host(&shflstr.shflstr); @@ -876,11 +822,7 @@ static void handle_rename(union INTPACK __far *r) SHFLROOT root = data.drives[srcdrive].root; vboxerr err; - dlog_print("handle_rename "); - dlog_fprint(src); - dlog_print(" to "); - dlog_fprint(dst); - dlog_endline(); + dprintf("handle_rename %Fs to %Fs\n", src, dst); if (srcdrive != dstdrive) { set_dos_err(r, DOS_ERROR_NOT_SAME_DEVICE); @@ -912,9 +854,7 @@ static void handle_getattr(union INTPACK __far *r) SHFLROOT root = data.drives[drive].root; vboxerr err; - dlog_print("handle_getattr "); - dlog_fprint(path); - dlog_endline(); + dprintf("handle_getattr %Fs\n", path); copy_drive_relative_filename(&shflstr.shflstr, path); translate_filename_to_host(&shflstr.shflstr); @@ -957,11 +897,7 @@ static vboxerr open_search_dir(unsigned openfile, SHFLROOT root, const char __fa { vboxerr err; - dlog_print("open_search_dir openfile="); - dlog_printu(openfile); - dlog_print(" path="); - dlog_fprint(path); - dlog_endline(); + dprintf("open_search_dir openfile=%u path=%Fs\n", openfile, path); copy_drive_relative_dirname(&shflstr.shflstr, path); translate_filename_to_host(&shflstr.shflstr); @@ -974,7 +910,7 @@ static vboxerr open_search_dir(unsigned openfile, SHFLROOT root, const char __fa err = vbox_shfl_open(&data.vb, data.hgcm_client_id, root, &shflstr.shflstr, &parms.create); if (err) { - dlog_puts("open search dir failed"); + dputs("open search dir failed"); return err; } @@ -988,7 +924,7 @@ static vboxerr open_search_dir(unsigned openfile, SHFLROOT root, const char __fa } if (parms.create.Handle == SHFL_HANDLE_NIL) { - dlog_puts("open search dir returned no handle..."); + dputs("open search dir returned no handle..."); return VERR_INVALID_HANDLE; } @@ -1011,9 +947,7 @@ static vboxerr find_volume_label(SHFLROOT root) translate_filename_from_host(&shflstr.shflstr); - dlog_print("label: "); - dlog_fprint(shflstr.buf); - dlog_endline(); + dprintf("label: %s\n", shflstr.buf); found_file->attr = _A_VOLID; copy_to_8_3_filename(found_file->filename, &shflstr.shflstr); @@ -1044,9 +978,7 @@ static vboxerr find_next_from_vbox(unsigned openfile, const char __far *path) translate_filename_to_host(&shflstr.shflstr); fix_wildcards(&shflstr.shflstr); - dlog_print("fixed path="); - dlog_print(shflstr.buf); - dlog_endline(); + dprintf("fixed path=%s\n", shflstr.buf); if (shflstr.shflstr.ach[shflstr.shflstr.u16Length-1] == '\\') { // No wildcard? @@ -1079,14 +1011,10 @@ static vboxerr find_next_from_vbox(unsigned openfile, const char __far *path) return VERR_IO_BAD_LENGTH; } - dlog_print("got diritem name="); - dlog_fprint(shfldirinfo.dirinfo.name.ach); - dlog_print(" sfnLen="); - dlog_printu(shfldirinfo.dirinfo.cucShortName); - dlog_endline(); + dprintf("got diritem name=%s\n", shfldirinfo.dirinfo.name.ach); if (!is_valid_dos_file(&shfldirinfo.dirinfo.Info)) { - dlog_puts("hiding file with invalid info"); + dputs("hiding file with invalid info"); continue; } @@ -1098,7 +1026,7 @@ static vboxerr find_next_from_vbox(unsigned openfile, const char __far *path) // than the ones in search_attr . // Except for the ARCH and RDONLY attributes, which are always accepted. if (found_file->attr & search_mask) { - dlog_puts("hiding file with unwanted attrs"); + dputs("hiding file with unwanted attrs"); continue; // Skip this one } @@ -1109,12 +1037,12 @@ static vboxerr find_next_from_vbox(unsigned openfile, const char __far *path) translate_filename_from_host(&shfldirinfo.dirinfo.name); if (!copy_to_8_3_filename(found_file->filename, &shfldirinfo.dirinfo.name)) { - dlog_puts("hiding file with long filename"); + dputs("hiding file with long filename"); continue; } if (!matches_8_3_wildcard(found_file->filename, sdb->search_templ)) { - dlog_puts("hiding file with unwanted filename"); + dputs("hiding file with unwanted filename"); continue; } @@ -1122,13 +1050,7 @@ static vboxerr find_next_from_vbox(unsigned openfile, const char __far *path) break; }; - dlog_print("accepted file name='"); - dlog_fnprint(&found_file->filename[0], 8); - dlog_putc(' '); - dlog_fnprint(&found_file->filename[8], 3); - dlog_print("' attr="); - dlog_printx(found_file->attr); - dlog_endline(); + dprintf("accepted file name='%.11Fs' attr=0x%x\n", found_file->filename, found_file->attr); return 0; } @@ -1149,13 +1071,7 @@ static void handle_find_first(union INTPACK __far *r) unsigned openfile; vboxerr err; - dlog_print("find_first path="); - dlog_fprint(path); - dlog_print(" mask="); - dlog_fnprint(search_mask, 8+3); - dlog_print(" attr="); - dlog_printx(search_attr); - dlog_endline(); + dprintf("find_first path=%Fs mask='%.11Fs' attr=0x%x\n", path, search_mask, search_attr); // Initialize the search data block; we'll use it on future calls // Even DOS seems to look and check that we did initialize it; @@ -1171,14 +1087,14 @@ static void handle_find_first(union INTPACK __far *r) // Simulate an initial entry with the volume label // if we are searching for it. // DOS actually expects to always find it first, and nothing else. - dlog_puts("search volid"); + dputs("search volid"); err = find_volume_label(root); if (err) { - dlog_puts("search volid err"); + dputs("search volid err"); set_vbox_err(r, err); return; } - dlog_puts("search volid OK"); + dputs("search volid OK"); clear_dos_err(r); return; } else if (search_attr == 0) { @@ -1239,7 +1155,7 @@ static void handle_find_first(union INTPACK __far *r) // never to call findnext again. // Cue hack to avoid leaking one dirfd for each mkdir... if (_fmemcmp(data.dossda->found_file.filename, "TESTDIR TMP", 8+3) == 0) { - dlog_puts("win3.x testdir detected"); + dputs("win3.x testdir detected"); close_openfile(openfile); clear_sdb_openfile_index(&data.dossda->sdb); } @@ -1252,9 +1168,7 @@ static void handle_find_next(union INTPACK __far *r) unsigned openfile = get_sdb_openfile_index(&data.dossda->sdb); vboxerr err; - dlog_print("find_next openfile="); - dlog_printu(openfile); - dlog_endline(); + dprintf("find_next openfile=%u\n", openfile); if (!is_valid_openfile_index(openfile)) { set_dos_err(r, DOS_ERROR_NO_MORE_FILES); @@ -1279,9 +1193,7 @@ static void handle_chdir(union INTPACK __far *r) SHFLROOT root = data.drives[drive].root; vboxerr err; - dlog_print("handle_chdir to "); - dlog_fprint(path); - dlog_endline(); + dprintf("handle_chdir %Fs\n", path); // Just have to check if the directory exists copy_drive_relative_filename(&shflstr.shflstr, path); @@ -1322,9 +1234,7 @@ static void handle_mkdir(union INTPACK __far *r) SHFLROOT root = data.drives[drive].root; vboxerr err; - dlog_print("handle_mkdir "); - dlog_fprint(path); - dlog_endline(); + dprintf("handle_mkdir %Fs\n", path); copy_drive_relative_filename(&shflstr.shflstr, path); translate_filename_to_host(&shflstr.shflstr); @@ -1362,9 +1272,7 @@ static void handle_rmdir(union INTPACK __far *r) SHFLROOT root = data.drives[drive].root; vboxerr err; - dlog_print("handle_rmdir "); - dlog_fprint(path); - dlog_endline(); + dprintf("handle_rmdir %Fs\n", path); copy_drive_relative_filename(&shflstr.shflstr, path); translate_filename_to_host(&shflstr.shflstr); @@ -1406,7 +1314,7 @@ static void handle_get_disk_free(union INTPACK __far *r) unsigned buf_size = sizeof(SHFLVOLINFO); vboxerr err; - dlog_puts("handle disk free"); + dputs("handle disk free"); memset(&parms.volinfo, 0, sizeof(SHFLVOLINFO)); @@ -1433,7 +1341,7 @@ static bool int2f_11_handler(union INTPACK r) if (r.h.ah != 0x11) return false; // Only interested in network redirector functions if (r.h.al == 0xff && r.w.bx == 0x5742 && r.w.cx == 0x5346) { // These are the magic numbers to our private "Get TSR data" function - dlog_puts("Get TSR data"); + dputs("Get TSR data"); r.w.es = get_ds(); r.w.di = FP_OFF(&data); r.w.bx = 0x5444; @@ -1442,9 +1350,7 @@ static bool int2f_11_handler(union INTPACK r) } #if TRACE_CALLS - dlog_print("2f al="); - dlog_printx(r.h.al); - dlog_endline(); + dprintf("2f al=%hx\n", r.h.al); #endif // Handle special functions that target all redirectors first @@ -140,7 +140,7 @@ static void timestampns_to_dos_time(uint16_t __far *dos_time, uint16_t __far *do day = 1 + days_since_epoch; // (day is 1-based) if (year < DOS_EPOCH_YEAR) { - dlog_puts("Year is too old, will show as 0"); + dputs("Year is too old, will show as 0"); year = 0; } else { year -= DOS_EPOCH_YEAR; @@ -179,12 +179,6 @@ static void timestampns_from_dos_time(int64_t *timestampns, uint16_t dos_time, u seconds2_since_day = seconds2 + (minutes * 60U/2) + (hours * 3600U/2); - dlog_print("days_since_epoch="); - dlog_printd(days_since_epoch); - dlog_print(" seconds2_since_day="); - dlog_printd(seconds2_since_day); - dlog_endline(); - __asm { push eax push ecx @@ -94,9 +94,7 @@ int vbox_init_buffer(LPVBOXCOMM vb, unsigned size) if (err) { // As far as I have seen, most VDS providers always keep low memory contiguous, // so I'm not handling VDS_REGION_NOT_CONTIGUOUS here. - dlog_print("Error while VDS locking, err="); - dlog_printd(err); - dlog_endline(); + dprintf("Error while VDS locking, err=%d\n", err); return err; } @@ -115,9 +113,7 @@ int vbox_release_buffer(LPVBOXCOMM vb) if (vb->vds && vds_available()) { int err = vds_unlock_dma_buffer_region(&vb->dds, 0); if (err) { - dlog_print("Error while VDS unlocking, err="); - dlog_printd(err); - dlog_endline(); + dprintf("Error while VDS unlocking, err=%d\n", err); // Ignore the error, it's not like we can do anything } } |