浏览代码

A2 64 bit, 64 bit modules

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7435 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 年之前
父节点
当前提交
726526270a
共有 2 个文件被更改,包括 60 次插入39 次删除
  1. 23 15
      source/AMD64.Raster.Mod
  2. 37 24
      source/Generic.Win64.Kernel32.Mod

+ 23 - 15
source/AMD64.Raster.Mod

@@ -628,8 +628,8 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		IF (mode.src.pal # NIL) & ((mode.map = NIL) OR (LEN(mode.map^) # mode.src.pal.used)) THEN
 			NEW(mode.map, mode.src.pal.used)
 		END;
-		(*SetRGB(mode.col, 255, 255, 255);*)
-		mode.col := SYSTEM.VAL(Pixel, -1);
+		SetRGB(mode.col, 255, 255, 255);
+		(*mode.col := SYSTEM.VAL(Pixel, -1);*)
 		mode.src.pack := NIL; mode.dst.pack := NIL	(* force re-evaluation of transfer procedure *)
 	END InitMode;
 
@@ -1879,13 +1879,15 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		END
 	END A8OverA8;
 
-
 	(* BGRA8888 *)
 	PROCEDURE BGRA8888OverAny (VAR mode: Mode0; sadr: ADDRESS; sbit: LONGINT; dadr: ADDRESS; dbit, len: LONGINT);
 		VAR spix, dpix: Pixel;
 	BEGIN
 		WHILE len > 0 DO
+			SYSTEM.MOVE(sadr, ADDRESSOF(spix),4);
+			(*
 			SYSTEM.GET (sadr, spix);
+			*)
 			IF spix[a] = 0FFX THEN
 				mode.dst.pack(mode.dst, dadr, dbit, spix)
 			ELSIF spix[a] # 0X THEN
@@ -1898,6 +1900,7 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		END
 	END BGRA8888OverAny;
 
+
 	PROCEDURE BGRA8888OverA8 (VAR mode: Mode0; sadr: ADDRESS; sbit: LONGINT; dadr: ADDRESS; dbit, len: LONGINT);
 		VAR in, out: CHAR;
 	BEGIN
@@ -1917,7 +1920,7 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		VAR src, dst: Pixel; fd, t: LONGINT;
 	BEGIN
 		WHILE len > 0 DO
-			SYSTEM.GET (sadr, src);
+			SYSTEM.MOVE(sadr, ADDRESSOF(src),4);
 			IF src[a] = 0FFX THEN
 				mode.dst.pack(mode.dst, dadr, dbit, src)
 			ELSIF src[a] # 0X THEN
@@ -1937,12 +1940,14 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 			INC(dadr, 2); INC(sadr, SIZEOF (Pixel)); DEC(len)
 		END
 	END BGRA8888OverAny16;
-
 	PROCEDURE BGRA8888Over565* (VAR mode: Mode0; sadr: ADDRESS; sbit: LONGINT; dadr: ADDRESS; dbit, len: LONGINT);
 		VAR src, dst: Pixel; fd, t: LONGINT;
 	BEGIN
 		WHILE len > 0 DO
+			SYSTEM.MOVE(sadr,ADDRESSOF(src),4);
+			(*
 			SYSTEM.GET (sadr, src);
+			*)
 			IF src[a] = 0FFX THEN
 				SYSTEM.PUT16(dadr, ASH(ORD(src[b]), -3) + ASH(ASH(ORD(src[g]), -2), 5) + ASH(ASH(ORD(src[r]), -3), 11));
 			ELSIF src[a] # 0X THEN
@@ -1966,6 +1971,9 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 	END BGRA8888Over565;
 
 
+
+
+
 	PROCEDURE MMXBGRA8888Over565(VAR mode: Mode0; sadr: ADDRESS; sbit: LONGINT; dadr: ADDRESS; dbit, len: LONGINT);
 	CODE {SYSTEM.AMD64, SYSTEM.MMX}
 		PUSHFQ
@@ -1982,7 +1990,7 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		MOV		ECX, [RBP + len]
 	loop:
 		CMP		ECX, 0
-		JE 			WORD end
+		JE 			 end
 
 		MOV		EAX, [RSI]
 		XOR		EBX, EBX
@@ -1992,7 +2000,7 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		MOV		EDX, EAX
 		SHR		EDX, 24
 		CMP		EDX, 0
-		JE			WORD empty
+		JE			 empty
 		CMP		EDX, 255
 		JE			full
 
@@ -2085,7 +2093,7 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		ADD 		RSI, 4;
 		ADD 		RDI, 2;
 		DEC		ECX
-		JMP 		WORD loop
+		JMP 		loop
 	end:
 		EMMS ; declare FPU registers free
 		POPFQ
@@ -2137,18 +2145,18 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 
 	loop:
 		CMP 		ECX,0
-		JE 			WORD end ; jump to end if ECX = 0
+		JE 			end ; jump to end if ECX = 0
 
 		; if len < 8 then do one pixel at the time
 		CMP		ECX, 8
-		JL 			WORD singlepixel
+		JL 			 singlepixel
 		; else
 		; take 8 at the time
 
 		MOV		EBX, ESI
 		AND 		EBX, 0FH
 		CMP		EBX, 0
-		JNE 		WORD singlepixel
+		JNE 		singlepixel
 
 	alleightpixels:
 		; dest blue -> MM6
@@ -2187,7 +2195,7 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		PCMPEQD 	XMM0, XMM5
 		PMOVMSKB EAX, XMM0
 		CMP 		EAX, 0FFFFH ; all alphas = zero; TEST not possible, because only 8 bits compared
-		JE      		WORD endloop
+		JE      		 endloop
 
 		; mask out alpha = zero
 
@@ -2412,7 +2420,7 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		ADD 		RSI, 32 ; num of bytes
 		ADD 		RDI, 16
 		SUB 		ECX, 8
-		JMP 		WORD loop
+		JMP 		loop
 
 	singlepixel: ; original code from MMXBGRA8888Over565, adjusted to fit this procedure
 		MOV	 	EAX, 0FFFFFFFFH
@@ -2428,7 +2436,7 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		SHR		EDX, 24
 
 		CMP		EDX, 0
-		JE			WORD empty
+		JE			 empty
 		CMP		EDX, 255
 		JE			full
 
@@ -2497,7 +2505,7 @@ MODULE Raster; (** non-portable *)	(* eos, TF  **)
 		ADD 		RSI, 4;
 		ADD 		RDI, 2;
 		DEC		ECX
-		JMP 		WORD loop
+		JMP 		loop
 
 	end:
 		EMMS ; declare FPU registers free

+ 37 - 24
source/Generic.Win64.Kernel32.Mod

@@ -135,7 +135,7 @@ CONST
 
 	(** EscapeCommFunction *)
 	SETXOFF* = 1;  SETXON* = 2;  SETRTS* = 3;  CLRRTS* = 4;  SETDTR* = 5;
-	CLRDTR* = 6;  RESETDEV* = 7;  SETBREAK* = 8;  CLRBREAK* = 9;
+	CLRDTR* = 6;  REDWORDDEV* = 7;  SETBREAK* = 8;  CLRBREAK* = 9;
 
 	(** PurgeComm *)
 	PurgeTXAbort* = 0;  PurgeRXAbort* = 1;  PurgeTXClear* = 2;
@@ -176,7 +176,7 @@ TYPE
 
 	(** The FindData structure describes a file found by the FindFirstFile or FindNextFile function. *)
 	FindData* = RECORD
-		dwFileAttributes*: SET;
+		dwFileAttributes*: DWORD;
 		ftCreationTime*, ftLastAccessTime*, ftLastWriteTime*: FileTime;
 		nFileSizeHigh*, nFileSizeLow*: LONGINT;
 		dwReserved0*, dwReserved1*: LONGINT;
@@ -213,7 +213,7 @@ TYPE
 	ContextPtr*= POINTER {UNSAFE} TO Context;
 	(* 32 bit
 	Context* = RECORD
-		ContextFlags*: SET;
+		ContextFlags*: DWORD;
 		DR0*, DR1*, DR2*, DR3*, DR6*, DR7*: SIZE;
 		FloatSave*: FloatingSaveArea;
 		GS*, FS*, ES*, DS*: ADDRESS;
@@ -349,7 +349,7 @@ TYPE
 		dwX*, dwY*, dwXSize*, dwYSize*: LONGINT;
 		dwXCountChars*, dwYCountChars*: LONGINT;
 		dwFillAttribute*: LONGINT;
-		dwFlags*: SET;
+		dwFlags*: DWORD;
 		wShowWindow*, cbReserved2*: INTEGER;
 		lpReserved2*: ADDRESS;
 		hStdInput*, hStdOutput*, hStdError*: HANDLE
@@ -373,14 +373,14 @@ TYPE
 
 	DCB* = RECORD
 		DCBlength*, BaudRate*: LONGINT;
-		flags*: SET;
+		flags*: DWORD;
 		wReserved*, XonLim*, XoffLim*: INTEGER;
 		ByteSize*, Parity*, StopBits*, XonChar*, XoffChar*, ErrorChar*, EofChar*, EvtChar*: CHAR;
 		wReserved1*: INTEGER
 	END;
 
 	ComStat* = RECORD
-		status*: SET;
+		status*: DWORD;
 		cbInQue*, cbOutQue*: LONGINT
 	END;
 
@@ -441,7 +441,7 @@ VAR
 	(** The ClearCommBreak function restores character transmission for a specified communications device and places the transmission line in a nonbreak state. *)
 	ClearCommBreak-: PROCEDURE {WINAPI} ( hFile: HANDLE ): BOOL;
 	(** The ClearCommError function retrieves information about a communications error and reports the current status of a communications device. *)
-	ClearCommError-: PROCEDURE {WINAPI} ( hFile: HANDLE;  VAR lpErrors: SET;  VAR lpStat: ComStat ): BOOL;
+	ClearCommError-: PROCEDURE {WINAPI} ( hFile: HANDLE;  VAR lpErrors: DWORD;  VAR lpStat: ComStat ): BOOL;
 	(** The CloseHandle function closes an open object handle. *)
 	CloseHandle-: PROCEDURE {WINAPI} ( hObject: HANDLE ): BOOL;
 	(** The CopyFile function copies an existing file to a new file. *)
@@ -456,10 +456,10 @@ VAR
 	(** The CreateFile function creates or opens the following objects and returns a handle that can be used to access the object:
 		 files, pipes, mailslots, communications resources, disk devices (Windows NT only), consoles, directories (open only) *)
 	CreateFile-: PROCEDURE {WINAPI} ( CONST lpFileName: ARRAY   OF CHAR;
-																dwDesiredAccess, dwShareMode: SET;
+																dwDesiredAccess, dwShareMode: DWORD;
 																lpSecurityAttributes: ANY;
 																dwCreationDistribution: LONGINT;
-																dwFlagsAndAttributes: SET;
+																dwFlagsAndAttributes: DWORD;
 																hTemplateFile: HANDLE ): HANDLE;
 	(** The CreateProcess function creates a new process and its primary thread. The new process executes the specified
 			executable file. *)
@@ -477,7 +477,7 @@ VAR
 	CreateThread-: PROCEDURE {WINAPI} ( lpThreadAttributes: ADDRESS;
 																	  dwStackSize: LONGINT;
 																	  lpStartAddress: ThreadProc;
-																	  lpParameter: ANY;  dwCreationFlags: SET;
+																	  lpParameter: ANY;  dwCreationFlags: DWORD;
 																	  VAR lpThreadId: LONGINT ): HANDLE;
 	(** The DeleteCriticalSection function releases all resources used by an unowned critical section object. *)
 	DeleteCriticalSection-: PROCEDURE {WINAPI} ( VAR lpCriticalSection: CriticalSection );
@@ -489,9 +489,9 @@ VAR
 	(** The DuplicateHandle function duplicates an object handle. *)
 	DuplicateHandle-: PROCEDURE {WINAPI} ( hSourceProcessHandle, hSourceHandle, hTargetProcessHandle: HANDLE;
 																			 VAR lpTargetHandle: HANDLE;
-																			 dwDesiredAccess: SET;
+																			 dwDesiredAccess: DWORD;
 																			 bInheritHandle: BOOL;
-																			 dwOptions: SET ): BOOL;
+																			 dwOptions: DWORD ): BOOL;
 	(** The EnterCriticalSection function waits for ownership of the specified critical section object. *)
 	EnterCriticalSection-: PROCEDURE {WINAPI} ( VAR lpCriticalSection: CriticalSection );
 	
@@ -530,7 +530,7 @@ VAR
 	GetCommandLine-: PROCEDURE {WINAPI} ( ): LPSTR;
 	(** The GetCommModemStatus function retrieves modem control-register values. *)
 	GetCommModemStatus-: PROCEDURE {WINAPI} ( hFile: HANDLE;
-																						VAR lpModemStat: SET ): BOOL;
+																						VAR lpModemStat: DWORD ): BOOL;
 	(** The GetCommState function retrieves the current control settings for a specified communications device. *)
 	GetCommState-: PROCEDURE {WINAPI} ( hFile: HANDLE;
 																		 VAR lpDCB: DCB ): BOOL;
