þ a‹R þ w ?þ m
Z<     þ hý	 o     þ nSystem-wide
  NAME CpCalls

Sysdep_CGROUP GROUP Sysdep_CODE
;Sysdep_DGROUP GROUP Sysdep_DATA

NULLBYTE EQU  0FFh
RomId1   EQU  1

PUBLIC SetCpCallsInterrupt
;PUBLIC rom1Slot

EXTRN CpSetKeyHandler : FAR
EXTRN CpSetWatchDogHandler : FAR
EXTRN CpCatchAll : FAR
EXTRN CpEnableInterrupt : FAR
EXTRN CpDisableInterrupt : FAR
EXTRN CpSetInterrupt : FAR
EXTRN CpEndOfInterrupt : FAR
EXTRN CpSystemTick : FAR
EXTRN CpRealTimeClock : FAR
EXTRN CpMachineID : FAR
EXTRN OsNewQElement : FAR
EXTRN OsInitQCB : FAR
EXTRN OsElementChecksum : FAR
EXTRN OsVerifyChecksum : FAR
EXTRN OsInsertIntoQ : FAR
EXTRN OsRemoveFromQ : FAR
EXTRN OsReplaceInQ : FAR
EXTRN OsElementInQ : FAR
EXTRN OsSearchInQ : FAR
EXTRN CpFree : FAR
EXTRN CpGetSize : FAR
EXTRN IntAllocate : FAR
EXTRN CpAllocate : FAR
EXTRN CpMemInit : FAR
EXTRN CpFreeTaskMem : FAR
EXTRN CpGetMemStatus : FAR
EXTRN CpWhoAmI : FAR
EXTRN Reschedule : FAR
EXTRN CpWait : FAR
EXTRN CpSend : FAR
EXTRN CpReceive : FAR
EXTRN CpCreateProcess : FAR
EXTRN CpDeleteProcess : FAR
EXTRN CpDelay : FAR
EXTRN CpSetPriority : FAR
EXTRN CpCreateSemaphore : FAR
EXTRN CpDeleteSemaphore : FAR
EXTRN Upper : FAR
EXTRN CompareChars : FAR
EXTRN MakeChecksum : FAR
EXTRN SetException : FAR
EXTRN Exception : FAR
EXTRN CpAddressOf : FAR
EXTRN CpSignal : FAR
EXTRN TellMessageWaiters : FAR
EXTRN CnoCharOut : FAR
EXTRN CnoLineOut : FAR
EXTRN InvalidCall : FAR
; System dependent routines
EXTRN DoOsMemInit: FAR
EXTRN GetDeviceList: FAR
EXTRN SetSystemId: FAR
EXTRN GfxSetPixel: FAR
EXTRN GfxClrPixel: FAR
EXTRN GfxInvertPixel: FAR
EXTRN GfxTestPixel: FAR
EXTRN GfxDrawLine: FAR
EXTRN GfxEraseLine: FAR
EXTRN GfxInvertLine: FAR
EXTRN BitInvertHLine: FAR
EXTRN BitEraseHLine: FAR
EXTRN CpCopyRectangle: FAR
EXTRN BlitRectangle: FAR
EXTRN InitSysdepVars: FAR
EXTRN CpScreenInfo: FAR
EXTRN SetDoClippingRect: FAR
EXTRN CpDrawChars: FAR
EXTRN SetUDISystemId: FAR
EXTRN CpPartitionInfo: FAR
EXTRN CpGetTime: FAR
EXTRN CpSetTime: FAR
EXTRN xCpGetMySlot: FAR
EXTRN xCpBankInfo: FAR
EXTRN xCpSetActiveSlot: FAR
EXTRN xCpGetSlotAddress: FAR
EXTRN ExceptionHandler: FAR
EXTRN UnresolvedMessage: FAR
$EJECT

;Sysdep_DATA SEGMENT PARA PUBLIC 'DATA'
;rom1Slot DB 1 DUP (?) ; needed because of rom1 bug
;                      ; with const in code
;Sysdep_DATA ENDS

Sysdep_CODE SEGMENT PARA PUBLIC 'CODE'
  ASSUME CS:Sysdep_CGROUP

