;----------------------------------------------------------------------------
; CopyRight [C] 1997-1998 RAM Scanner // [CiD], VD. All Rights Reserved
;----------------------------------------------------------------------------
Version_           Equ '0.12 Alpha'
TRUE		   Equ 0ffh
FALSE		   Equ 0
INT_ENABLED        Equ 200h
INT_DISABLED       Equ 0
;----------------------------------------------------------------------------
; Максимальный номер эксепшена. На него завазаны кое-какие фени, так что
; без дела лучше не вертеть.
;----------------------------------------------------------------------------
MaxFaultNum        Equ 11h
;----------------------------------------------------------------------------
; Раскомментарить для работы в IOPL 0 иначе работает в IOPL 3.
; Работать в IOPL 0 будет криво из-за отсутствия эмуляции pushfd/popfd и
; трудноуловимого глюка с int 1. При iopl 3 нормально.
;----------------------------------------------------------------------------
;$$IOPL0            Equ 0

;----------------------------------------------------------------------------
; Дебуговый макрос Invalid OpCode. Трапает машину.
;----------------------------------------------------------------------------
_Break		   Equ Db 0fh,0ffh


;----------------------------------------------------------------------------
; Еще одна дебуговая фенечка
;----------------------------------------------------------------------------
_Debug		   Macro Char
		   mov ax,Sel_Video
		   mov es,ax
		   mov br es:[0],Char
		   jmp $
		   Endm

;----------------------------------------------------------------------------
; Дебуговая феня
;----------------------------------------------------------------------------
_Debug32	   Macro Reg_
		   mov ax,Sel_Video
		   mov es,ax
		   mov eax,Reg_
		   mov ebx,eax
		   shr eax,16
		   mov es:[0],ah
		   mov es:[2],al
		   mov eax,ebx
		   mov es:[4],ah
		   mov es:[6],al
		   jmp $
		   Endm

;----------------------------------------------------------------------------
; Последний порт PC. Задает IO-Map в TSS. Если поставить 3ff, то на PCI будет
; падать из-за обращения к левым портам.
;----------------------------------------------------------------------------
Last_PC_Port       Equ 03ffh
;Last_PC_Port      Equ 0ffffh

;----------------------------------------------------------------------------
; Дефолтное значение IOPL. Уж не помню для чего нужно
;----------------------------------------------------------------------------
DefIOPL            Equ 3

;----------------------------------------------------------------------------
; Описание типов селекторов
;----------------------------------------------------------------------------
RDOnly		   Equ 10h
RD_WR		   Equ 12h
RD_WR_XD	   Equ 16h
EXOnly		   Equ 18h
EX_RD		   Equ 1ah
EXOnly_CF	   Equ 1ch
EX_RD_CF	   Equ 1eh

_IF		   Equ (1 Shl 9)
_TF		   Equ (1 Shl 8)

XTSS		   Equ 9
XTSS_Busy	   Equ 0bh
XCall_Gate	   Equ 0ch
XINT_Gate	   Equ 0eh
XTrap_Gate	   Equ 0fh

;----------------------------------------------------------------------------
; Еще всякие макросы разные
;----------------------------------------------------------------------------
GdLimit		   Macro Granularity,Default,HighLimit
		   Db (Granularity Shl 7) Or (Default Shl 6) Or	(HighLimit And 0fh)
		   Endm

PlType		   Macro Privilege,Type
		   Db 80h Or (Privilege	Shl 3) Or Type
		   Endm

;----------------------------------------------------------------------------
; Макрос перехода по программному исключению. Чтоб писанины меньше
;----------------------------------------------------------------------------
FaultJmp	   Macro Lbl,NPtr,Jump
Fault_&Lbl:
		   push	Dr NPtr
		   jmp Jump
		   Endm

;----------------------------------------------------------------------------
; То же самое, но по аппаратному инту
;----------------------------------------------------------------------------                   
HardwIntJmp	   Macro Lbl,NPtr,Jump
HWInt_&Lbl:
;		   push	dr NPtr
		   Db 66h,6ah
HWVectIrq_&Lbl	   Db NPtr
		   jmp Jump
		   Endm

;----------------------------------------------------------------------------
; Настраивалка IDT/GDT
;----------------------------------------------------------------------------
Adjust_Table	   Macro SysTableName,DescriptorCount
		   mov si,ofs SysTableName
		   mov cx,DescriptorCount
		   call	Adjust
		   Endm


;----------------------------------------------------------------------------
; Заходилка в PM16. Не юзается и досталась в наследство
;----------------------------------------------------------------------------
Set_PM             Macro GDTTbl_Seg,GDTTBl_Name,IRQ0_Vect,IRQ8_Vect
		   mov ax,GDTTbl_Seg
		   mov es,ax
		   mov si,ofs GDTTbl_Name
		   mov bh,IRQ0_Vect
		   mov bl,IRQ8_Vect
		   mov ah,89h
		   int 15h
		   Endm

;----------------------------------------------------------------------------
; Структурка TSS
;----------------------------------------------------------------------------                   
XTaskSegment	   Struc
		   _Link	 Dw 0
				 Dw 0
		   ESP0		 Dd 0
		   SS0		 Dw 0
				 Dw 0
		   ESP1		 Dd 0
		   SS1		 Dw 0
				 Dw 0
		   ESP2		 Dd 0
		   SS2		 Dw 0
				 Dw 0
		   _CR3		 Dd 0
		   _EIP		 Dd 0
		   _EFlags	 Dd 0
		   _EAX		 Dd 0
		   _ECX		 Dd 0
		   _EDX		 Dd 0
		   _EBX		 Dd 0
		   _ESP		 Dd 0
		   _EBP		 Dd 0
		   _ESI		 Dd 0
		   _EDI		 Dd 0
		   _ES		 Dw 0
				 Dw 0
		   _CS		 Dw 0
				 Dw 0
		   _SS		 Dw 0
				 Dw 0
		   _DS		 Dw 0
				 Dw 0
		   _FS		 Dw 0
				 Dw 0
		   _GS		 Dw 0
				 Dw 0
		   _LDT		 Dw 0
				 Dw 0
		   _TrapF	 Dw 0
		   IOBase	 Dw 68h	  ; Offset Virtual_IO -	Offset _Link
		   Virtual_IO	 Db (Last_PC_Port/8+1) Dup (0)
				 Dd -1
		   Ends
