You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
572 lines
14 KiB
572 lines
14 KiB
;++
|
|
;
|
|
; Module name
|
|
;
|
|
; su.inc
|
|
;
|
|
; Author
|
|
;
|
|
; Thomas Parslow (tomp) Mar-1-90
|
|
;
|
|
; Description
|
|
;
|
|
; Include file for SU.ASM.
|
|
;
|
|
;
|
|
;--
|
|
|
|
.386
|
|
|
|
PAGE_SIZE equ 1000h
|
|
MACHINE_TYPE_ISA equ 0
|
|
MACHINE_TYPE_EISA equ 1
|
|
MACHINE_TYPE_MCA equ 2
|
|
|
|
;
|
|
; Define the segment:offset address pair of the location to
|
|
; load detection module.
|
|
; N.B. This definition *MUST* be the same as the ones defined
|
|
; in ..\constant.h
|
|
;
|
|
|
|
DETECTION_ADDRESS_SEG equ 1000h
|
|
DETECTION_ADDRESS_OFFSET equ 0
|
|
|
|
;
|
|
; Structure definitions and equates for INT 15 function E820
|
|
;
|
|
|
|
E820Frame struc
|
|
ErrorFlag dd ?
|
|
Key dd ?
|
|
DescSize dd ?
|
|
|
|
BaseAddrLow dd ?
|
|
BaseAddrHigh dd ?
|
|
SizeLow dd ?
|
|
SizeHigh dd ?
|
|
MemoryType dd ?
|
|
E820Frame ends
|
|
|
|
MemoryDescriptorFramePointer struc
|
|
E820FramePointer dd ?
|
|
MemoryDescriptorFramePointer ends
|
|
|
|
|
|
|
|
;
|
|
|
|
IFDEF NEC_98
|
|
IDT_ENTRIES equ 100h
|
|
|
|
BIOS_KEYBOARD_INTERRUPT equ 18h
|
|
BIOS_DISK_INTERRUPT equ 1bh
|
|
else ;NEC_98
|
|
BIOS_DISK_INTERRUPT equ 13h
|
|
BIOS_READ_SECTOR equ 2
|
|
IDT_ENTRIES equ 100h
|
|
|
|
BIOS_KEYBOARD_INTERRUPT equ 16h
|
|
endif ;NEC_98
|
|
|
|
EXPORT_STACK equ 07ffeh
|
|
RE_ENABLING equ 1
|
|
LOADER_STACK equ 061ffch
|
|
|
|
CR0_ET equ 10h
|
|
|
|
;
|
|
; Trap Number macro save eax on the stack and then pushes the
|
|
; number of the trap that's in progress.
|
|
;
|
|
|
|
TRAP_NUMBER macro num,addr
|
|
IF num EQ 9
|
|
push eax ; push place holder for error code
|
|
ENDIF
|
|
IF num LE 7
|
|
push eax ; push place holder for error code
|
|
ENDIF
|
|
push eax ; save eax on stack first
|
|
mov eax,num
|
|
push eax
|
|
jmp addr
|
|
endm
|
|
|
|
;;
|
|
;
|
|
; GetSector Stack Frame Structure
|
|
;
|
|
; Stack frame definition for GetSector call from OS loader
|
|
; to 16bit routines.
|
|
;
|
|
;;
|
|
|
|
GetSectorFrame struc
|
|
FunctionNumber dd ?
|
|
DriveNumber dd ?
|
|
HeadNumber dd ?
|
|
TrackNumber dd ?
|
|
SectorNumber dd ?
|
|
NumberOfSectors dd ?
|
|
BufferPointer dd ?
|
|
GetSectorFrame ends
|
|
|
|
;;
|
|
;
|
|
; GetEddsSector Stack Frame Structure
|
|
;
|
|
; Stack frame definition for GetEddsSector call from OS loader
|
|
; to 16bit routines.
|
|
;
|
|
;;
|
|
|
|
GetEddsSectorFrame struc
|
|
DriveNum dd ?
|
|
LBNLow dd ?
|
|
LBNHigh dd ?
|
|
NumberOfBlocks dd ?
|
|
BufPointer dd ?
|
|
FunctionNum dd ?
|
|
GetEddsSectorFrame ends
|
|
|
|
RebootFrame struc
|
|
BootType dd ?
|
|
RebootFrame ends
|
|
|
|
;
|
|
; ABIOS services Stack Frame Structure
|
|
;
|
|
; Stack frame definition for ABIOS services call from OS loader
|
|
; to 16 bit routine.
|
|
;
|
|
|
|
AbiosServicesFrame struc
|
|
AbiosFunction dd ?
|
|
CommonDataArea dd ?
|
|
InitTable dd ?
|
|
RamExtension dd ?
|
|
AbiosRoutine dd ?
|
|
LogicalId dd ?
|
|
NumberLids dd ?
|
|
AbiosServicesFrame ends
|
|
|
|
;
|
|
; Hardware detection frame structure
|
|
;
|
|
; Stack frame definition for DetectHardware call from OS loader
|
|
; to 16 bit routine.
|
|
;
|
|
|
|
DetectionFrame struc
|
|
HeapStart dd ?
|
|
HeapSize dd ?
|
|
ConfigTree dd ?
|
|
HeapUsed dd ?
|
|
LoadOptions dd ?
|
|
OptionsLength dd ?
|
|
DetectionFrame ends
|
|
|
|
;
|
|
; HardwareCursor Stack Frame Structure
|
|
;
|
|
; Stack frame definition for HardwareCursor call from OS loader
|
|
; to 16 bit routine.
|
|
;
|
|
|
|
HardwareCursorFrame struc
|
|
XCoord dd ?
|
|
YCoord dd ?
|
|
HardwareCursorFrame ends
|
|
|
|
;
|
|
; GetDateTime Stack Frame Structure
|
|
;
|
|
; Stack frame definition for GetDateTime call from OS loader
|
|
; to 16 bit routine.
|
|
;
|
|
|
|
GetDateTimeFrame struc
|
|
DateDword dd ?
|
|
TimeDword dd ?
|
|
GetDateTimeFrame ends
|
|
|
|
|
|
;
|
|
; ComPort Stack Frame Structure
|
|
;
|
|
; Stack frame definition for ComPort call from OS loader
|
|
; to 16 bit routine.
|
|
;
|
|
|
|
ComPortFrame struc
|
|
ComPortPort dd ?
|
|
ComPortFunction dd ?
|
|
ComPortArg dd ?
|
|
ComPortFrame ends
|
|
|
|
;
|
|
; IsMcaMachine Stack Frame Structure
|
|
;
|
|
; Stack frame definition for IsMcaMachine call from OS loader
|
|
; to 16 bit routine.
|
|
;
|
|
|
|
IsMcaMachineFrame struc
|
|
Dummy dd ?
|
|
IsMcaMachineFrame ends
|
|
|
|
;;
|
|
;
|
|
; GetElToritoStatus Stack Frame Structure
|
|
;
|
|
; Stack frame definition for GetElToritoStatus call from OS loader
|
|
; to 16bit routines.
|
|
;
|
|
;;
|
|
|
|
GetElToritoStatusFrame struc
|
|
SpecPacketPointer dd ?
|
|
ETDriveNum dd ?
|
|
GetElToritoStatusFrame ends
|
|
|
|
;;
|
|
;
|
|
; GetExtendedInt13Params Stack Frame Structure
|
|
;
|
|
; Stack frame definition for GetExtendedInt13Params call from OS loader
|
|
; to 16bit routines.
|
|
;
|
|
;;
|
|
|
|
GetExtendedInt13ParamsFrame struc
|
|
ParamPacketPointer dd ?
|
|
Int13UnitNumber dd ? ; really only a byte >= 0x80
|
|
GetExtendedInt13ParamsFrame ends
|
|
|
|
;;
|
|
;
|
|
; NetPcRomServices Stack Frame Structure
|
|
;
|
|
; Stack frame definition for NetPcRomServices call from OS loader
|
|
; to 16bit routines.
|
|
;
|
|
;;
|
|
|
|
NetPcRomServicesFrame struc
|
|
NetPcRomFunctionNumber dd ?
|
|
NetPcRomCommandPacketPointer dd ?
|
|
NetPcRomServicesFrame ends
|
|
|
|
;;
|
|
;
|
|
; BiosRedirectService Stack Frame Structure
|
|
;
|
|
; Stack frame definition for BiosRedirectService call from OS loader
|
|
; to 16bit routines.
|
|
;
|
|
;;
|
|
|
|
BiosRedirectServiceFrame struc
|
|
Command dd ?
|
|
BiosRedirectServiceFrame ends
|
|
|
|
;;
|
|
;
|
|
; Memory Descriptor Structure.
|
|
;
|
|
; Passed to OS loader as part of the boot context record
|
|
;
|
|
;;
|
|
|
|
MemoryDescriptor struc
|
|
BlockBase dd ?
|
|
BlockSize dd ?
|
|
MemoryDescriptor ends
|
|
|
|
;;
|
|
;
|
|
; File System Context Record Structure
|
|
;
|
|
;;
|
|
|
|
FsContextRecord struc
|
|
BootDrive db ?
|
|
FsContextRecord ends
|
|
|
|
;;
|
|
;
|
|
; IDT Descriptor Structure
|
|
;
|
|
;;
|
|
|
|
TrapDesc struc
|
|
IDT_offset dw ?
|
|
IDT_selector dw ?
|
|
IDT_attribute dw ?
|
|
IDT_reserved dw ?
|
|
TrapDesc ends
|
|
|
|
;;
|
|
;
|
|
; GDT Descriptor Structure ;;
|
|
;
|
|
;;
|
|
|
|
GDTDesc struc
|
|
GDT_limit dw 0
|
|
GDT_base1 dw 0
|
|
GDT_base2 db 0
|
|
GDT_access db 0
|
|
GDT_limacc db 0
|
|
GDT_base3 db 0
|
|
GDTDesc ends
|
|
|
|
|
|
;;
|
|
;
|
|
; GDT Selector Definitions
|
|
;
|
|
;;
|
|
|
|
NULL_Selector equ 0h
|
|
KeCodeSelector equ 8h
|
|
KeDataSelector equ 10h
|
|
UsCodeSelector equ 18h
|
|
UsDataSelector equ 20h
|
|
TSS_Selector equ 28h
|
|
PCR_Selector equ 30h
|
|
TEP_Selector equ 38h
|
|
BDA_Selector equ 40h
|
|
KeLdtSelector equ 48h
|
|
DblFltTskSelector equ 50h
|
|
SuCodeSelector equ 58h
|
|
SuDataSelector equ 60h
|
|
VideoSelector equ 68h
|
|
GDT_AliasSelector equ 70h
|
|
DbCodeSelector equ 78h
|
|
DbDataSelector equ 80h
|
|
DebugUseSelector equ 88h
|
|
MdlSelector equ 90h
|
|
|
|
;;
|
|
;
|
|
; Exception Frame Structure
|
|
; Note, this absolutely must match the corresponding structure
|
|
; defined in "types.h"
|
|
;
|
|
;;
|
|
|
|
ExceptionFrame struc
|
|
Ftr dw 0
|
|
Fdr6 dd 0
|
|
Fcr0 dd 0
|
|
Fcr2 dd 0
|
|
Fcr3 dd 0
|
|
Fss dw 0
|
|
Fgs dw 0
|
|
Ffs dw 0
|
|
Fes dw 0
|
|
Fds dw 0
|
|
Fedi dd 0
|
|
Fesi dd 0
|
|
Febp dd 0
|
|
Fesp dd 0
|
|
Febx dd 0
|
|
Fedx dd 0
|
|
Fecx dd 0
|
|
TrapNum dd 0
|
|
Feax dd 0
|
|
Error dd 0
|
|
Feip dd 0
|
|
Fcs dd 0
|
|
Feflags dd 0
|
|
ExceptionFrame ends
|
|
|
|
|
|
|
|
FUNCTION_ERROR equ -1
|
|
|
|
;;
|
|
;
|
|
; Register Frame Structure
|
|
;
|
|
; For bios int calls
|
|
;
|
|
;;
|
|
|
|
reg_frame struc
|
|
intnum dw ?
|
|
sfg dw ?
|
|
sax dw ?
|
|
sbx dw ?
|
|
scx dw ?
|
|
sdx dw ?
|
|
ssi dw ?
|
|
ses dw ?
|
|
reg_frame ends
|
|
|
|
IFDEF NEC_98
|
|
gdpRegistors struc
|
|
rAL db 0FFh
|
|
FLG db ?
|
|
rBX dw ?
|
|
rCX dw ?
|
|
rDX dw ?
|
|
gdpRegistors ends
|
|
|
|
PartitionDescriptor struc
|
|
BootableFlag db ?
|
|
PartitionType db ?
|
|
Reserved00 dw ?
|
|
IPLSector db ?
|
|
IPLTrack db ?
|
|
IPLCylinder dw ?
|
|
StartingSector db ?
|
|
StartingTrack db ?
|
|
StartingCylinder dw ?
|
|
EndingSector db ?
|
|
EndingTrack db ?
|
|
EndingCylinder dw ?
|
|
PartitionName db 16 dup(?) ; ASCII strings
|
|
PartitionDescriptor ends
|
|
|
|
BIOS_FLAG equ 500h ; byte in ROM work segment
|
|
BIOS_FLAG1 equ 480h ; byte in ROM work segment
|
|
BIOS_FLAG4 equ 484h ; byte in ROM work segment
|
|
BIOS_FLAG5 equ 458h ; byte in ROM work segment
|
|
BIOS_FLAG6 equ 45Ah ; byte in ROM work segment
|
|
AT_SWITCH equ 457h ; byte in ROM work segment
|
|
DAUA equ 584h ; byte in ROM work segment
|
|
DISK_EQUIP equ 55Ch ; byte in ROM work segment
|
|
DISK_EQUIPS_SCSI equ 482h ; byte in ROM work segment
|
|
EXPMMSIZ equ 401h ; byte in ROM work segment
|
|
EXPMMSZ2 equ 594h ; word in ROM work segment
|
|
DISK_RESULT equ 564h ; word in ROM work segment
|
|
H_EQUIPS equ 47Dh ; byte in ROM work segment
|
|
H_DISK_EQUIPS equ 47Eh ; word in ROM work segment
|
|
EQUIPS_47Ch equ 47Ch ; byte in ROM work segment
|
|
IC0 equ 10000000b
|
|
IC1 equ 01000000b
|
|
DAFloppy equ 00010000b ; floppy bit in DA
|
|
DASCSI equ 00100000b ; SCSI bit in DA
|
|
DASASI equ 00000000b ; SASI bit in DA
|
|
DEVICEFORMAT equ 0FFFFh
|
|
TRACKFORMAT equ 00000h
|
|
MEMBANK08 equ 91h ; bank 08
|
|
MEMBANK0A equ 93h ; bank 0A
|
|
|
|
ROLLOVER_COUNT equ 45011 ; 1/18.2 * 2457.6KHz /3
|
|
TIMER_VECTOR equ (8*4)
|
|
TIMER1_DATA_PORT0 equ 71h ; Timer1, channel 0 data port
|
|
TIMER1_CONTROL_PORT0 equ 77h ; Timer1, channel 0 control port
|
|
TIMER1_INTSHAREREG equ 879h ; PC-H98 TIMER INT SHARE REGISTER
|
|
COMMAND_8254_COUNTER0 equ 00h ; Select count 0
|
|
COMMAND_8254_RW_16BIT equ 30h ; Read/Write LSB firt then MSB
|
|
COMMAND_8254_MODE2 equ 4 ; Use mode 2
|
|
|
|
UR_DAT equ 030h ; data port
|
|
UR_LCR equ UR_DAT+2 ; line control registers
|
|
UR_LSR equ UR_DAT+2 ; line status register
|
|
UR_IEN equ UR_DAT+5 ; Interrupt enable
|
|
UR_TIMERSET equ 75h ; 8253 counter set
|
|
UR_TIMERMODE equ 77h ; 8253 counter mode
|
|
|
|
UR_MODE equ 01001110B ; stop 1, disable p, 8 bpc, 1 stop, x16
|
|
UR_COMMAND equ 00110111B ; RTS, err reset, RXE, DTR, TXEN
|
|
UR_RESET equ 01000000B ; internal reset command
|
|
|
|
RD_RDY equ 02h ; recieve data ready
|
|
TX_RDY equ 01h ; transmitter empty if 1
|
|
endif ;NEC_98
|
|
|
|
;;
|
|
;; Processor Flags
|
|
;;
|
|
|
|
PROT_MODE equ 000000001 ; Enable protect mode operation
|
|
ENABLE_PAGING equ 80000000h ; Enable paging hardware
|
|
PD_PHYSICAL_ADDRESS equ 99000h
|
|
TSS_SIZE equ 80h
|
|
OVERRIDE equ 66h
|
|
|
|
;
|
|
; Operand and Address size overrides
|
|
;
|
|
|
|
OPSIZE macro
|
|
db 66h
|
|
endm
|
|
ADSIZE macro
|
|
db 67h
|
|
endm
|
|
|
|
|
|
;
|
|
; External Procedures for SUDATA.ASM
|
|
;
|
|
|
|
IFDEF SU_CODEMODULE
|
|
extrn _SuMain:near
|
|
extrn _ScreenStart:near
|
|
extrn _vp:near
|
|
extrn _putx:near
|
|
extrn _TrapHandler:near
|
|
extrn _GDTregister:fword
|
|
extrn _IDTregister:fword
|
|
extrn _IDTregisterZero:fword
|
|
extrn saveDS:word
|
|
extrn SuStack:word
|
|
extrn _edata:word
|
|
extrn _FileStart:dword
|
|
ENDIF
|
|
|
|
|
|
|
|
;
|
|
; External Procedures for SUDATA.ASM
|
|
;
|
|
|
|
IFDEF SU_DATAMODULE
|
|
extrn Trap0:far
|
|
extrn Trap1:far
|
|
extrn Trap2:far
|
|
extrn Trap3:far
|
|
extrn Trap4:far
|
|
extrn Trap5:far
|
|
extrn Trap6:far
|
|
extrn Trap7:far
|
|
extrn Trap8:far
|
|
extrn Trap9:far
|
|
extrn TrapA:far
|
|
extrn TrapB:far
|
|
extrn TrapC:far
|
|
extrn TrapD:far
|
|
extrn TrapE:far
|
|
extrn TrapF:far
|
|
extrn _edata:near
|
|
ENDIF
|
|
|
|
|
|
|
|
;
|
|
; Segment declarations for "Small Model" 16 bit Su Module.
|
|
;
|
|
|
|
_TEXT segment para use16 public 'CODE'
|
|
_TEXT ends
|
|
|
|
_DATA segment para use16 public 'DATA'
|
|
_DATA ends
|
|
|
|
CONST segment para use16 public 'CONST'
|
|
CONST ends
|
|
|
|
_BSS segment para use16 public 'BSS'
|
|
_BSS ends
|
|
|
|
DGROUP group const, _BSS, _DATA
|
|
|
|
|
|
;;; END OF FILE ;;;
|
|
|