@@ -672,7 +672,7 @@ VAR
 			(an atom) identifying the string. *)
 	GlobalAddAtom-: PROCEDURE {WINAPI} ( VAR lpString: ARRAY   OF CHAR ): ATOM;
 	(** The GlobalAlloc function allocates the specified number of bytes from the heap. *)
-	GlobalAlloc-: PROCEDURE {WINAPI} ( uFlags: SET;  dwBytes: LONGINT ): HGLOBAL;
+	GlobalAlloc-: PROCEDURE {WINAPI} ( uFlags: DWORD;  dwBytes: LONGINT ): HGLOBAL;
 	(** The GlobalDeleteAtom function decrements the reference count of a global string atom. *)
 	GlobalDeleteAtom-: PROCEDURE {WINAPI} ( nAtom: ATOM ): ATOM;
 	(** The GlobalLock function locks a global memory object and returns a pointer to the first byte of the
@@ -684,7 +684,7 @@ VAR
 
 	(** The GlobalReAlloc function changes the size or attributes of a specified global memory object. *)
 	GlobalReAlloc-: PROCEDURE {WINAPI} ( hMem: HGLOBAL;  dwBytes: LONGINT;
-																		uFlags: SET ): HGLOBAL;
+																		uFlags: DWORD ): HGLOBAL;
 	(** The GlobalSize function retrieves the current size, in bytes, of the specified global memory object. *)
 	GlobalSize-: PROCEDURE {WINAPI} ( hMem: HGLOBAL ): LONGINT;
 	(** The GlobalUnlock function decrements the lock count associated with a memory object that was allocated with
@@ -712,7 +712,7 @@ VAR
 																						   VAR lpFileTime: FileTime ): BOOL;
 	(** The MoveFileEx function renames an existing file or directory. *)
 	MoveFileEx-: PROCEDURE {WINAPI} ( VAR lpExistingFileName, lpNewFileName: ARRAY   OF CHAR;
-																    dwFlags: SET ): BOOL;
+																    dwFlags: DWORD ): BOOL;
 	(** The OutputDebugString function sends a string to the debugger for the current application. *)
 	outputDebugString-: PROCEDURE {WINAPI} ( CONST lpOutputString: ARRAY   OF CHAR );
 
