*****************************************************************
**
** This is the Pro-Tools' Library library builder module.
**
*****************************************************************
*****************************************************************
STITLE Pro-Tools Library Builder Equates, Version 3.0
*****************************************************************
*****************************************************************
**
** These are the necessary library builder equate statements.
**
*****************************************************************
*****************************************************************
ASSEMBLE
sVISI_ID EQU 0
sHIDD_ID EQU 1
sNULL_ID EQU 2
sOMIT_ID EQU 3
sPASS1 EQU 5
sPASS2 EQU 6
sPASS3 EQU 7
sMESSAGE EQU 4
sCONFIG EQU 5
sTITLE EQU 6
sROMID EQU 7
svisi_id EQU 8
shidd_id EQU 9
snull_id EQU 10
somit_id EQU 11
TITLE# EQU (16*5)+5
ROMID# EQU (16*5)+10
CONFIG# EQU (16*5)+15
LINK# EQU (16*5)+20
MESSAGE# EQU (16*5)+25
HASH# EQU (16*5)+30
RPL
STITLE Directory-to-Library Conversion, Version 3.0
** begin dir>lib ************************************************
*****************************************************************
**
** NAME: dir>lib
**
** ENTRY: rrp
**
** EXIT: library
**
** ABSTRACT: Converts a directory to a library data structure.
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
** Reconstructed 10/25/93 Rick Grevelle
** First speedup 11/14/93 Rick Grevelle
** Inclusion in HACK library ??/??/?? Mika Heiskanen
** Minor space optimizations 06/09/96 Mika Heiskanen
** Made to work from tempob 06/09/96 Mika Heiskanen
** (stack pushes still questionable)
**
** DETAIL:
**
** 5 distinct loops are utilized in this conversion process, one
** of which is a multi-pass loop that may make additional sweeps
**
** Most of the required work occurs prior to the final pass that
** is responsible for the actual directory-to-library conversion
**
** The duties performed by each of these loops are the following
**
** 1) SUM_TBL computes the amount of memory to allocate in order
** to support the master HASH table used to build the library
**
** 2) STATUS! determines the status of each non-null IDNT within
** the source directory in the following hierarchical fashion
**
** a) $VARS - IDNTs in this list will be excluded
**
** b) $HIDDEN - IDNTs in this list lose thier names
**
** c) $NULL - IDNTs in this list keep thier names
** but do not appear in the menu pages
**
** d) $VISIBLE - IDNTs in this list keep thier names
** and generate menu labels in library
**
** 3) NUMBER! assigns the XLIB number each IDNT will have in the
** result library in the reverse order of the above hierarchy
**
** 4) SUM_RRP computes the amount of memory to allocate in order
** to support the various components in the resulting library
**
** 5) SET_LIB performs all the mundane library conversion chores
**
**
** Example Directory Structure
** ###########################
**
**
** A(0)----B(0)----DIR1----C(0)----D(0)----DIR2----E(0)----F(0)
** | |
** | |
** A(1)----B(1)----DIR3----DIR4 A(2)----B(2)----DIR5----DIR6
** | | | |
** | | | |
** A(3)----B(3) | A(5)----B(5) |
** | |
** | |
** A(4)----B(4) A(6)----B(6)
**
**
** Example HASH TABLE Structure
** ############################
**
** 02A4E prolog
** lllll length
** s*xxx F(0)
** s*xxx E(0)
** ------>ppppp -----> A(0) offset
** | -->ppppp --> | A(2) offset
** | | s*xxx | | B(6)
** | | s*xxx | | A(6)
** | <-- bbbbb | | END6 offset
** | -->ppppp --> | A(2) offset
** | | s*xxx | | B(5)
** | | s*xxx | | A(5)
** | <-- bbbbb | | END5 offset
** | s*xxx | | B(2)
** | s*xxx<-- | A(2)
** <------ bbbbb | END2 offset
** s*xxx | D(0)
** s*xxx | C(0)
** ------>ppppp -----> A(0) offset
** | -->ppppp --> | A(1) offset
** | | s*xxx | | B(4)
** | | s*xxx | | A(4)
** | <-- bbbbb | | END4 offset
** | -->ppppp --> | A(1) offset
** | | s*xxx | | B(3)
** | | s*xxx | | A(3)
** | <-- bbbbb | | END3 offset
** | s*xxx | | B(1)
** | s*xxx<-- | A(1)
** <------ bbbbb | END1 offset
** s*xxx | B(0)
** s*xxx<----- A(0)
** 00000 (00) offset
** 11111 (01) offset
** 22222 (02) offset
** 33333 (03) offset
** 44444 (04) offset
** 55555 (05) offset
** 66666 (06) offset
** 77777 (07) offset
** 88888 (08) offset
** 99999 (09) offset
** AAAAA (10) offset
** BBBBB (11) offset
** CCCCC (12) offset
** DDDDD (13) offset
** EEEEE (14) offset
** FFFFF (15) offset
** nnnnn $TITLE
** hhh** $ROMID
** nnnnn $CONFIG
** nnnnn LINK table
** nnnnn $MESSAGE
** nnnnn HASH table
** **
**
**
** LEGEND
** ######
**
** bbbbb = back pointer for end of directory
**
** nnnnn = hexadecimal value or nibble count
**
** ppppp = forward offset that points to the
** 1st variable up 1 directory level
**
** hhh = hexadecimal ROMID (must be < 7FF)
**
** s = status (i.e. $HIDDEN, $NULL, etc)
**
** * = unused nibble
**
**
*****************************************************************
*****************************************************************
ASSEMBLE
CON(1) 8
RPL
xNAME D\8DLIB
::
CK0
DEPTH #0<> ITE ( Check if user wants to split rrp on stack )
DUPTYPERRP?
FALSE
ITE
CK1NOLASTWD ( stack_rrp )
CONTEXT@ ( context_rrp )
( Disallow home directory )
DUP SYSRRP? case SETTYPEERR
CODE
GOSBVL =SAVPTR
SETHEX
** Clear the CPU working registers.
CLRST \
P= 0 \
A=0 W ZEROS CPU
B=0 W REGISTERS
C=0 W /
D=0 W /
** Clear the CPU scratch registers.
R0=A \
R1=A ZEROS CPU
R2=A (SCRATCH)
R3=A REGISTERS
R4=A /
** Go to the start of the RRP.
C=DAT1 A
D1=C D1->:DORRP
D1=D1+ 8
A=DAT1 A
?A#0 A
GOYES sum_tbl go to hook
GOTO do_hash
STITLE Master Hash Table Summation Loop, Version 1.0
** begin SUM_TBL ************************************************
*****************************************************************
**
** NAME: SUM_TBL
**
** ENTRY: D1->:rrp
**
** EXIT: D[A]:HASH mem (nibbles)
**
** CALLS: None.
**
** REGISTERS: A[A], B[X], C[A], D[A], D0, and D1.
**
** ABSTRACT:
**
** Computes amount of memory needed to support main HASH table.
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
SUM_TBL D1=D1+ 8 <-------------------------------
A=DAT1 A |
?A=0 A |
GOYES next_id |
** Increment PATH; point to 1st IDNT. |
B=B+1 X B[X]:(PATH)+1 |
D=D+CON A,10 add directory |
sum_tbl CD1EX start-up hook |
C=C+A A |
** Trap all null named vairables. |
lis@d01 D0=C <<-----(D0->:new IDNT)-- |
A=0 A | |
A=DAT0 B | |
?A=0 B | |
GOYES next_id | |
** Trap all embedded directories. | |
CD0EX | |
D0=C | |
A=A+A A | |
C=C+A A | |
D1=C | |
D1=D1+ 4 | |
A=DAT1 A | |
LC(5) =DORRP | |
?A=C A | |
GOYES SUM_TBL ------------------------------>
** Add IDNT to build HASH table. |
D=D+CON A,5 D[A]:HASH mem |
** Attempt to process next IDNT. |
next_id D0=D0- 5 <<<-----------------------------
A=DAT0 A | |
CD0EX | |
C=C-A A | |
?A#0 A | |
GOYES lis@d01 --------------------->> |
B=B-1 X B[X]:(PATH)-1 |
GOC do_hash |
** Move up 1 subdirectory. |
D0=C |
D0=D0- 15 |
A=0 A |
A=DAT0 B |
A=A+1 A |
A=A+A A |
CD0EX |
C=C-A A |
D0=C |
GONC next_id ---------------------------->>>
** Add DORRP prologue, length field, HASH offsets, etc.
do_hash ST=0 sGARBAGE
LC(5) 10+(16*5)+32 C[A]:overhead
D=D+C A
chkroom GOSBVL =ROOM
A=C A A[A]:# memory
C=D A
C=C+CON A,11 C[A]:required (including stack)
?A>=C A
GOYES DO_HASH
C=D A
R0=C.F A
* GOSBVL =DOGARBAGE Commented out by M.H.
* C=R0.F A
* D=C A
* GOTO chkroom and replaced by following
?ST=1 sGARBAGE Already tried GC?
GOYES liberr Yes - out of memory
GOSUB libgc
CON(5) =DOCOL
CON(5) =GARBAGE
CON(5) =COLA
CON(5) =DOCODE
REL(5) dtolibend
ST=1 sGARBAGE
GOSBVL =SAVPTR
C=R0.F A
D=C A
GOTO chkroom
liberr GOVLNG =GPMEMERR
libgc C=RSTK
GOVLNG =GETPTREVALC
** Allocate HASH memory.
DO_HASH C=D A
GOSBVL =CREATETEMP
LC(5) =DOHSTR
DAT0=C A D0-->prologue
CD0EX
RSTK=C
D0=C
D0=D0+ 5 D0->:$ length
B=B-CON A,11
A=B A
DAT0=A A D0-->$ length
** Initilize HASH tracking.
A=A+C A
LC(5) (16*5)+32
A=A-C A
R3=A.F A R3->:1st HASH
R2=A.F A R2->:new HASH
** Initialize HASH offsets.
D0=A
D0=D0+ 5 D0->:tab IDNT
P= 9
A=0 W
0OFFSET DAT0=A W <-------
D0=D0+ 16 |
P=P+1 |
GONC 0OFFSET ------->
** Push HASH onto data stack.
GOSBVL =GETPTR
D1=D1- 5
D=D-1 A
C=RSTK
DAT1=C A
GOSBVL =SAVPTR
** Partially zero the CPU.
A=0 W \
B=0 W ZEROS CPU
C=0 W REGISTERS
D=0 W /
** Advance to start of RRP.
D1=D1+ 5
C=DAT1 A
D1=C D1->:DORRP
D1=D1+ 8
A=DAT1 A
?A#0 A
GOYES status! go-to-hook
GOLONG OVRHEAD
STITLE Compute IDNT-XLIB Status, Version 1.0
** begin STATUS! ************************************************
*****************************************************************
**
** NAME: STATUS!
**
** ENTRY: D1->:rrp
** R2->:new HASH
** R3->:1st HASH
**
** EXIT: R1->:1st IDNT
** R3->:1st HASH
**
** CALLS: LIS@D0, STATUS?
**
** REGISTERS: A[A], B[X], C[A], D0, and D1.
**
** ABSTRACT:
**
** Determines the status the IDNT will have in resulting library.
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
STATUS! D1=D1+ 8 <-------------------------------
A=DAT1 A |
?A#0 A |
GOYES DO_SRRP |
GOTO PREP_ID |
** Increment PATH; track 1st HASH entry. |
DO_SRRP B=B+1 X B[X]:(PATH)+1 |
C=R2.F A |
D0=C |
C=R3.F A C[A]:1st HASH |
DAT0=C A save 1st HASH |
D0=D0- 5 |
CD0EX |
R2=C.F A R2->:new HASH |
R3=C.F A R3->:1st HASH |
** Go to the start of the RRP. |
status! CD1EX start-up hook |
C=C+A A |
R1=C.F A R1->:1st IDNT |
** Omit all $LIBRARY paramters. |
lis@d02 D0=C <<-----(D0->:new IDNT)-- |
R0=C.F A R0->:new IDNT | |
GOSUB LIS@D0? | |
LC(3) #800 C[XS]:$OMIT | |
GONC SET_BIT | |
** Trap all null named vaiables. | |
A=0 A | |
A=DAT0 B | |
?A=0 B | |
GOYES NEXT_ID | |
** Trap all embedded directories. | |
CD0EX | |
A=A+A A | |
C=C+A A | |
D1=C | |
D1=D1+ 4 | |
A=DAT1 A | |
LC(5) =DORRP | |
?A=C A | |
GOYES STATUS! ------------------------------->
** Determine IDNT's status. |
C=B A |
RSTK=C |
GOSUB STATUS? |
C=RSTK |
B=C A |
C=ST |
?C#0 XS |
GOYES set_bit |
C=C+1 XS C[XS]:default |
?CBIT=1 4 |
GOYES do_null |
?CBIT=0 5 |
GOYES set_bit |
do_null LC(3) #400 C[XS]:$NULL |
set_bit A=R4.F XS |
A=A!C XS A[XS]:$status |
R4=A.F XS |
SET_BIT A=R2.F A |
D1=A |
A=A-CON A,5 |
R2=A.F A R2->:new HASH |
DAT1=C XS |
PREP_ID C=R0.F A |
D0=C |
** Attempt to process next IDNT. |
NEXT_ID D0=D0- 5 <<<-----------------------------
A=DAT0 A | |
CD0EX | |
C=C-A A | |
?A=0 A | |
GOYES decPATH | |
GOTO lis@d02 ---------------------->> |
decPATH B=B-1 X B[X]:(PATH)-1 |
GOC number! |
** Move up 1 subdirectory. |
D0=C |
D0=D0- 15 |
A=0 A |
A=DAT0 B |
A=A+1 A |
A=A+A A |
CD0EX |
C=C-A A |
D0=C |
D1=C |
** Compute address of 1st IDNT. |
backrrp D1=D1- 5 <<<----- |
A=DAT1 A | |
CD1EX | |
C=C-A A | |
D1=C | |
?A#0 A | |
GOYES backrrp ----->>> |
D1=D1- 5 |
A=DAT1 A |
CD1EX |
C=C+A A |
R1=C.F A R1->:1st IDNT |
** Compute and set SRRP pointer fields. |
A=R2.F A |
C=R3.F A |
D1=C |
D1=D1+ 5 |
C=DAT1 A |
R3=C.F A R3->:1st HASH (entry) |
C=C-A A |
AD1EX |
DAT1=C A D1->:first up (ppppp) |
C=A A |
AD1EX |
C=C-A A |
DAT1=C A D1->:end SRRP (bbbbb) |
A=A-CON A,5 |
R2=A.F A R2->:new HASH (entry) |
GOTO NEXT_ID ----------------------------->>>
** Partially zero the CPU again.
number! A=0 W \
B=0 W ZEROS CPU
C=0 W REGISTERS
D=0 W /
** Set IDNTs flags.
C=R4.F XS
ST=C ST[2]:present
** Advance to start of RRP and HASH.
C=R3.F A
D=C A D[A]:1st HASH
C=R1.F A C[A]:1st IDNT
GOTO 0thPASS
STITLE Compute IDNT-XLIB Number, Version 1.0
** begin NUMBER! ************************************************
*****************************************************************
**
** NAME: NUMBER!
**
** ENTRY: D1->:rrp
** D[A]:end SRRP
**
** EXIT: R1->:1st IDNT
** R3->:1st HASH
**
** CALLS: None.
**
** REGISTERS: A[A], B[W], C[A], D[A], D0, and D1.
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
NUMBER! D1=D1+ 8 <-------------------------------
A=DAT1 A |
?A=0 A |
GOYES next_no |
** Increment PATH; point to 1st IDNT. |
B=B+1 M B[M]:(PATH)+1 |
D=D-CON A,5 skip end SRRP |
CD1EX |
C=C+A A |
** Trap all null named vaiables. |
LIS@D03 D0=C <<-----(D0->:new IDNT)-- |
lis@d03 A=0 A | |
A=DAT0 B | |
?A=0 B | |
GOYES next_no | |
** Trap all embedded directories. | |
CD0EX | |
D0=C | |
A=A+A A | |
C=C+A A | |
D1=C | |
D1=D1+ 4 | |
A=DAT1 A | |
LC(5) =DORRP | |
?A=C A | |
GOYES NUMBER! ------------------------------->
** Determine IDNT's status. |
C=D A |
D1=C |
D=D-CON A,5 |
C=DAT1 S |
?B#C S |
GOYES next_no |
D1=D1+ 2 |
C=B X C[X]:new XLIB |
DAT1=C X |
B=B+1 X B[X]:add XLIB |
** Trap all named XLIBs. |
?ST=0 sPASS3 |
GOYES offset! |
** Attempt to process next IDNT. |
next_no D0=D0- 5 <<<-----------------------------
A=DAT0 A | |
CD0EX | |
C=C-A A | |
?A#0 A | |
GOYES LIS@D03 ---------------------->> |
B=B-1 M B[M]:(PATH)-1 | |
GOC nextcat | |
GOTO up1srrp | |
** Attempt to process next status category | |
nextcat B=0 M B[M]:(PATH)=0 | |
C=R3.F A | |
D=C A D[A]:1st HASH | |
C=R1.F A | |
?ST=1 sPASS1 | |
GOYES 1stPASS | |
?ST=1 sPASS2 | |
GOYES 2ndPASS | |
GOTO sum_rrp | |
** Trap $VISIBLE IDNTs. | |
0thPASS B=B+1 S B[S]:$VISIBLE | |
?ST=0 svisi_id | |
GOYES 1stpass | |
ST=1 sPASS1 | |
GOTO LIS@D03 ---------------------->> |
** Trap $HIDDEN IDNTs. | |
1stPASS ST=0 sPASS1 | |
1stpass B=B+B S B[S]:<status> | |
?ST=0 shidd_id | |
GOYES 2ndpass | |
B=B+1 X B[X]:pad XLIB | |
ST=1 sPASS2 | |
GOTO LIS@D03 ---------------------->> |
** Trap $NULL IDNTs. | |
2ndPASS ST=0 sPASS2 | |
2ndpass B=B+B S B[S]:<status> | |
D0=C D0->:new IDNT | |
GOSUB ENTRIES | |
?ST=0 snull_id | |
GOYES sum_rrp | |
ST=1 sPASS3 | |
GOTO lis@d03 ---------------------->> |
** Add IDNT to offset table. |
offset! A=0 A |
A=DAT0 B |
C=R3.F A |
C=C+A A |
A=A+A A |
C=C+A A |
C=C+A A |
D1=C |
A=A+CON A,5 |
C=DAT1 A |
C=C+A A |
DAT1=C A |
GOTO next_no ----------------------------->>>
** Move up 1 subdirectory. |
up1srrp D=D-CON A,5 skip first up |
D0=C |
D0=D0- 15 |
A=0 A |
A=DAT0 B |
A=A+1 A |
A=A+A A |
CD0EX |
C=C-A A |
D0=C |
GOTO next_no ----------------------------->>>
** Set the total number of XLIBs.
sum_rrp LC(5) LINK#
GOSUB entries
** Partially zero the CPU again.
A=0 W \
B=0 W ZEROS CPU
C=0 W REGISTERS
D=0 W /
** Handle $HIDDEN case.
?ST=0 shidd_id
GOYES .0
LC(5) 115
GONC .2
** Handle $VISIBLE case.
.0 ?ST=0 svisi_id
GOYES .1
LC(5) 105
GONC .2
** Handle $NULL case.
.1 ?ST=0 snull_id
GOYES .2
C=C+CON A,10
** Advance to start of RRP and HASH.
.2 D=C A D[A]:#initial
A=R3.F A
R4=A.F A
D1=A D1->:1st HASH
C=R1.F A C[A]:1st IDNT
CLRST clear status!
GOTO par@d01 start summing
** Compute size of offset portion of HASH/LINK.
ENTRIES LC(5) HASH#
entries ?B=0 X
RTNYES
A=R3.F A
A=A+C A
D1=A D1->:set XLIB
A=0 A
A=B X
A=A+1 A
C=A A
A=A+A A
A=A+A A
A=A+C A
DAT1=A A
RTN
STITLE Library-Parameter ID Test, Version 1.1
** begin LIS@D0? ************************************************
*****************************************************************
**
** NAME: LIS@D0?
**
** ENTRY: D0->:rrp variable ID
**
** EXIT: D0->:rrp variable ID
**
** CALLS: $table1
**
** TRASHES: A[A], C[A], D1, and P
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 05/11/92 Rick Grevelle
** Optimized 09/11/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
LIS@D0? A=DAT0 A A[A]:[?(??)bb]
C=A A
P= 2
LCASC \$\ C[A]:[?(24)bb]
P= 0
?A#C A
RTNYES
A=A-CON B,5
RTNC
LC(2) 3 C[A]:[?(24)03]
?A>C B
RTNYES
C=0 B C[A]:[?(24)00]
A=A-C A
A=A+A A
ASL A A[A]:0,16,or32
GOSUB $table1
STITLE Library Paramater Lookup Table, Version 1.1
*****************************************************************
*****************************************************************
**
** OPCODE \NAME \ OBJECT
** OPCODE ## LEN STATUS-BIT
** ------ --------- --- ---------- ------
*****************************************************************
*****************************************************************
NIBASC \VARS \ ( list )
NIBHEX 78 P:7 ST[0]:1000
NIBASC \NULL \ ( list )
NIBHEX 72 P:7 ST[0]:0010
NIBASC \ROMID \ ( # )
NIBHEX 90 P:9 ST[0]:0000
NIBASC \TITLE \ ( $ )
NIBHEX 90 P:9 ST[0]:0000
NIBASC \HIDDEN \ ( list )
NIBHEX B4 P:B ST[0]:0100
NIBASC \CONFIG \ ( seco )
NIBHEX B0 P:B ST[0]:0000
NIBASC \VISIBLE\ ( list )
NIBHEX D1 P:D ST[0]:0001
NIBASC \MESSAGE\ ( list )
NIBHEX D0 P:D ST[0]:0000
STITLE Library-Parameter ID Lookup, Version 1.1
*****************************************************************
*****************************************************************
**
** NAME: $table1
**
** ENTRY: D0->:rrp variable ID
** RSTK:table's address
**
** EXIT: D0->:rrp variable ID
** C[S]:ID's status bit
** ONLY IF CARRY CLEAR!
**
** CALLS: None
**
** TRASHES: A[W], C[W], D1, and P
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 05/11/92 Rick Grevelle
** Changed pointer field 09/11/92 Rick Grevelle
**
*****************************************************************
*****************************************************************
$table1 C=RSTK
C=C+A A
D1=C
C=DAT1 W
P=C 14
D0=D0+ 4
A=DAT0 14
D0=D0- 4
?A=C WP
GOYES $match1
D1=D1+ 16
C=DAT1 W
?A=C WP
GOYES $match1
P= 0
RTNSC
$match1 P= 0
RTNCC
STITLE IDNT Status Assessment Utility, Version 1.0
** begin STATUS? ************************************************
*****************************************************************
**
** NAME: STATUS?
**
** ENTRY: R0->:new IDNT in current directory
** R1->:1st IDNT in current directory
** B[A]:PATH levels current directory
**
** EXIT:
**
** CALLS: LIS@D0?, SKIPOB,
**
** TRASHES: A[W], B[X], C[W], D[A], D0, D1, and P.
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 09/11/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
STATUS? CLRST
C=R1.F A
D0=C
** Determine whether ID is a parameter ID.
status? GOSUB LIS@D0? <---------------
GONC chklist |
** Attempt to process yet another ID. |
nextpar D0=D0- 5 <<----------------------
A=DAT0 A | |
CD0EX | |
C=C-A A | |
D0=C | |
?A#0 A | |
GOYES status? --------------> |
B=B-1 X | |
RTNC | |
** Move up 1 subdirectory in path. | |
D0=D0- 15 | |
A=0 A | |
A=DAT0 B | |
A=A+1 A (** RRP IS NOT NULL NAMED **)
A=A+A A | |
CD0EX | |
C=C-A A | |
D0=C | |
** Compute address of 1st IDNT. | |
1stID.1 D0=D0- 5 <<<----- | |
A=DAT0 A | | |
CD0EX | | |
C=C-A A | | |
D0=C | | |
?A#0 A | | |
GOYES 1stID.1 ---->>> | |
D0=D0- 5 | |
A=DAT0 A | |
CD0EX | |
C=C+A A | |
D0=C | |
GONC status? --------------> |
** Attempt to process another $LIST. |
restart C=RSTK |
D0=C |
GOTO nextpar --------------------->>
** Skip non-IDNT. |
skip_ob GOSBVL =SKIPOB |
GOTO matchid |
** Check for 'list' parameter. |
chklist ?C=0 S |
GOYES nextpar --------------------->>
A=0 A |
A=DAT0 B |
CD0EX |
RSTK=C |
A=A+A A |
C=C+A A |
D0=C |
D0=D0+ 4 (** RRP IS NOT NULL NAMED **)
A=DAT0 A |
LC(5) =DOLIST |
?A#C A |
GOYES restart |
** Update status bits by priority. |
C=ST C[X]:[IDNT|LIST]|
B=C S |
P=C 2 |
C=P 15 C[X]:[IDNT](old)|
P= 0 |
?B<=C S is IDNT < list? |
GOYES restart YES, try again! |
P=C 1 |
C=P 15 C[S]:[LIST](old)|
P= 0 |
?B<=C S is LIST < list? |
GOYES pointID YES, skip reset |
C=B S |
P=C 15 |
C=P 1 |
P= 0 |
ST=C reset LIST type |
pointID D0=D0+ 5 |
** Check IDNT match loop. |
matchid A=DAT0 A <<<-----------------------------
LC(5) =SEMI | |
?A=C A | |
GOYES restart | |
LC(4) =DOIDNT | |
?A#C A | |
GOYES skip_ob | |
D0=D0+ 5 | |
CD0EX | |
RSTK=C | |
D0=C | |
C=R0.F A | |
D1=C | |
A=DAT1 B | |
C=DAT0 B | |
?A#C B | |
GOYES -match1 | |
C=0 XS | |
C=C+1 X | |
C=C+C X | |
P=C 0 | |
D=C X | |
DSR X | |
D=D-1 B | |
GOC initzm1 | |
zoomin1 A=DAT1 W <<<<------------ | |
C=DAT0 W | | |
D1=D1+ 16 | | |
D0=D0+ 16 | | |
?A#C W | | |
GOYES -match1 | | |
D=D-1 B | | |
GONC zoomin1 ----------->>>> | |
initzm1 P=P-1 | |
GOC +match1 | |
A=DAT1 WP | |
C=DAT0 WP | |
?A=C WP | |
GOYES +match1 | |
-match1 P= 0 | |
C=RSTK | |
D0=C | |
A=0 A | |
A=DAT0 B | |
A=A+1 A | |
A=A+A A | |
C=C+A A | |
D0=C | |
GOTO matchid ---------------------------->>>
+match1 P= 0 |
C=RSTK |
C=RSTK |
D0=C |
C=ST C[X]:[IDNT|LIST]|
C=B S \ |
P=C 15 |
C=P 2 set new status |
P= 0 |
ST=C / |
GOTO nextpar --------------------->>
STITLE Result-Library Summation Loop, Version 1.0
** begin SUM_RRP ************************************************
*****************************************************************
**
** NAME: SUM_RRP
**
** ENTRY: D0->:rrp
** R3->:1st HASH
**
**
** EXIT:
**
** CALLS: LIS@D0
**
** REGISTERS:
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
SUM_RRP D0=D0+ 8 <-------------------------------
A=DAT0 A |
?A=0 A |
GOYES PREP_NO |
** Increment PATH; point to 1st IDNT. |
B=B+1 X B[X]:(PATH)+1 |
D1=D1- 5 D1->:new HASH |
CD1EX |
D1=C |
R3=C.F A R3->:1st HASH |
CD0EX |
C=C+A A |
** Trap all $LIBRARY paramters. |
par@d01 D0=C <<-----(D0->:new IDNT)-- |
GOSUB PAR@D0? | |
GONC miscpar | |
** Trap all null named vaiables. | |
A=0 A | |
A=DAT0 B | |
?A=0 B | |
GOYES NEXT_NO | |
** Trap all embedded directories. | |
CD0EX | |
R0=C.F A R0->:new IDNT | |
A=A+A A | |
C=C+A A | |
D0=C | |
D0=D0+ 4 | |
A=DAT0 A | |
LC(5) =DORRP | |
?A=C A | |
GOYES SUM_RRP ------------------------------->
** Determine IDNT's status. |
A=DAT1 P |
D1=D1- 5 D1->:new HASH |
CD1EX |
RSTK=C save new HASH |
?ABIT=1 sNULL_ID |
GOYES null_id |
?ABIT=0 sOMIT_ID |
GOYES visi_id |
RESETID C=RSTK |
D1=C D1->:new HASH |
PREP_NO C=R0.F A |
D0=C |
** Attempt to process next IDNT. |
NEXT_NO D0=D0- 5 <<<-----------------------------
A=DAT0 A | |
CD0EX | |
C=C-A A | |
?A#0 A | |
GOYES par@d01 ---------------------->> |
B=B-1 X B[X]:(PATH)-1 |
GONC UP1SRRP |
GOTO OVRHEAD |
** Trap all ${} parameters. |
miscpar D1=D1- 5 D1->:new HASH |
?C=0 S |
GOYES NEXT_NO |
GOTO MISCPAR |
** Move up 1 subdirectory. |
UP1SRRP D0=C |
D0=D0- 15 |
A=0 A |
A=DAT0 B |
A=A+1 A |
A=A+A A |
CD0EX |
C=C-A A |
D0=C |
A=DAT1 A |
CD1EX |
D1=C |
D1=D1- 5 D1->:new HASH |
C=C+A A |
R3=C.F A R3->:1st HASH |
GOTO NEXT_NO ----------------------------->>>
STITLE Variable Summation Utility, Version 1.0
*****************************************************************
*****************************************************************
**
** NAME: null_id
** visi_id
**
** ENTRY: D0->:object
** D1->:new HASH
** R0->:new IDNT
**
** EXIT:
**
** CALLS: 1stID.2
**
** REGISTERS:
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
** HERE D0->:object's PROLOGUE, D1->:new HASH, R0->:object's IDNT
null_id D=D+CON A,5
A=B X
R2=A.F X save rrp PATH
B=0 A B[A]:new SECO
A=DAT0 A
GONC NEW_OBJ
** HERE D0->:object's PROLOGUE, D1->:new HASH, R0->:object's IDNT
visi_id D=D+CON A,15
A=B X
R2=A.F X save rrp PATH
B=0 A B[A]:new SECO
CD0EX
CR0EX.F A R0->:PROLOGUE
D0=C D0->:new IDNT
A=0 A
A=DAT0 B
A=A+A A
LC(5) 32 C[A]:max IDNT
?A>C A
GOYES addidnt
C=A A
addidnt D=D+C A
CD0EX
CR0EX.F A R0->:new IDNT
D0=C D0->:PROLOGUE
A=DAT0 A
LC(5) =DOCOL
?A#C A
GOYES new_obj
D=D+CON A,7
GONC compobj
NEW_OBJ LC(5) =DOCOL
?A=C A
GOYES compobj
new_obj LC(3) =DOLIST
?A=C A
GOYES compobj
LC(2) =DOSYMB
?A=C A
GOYES compobj
LC(3) =DOIDNT
?A=C A
GOYES idntobj
sum_obj CD0EX
RSTK=C
D0=C
GOSBVL =SKIPOB
AD0EX
D0=A
C=RSTK
C=A-C A
D=D+C A
?B#0 A
GOYES finish?
A=R2.F X save rrp PATH
B=A X
GOTO RESETID
compobj B=B+1 A
nextobj D0=D0+ 5
D=D+CON A,5
finish? LC(5) =SEMI
A=DAT0 A
?A#C A
GOYES NEW_OBJ
B=B-1 A
?B#0 A
GOYES nextobj
D=D+CON A,5
A=R2.F X save rrp PATH
B=A X
GOTO RESETID
** HERE D0->:object's PROLOGUE, D1->:new HASH, R0->:new IDNT
** R1->:(save above here), R2->:rrp PATH, R3->:1st HASH
idntobj C=R0.F A
D0=D0+ 5
CD0EX D0->:new IDNT
R1=C.F A R1->:run BYTE
C=R3.F A
D1=C
C=R2.F X
BCEX A B[A]:rrp PATH
RSTK=C save new SECO
GOSUB 1stID.2
C=RSTK
B=C A B[A]:new SECO
A=R1.F A
D0=A D0->:run BYTE
C=0 A
C=DAT0 B C[B]:run BYTE
GOC addIDNT
C=C+1 A
C=C+C A
A=A+C A
D0=A
D=D+CON A,11 add XLIB
end_obj ?B#0 A
GOYES finish?
A=R2.F X save rrp PATH
B=A X
GOTO RESETID
addIDNT C=C+1 A
C=C+C A
A=A+C A
D0=A
D=D+C A add IDNT body
D=D+CON A,5 with prologue
GOTO end_obj
STITLE Miscellaneous Parameter Summation, Version 1.0
** begin MISCPAR ************************************************
*****************************************************************
**
** NAME: MISCPAR
**
** ENTRY:
**
** EXIT:
**
** CALLS:
**
** REGISTERS:
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
MISCPAR A=0 A
A=DAT0 B
CD0EX
R0=C.F A R0->:new IDNT
A=A+A A
C=C+A A
D0=C
D0=D0+ 4 D0->:obj IDNT
A=DAT0 A A[A]:prologue
** Trap $MESSAGE parameter.
C=C+C S
GONC $CONFG?
LC(5) =DOLIST
?A#C A
GOYES abort00
C=0 A
CDEX A
RSTK=C
D0=D0+ 5
summesg A=DAT0 A
LC(5) =SEMI
?A=C A
GOYES setmesg
LC(4) =DOCSTR
?A#C A
GOYES nextstr
ST=1 sMESSAGE
D0=D0+ 5
C=DAT0 A
D=D+C A
AD0EX
A=A+C A
D0=A
GOTO summesg
nextstr GOSBVL =SKIPOB
GOTO summesg
setmesg LC(5) MESSAGE#
A=R4.F A
A=A+C A
D0=A
C=DAT0 A
C=C+D A
DAT0=C A
C=RSTK
D=D+C A
abort00 GOTO PREP_NO
** Trap $CONFIG parameter.
$CONFG? C=C+C S
GONC $TITLE?
?ST=1 sCONFIG
GOYES abort00
LC(5) =DOCOL
?A#C A
GOYES abort00
ST=1 sCONFIG
** Save new HASH and rrp PATH.
CD1EX
RSTK=C save new HASH
A=B A
R2=A.F A save rrp PATH
B=0 A B[A]:new SECO
** Cache current counter.
LC(5) CONFIG#
A=R4.F A
A=A+C A
D1=A
C=D A
DAT1=C A save old nibs
A=DAT0 A
GOTO config+
** Trap $TITLE parameter.
$TITLE? C=C+C S
GONC $romid!
?ST=1 sTITLE
GOYES abort01
LC(5) =DOCSTR
?A#C A
GOYES abort01
ST=1 sTITLE
D0=D0+ 5
C=DAT0 A
LA(5) 3
C=C-A A
?C<=A A
GOYES abort01
RSTK=C
D=D+C A
LC(5) TITLE#
sethash A=R4.F A
A=A+C A
D0=A
C=RSTK
DAT0=C A
abort01 GOTO PREP_NO
$romid! ?ST=1 sROMID
GOYES abort01
LC(5) =DOHSTR
?A#C A
GOYES romid.3
D0=D0+ 5
C=DAT0 A
C=C-CON A,6
GOC abort01
ST=1 sROMID
A=0 W
LA(1) 15
?A>=C A
GOYES romid.1
C=A A
romid.1 LA(3) #7FF
P=C 0
D0=D0+ 5
C=0 X
C=DAT0 WP
?A>=C WP
GOYES romid.2
C=A X
romid.2 P= 0
RSTK=C
LC(5) ROMID#
GOTO sethash
romid.3 LC(5) =DOREAL
?A#C A
GOYES abort01
ST=1 sROMID
D0=D0+ 5
C=D A
R1=C.F A
A=B X
R2=A.F X
STITLE Real-to-Hexidecimal Conversion, Version 3.0
*****************************************************************
*****************************************************************
**
** NAME: COERCE
**
** ENTRY: A[W]: BCD-12
**
** EXIT: C[A]: hex value
**
** ABSTRACT: Coerce real to binary integer
**
** DETAIL: If % < ZERO, then # is ZERO.
** If % > #7FF, then # is #7FF.
**
*****************************************************************
*****************************************************************
A=DAT0 W
?A=0 S
GOYES COER15
CEXIT4 C=0 A
GOTO UNDFLOW
CEXIT1 LA(5) #7FF
GOTO OVRFLOW
COER15 ?A=0 W
GOYES undflow
** Trap numbers less than 1.
LCHEX 500
?A<C X exponent positive?
GOYES COER30 YES
LCHEX 999
?A#C X exponent < -1 now?
GOYES CEXIT4 YES, return #00000
P= 14 exponent = -1 here
LCHEX 4
C=C-A P Mantissa < .5 now?
P= 0
GONC CEXIT4 YES, return #00000
C=0 A NO, return #00001
C=C+1 A
undflow GOTO UNDFLOW
** Trap numbers greater than 1E3.
COER30 LCHEX 003
?A>C X exponent > 6 here?
GOYES CEXIT1 YES, return #007FF
** Round fractional part.
B=A X
C=A X
P= 14
COER35 P=P-1 determine fraction
C=C-1 X
GONC COER35
SETDEC
A=A+A P double first digit
A=0 WP fractional part 0s
GONC COER40 integer part round
A=A-1 WP
A=A+1 W
?A=0 S
GOYES COER40
ASR W
B=B+1 X
** Coerce real to integer.
COER40 C=0 W
SETHEX
COER42 C=C+C W
D=C W
C=C+C W
C=C+C W
C=C+D W
ASL W
?A=0 S
GOYES COER47
COER45 C=C+1 W
A=A-1 S
?A#0 S
GOYES COER45
COER47 B=B-1 X
GONC COER42
** Overflow trap.
P= 0
A=0 W
LA(3) #7FF
?C<=A W OVERFLOW?
GOYES UNDFLOW
OVRFLOW C=A A
UNDFLOW RSTK=C
C=R1.F A
D=C A
A=R2.F X
B=A X
LC(5) ROMID#
GOTO sethash
** Determine conversion nibbles.
CONFIG+ LC(5) =DOCOL
?A=C A
GOYES config+
LC(3) =DOLIST
?A=C A
GOYES config+
LC(2) =DOSYMB
?A=C A
GOYES config+
LC(3) =DOIDNT
?A=C A
GOYES idntcon
sum_con CD0EX
RSTK=C
D0=C
GOSBVL =SKIPOB
AD0EX
D0=A
C=RSTK
C=A-C A
D=D+C A
?B#0 A
GOYES theEND?
A=R2.F X save rrp PATH
B=A X
GOTO setsize
config+ B=B+1 A
nextcon D0=D0+ 5
D=D+CON A,5
theEND? LC(5) =SEMI
A=DAT0 A
?A#C A
GOYES CONFIG+
B=B-1 A
?B#0 A
GOYES nextcon
D=D+CON A,5
A=R2.F X save rrp PATH
B=A X
GOTO setsize
** HERE D0->:object's PROLOGUE, D1->:new HASH, R0->:new IDNT
** R1->:(save above here), R2->:rrp PATH, R3->:1st HASH
idntcon C=R0.F A
D0=D0+ 5
CD0EX D0->:new IDNT
R1=C.F A R1->:run BYTE
C=R3.F A
D1=C
C=R2.F X
BCEX A B[A]:rrp PATH
RSTK=C save new SECO
GOSUB 1stID.2
C=RSTK
B=C A B[A]:new SECO
A=R1.F A
D0=A D0->:run BYTE
C=0 A
C=DAT0 B C[B]:run BYTE
GOC addNAME
C=C+1 A
C=C+C A
A=A+C A
D0=A
D=D+CON A,11 add XLIB
end_con ?B#0 A
GOYES theEND?
A=R2.F X save rrp PATH
B=A X
setsize LC(5) CONFIG#
A=R4.F A
A=A+C A
D1=A
A=DAT1 A
C=D A
C=C-A A
DAT1=C A
GOTO RESETID
addNAME C=C+1 A
C=C+C A
A=A+C A
D0=A
D=D+C A add IDNT body
D=D+CON A,5 with prologue
GOTO end_con
** Tack on necessary overhead.
OVRHEAD ?ST=0 sMESSAGE
GOYES ovrhead
LC(5) 25
D=D+C A
ovrhead LC(5) 39
** LC(5) (dolib)+(len)+(bytes)+(romid)+(hash)+(mesg)+(link)+(crc)
C=C+D A
GOTO MAKELIB
STITLE Library-Parameter ID Test, Version 1.1
** begin PAR@D0? ************************************************
*****************************************************************
**
** NAME: PAR@D0?
**
** ENTRY: D0->:rrp variable ID
**
** EXIT: D0->:rrp variable ID
**
** CALLS: $table2
**
** TRASHES: A[A], C[A], D1, and P
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 05/11/92 Rick Grevelle
** Optimized 09/11/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
PAR@D0? A=DAT0 A A[A]:[?(??)bb]
C=A A
P= 2
LCASC \$\ C[A]:[?(24)bb]
P= 0
?A#C A
RTNYES
A=A-CON B,5
RTNC
LC(2) 3 C[A]:[?(24)03]
?A>C B
RTNYES
C=0 B C[A]:[?(24)00]
A=A-C A
A=A+A A
ASL A A[A]:0,16,or32
GOSUB $table2
STITLE Library Paramater Lookup Table, Version 1.1
*****************************************************************
*****************************************************************
**
** OPCODE \NAME \ OBJECT
** OPCODE ## LEN STATUS-BIT
** ------ --------- --- ---------- ------
*****************************************************************
*****************************************************************
NIBASC \VARS \ ( list )
NIBHEX 70 P:7 ST[0]:0000
NIBASC \NULL \ ( list )
NIBHEX 70 P:7 ST[0]:0000
NIBASC \ROMID \ ( # )
NIBHEX 91 P:9 ST[0]:0001
NIBASC \TITLE \ ( $ )
NIBHEX 92 P:9 ST[0]:0010
NIBASC \HIDDEN \ ( list )
NIBHEX B0 P:B ST[0]:0000
NIBASC \CONFIG \ ( seco )
NIBHEX B4 P:B ST[0]:0100
NIBASC \VISIBLE\ ( list )
NIBHEX D0 P:D ST[0]:0000
NIBASC \MESSAGE\ ( list )
NIBHEX D8 P:D ST[0]:1000
STITLE Library-Parameter ID Lookup, Version 1.1
*****************************************************************
*****************************************************************
**
** NAME: $table2
**
** ENTRY: D0->:rrp variable ID
** RSTK:table's address
**
** EXIT: D0->:rrp variable ID
** C[S]:ID's status bit
** ONLY IF CARRY CLEAR!
**
** CALLS: None
**
** TRASHES: A[W], C[W], D1, and P
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 05/11/92 Rick Grevelle
** Changed pointer field 09/11/92 Rick Grevelle
**
*****************************************************************
*****************************************************************
$table2 C=RSTK
C=C+A A
CD1EX
RSTK=C
C=DAT1 W
P=C 14
D0=D0+ 4
A=DAT0 14
D0=D0- 4
?A=C WP
GOYES $match2
D1=D1+ 16
C=DAT1 W
?A=C WP
GOYES $match2
P= 0
C=RSTK
D1=C
RTNSC
$match2 P= 0
C=RSTK
D1=C
RTNCC
STITLE IDNT Path Assessment Utility, Version 1.0
** begin INPATH? ************************************************
*****************************************************************
**
** NAME: INPATH?
**
** ENTRY: D0->:new IDNT in current directory
** D1->:new HASH in current directory
** B[X]:rrp PATH
**
** EXIT: D0->: new IDNT
** D1->: new HASH
** R1->: run IDNT
** in PATH if CARRY CLEAR
**
** HOOK: (1stID.2)
** D0->:new IDNT
** D1->:1st HASH
** B[X]:rrp PATH
**
** CALLS: PAR@D0?
**
** TRASHES: A[W], B[A], C[W], D0, D1, and P.
**
** ABSTRACT:
**
** STACK LEVELS: 3
**
** MODULE HISTORY:
**
** Written 09/11/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
** Trap all null named variables.
INPATH? A=0 A <---------------
A=DAT0 B |
?A=0 B |
GOYES nextvar |
** Trap all embedded directories. |
CD0EX |
RSTK=C |
A=A+A A |
C=C+A A |
D0=C |
D0=D0+ 4 |
A=DAT0 A |
LC(5) =DORRP |
?A#C A |
GOYES chkidnt |
** Trap all null SRRPs. |
D0=D0+ 8 |
A=DAT0 A |
?A=0 A |
GOYES backoff |
** Use bbbbb to skip over HASH SRRP. |
A=DAT1 A |
CD1EX |
C=C-A A |
D1=C |
D1=D1- 5 |
** Back D0 off and do nextvar. |
backoff C=RSTK |
D0=C |
** Attempt to process yet another ID. |
nextvar D0=D0- 5 <<----------------------
A=DAT0 A | |
CD0EX | |
C=C-A A | |
D0=C | |
?A#0 A | |
GOYES INPATH? --------------> |
B=B-1 X B[X]:(PATH)-1 | |
RTNC | |
** Use ppppp to skip to 1st HASH up 1 SRRP. |
A=DAT1 A | |
CD1EX | |
C=C+A A | |
D1=C D1->:1st HASH | |
** Move up 1 subdirectory in path. | |
D0=D0- 15 | |
A=0 A | |
A=DAT0 B | |
A=A+1 A (** RRP IS NOT NULL NAMED **)
A=A+A A | |
CD0EX | |
C=C-A A | |
D0=C | |
** Compute address of 1st IDNT. | |
1stID.2 D0=D0- 5 <<<----- | |
A=DAT0 A | | |
CD0EX | | |
C=C-A A | | |
D0=C | | |
?A#0 A | | |
GOYES 1stID.2 ---->>> | |
D0=D0- 5 | |
A=DAT0 A | |
CD0EX | |
C=C+A A | |
D0=C D0->:1st IDNT | |
GOTO INPATH? --------------> |
** Check IDNT match loop. |
chkidnt C=RSTK |
D0=C D0->:new IDNT |
RSTK=C save new IDNT |
C=R1.F A |
CD1EX D1->:run IDNT |
RSTK=C save new HASH |
** D1=D1+ 5 |
A=DAT0 B |
C=DAT1 B |
?A#C B |
GOYES -MATCH2 |
C=0 XS |
C=C+1 X |
C=C+C X |
P=C 0 |
BCEX A |
BSR X |
RSTK=C |
B=B-1 B |
GOC initzm2 |
zoomin2 A=DAT1 W <<<<------------ |
C=DAT0 W | |
D1=D1+ 16 | |
D0=D0+ 16 | |
?A#C W | |
GOYES -match2 | |
B=B-1 B | |
GONC zoomin2 ----------->>>> |
initzm2 P=P-1 |
GOC +match2 |
A=DAT1 WP |
C=DAT0 WP |
?A=C WP |
GOYES +match2 |
-match2 P= 0 |
C=RSTK |
B=C A B[A]:rrp PATH |
-MATCH2 C=RSTK |
D1=C |
D1=D1- 5 D1->:new HASH |
C=RSTK |
D0=C D0->:new IDNT |
GOTO nextvar --------------------->>
+match2 P= 0
C=RSTK
C=RSTK
D1=C D1->:new HASH
C=RSTK
D0=C D0->:new IDNT
A=DAT1 P
?ABIT=1 sOMIT_ID
RTNYES
RTN
STITLE Initialize Library Object, Version 1.0
** begin MAKELIB ************************************************
*****************************************************************
**
** NAME: MAKELIB
**
** ENTRY: C[A]:nibbles needed to support library!
**
** EXIT:
**
** CALLS:
**
** TRASHES:
**
** ABSTRACT:
**
** STACK LEVELS:
**
** MODULE HISTORY:
**
** Written 09/11/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
MAKELIB ST=0 sGARBAGE
R3=C.F A
makelib GOSBVL =CREATETEMP
GONC initlib
* ?ST=0 sGARBAGE Commented out by M.H
* GOYES garbage
* GOSBVL =GETPTR
* LA(5) =SETMEMERR
* PC=(A)
*
*garbage
* ST=1 sGARBAGE
* GOSBVL =GARBAGECOL
* GOSBVL =GETPTR
* C=R3.F A
* GOTO makelib and replaced by the following
?ST=1 sGARBAGE
GOYES mkliber
GOSUB mklib:
CON(5) =DOCOL
CON(5) =GARBAGE
CON(5) =COLA
CON(5) =DOCODE
REL(5) dtolibend
ST=1 sGARBAGE
GOSBVL =SAVPTR
C=R3.F A
GOTO makelib
mkliber GOVLNG =GPMEMERR
mklib: C=RSTK
GOVLNG =GETPTREVALC
** Initialize library object.
initlib LC(5) =DOLIB
DAT0=C A
AD0EX
D0=A
D0=D0+ 5
B=B-CON A,11
C=B A
DAT0=C A
** Push library onto data stack.
GOSBVL =GETPTR
C=DAT1 A
D0=C
D1=D1+ 5
C=DAT1 A
RSTK=C save argument
DAT1=A A D1-->LIBRARY!
D1=A
** Initilize HASH tracking.
AD0EX
D0=A
D0=D0+ 5
C=DAT0 A
A=A+C A
LC(5) (16*5)+32
A=A-C A
R3=A.F A R3->:1st HASH
** Initialize library $TITLE.
D1=D1+ 10
LC(5) TITLE#
A=A+C A
D0=A
A=DAT0 A
?A=0 A
GOYES ++
A=A-CON A,2
ASRB.F A
LC(5) #FF
?C>=A A
GOYES +
A=C A
+ DAT1=A B D1-->$byte(s)
CD1EX \
C=C+A A \
C=C+A A skips $TITLE
D1=C /
D1=D1+ 2 /
++ DAT1=A B D1-->$byte(s)
D1=D1+ 2
** Initialize library $ROMID.
D0=D0+ 5 D0->:ROMID#
A=DAT0 X
DAT1=A X D1-->$ROMID
D1=D1+ 3
** Initialize library $CONFIG.
D1=D1+ 15
D0=D0+ 5 D0->:CONFIG#
C=0 A
A=DAT0 A
?A=0 A
GOYES +
LC(1) 5
+ DAT1=C A D1-->offset
B=A A
B=B+CON A,10 B[A]:offset
D1=D1- 5
** Initialize LINK table.
D0=D0+ 5
A=DAT0 A
?A=0 A
GOYES +
ABEX A B[A]:length
+ DAT1=A A D1-->offset
GOC +
CD1EX
RSTK=C
C=C+A A
D1=C
LC(5) =DOHSTR
DAT1=C A D1-->DOHSTR
D1=D1+ 5
ABEX A
DAT1=A A D1-->length
B=B+A A
B=B+CON A,5
C=A A C[A]:length
GOSUB zeroout
C=RSTK
D1=C
+ B=B+CON A,5
D1=D1- 5
** Initialize library $MESSAGE.
D0=D0+ 5
A=DAT0 A
?A=0 A
GOYES +
ABEX A B[A]:length
+ DAT1=A A D1-->offset
GOC +
CD1EX
RSTK=C
C=C+A A
D1=C
LC(5) =DOARRY
DAT1=C A D1-->DOARRY
D1=D1+ 5
ABEX A
LC(5) 20
A=A+C A
DAT1=A A D1-->length
B=B+A A
B=B+CON A,5
D1=D1+ 5
LCHEX 000000000102A2C
DAT1=C 15
C=RSTK
D1=C
+ B=B+CON A,5
D1=D1- 5
** Initialize HASH table.
D0=D0+ 5
A=DAT0 A
?A=0 A
GOYES +
ABEX A B[A]:length
+ DAT1=A A D1-->offset
CD1EX
R4=C.F A R4->:tables
GOC output!
C=C+A A
D1=C **(HASH table start)**
RSTK=C
LC(5) =DOHSTR
DAT1=C A D1-->DOHSTR
D1=D1+ 5
ABEX A A[A]:length
LC(5) 85
D=C A D[A]:fields
C=R3.F A
D0=C
- D0=D0+ 5 <---------------
D1=D1+ 5 |
C=DAT0 A |
?C=0 A |
GOYES + |
CDEX A |
+ DAT1=C A |
GOC + |
D=D+C A |
+ D=D-CON A,5 |
P=P+1 |
GONC - --------------->
D1=D1+ 5
C=D A
DAT1=C A D1-->offset
A=A+C A
C=A A
C=C-CON A,5 C[A]:length
GOSUB zeroout
LC(5) 80
A=A+C A
C=RSTK
D1=C
D1=D1+ 5
DAT1=A A
B=B+A A
B=B+CON A,5
** Compute output address.
output! C=R4.F A
C=C+B A
D=C A D[A]:output!
** Initilize 1st HASH.
A=R3.F A
D1=A D1->:1st HASH
** Advance to start of RRP.
CLRST
B=0 X B[X]:(PATH)=0
C=RSTK
D0=C D1->:DORRP
D0=D0+ 8
A=DAT0 A
?A#0 A
GOYES set_lib go-to-hook
GOTO SET_CRC
** Zero C[A]:nibbles-5 starting at D1+5.
zeroout C=C-CON A,5
P=C 0
CSR A
D=C A
C=0 W
D1=D1+ 5
D=D-1 A
GOC +
- DAT1=C W
D1=D1+ 16
D=D-1 A
GONC -
+ P=P-1
GOC +
DAT1=C WP
+ P= 0
RTN
STITLE Result-Library Write Loop, Version 1.0
** begin SET_LIB ************************************************
*****************************************************************
**
** NAME: SET_LIB
**
** ENTRY: D0->:rrp
** R3->:1st HASH
**
**
** EXIT:
**
** CALLS: LIS@D0
**
** REGISTERS:
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
SET_LIB D0=D0+ 8 <-------------------------------
A=DAT0 A |
?A=0 A |
GOYES nextset |
** Increment PATH; point to 1st IDNT. |
B=B+1 X B[X]:(PATH)+1 |
D1=D1- 5 D1->:new HASH |
CD1EX |
D1=C |
R3=C.F A R3->:1st HASH |
set_lib CD0EX |
C=C+A A |
** Trap all $LIBRARY paramters. |
par@d02 D0=C <<-----(D0->:new IDNT)-- |
GOSUB PAR@D0? | |
GONC miscset | |
** Trap all null named vaiables. | |
A=0 A | |
A=DAT0 B | |
?A=0 B | |
GOYES NEXTSET | |
** Trap all embedded directories. | |
CD0EX | |
R0=C.F A R0->:new IDNT | |
A=A+A A | |
C=C+A A | |
D0=C | |
D0=D0+ 4 | |
A=DAT0 A | |
LC(5) =DORRP | |
?A=C A | |
GOYES SET_LIB ------------------------------->
** Determine IDNT's status. |
A=DAT1 P |
?ABIT=1 sNULL_ID |
GOYES NULL_ID |
?ABIT=0 sOMIT_ID |
GOYES VISI_ID |
RESTART D1=D1- 5 D1->:new HASH |
nextset C=R0.F A |
D0=C |
** Attempt to process next IDNT. |
NEXTSET D0=D0- 5 <<<-----------------------------
A=DAT0 A | |
CD0EX | |
C=C-A A | |
?A#0 A | |
GOYES par@d02 ---------------------->> |
B=B-1 X B[X]:(PATH)-1 |
GONC UP_SRRP |
GOTO SET_CRC |
** Trap all ${} parameters. |
miscset D1=D1- 5 |
?C=0 S |
GOYES NEXTSET |
GOTO MISCSET |
** Move up 1 subdirectory. |
UP_SRRP D0=C |
D0=D0- 15 |
A=0 A |
A=DAT0 B |
A=A+1 A |
A=A+A A |
CD0EX |
C=C-A A |
D0=C |
A=DAT1 A |
CD1EX |
D1=C |
D1=D1- 5 D1->:new HASH |
C=C+A A |
R3=C.F A R3->:1st HASH |
GOTO NEXTSET ----------------------------->>>
STITLE Variable Conversion Utility, Version 1.0
*****************************************************************
*****************************************************************
**
** NAME: NULL_ID
** VISI_ID
**
** ENTRY: D0->:object
** D1->:new HASH
** R0->:new IDNT
**
** EXIT:
**
** CALLS: 1stID.2
**
** REGISTERS:
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
** HERE D0->:object's PROLOGUE, D1->:new HASH, R0->:object's IDNT
NULL_ID CD1EX
RSTK=C save new HASH
D1=C
D1=D1+ 2
C=0 A
C=DAT1 X C[A]:00(XLIB)
RSTK=C RSTK:1:2:
GOTO SETLINK
** HERE D0->:object's PROLOGUE, D1->:new HASH, R0->:object's IDNT
VISI_ID CD1EX
RSTK=C save new HASH
D1=C
A=DAT0 A
LC(5) =DOCOL
?A#C A
GOYES set_hash
** Set properties list data.
A=DAT1 A
ASL W A[5-0]:xxx*s0
C=R4.F A
CD1EX
RSTK=C RSTK:1:2:
D1=D1- 3
A=DAT1 X A[5-0]:xxxhhh
ASL W
LA(1) 8 property list
C=D A
D1=C A D1->:output!
DAT1=A 7
D1=D1+ 7
C=RSTK RSTK:1:
CD1EX
D=C A save output!
** Set HASH category data.
set_hash
D1=D1+ 2
C=0 A
C=DAT1 X C[A]:00(XLIB)
RSTK=C RSTK:1:2:
A=R4.F A
D1=A
C=DAT1 A
A=A+C A
D1=A D1->:prologue
D1=D1+ 5
LC(5) 90
C=C+A A C[A]:pointers
RSTK=C RSTK:1:2:3:
C=R0.F A
D0=C D0->:new IDNT
A=0 A
A=DAT0 B
LC(5) 16 C[A]:max IDNT
?A<=C A
GOYES putback
A=C A
putback C=A A
C=C+C A
A=A+C A
A=A+C A A[A]=(A[A]x5)
C=C+CON A,5 C[A]:category
RSTK=C RSTK:1:2:3:4:
CD1EX
C=C+A A
D1=C
A=DAT1 A
C=C+A A
D1=C D1->:CATEGORY
C=RSTK RSTK:1:2:3:
gethole A=DAT1 B <---------------
?A=0 B |
GOYES setcate |
AD1EX |
A=A+C A |
D1=A |
GOTO gethole --------------->
setcate C=C-CON A,3
GOSBVL =MOVEDOWN
** Set HASH offset field.
C=RSTK RSTK:1:2:
A=C A
C=RSTK RSTK:1:
RSTK=C RSTK:1:2:
DAT1=C X D1-->new XLIB
ACEX A A[A]:new XLIB
CD1EX D1->:pointers
RSTK=C RSTK:1:2:3:
C=DAT1 A
C=C+A A
A=A+A A
A=A+A A
C=C+A A
AD1EX
A=A+C A
D1=A
C=RSTK RSTK:1:2:
A=A-C A
C=0 A
C=DAT0 B
D0=D0+ 2
C=C+1 A
C=C+C A
A=A+C A
DAT1=A A
** Set LINK offset field.
SETLINK A=B X
R2=A.F X save rrp PATH
B=0 A B[A]:new SECO
C=R4.F A
C=C+CON A,10
D1=C
A=DAT1 A
A=A+C A
A=A+CON A,10
C=RSTK RSTK:1:
A=A+C A
C=C+C A
C=C+C A
A=A+C A
D1=A
C=D A
C=C-A A
DAT1=C A
A=DAT0 A
C=D A
D1=C
NEWXLIB LC(5) =DOCOL
?A=C A
GOYES nestobj
LC(3) =DOLIST
?A=C A
GOYES nestobj
LC(2) =DOSYMB
?A=C A
GOYES nestobj
LC(3) =DOIDNT
?A=C A
GOYES IDNTOBJ
SET_OBJ CD0EX
RSTK=C
D0=C
GOSBVL =SKIPOB
AD0EX
C=RSTK
D0=C
C=A-C A
GOSBVL =MOVEDOWN
END_OBJ ?B#0 A
GOYES FINISH?
C=RSTK
CD1EX
D=C A D[A]:output!
A=R2.F X save rrp PATH
B=A X
GOTO RESTART
nestobj DAT1=A A
B=B+1 A
NEXTOBJ D0=D0+ 5
D1=D1+ 5
FINISH? LC(5) =SEMI
A=DAT0 A
?A#C A
GOYES NEWXLIB
DAT1=A A
B=B-1 A
?B#0 A
GOYES NEXTOBJ
D1=D1+ 5
C=RSTK
CD1EX
D=C A D[A]:output!
A=R2.F X save rrp PATH
B=A X
GOTO RESTART
** HERE D0->:object's PROLOGUE, D1->:new HASH, R0->:new IDNT
** R1->:(save above here), R2->:rrp PATH, R3->:1st HASH
IDNTOBJ C=R0.F A
D0=D0+ 5
CD0EX D0->:new IDNT
R1=C.F A R1->:run BYTE
C=R3.F A
CD1EX
D=C A
C=R2.F X
BCEX A B[A]:rrp PATH
RSTK=C save new SECO
GOSUB 1stID.2
C=RSTK
B=C A B[A]:new SECO
A=R1.F A
D0=A D0->:run BYTE
GOC setIDNT
C=0 A \
C=DAT0 B \
C=C+1 A skip
C=C+C A IDNT
A=A+C A /
D0=A /
A=DAT1 A
ASL W A[5-0]:xxx*s0
C=R4.F A
D1=C
D1=D1- 3
A=DAT1 X A[5-0]:xxxhhh
C=D A
D1=C
LC(5) =DOROMP
DAT1=C A
D1=D1+ 5
DAT1=A 6
D1=D1+ 6
GOTO END_OBJ
setIDNT C=D A
D1=C
LC(5) =DOIDNT
DAT1=C A
D1=D1+ 5
C=0 A
C=DAT0 B
C=C+1 A
C=C+C A
GOSBVL =MOVEDOWN
GOTO END_OBJ
STITLE Miscellaneous Parameter Conversion, Version 1.0
** begin MISCSET ************************************************
*****************************************************************
**
** NAME: MISCSET
**
** ENTRY:
**
** EXIT:
**
** CALLS:
**
** REGISTERS:
**
** ABSTRACT:
**
** MODULE HISTORY:
**
** Written 09/18/93 Rick Grevelle
**
*****************************************************************
*****************************************************************
MISCSET A=0 A
A=DAT0 B
CD0EX
R0=C.F A R0->:new IDNT
A=A+A A
C=C+A A
D0=C
D0=D0+ 4 D0->:obj IDNT
A=DAT0 A A[A]:prologue
** Trap $MESSAGE parameter.
C=C+C S
GOC messg00
GOTO $confg?
ABORTFF C=RSTK
D1=C
ABORT00 GOTO nextset
messg00 LC(5) =DOLIST
?A#C A
GOYES ABORT00
C=R4.F A
C=C+CON A,5
CD1EX
RSTK=C RSTK:1: (SAVE D1 )
A=DAT1 A
?A=0 A
GOYES ABORTFF
CD1EX
A=A+C A
LC(5) 20
C=C+A A
RSTK=C RSTK:1:2: (SAVE ->ELEMENTS)
D1=C
C=DAT1 A C[A]:elements
CBEX A
RSTK=C RSTK:1:2:3: (SAVE B[A] )
C=B A
D0=D0+ 5 D0->:1st list
D1=D1+ 5 D1->:elements
B=B-1 A
GOC messg02
RSTK=C RSTK:1:2:3:4: (SAVE ELEMENTS )
messg01 A=DAT1 A <-------
CD1EX |
C=C+A A |
D1=C |
B=B-1 A |
GONC messg01 ------->
C=RSTK RSTK:1:2:3: (RESTORE ELEMENTS)
messg02 B=C A
set_mesg
A=DAT0 A
LC(5) =SEMI
?A=C A
GOYES SETELEM
LC(5) =DOCSTR
?A#C A
GOYES NEXTSTR
B=B+1 A
D0=D0+ 5
C=DAT0 A
GOSBVL =MOVEDOWN
GOTO set_mesg
NEXTSTR GOSBVL =SKIPOB
GOTO set_mesg
SETELEM C=RSTK RSTK:1:2: (RESTORE B[A] )
CBEX A
A=C A
C=RSTK RSTK:1: (RESTORE ->ELEMS)
D1=C
DAT1=A A D1-->elements
C=RSTK RSTK: (RESTORE D1 )
D1=C
ABORT01 GOTO nextset
** Trap $CONFIG parameter.
$confg? C=C+C S
GONC $title?
?ST=1 sCONFIG
GOYES ABORT01
LC(5) =DOCOL
?A#C A
GOYES ABORT01
ST=1 sCONFIG
C=R4.F A
CD1EX
RSTK=C RSTK:1:
D1=D1+ 15
C=D A
DAT1=C A cache output!
D1=D1+ 5
C=B A
R2=C.F A save rrp PATH
B=0 A B[A]:new SECO
GOTO config!
** Trap $TITLE parameter.
$title? C=C+C S
GONC ABORT02
?ST=1 sTITLE
GOYES ABORT02
LC(5) =DOCSTR
?A#C A
GOYES ABORT02
ST=1 sTITLE
D0=D0+ 5
A=DAT0 A
CD0EX
C=C+A A
D0=C
A=A-CON A,5
?A=0 A
GOYES ABORT02
C=R4.F A
CD1EX
RSTK=C RSTK:1:2:
D1=D1- 5
C=A A
CBIT=0 0
GOSBVL =MOVEUP RSTK:1:2:3:
C=RSTK
D1=C
ABORT02 GOTO nextset
CONFIG! LC(5) =DOCOL
?A=C A
GOYES config!
LC(3) =DOLIST
?A=C A
GOYES config!
LC(2) =DOSYMB
?A=C A
GOYES config!
LC(3) =DOIDNT
?A=C A
GOYES IDNTCON
SET_CON CD0EX
RSTK=C
D0=C
GOSBVL =SKIPOB
AD0EX
C=RSTK
D0=C
C=A-C A
GOSBVL =MOVEDOWN
END_CON ?B#0 A
GOYES THEEND?
GOTO bailcon
config! DAT1=A A
B=B+1 A
NEXTCON D0=D0+ 5
D1=D1+ 5
THEEND? LC(5) =SEMI
A=DAT0 A
?A#C A
GOYES CONFIG!
DAT1=A A
B=B-1 A
?B#0 A
GOYES NEXTCON
bailcon C=RSTK
D1=C
A=R2.F X save rrp PATH
B=A X
C=R4.F A
D0=C
D0=D0+ 15
C=DAT0 A
D=C A
LC(5) 5
DAT0=C A
GOTO nextset
** HERE D0->:object's PROLOGUE, D1->:new HASH, R0->:new IDNT
** R1->:(save above here), R2->:rrp PATH, R3->:1st HASH
IDNTCON C=R0.F A
D0=D0+ 5
CD0EX D0->:new IDNT
R1=C.F A R1->:run BYTE
C=R3.F A
CD1EX
D=C A
C=R2.F X
BCEX A B[A]:rrp PATH
RSTK=C save new SECO
GOSUBL 1stID.2
C=RSTK
B=C A B[A]:new SECO
A=R1.F A
D0=A D0->:run BYTE
GOC setNAME
C=0 A \
C=DAT0 B \
C=C+1 A skip
C=C+C A IDNT
A=A+C A /
D0=A /
A=DAT1 A
ASL W A[5-0]:xxx*s0
C=R4.F A
D1=C
D1=D1- 3
A=DAT1 X A[5-0]:xxxhhh
C=D A
D1=C
LC(5) =DOROMP
DAT1=C A
D1=D1+ 5
DAT1=A 6
D1=D1+ 6
GOTO END_CON
setNAME C=D A
D1=C
LC(5) =DOIDNT
DAT1=C A
D1=D1+ 5
C=0 A
C=DAT0 B
C=C+1 A
C=C+C A
GOSBVL =MOVEDOWN
GOTO END_CON
** Compute and set library CRC.
SET_CRC GOSBVL =GETPTR
D1=D1+ 5
A=DAT1 A
D0=A
D0=D0+ 5
A=DAT0 A
A=A-CON A,4
GOSBVL =DoCRC
DAT0=A 4
** Restore RPL, drop HASH, and loop.
LC(5) =DROP
GOVLNG =GETPTREVALC
dtolibend
ENDCODE
;
**********************************************************************