aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2022-04-03 22:58:39 +0200
committerJavier <dev.git@javispedro.com>2022-04-03 22:58:39 +0200
commitf9b0699da8adb44fd91640180a7b70639a43449b (patch)
tree81fcbd285a306b85f21086d1c7d37e77af71ed12
parent71f66c759930ce22f099ad1631f05ddb3e0ccd8a (diff)
downloadvbados-f9b0699da8adb44fd91640180a7b70639a43449b.tar.gz
vbados-f9b0699da8adb44fd91640180a7b70639a43449b.zip
replace some custom asm utils with watcom intrinsincs
-rw-r--r--dostsr.c20
-rw-r--r--makefile9
-rw-r--r--utils.h55
-rw-r--r--vbox.h9
-rw-r--r--vboxlog.h12
-rw-r--r--w16mouse.c7
6 files changed, 31 insertions, 81 deletions
diff --git a/dostsr.c b/dostsr.c
index f281d8a..3e621be 100644
--- a/dostsr.c
+++ b/dostsr.c
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include <stdlib.h>
+#include <string.h>
#include <i86.h>
#include "dlog.h"
@@ -186,7 +188,7 @@ static void hide_graphic_cursor(void)
plane, y);
// Restore this scaline from cursor_prev
- nfmemcpy(line, prev, cursor_bytes_per_line);
+ _fmemcpy(line, prev, cursor_bytes_per_line);
}
}
@@ -230,7 +232,7 @@ static void show_graphic_cursor(void)
unsigned x;
// First, backup this scanline to prev before any changes
- fnmemcpy(prev, line, cursor_bytes_per_line);
+ _fmemcpy(prev, line, cursor_bytes_per_line);
// when start.x is not pixel aligned,
// scaline points the previous multiple of pixels_per_byte;
@@ -380,7 +382,7 @@ static void load_cursor(void)
uint8_t *output = req->pointerData;
unsigned int y, x;
- bzero(req, sizeof(VMMDevReqMousePointer));
+ memset(req, 0, sizeof(VMMDevReqMousePointer));
req->header.size = vbox_req_mouse_pointer_size(width, height);
req->header.version = VMMDEV_REQUEST_HEADER_VERSION;
@@ -555,7 +557,7 @@ static void handle_mouse_event(uint16_t buttons, bool absolute, int x, int y, in
} else if (x || y) {
// Relative movement: x,y are in mickeys
uint16_t ticks = bda_get_tick_count_lo();
- unsigned ax = ABS(x), ay = ABS(y);
+ unsigned ax = abs(x), ay = abs(y);
events |= INT33_EVENT_MASK_MOVEMENT;
@@ -733,7 +735,7 @@ static void reset_mouse_settings()
data.cursor_text_xor_mask = 0x7700U;
data.cursor_hotspot.x = 0;
data.cursor_hotspot.y = 0;
- nnmemcpy(data.cursor_graphic, default_cursor_graphic, sizeof(data.cursor_graphic));
+ memcpy(data.cursor_graphic, default_cursor_graphic, sizeof(data.cursor_graphic));
refresh_cursor(); // This will hide the cursor and update data.cursor_visible
}
@@ -764,7 +766,7 @@ static void reset_mouse_state()
data.cursor_pos.x = 0;
data.cursor_pos.y = 0;
data.cursor_prev_char = 0;
- bzero(data.cursor_prev_graphic, sizeof(data.cursor_prev_graphic));
+ memset(data.cursor_prev_graphic, 0, sizeof(data.cursor_prev_graphic));
}
static void return_clear_wheel_counter(union INTPACK __far *r)
@@ -884,7 +886,7 @@ static void int33_handler(union INTPACK r)
hide_cursor();
data.cursor_hotspot.x = r.x.bx;
data.cursor_hotspot.y = r.x.cx;
- fnmemcpy(data.cursor_graphic, MK_FP(r.x.es, r.x.dx), sizeof(data.cursor_graphic));
+ _fmemcpy(data.cursor_graphic, MK_FP(r.x.es, r.x.dx), sizeof(data.cursor_graphic));
load_cursor();
refresh_cursor();
break;
@@ -944,11 +946,11 @@ static void int33_handler(union INTPACK r)
break;
case INT33_SAVE_MOUSE_STATUS:
dlog_puts("Mouse save status");
- nfmemcpy(MK_FP(r.x.es, r.x.dx), &data, sizeof(TSRDATA));
+ _fmemcpy(MK_FP(r.x.es, r.x.dx), &data, sizeof(TSRDATA));
break;
case INT33_LOAD_MOUSE_STATUS:
dlog_puts("Mouse load status");
- fnmemcpy(&data, MK_FP(r.x.es, r.x.dx), sizeof(TSRDATA));
+ _fmemcpy(&data, MK_FP(r.x.es, r.x.dx), sizeof(TSRDATA));
break;
case INT33_SET_MOUSE_SENSITIVITY:
dlog_print("Mouse set speed x=");
diff --git a/makefile b/makefile
index 2f4d78a..f91b552 100644
--- a/makefile
+++ b/makefile
@@ -2,15 +2,16 @@
# Assuming you have sourced `owsetenv` beforehand.
#
dosobjs = dostsr.obj dosmain.obj vbox.obj
-doscflags = -bt=dos -ms -6 -os -w3
+doscflags = -bt=dos -ms -6 -os -oi -w3
# -ms to use small memory model (though sometimes ss != ds...)
# -os to optimize for size
+# -oi to put intrinsics online (don't use them much)
dostsrcflags = -zu -s -g=RES_GROUP -nd=RES -nt=RES_TEXT -nc=RES_CODE
# -s to disable stack checks, since it inserts calls to the runtime from the TSR part
# -zu since ss != ds on the TSR
w16objs = w16mouse.obj
-w16cflags = -bt=windows -bd -mc -zu -s -6 -w3
+w16cflags = -bt=windows -bd -mc -zu -s -6 -oi -w3
# -bd to build DLL
# -mc to use compact memory model (far data pointers, ss != ds always)
# -zu for DLL calling convention (ss != ds)
@@ -46,6 +47,6 @@ vbmouse.flp:
mformat -C -f 1440 -v VBMOUSE -i $^@ ::
# Build a floppy image containing the driver
-flp: vbmouse.flp vbmouse.exe vbmouse.drv .SYMBOLIC
- mcopy -i vbmouse.flp -o vbmouse.exe vbmouse.drv ::
+flp: vbmouse.flp vbmouse.exe vbmouse.drv oemsetup.inf .SYMBOLIC
+ mcopy -i vbmouse.flp -o vbmouse.exe vbmouse.drv oemsetup.inf ::
diff --git a/utils.h b/utils.h
index 39260c4..c7db435 100644
--- a/utils.h
+++ b/utils.h
@@ -3,8 +3,6 @@
#include <stdint.h>
-#define ABS(x) (((x) < 0) ? -(x) : (x))
-
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
@@ -13,12 +11,6 @@
static inline void breakpoint(void);
#pragma aux breakpoint = 0xcd 0x03;
-static inline void cli(void);
-#pragma aux cli = "cli"
-
-static inline void sti(void);
-#pragma aux sti = "sti"
-
/** Map x linearly from range [0, srcmax] to [0, dstmax].
* Equivalent of (x * dstmax) / srcmax but with 32-bit unsigned precision. */
static unsigned scaleu(unsigned x, unsigned srcmax, unsigned dstmax);
@@ -59,51 +51,4 @@ static int scalei_rem(int x, int srcmax, int dstmax, short *rem);
__value [ax] \
__modify [ax cx dx si]
-static void bzero(void __far *buf, unsigned int size);
-#pragma aux bzero = \
- "cld" \
- "mov ax, 0" \
- "rep stos byte ptr es:[di]" \
- __parm [es di] [cx] \
- __modify [ax]
-
-static void nfmemcpy(void __far *dst, const void *src, unsigned int size);
-#pragma aux nfmemcpy = \
- "cld" \
- "rep movs byte ptr es:[di], byte ptr ds:[si]" \
- __parm [es di] [si] [cx] \
- __modify [cx si di]
-
-static void fnmemcpy(void *dst, const void __far *src, unsigned int size);
-#pragma aux fnmemcpy = \
- "cld" \
- "push gs" \
- "mov ax, es" \
- "mov gs, ax" /* gs is now the src segment */ \
- "mov ax, ds" \
- "mov es, ax" /* es is now ds, the dst segment */ \
- "rep movs byte ptr es:[di], byte ptr gs:[si]" \
- "pop gs" \
- __parm [di] [es si] [cx] \
- __modify [ax cx si di es]
-
-static void ffmemcpy(void __far *dst, const void __far *src, unsigned int size);
-#pragma aux ffmemcpy = \
- "cld" \
- "push gs" \
- "mov gs, ax" \
- "rep movs byte ptr es:[di], byte ptr gs:[si]" \
- "pop gs" \
- __parm [es di] [gs si] [cx] \
- __modify [cx si di]
-
-static void nnmemcpy(void *dst, const void *src, unsigned int size);
-#pragma aux nnmemcpy = \
- "cld" \
- "mov ax, ds" \
- "mov es, ax" /* es is now ds, the src+dst segment */ \
- "rep movs byte ptr es:[di], byte ptr ds:[si]" \
- __parm [di] [si] [cx] \
- __modify [cx si di es]
-
#endif
diff --git a/vbox.h b/vbox.h
index a4ad727..6bb8797 100644
--- a/vbox.h
+++ b/vbox.h
@@ -22,6 +22,7 @@
#include <stdbool.h>
#include <stdint.h>
+#include <string.h>
#include "dlog.h"
#include "vds.h"
@@ -69,7 +70,7 @@ static int vbox_report_guest_info(LPVBOXCOMM vb, uint32_t osType)
{
VMMDevReportGuestInfo __far *req = (void __far *) vb->buf;
- bzero(req, sizeof(VMMDevReportGuestInfo));
+ _fmemset(req, 0, sizeof(VMMDevReportGuestInfo));
req->header.size = sizeof(VMMDevReportGuestInfo);
req->header.version = VMMDEV_REQUEST_HEADER_VERSION;
@@ -88,7 +89,7 @@ static int vbox_set_mouse(LPVBOXCOMM vb, bool absolute, bool pointer)
{
VMMDevReqMouseStatus __far *req = (void __far *) vb->buf;
- bzero(req, sizeof(VMMDevReqMouseStatus));
+ _fmemset(req, 0, sizeof(VMMDevReqMouseStatus));
req->header.size = sizeof(VMMDevReqMouseStatus);
req->header.version = VMMDEV_REQUEST_HEADER_VERSION;
@@ -110,7 +111,7 @@ static int vbox_get_mouse(LPVBOXCOMM vb, bool __far *abs,
{
VMMDevReqMouseStatus __far *req = (void __far *) vb->buf;
- bzero(req, sizeof(VMMDevReqMouseStatus));
+ _fmemset(req, 0, sizeof(VMMDevReqMouseStatus));
req->header.size = sizeof(VMMDevReqMouseStatus);
req->header.version = VMMDEV_REQUEST_HEADER_VERSION;
@@ -131,7 +132,7 @@ static int vbox_set_pointer_visible(LPVBOXCOMM vb, bool visible)
{
VMMDevReqMousePointer __far *req = (void __far *) vb->buf;
- bzero(req, sizeof(VMMDevReqMousePointer));
+ _fmemset(req, 0, sizeof(VMMDevReqMousePointer));
req->header.size = sizeof(VMMDevReqMousePointer);
req->header.version = VMMDEV_REQUEST_HEADER_VERSION;
diff --git a/vboxlog.h b/vboxlog.h
index 11ecf68..559566b 100644
--- a/vboxlog.h
+++ b/vboxlog.h
@@ -1,12 +1,12 @@
#ifndef VBOXDLOG_H
#define VBOXDLOG_H
+#include <conio.h>
+
/** Logs a single character to the VBox debug message port. */
-static void vbox_log_putc(char c);
-#pragma aux vbox_log_putc = \
- "mov dx, 0x504" \
- "out dx, al" \
- __parm [al] \
- __modify [dx]
+static inline void vbox_log_putc(char c)
+{
+ outp(0x504, c);
+}
#endif // VBOXDLOG_H
diff --git a/w16mouse.c b/w16mouse.c
index f4c16a9..5660b81 100644
--- a/w16mouse.c
+++ b/w16mouse.c
@@ -124,7 +124,8 @@ BOOL FAR PASCAL LibMain(HINSTANCE hInstance, WORD wDataSegment,
uint16_t version = int33_get_driver_version();
// For now we just check for the presence of any int33 driver version
- if (version <= 0) {
+ if (version == 0) {
+ // No one responded to our request, we can assume no driver
// This will cause a "can't load .drv" message from Windows
return 0;
}
@@ -147,9 +148,9 @@ WORD FAR PASCAL Inquire(LPMOUSEINFO lpMouseInfo)
VOID FAR PASCAL Enable(LPFN_MOUSEEVENT lpEventProc)
{
// Store the windows-given callback
- cli(); // Write to far pointer may not be atomic, and we could be interrupted mid-write
+ _disable(); // Write to far pointer may not be atomic, and we could be interrupted mid-write
eventproc = lpEventProc;
- sti();
+ _enable();
if (!enabled) {
int33_reset();