routines DD CpSetKeyHandler
         DD CpSetWatchDogHandler
         DD CpCatchAll
         DD CpEnableInterrupt
         DD CpDisableInterrupt
         DD CpSetInterrupt
         DD CpEndOfInterrupt
         DD CpSystemTick
         DD CpRealTimeClock
         DD CpMachineID
         DD OsNewQElement
         DD OsInitQCB
         DD OsElementChecksum
         DD OsVerifyChecksum
         DD OsInsertIntoQ
         DD OsRemoveFromQ
         DD OsReplaceInQ
         DD OsElementInQ
         DD OsSearchInQ
         DD CpFree
         DD CpGetSize
         DD IntAllocate
         DD CpAllocate
         DD CpMemInit
         DD CpFreeTaskMem
         DD CpGetMemStatus
         DD CpWhoAmI
         DD Reschedule
         DD CpWait
         DD CpSend
         DD CpReceive
         DD CpCreateProcess
         DD CpDeleteProcess
         DD CpDelay
         DD CpSetPriority
         DD CpCreateSemaphore
         DD CpDeleteSemaphore
         DD Upper
         DD CompareChars
         DD MakeChecksum
         DD SetException
         DD Exception
         DD CpAddressOf
         DD CpSignal
         DD TellMessageWaiters
         DD CnoCharOut
         DD CnoLineOut
         DD InvalidCall       ;CpSetMessageHandler
         DD InvalidCall       ;CpLogError
         DD InvalidCall       
         DD InvalidCall       
         DD InvalidCall       
         DD InvalidCall       
         DD InvalidCall       
; System Dependent Calls
         DD DoOsMemInit
         DD GetDeviceList
         DD SetSystemId
         DD GfxSetPixel
         DD GfxClrPixel
         DD GfxInvertPixel
         DD GfxTestPixel
         DD GfxDrawLine
         DD GfxEraseLine
         DD GfxInvertLine
         DD BitInvertHLine
         DD BitEraseHLine
         DD CpCopyRectangle
         DD BlitRectangle
         DD InitSysdepVars
         DD CpScreenInfo
         DD SetDoClippingRect
         DD CpDrawChars
         DD SetUDISystemId
         DD CpPartitionInfo
         DD CpGetTime
         DD CpSetTime
         DD xCpGetMySlot
         DD xCpBankInfo
         DD xCpSetActiveSlot
         DD xCpGetSlotAddress
         DD ExceptionHandler
         DD UnresolvedMessage
$EJECT

IntrEntry LABEL FAR
  JMP  SHORT InterruptEntry

IndrEntry:
  JMP  SHORT IndirectEntry

jumpTable:
  DW  routines
  DW  0
parms:
  DW 0fh
  DW 0ffffh
routineCount:
  DB 82


InterruptEntry:

  POP  BX          ; get IP
  POP  ES          ; get CS
  POPF             ; set flags

  MOV  AX, ES:[BX] ; get call #
  XOR  AH, AH
  INC  BX          ; skip call #

  PUSH ES          ; push CS
  PUSH BX          ; push IP

IndirectEntry:
  MOV  BX, AX      ; table index
  CMP  BL, BYTE PTR routineCount
  JB   LookItUp
  CALL InvalidCall ; invalid routine number - abort
LookItUp:
  SHL  BX, 1
  SHL  BX, 1       ; bx = bx * 4

  LES  DI, DWORD PTR jumpTable
  MOV  AX, ES
  OR   AX, AX
  JNZ  GoToIt
  MOV  AX, CS
  MOV  ES, AX
GoToIt:
  JMP  DWORD PTR ES:[DI+BX]
$EJECT

;  ASSUME DS:Sysdep_DGROUP

SetCpCallsInterrupt PROC NEAR
  PUSH DS

  XOR  AX, AX
  MOV  ES, AX

  CLI

  MOV  AX, 4 * 113
  MOV  BX, AX

  MOV  AX, SEG IntrEntry
  MOV  ES:[BX+2], AX

  MOV  AX, OFFSET Sysdep_CODE:IntrEntry
  MOV  ES:[BX+0], AX

  STI

;  MOV  AX, Sysdep_DGROUP
;  MOV  DS, AX
;  MOV  AX, romId1
;  PUSH AX
;  CALL xCpGetMySlot
;  MOV  Sysdep_DGROUP:rom1Slot, AL
  POP  DS
  RET
SetCpCallsInterrupt ENDP

Sysdep_CODE ENDS

  END
