................................<
.laser
.topmargin 1"
.margin 1"
.; The following rulers work for Times-Roman and Helvetica - 10 point type
.font times
.point 10
.; Three columns per page (2 1/16")
.;  ................................<

.; Two columns per page (3 1/16")
..................................................<

.; One column per page (6 5/8")
.;  ........................................................................................................<
.hlt bold
      Alphanso's Assembler Assylum
                  by SDH

  _Generating a UNIVERSAL file for Your MACROs_

  Hey gang! How are you and your MACROs these days?
This  month  let's  learn how to generate  our  own
personal UNIVERSAL file  filled  with our own MACRO
definitions.  Once we have created  the  MACROs  we
need and place  them in our special universal file,
each time we write  a new assembly language program 
we can "assume" that  our  MACROs  are  part of the
entire  library and use them without ever  defining
them within  the  source  code!  Slick! If you have
missed  the  last two sessions of the  Assylum,  be
sure  to catch  up  on  your  reading.  Talk  about
getting fancy!
_Why a Universal File?_
  Why would one ever want to create a univeral file
in the  first  place?  A  couple of good answers to
this question. One reason is  that it will save you
a good deal of time: you only have  to  define your
favorite   MACROs   once.  Second  reason:  program
compactness. If you  begin  to create more and more
custom MACROs, you could have  page  upon  page  of
definitions  before you even begin the main body of
your program. Third reason: program readability. If
you properly name  your  MACROs  and  provide solid
comments  within  the  main body of your code,  the
final product will be much  more  readable.  Fourth
reason:  speed.  Rather  than  copying  in all your
MACRO  definitions, you will be able to SEARCH  for
these definitions  at  assembly time - much faster.
Finally,  it's  cool...  very  cool.  All  assembly
language programmers like to "be cool".
_How to Construct a Universal file_
  Next  step, since we all  decided  that  cool  is
"in", is  to create a UNIVERSAL file. You will find
that  a  universal  source  code  file  looks  very
similar to  our previous files. The simple rules to
follow are  listed  below.   Rule 1: you cannot use
any SEARCH lines from within a  .UNV  source  file.
Rule 2: you cannot use the COPY command either  (we
haven't  discussed  this,  but  COPY will basically
"yank"  in  a piece of .M68 code upon  assembling).
Rule 3: a .UNV  source  code  file may only contain
MACRO  definitions and SYMBOL definitions - NO CODE
may be generated.  Not  as  spooky as you think. If
you are real interested in looking  at a .UNV file,
LOG to the MAC: account, DSK0:[7,7],  and  VUE  (or
TYPE)  SYS.M68  or TRM.M68. Most of the information
in these two files  consist  of SYMBOL definitions,
but TRM.M68 has at least one MACRO  within the file
towards the bottom. Both SYS.M68 and  TRM.M68  when
assembled create SYS.UNV and TRM.UNV - two files we
have SEARCHed over and over.
.bl |
.hlt key
  Now that the rules are clear, the rest is a snap.
Let's  once  again  use the file JOBRUN.M68 as  our
example. VUE JOBRUN.M68  from  last  months session
(or  get JOBRUN.M68 off the Network, PPN [100,51]).
Unyank  the  MACRO  portion of the file. You can do
this by following these  steps:  placing the cursor
at the first DEFINE statement and  hit  a _|cP|_. Now
move the cursor to the last ENDM statement  of  the
MACRO  definitions  and  hit another _|cP|_. You have
just "marked" a block of text.  Now  hit a _|RETURN|_
to move the cursor out of the "dim"  block you just
marked.  Hit and _|ESC|_ to get to VUE  command  mode
(the ">")  and type U MYMACS (for "unyank MYMACS").
This will create  a  file  called  MYMACS.M68.  The
cursor  will  be  resting at the ">" at this point.
Now type DELETE. This  will  delete  the  block you
marked from within JOBRUN.
  We still are not done.  Again  hit  an  _|ESC|_ to
return  to  the  text  of  JOBRUN.  Notice that the
MACROs have been removed from this file.  In  order
for  the assembler to "find" our MACRO definitions,
we need  to add in another SEARCH instruction (just
below SEARCH  TRM).  This  SEARCH  line should read
SEARCH MYMACS. What this instruction  line  will do
is  inform  the  assembler  to SEARCH a file called
MYMACS.UNV  (notice  the  .UNV  extension).  All  a
SEARCH   does   is  locate  any  MACRO  or   SYMBOL
definitions  within   a   given   .UNV   file   for
processing.  If  you  never  use  any of the MACROs
within  MYMACS.UNV  but still included  the  SEARCH
instruction, no errors  would occur and it would be
"legal beagle". If you do use  a MACRO or a SYMBOL
from  MYMACS,  then  the  SEARCH  statement   would
provide the proper definition. Simple!
  Finally,  we  need  to  create the .UNV file from
MYMACS.M68. Before you assemble JOBRUN, Finish from
VUE and now VUE MYMACS.M68. At the top of the file,
we need to inform the assembler that this .M68 file
will generate a .UNV file. We do this by placing at
the top of the file the following  one line opcode:
UNIVERSAL  (see enclosed code below). Now  assemble
MYMACS.M68.  Notice  that  the  assembler only goes
through two phases of assembly, and it also informs
you  that the Universal file is finished.  Bingo  -
instant library!

.font courier
.hlt bold
.point 10
_UNIVERSAL_

_ DEFINE  TYPEIT  V,B_
_;+---_
_;| TYPEIT will process a JCB variable that is two words packed RAD50 data_
_;|        and type this variable to the screen in ascii format._
_;| where_
_;|        V = variable to be UNPACKED_
_;|        B = buffer area to place unpacked characters_
_;+---------------------------------------------------------------------------_
_        LEA     A1,V(A4)                ;A1 points to variable to be unpacked_
_        LEA     A2,B(A5)                ;and ^ A2 to byte "0" of "BUFFER"_
_        UNPACK                          ;get the letters unpacked_   
_        UNPACK                          ;  ...for up to full letters_
_        CLRB    @A2                     ;Place a "null" after the characters_
_        LEA     A2,B(A5)                ;Repoint A2 to byte "0" of "BUFFER"_
_        TTYL    @A2                     ;Print out all chars until a null_
_ENDM_

_DEFINE  PRTTAB  AA,BB_
_;+---_
_;| PRTTAB acts just like "PRINT TAB (#,#) from within BASIC_
_;| where_
_;|      AA is the first #, BB is the second #_
_;+------------------------------------------------------------_
_        MOVB    #AA,D1                  ;move 1st number into D1_
_        LSLW    D1,#10                  ;shift it left 8. bits_
_        MOVB    #BB,D1                  ;move in 2nd number_
_        TCRT                            ;and perform TCRT call_
_ENDM_

_DEFINE  TABDWN  AA,BB_
_;+---_
_;| TABDWN - or "TAB DOWN" will place the cursor at the row specified by_
_;|          AA and the column specified by BB. Assumes a data register_
_;|          (AA) has been "dedicated" to keep track of which row._
_;| where_
_;|      AA is a dedicated data register holding current row number_
_;|      BB is the column number_
_;+----------------------------------------------------------------------_
_       MOVB    AA,D1                   ;move in value from dedicated reg._
_       LSLW    D1,#10                  ;shift it left 8. bits_
_       MOVB    #BB,D1                  ;move in column number_
_       TCRT                            ;and perform TCRT call_
_       INC     AA                      ;increment dedicated data register_
_ENDM_
.font times
.point 10
  Now  we  are  ready  to assemble JOBRUN. Type M68
JOBRUN  and  watch how the  assembler  will  SEARCH
MYMACS  at  the   appropriate   time  and  generate
JOBRUN.LIT with the exact same hash  code  total as
before. Wasn't that easy??? 
  Now for some questions and answers. First,  where
should  you  place  MYMACS.UNV?  Probably  the best
location  is in the MAC: account, DSK0:[7,7].  That
way, no matter  what  PPN  you are currently in, if
you have a SEARCH MYMACS instruction line in a file
you  are  creating, the assembler  will  find  this
file. Next  question:  how come the assembler found
MYMACS  during  this session  when  I  didn't  move
MYMACS down to DSK0:[7,7]?  The answer, as you have
probably  already guessed, is  that  the  assembler
will look in  the  PPN you are currently working in
if  it  cannot  find the  .UNV  file  in  the  MAC:
account. What if  I want to add more of my favorite
MACROs to MYMACS? Well,  if you leave MYMACS.M68 in
the  MAC: account, each time  you  generate  a  new
MACRO  that  you  think you will use over and over,
simply VUE MYMACS.M68,  add  in the new definition,
re-assemble, and your done! I  noticed  that MYMACS
does  not  contain an END statement, how come?  The
answer to this  one  is  also  slick:  with  no END
statement included, if there ever comes a time that
you would rather COPY MYMACS.M68 to a file, you may
do  so.  If  there  was  an END statement contained
within MYMACS, as soon as  you  copied in the file,
you would be at the "END" of your code!
.hlt bold
_Wrapping Up_
  Perform the step above to be sure  you understand
how  to  create  a  universal  file. As the  series
continues, we will begin to employ more and more of
the neat features of the Alpha Micro  assembler, so
don't  find yourself getting behind! Coming  up  in
the future  will  be  number  conversion  routines,
block  programming  using  the LNKLIT command,  and
even  file I/O! Also, as long  as  I  keep  getting
positive comments about this series I will continue
submitting  the AAA. Input and suggestions are more
than welcome. I enjoy writing these article as long
as somebody gets  something  out  of  them. See you
next month. Bye!