mac-rom/OS/StartMgr/StdMacros.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +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