@@ -722,9 +722,9 @@ VAR
 
 
 	(** The PurgeComm function discards all characters from the output or input buffer of a specified communications resource. *)
-	PurgeComm-: PROCEDURE {WINAPI} ( hFile: HANDLE;  dwFlags: SET ): BOOL;
+	PurgeComm-: PROCEDURE {WINAPI} ( hFile: HANDLE;  dwFlags: DWORD ): BOOL;
 	(** The QueryDosDevice function retrieves information about MS-DOS device names. *)
-	QueryDosDevice-: PROCEDURE {WINAPI} ( lpDeviceName: ARRAY   OF CHAR;
+	QueryDosDevice-: PROCEDURE {WINAPI} ( CONST lpDeviceName: ARRAY   OF CHAR;
 																		   VAR lpTargetPath: ARRAY   OF CHAR;
 																		   ucchMax: LONGINT ): LONGINT;
 	(** The QueryPerformanceCounter function retrieves the current value of the high-resolution
@@ -769,7 +769,7 @@ VAR
 	(** The SetCommBreak function suspends character transmission for a specified communications device and places the transmission line in a break state until the ClearCommBreak function is called. *)
 	SetCommBreak-: PROCEDURE {WINAPI} ( hFile: HANDLE ): BOOL;
 	(** The SetCommMask function specifies a set of events to be monitored for a communications device. *)
-	SetCommMask-: PROCEDURE {WINAPI} ( hFile: HANDLE;  dwEvtMask: SET ): BOOL;
+	SetCommMask-: PROCEDURE {WINAPI} ( hFile: HANDLE;  dwEvtMask: DWORD ): BOOL;
 	(** The SetCommState function configures a communications device according to the specifications in a device-control block (a DCB structure)*)
 	SetCommState-: PROCEDURE {WINAPI} ( hFile: HANDLE;
 																	    VAR lpDCB: DCB ): BOOL;
@@ -793,14 +793,14 @@ VAR
 	SetCurrentDirectory-: PROCEDURE {WINAPI} ( VAR lpPathName: ARRAY   OF CHAR ): BOOL;
 	(** The SetErrorMode function controls whether the system will handle the specified types of serious errors,
 			or whether the process will handle them. *)
-	SetErrorMode-: PROCEDURE {WINAPI} ( uMode: SET ): SET;
+	SetErrorMode-: PROCEDURE {WINAPI} ( uMode: DWORD ): DWORD;
 	(** The SetEndOfFile function moves the end-of-file (EOF) position for the specified file to the current position of the file pointer. *)
 	SetEndOfFile-: PROCEDURE {WINAPI} ( hFile: HANDLE ): BOOL;
 	(** The SetEvent function sets the state of the specified event object to signaled. *)
 	SetEvent-: PROCEDURE {WINAPI} ( hEvent: HANDLE ): BOOL;
 	(** The SetFileAttributes function sets a file's attributes. *)
 	SetFileAttributes-: PROCEDURE {WINAPI} ( VAR lpFileName: ARRAY   OF CHAR;
-																			dwFileAttributes: SET ): BOOL;
+																			dwFileAttributes: DWORD ): BOOL;
 	(** The SetFilePointer function moves the file pointer of an open file. *)
 	SetFilePointer-: PROCEDURE {WINAPI} ( hFile: HANDLE;  lDistanceToMove: LONGINT;
 																	    VAR lpDistanceToMoveHigh: LONGINT;
@@ -814,7 +814,7 @@ VAR
 	(** The SetLocalTime function sets the current local time and date. *)
 	SetLocalTime-: PROCEDURE {WINAPI} ( VAR lpSystemTime: SystemTime ): BOOL;
 	(** The SetThreadAffinityMask function sets a processor affinity mask for the specified thread. *)
-	SetThreadAffinityMask-: PROCEDURE {WINAPI} ( hThread: HANDLE; dwThreadAffinityMask: SET): SET;
+	SetThreadAffinityMask-: PROCEDURE {WINAPI} ( hThread: HANDLE; dwThreadAffinityMask: DWORD): DWORD;
 	(** The SetThreadContext function sets the context in the specified thread. *)
 	SetThreadContext-: PROCEDURE {WINAPI} ( hThread: HANDLE;
 																			  VAR lpContext: Context ): BOOL;
@@ -844,11 +844,11 @@ VAR
 	TryEnterCriticalSection-: PROCEDURE {WINAPI} ( VAR lpCriticalSection: CriticalSection ): BOOL;
 	(** The VirtualAlloc function reserves or commits a region of pages in the virtual address space of the calling process. *)
 	VirtualAlloc-: PROCEDURE {WINAPI} ( lpAddress: ADDRESS;  dwSize: SIZE;
-																    flAllocationType, flProtect: SET ): ADDRESS;
+																    flAllocationType, flProtect: DWORD ): ADDRESS;
 	(** The VirtualFree function releases or decommits (or both) a region of pages within the virtual address space of the
 			calling process. *)
 	VirtualFree-: PROCEDURE {WINAPI} ( lpAddress: ADDRESS;  dwSize: SIZE;
-																  dwFreeType: SET ): BOOL;
+																  dwFreeType: DWORD ): BOOL;
 	(** The WaitForSingleObject function returns when one of the following occurs:
 			The specified object is in the signaled state.
 			The time-out interval elapses. *)
@@ -870,6 +870,19 @@ VAR
 	(* OutputString*: OutputStringProc; *)
 	Shutdown*: PROCEDURE ( code: LONGINT );
 
+	PROCEDURE SetToDW*(s: SET): DWORD;
+	BEGIN
+		RETURN SYSTEM.VAL(DWORD, s); 
+	END SetToDW;
+
+	PROCEDURE DWToSet*(d: DWORD): SET;
+	VAR a: ADDRESS;
+	BEGIN
+		a := d;
+		RETURN SYSTEM.VAL(SET, a); 
+	END DWToSet;
+	
+
 	(** Wrapper for getProcAddress. *)
 	PROCEDURE GetProcAddress*( hModule: HMODULE; CONST procName: ARRAY OF CHAR; VAR adr: ADDRESS );
 	BEGIN