301 lines
7.4 KiB
Plaintext
301 lines
7.4 KiB
Plaintext
;*******************************************************************************
|
||
;* TIPC Scheme '84 Runtime Support - Assembler Macros *
|
||
;* *
|
||
;* (C) Copyright 1984,1985 by Texas Instruments Incorporated. *
|
||
;* All rights reserved. *
|
||
;* *
|
||
;* Memory and Machine specific macros to aid in the building specific *
|
||
;* of PC Scheme. There are four versions of the PC Scheme system: *
|
||
;* 1. Conventional Memory Scheme *
|
||
;* 2. Expanded Memory Scheme *
|
||
;* 3. Extended Memory Scheme *
|
||
;* 4. Protected Mode Scheme *
|
||
;* These macros create version specific code for each of the above schemes. *
|
||
;* The Macro assembler symbols REGMEM, EXPMEM, EXTMEM, and PROMEM are used *
|
||
;* to conditionally define the correct macros. It can be (and must be) *
|
||
;* specified on the MASM command line during the assembly phase as follows: *
|
||
;* MASM /DREGMEM srcfile,objfile,... *
|
||
;* *
|
||
;* Date Written: 29 July 1987 *
|
||
;* *
|
||
;* *
|
||
;*******************************************************************************
|
||
|
||
|
||
;;;
|
||
;;; Macros for conventional memory version - default
|
||
;;;
|
||
|
||
; The LoadPage macros should be used to obtain the address of a given page
|
||
; from the pagetable. This must be done in order to access any given heap
|
||
; allocated object. For conventional memory, this just means indexing into
|
||
; the pagetable and accessing the paragraph address, however for extended
|
||
; and expanded memories, it is quite different. See the macro definitions
|
||
; for EXPMEM and EXTMEM for definitions for expanded and extended memorys.
|
||
|
||
LoadPage MACRO dst,src ; Get Page address from page table
|
||
IFIDN <src>,<BX>
|
||
mov dst,[SS:pagetabl+src]
|
||
ELSE
|
||
IFIDN <src>,<bx>
|
||
mov dst,[SS:pagetabl+src]
|
||
ELSE
|
||
IFIDN <src>,<DI>
|
||
mov dst,[SS:pagetabl+src]
|
||
ELSE
|
||
IFIDN <src>,<di>
|
||
mov dst,[SS:pagetabl+src]
|
||
ELSE
|
||
IFIDN <src>,<DI>
|
||
mov dst,[SS:pagetabl+src]
|
||
ELSE
|
||
IFIDN <src>,<si>
|
||
mov dst,[SS:pagetabl+src]
|
||
ELSE
|
||
IFIDN <src>,<SI>
|
||
mov dst,[SS:pagetabl+src]
|
||
ELSE
|
||
push BX
|
||
mov BX,src
|
||
mov dst,[SS:pagetabl+BX]
|
||
pop BX
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDM
|
||
|
||
%LoadPage MACRO dst,src
|
||
LoadPage dst,src
|
||
ENDM
|
||
|
||
%LoadPage0 MACRO dst,src
|
||
LoadPage dst,src
|
||
ENDM
|
||
|
||
%LoadPage1 MACRO dst,src
|
||
LoadPage dst,src
|
||
ENDM
|
||
|
||
LoadCode MACRO dst,src
|
||
LoadPage dst,src
|
||
ENDM
|
||
|
||
; The following macros should be used whenever saving some value in a
|
||
; location within the code segment. For real mode, you may store anything
|
||
; within the code segment, however in protected mode, this causes a
|
||
; protection violation. See the macro expansions for PROMEM to see how
|
||
; this may be accomplished in protected mode.
|
||
|
||
STORE_WORD_IN_CS MACRO SEG,OFFSET,VALUE
|
||
mov word ptr CS:OFFSET,VALUE
|
||
ENDM
|
||
|
||
STORE_BYTE_IN_CS MACRO SEG,OFFSET,VALUE
|
||
mov byte ptr CS:OFFSET,VALUE
|
||
ENDM
|
||
|
||
XCHG_WORD_IN_CS MACRO SEG,OFFSET,VALUE
|
||
xchg word ptr CS:OFFSET,VALUE
|
||
ENDM
|
||
|
||
|
||
IFDEF REGMEM
|
||
; Access to pagetabl for LoadPage macros
|
||
extrn pagetabl:word
|
||
ENDIF
|
||
|
||
|
||
;;;
|
||
;;; Macros for expanded memory version
|
||
;;;
|
||
|
||
IFDEF EXPMEM
|
||
; get rid of default conventional memory definitions
|
||
purge LoadPage,%LoadPage,%LoadPage0,%LoadPage1,LoadCode
|
||
|
||
; Load page address
|
||
extrn _MMU:near
|
||
LoadPage MACRO dst,src
|
||
push src
|
||
call _MMU
|
||
pop dst
|
||
ENDM
|
||
|
||
; Load code block
|
||
extrn _MMUCB:near
|
||
LoadCode MACRO dst,src
|
||
push src
|
||
call _MMUCB
|
||
pop dst
|
||
ENDM
|
||
|
||
; SAME AS LoadPage EXCEPT CALLABLE FROM PROGX SEGMENT
|
||
extrn _%MMU:far
|
||
%LoadPage MACRO dst,src
|
||
IF1
|
||
IFIDN <dst>,<AX>
|
||
%OUT *AX as destination of %LoadPage not recommended*
|
||
ELSE
|
||
IFIDN <dst>,<ax>
|
||
%OUT *AX as destination of %LoadPage not recommended*
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
push AX
|
||
mov AX,src
|
||
call _%MMU
|
||
mov dst,AX
|
||
pop AX
|
||
ENDM
|
||
|
||
; Loads only Emm page 0
|
||
extrn _%MMU0:far
|
||
%LoadPage0 MACRO dst,src
|
||
IF1
|
||
IFIDN <dst>,<AX>
|
||
%OUT *AX as destination of %LoadPage0 not recommended*
|
||
ELSE
|
||
IFIDN <dst>,<ax>
|
||
%OUT *AX as destination of %LoadPage0 not recommended*
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
push AX
|
||
mov AX,src
|
||
call _%MMU0
|
||
mov dst,AX
|
||
pop AX
|
||
ENDM
|
||
|
||
; Loads only Emm page 1
|
||
extrn _%MMU1:far
|
||
%LoadPage1 MACRO dst,src
|
||
IF1
|
||
IFIDN <dst>,<AX>
|
||
%OUT *AX as destination of %LoadPage1 not recommended*
|
||
ELSE
|
||
IFIDN <dst>,<ax>
|
||
%OUT *AX as destination of %LoadPage1 not recommended*
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
push AX
|
||
mov AX,src
|
||
call _%MMU1
|
||
mov dst,AX
|
||
pop AX
|
||
ENDM
|
||
ENDIF
|
||
|
||
|
||
;;;
|
||
;;; Macros for extended memory version
|
||
;;;
|
||
|
||
|
||
IFDEF EXTMEM
|
||
; get rid of default conventional memory definitions
|
||
purge LoadPage,%LoadPage,%LoadPage0,%LoadPage1,LoadCode
|
||
|
||
; Load page address
|
||
extrn _MMU:near
|
||
LoadPage MACRO dst,src
|
||
push src
|
||
call _MMU
|
||
pop dst
|
||
ENDM
|
||
|
||
; SAME AS LoadPage EXCEPT CALLABLE FROM PROGX SEGMENT
|
||
extrn _%MMU:far
|
||
%LoadPage MACRO dst,src
|
||
IF1
|
||
IFIDN <dst>,<AX>
|
||
%OUT *AX as destination of %LoadPage not recommended*
|
||
ELSE
|
||
IFIDN <dst>,<ax>
|
||
%OUT *AX as destination of %LoadPage not recommended*
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
push AX
|
||
mov AX,src
|
||
call _%MMU
|
||
mov dst,AX
|
||
pop AX
|
||
ENDM
|
||
|
||
; The following macros are provided for comatibility with the
|
||
; Expanded memory version. They just perform a LoadPage.
|
||
|
||
; Load code block
|
||
LoadCode MACRO dst,src
|
||
LoadPage dst,src
|
||
ENDM
|
||
|
||
%LoadPage0 MACRO dst,src
|
||
%LoadPage dst,src
|
||
ENDM
|
||
|
||
%LoadPage1 MACRO dst,src
|
||
%LoadPage dst,src
|
||
ENDM
|
||
|
||
ENDIF
|
||
|
||
|
||
;;;
|
||
;;; Macros for protected mode version
|
||
;;;
|
||
|
||
IFDEF PROMEM
|
||
; get rid of default real mode definitions
|
||
purge STORE_WORD_IN_CS,STORE_BYTE_IN_CS,XCHG_WORD_IN_CS
|
||
|
||
; Access to pagetabl for LoadPage macros
|
||
extrn pagetabl:word
|
||
|
||
STORE_WORD_IN_CS MACRO SEG,OFFSET,VALUE
|
||
push DS
|
||
push AX
|
||
mov AX,CS
|
||
and AX,0FFF7H
|
||
mov DS,AX
|
||
pop AX
|
||
assume DS:SEG
|
||
mov word ptr DS:OFFSET,VALUE
|
||
assume DS:DGROUP
|
||
pop DS
|
||
ENDM
|
||
|
||
STORE_BYTE_IN_CS MACRO SEG,OFFSET,VALUE
|
||
push DS
|
||
push AX
|
||
mov AX,CS
|
||
and AX,0FFF7H
|
||
mov DS,AX
|
||
pop AX
|
||
assume DS:SEG
|
||
mov byte ptr DS:OFFSET,VALUE
|
||
assume DS:DGROUP
|
||
pop DS
|
||
ENDM
|
||
|
||
XCHG_WORD_IN_CS MACRO SEG,OFFSET,VALUE
|
||
push DS
|
||
push AX
|
||
mov AX,CS
|
||
and AX,0FFF7H
|
||
mov DS,AX
|
||
pop AX
|
||
assume DS:SEG
|
||
xchg word ptr DS:OFFSET,VALUE
|
||
assume DS:DGROUP
|
||
pop DS
|
||
ENDM
|
||
|
||
|
||
ENDIF |