sys7.1-doc-wip/OS/StartMgr/StdMacros.a
2019-07-27 22:37:48 +08:00

200 lines
4.5 KiB
Plaintext

TITLE 'StdMacros.a'
;---------------------------------------------------------------------------
; File: StdMacros.a
;
; Contains: This file contains macros which are used throughout the test software
; to define records in a convenient way.
;
; Written by: CPU diagnostics and Test Engineering
;
; Copyright: © 1990 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <1> 8/31/90 SS first checked in
;
;
;---------------------------------------------------------------------------
IF &TYPE('StdMacros')='UNDEFINED' THEN
StdMacros EQU 1
CASE ON
PRINT NOMDIR
;---------------------------------------------------------------------------
; The following four macros, STRUCTURE, DSF, ENDSTRUCT, and STRUCTITEM are
; used to declare a 'C'-type structure. These macros are used to create a
; RECORD which provides offsets into a structure, and to create another
; MACRO which is used to define a entry for a constant table of structures.
;
; A symbol table is used to store structure information. The following is
; an example of creating structure offsets:
;
; TheCStruct STRUCTURE 0
; DSF.L aLong
; DSF.B aByte
; DSF.B anotherByte
; DSF.W aWord
; ENDSTRUCT
;
; It would be used as:
; WITH TheCStruct
; move.l aLong(a0),d0 ;Offset is 0
; move.b anotherByte(a0),d0 ;Offset is 5
; sub.l #sizeofTheCStruct,sp ;Subtract 8 from stack pointer
; ENDWITH
;
; A MACRO to define a table entry would look like this:
;
; MACRO
; TheCStructItem &items
; STRUCTITEM TheCStruct, &items
; ENDM
;
; And used as:
;
; ANewTable PROC ;aLong aByte anotherByte aWord
; TheCStructItem ($12345678, 3, 7, $5A5A)
; TheCStructItem ($87654321, 9, 32, $A5A5)
; ENDPROC
;
;---------------------------------------------------------------------------
; The symbol table, used for defining all structures, is initialized
GBLA &structSymTbl
&structSymTbl SETA &NEWSYMTBL
; macro STRUCTURE
; - adds the structure name to symbol table with a field count of zero (value entry)
; - initializes globals &structName and &structIdx
; - code produced:
; &name RECORD &offset
MACRO
&name STRUCTURE &offset
GBLC &structName
GBLA &structSymTbl, &structIdx
IF &FINDSYM (&structSymTbl, &name) THEN
AERROR 'MACRO ERROR: Structure name already exists'
EXITM
ENDIF
IF &ENTERSYM (&structSymTbl, &name, 0, 0) = 0 THEN
AERROR 'MACRO ERROR: Error adding structure name to symbol table'
EXITM
ENDIF
&structName SETC &name
&structIdx SETA 1
&name RECORD &offset
ENDM
; macro DSF
; - adds structure name concatted with idx to symbol table, with a value of &fieldName,
; and flags set to &size
; - increments globals &structIdx
; - code produced:
; &fieldName DS.&size 1
MACRO
DSF.&size &fieldName
GBLC &structName
GBLA &structSymTbl, &structIdx
LCLC &symEntry
LCLA &iSize
&symEntry SETC &CONCAT(&structName, &I2S(&structIdx))
&iSize SETA &ORD(&size)
IF &ENTERSYM (&structSymTbl, &symEntry, &fieldName, &iSize) = 0 THEN
AERROR 'MACRO ERROR: Error adding structure field to symbol table'
EXITM
ENDIF
&structIdx SETA &structIdx + 1
&fieldName DS.&size 1
ENDM
; macro ENDSTRUCT
; - adds the field count to the symbol table as the value entry for the structure name
; - code produced:
; sizeof&structName EQU *
; ENDR
MACRO
ENDSTRUCT
GBLC &structName
GBLA &structSymTbl, &structIdx
IF &ENTERSYM (&structSymTbl, &structName, 0, &structIdx - 1) = 0 THEN
AERROR 'MACRO ERROR: Error adding structure size to symbol table'
EXITM
ENDIF
sizeof&structName EQU *
ENDR
ENDM
; macro STRUCTITEM
; - finds &name in symbol table and validates number of entries in &field based on value
; stored with structure name symbol
; - for each field entry, get field size from symbol table and produce code:
; DC.&size &fields[&idx]
MACRO
STRUCTITEM &name, &fields
GBLA &structSymTbl
LCLC &symEntry, &size
LCLA &fieldCnt, &idx
&fieldCnt SETA &NBR (&fields)
IF &FINDSYM (&structSymTbl, &name) = 0 THEN
AERROR 'MACRO ERROR: Structure name not found'
EXITM
ENDIF
IF &SYSFLAGS <> &fieldCnt THEN
AERROR 'MACRO ERROR: Invalid number of structure fields'
EXITM
ENDIF
&idx SETA 1
WHILE &idx <= &fieldCnt DO
&symEntry SETC &CONCAT(&name, &I2S(&idx))
IF &FINDSYM (&structSymTbl, &symEntry) = 0 THEN
AERROR 'MACRO ERROR: Structure field not found'
EXITM
ENDIF
&size SETC &CHR(&SYSFLAGS)
DC.&size &fields[&idx]
&idx SETA &idx + 1
ENDWHILE
ENDM
ENDIF