home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / lang / vlsi_j.hqx / toolbx.list next >
Text File  |  1988-02-21  |  33KB  |  573 lines

  1.    ; Toolbx.sub file for Absoft Fortran 2.3
  2.    ; Jay Lieske   JPL, 29 Jan '88.
  3.    ;
  4.    ; 'toolbx.sub' is provided and copyrighted by Absoft.  This disassembly
  5.    ; is an attempt to find out what the routine does so that erroneous trap
  6.    ; parameters in the Absoft include files can be corrected and so that additional
  7.    ; traps can be implemented (e.g. the Printer traps at $A8FD.
  8.    ;
  9.    * Decomposition of Absoft's Fortran toolbx.sub for Fortran 2.3 via Nosy.
  10.    * My toolbx.sub is dated 10 August 1987.  Be cautious with older toolbx.par files
  11.    * since the 'control exception flag' (bit 29 of the trap descriptor) described in
  12.    * some of the 'Absoft Extras' documentation is for an older version of Fortran.
  13.    *  The Bit 29 flag is NOT used in Version 2.3, but instead 'Arg1' is employed
  14.    *  to flag the 'exceptional traps' that require more than six arguments.
  15.    *  The comments given below are based on Absoft's documentation of their earlier
  16.    *  toolbx.sub formats as modified by this disassembly for Version 2.3
  17.    * * * * * *
  18.    * Notes:  What's at $D08(A0) and environs?? Used to dispatch trap and exit glue
  19.    * * * * * *
  20.    ;**************************************************************************************
  21.    ; The normal ToolBox and Operating System Traps ($Axxx) and their argument types
  22.    ; are encoded into a 'trap descriptor' as follows:
  23.    ;
  24.    ;   |- 0=> OS trap, 1 => ToolBox trap (Bits 20-31 are usually lower 3 nybbles of
  25.    ;   |                                    the ToolBox trap )
  26.    ;   |  |--< 1 => 'Funny' trap (not a trap at all, but an internal routine as 'PTR')
  27.    ;  _V__V__________________________________________________________________________
  28.    ; |31 30                        20 19                                            0|
  29.    ; |      Trap Field               | Parameter Control Field                       |
  30.    ; |_______________________________|_______________________________________________|
  31.    ;
  32.    ; The 'Funny trap' field (bit 30) is used for ToolBox 'traps' (bit 31 = 1) to
  33.    ; indicate that it's not really a ToolBox trap but rather a toolbx.sub internal
  34.    ; routine.  Current ones are PTR ($C000 0000), GetGlobal ($C000 0001), and
  35.    ; MemError ($C000 0002). See 'FunTrap' entry in the toolbx.sub routine below.
  36.    ; The 'Trap Field' in general consists of the lower 3 nybbles (i.e. the lower
  37.    ; three hex digits) of the Apple ToolBox 'trap word' so that the 'NewWindow' trap
  38.    ; word of $A913 becomes Trap Field $913.
  39.    ;
  40.    ;**************************************************************************************
  41.    ;
  42.    ; The 'Operating System traps' consist of trap addresses of the form $Ayxx where
  43.    ; 'y' is less than $8 (viz. bit 31 is clear).  They are register-based traps and
  44.    ; the Parameter Control Field contains encoded information concerning the arguments
  45.    ; and through which registered they are to be passed.
  46.    ; The 'Toolbox traps' where 'y' is greater than $8 (viz. bit 31 is set) are
  47.    ; stack-based traps and the Parameter Control Field contains encoded information
  48.    ; concerning the arguments and their sizes.
  49.    ;
  50.    ;**************************************************************************************
  51.    ; The OS traps (where bit 31 is clear) are register-based and have a
  52.    ;  Parameter Control Field as follows:
  53.    ;  ____________________________________________________
  54.    ; |19  17 16  14 13  11 10   8 7  6 5   4 3    2 1  0 |
  55.    ; | Arg1 | Arg2 | Arg3 | Arg4 | Ret| Size| Save |x  x |
  56.    ; |___________________________________________________|
  57.    ;
  58.    ; The 'Argx' fields are 3 bits wide and contain
  59.    ;         ________________________
  60.    ; Argx:  |    Register   | Val/Var| Register: 2 bits with meaning in 'Reg' field
  61.    ;        |_______________|________| Val: 0 (Pass by value)  Var: 1 (Pass by address)
  62.    ;
  63.    ;         _____
  64.    ; Reg:   | 0 0 | Register D0
  65.    ;        | 0 1 | Register D1
  66.    ;        | 1 0 | Register A0
  67.    ;        | 1 1 | Register A1
  68.    ;        |_____|
  69.    ;
  70.    ; Ret:   Return register. Encoded like 'Reg' field
  71.    ; Size:  Type of result given by
  72.    ;                 _____
  73.    ;                | 0 1 | Word
  74.    ;                | 1 0 | Longword
  75.    ;                | 1 1 | Byte (boolean)
  76.    ;                |_____|
  77.    ;
  78.    ; Save:  For MemError calls. Clear (01) or Save (10) reg D0 in MemError word
  79.    ;
  80.    ;**************************************************************************************
  81.    ; The TB traps (where bit 31 is set) are stack-based and have a
  82.    ;  Parameter Control Field as follows:
  83.    ;
  84.    ;  __________________________________________________
  85.    ; |19  18 17  15 14  12 11   9 8    6 5    3 2    0 |
  86.    ; | Fcn  | Arg1 | Arg2 | Arg3 | Arg4 | Arg5 | Arg6  |
  87.    ; |_________________________________________________|
  88.    ;         _____
  89.    ; Fcn:   | 0 0 | Procedure
  90.    ;        | 0 1 | Word
  91.    ;        | 1 0 | Longword
  92.    ;        | 1 1 | Byte (boolean)
  93.    ;        |_____|
  94.    ;         ________________________
  95.    ; Argx:  |Val/Var |     Size      |  Val: 0 (Pass by value)  Var: 1 (Pass by address)
  96.    ;        |________|_______________|  Size: 2 bits with same meaning as 'Fcn' field
  97.    ;
  98.    ; The normal TB traps can have a maximum of six arguments.  Up to ten arguments
  99.    ; can be handled, however, by using the 'exceptional trap' mechanism given below.
  100.    ; Note that this version employs a different method for these long argument lists
  101.    ; than the earlier version of toolbx.sub which employed bit 29 in the Trap Field
  102.    ; to flag the longer argument lists.  This is perhaps why some of the parameter
  103.    ; values for unusual traps like SFGetFile are messed up in some of the Absoft
  104.    ; include files.
  105.    ;
  106.    ;**************************************************************************************
  107.    ; In cases where there are more than six arguments to a toolbox trap the
  108.    ; following method is implemented. An extra LongWord (called 'Xfields' here)
  109.    ; is imbedded at the end of toolbx.sub (and unfortunately isn't visible
  110.    ; unless you disassemble the routine). All toolbox traps that use this feature
  111.    ; will have the Trap Field of the descriptor contain 1 in bit 31 and a 0 in
  112.    ; bit 30.  They will also have a $100 in arg1 (bits 17 to 15) of the
  113.    ; descriptor field.  The Fortran parameters will thus appear something like
  114.    ;
  115.    ;      __>> 1 => ToolBox trap (rather than OStrap)
  116.    ;      |__>> 0 => a 'regular' trap rather than a 'funny' trap. xx is rest of trap word
  117.    ;      ||             __>> Fcn field of descriptor 00 => 'proc'
  118.    ;      ||             | __>> Val/Var field of Arg1: 1 => 'proc' type
  119.    ;      ||             | |__>> Size field of Arg1: 00 => proc (a 'VAR proc' is illegal)
  120.    ;      ||             | ||         __>> Xfield pointer (4 bits currently)
  121.    ;      ||             | ||         |
  122.    ;      VV             V VV         V
  123.    ;      10xx xxxx xxxx 0010 0 ..... yyyy
  124.    ;
  125.    ; All 'exceptional traps' with more than six args will have an encoded Fortran
  126.    ; parameter of the type abcd 2000 0000 000z
  127.    ; where 'a' is > $8 since bit 31 must be set and 30 must be clear (actually,$8..$B)
  128.    ; and where 'z' is a number between 0 and 3 currently.  Apparently (see notes at
  129.    ; end of the routine) the parameter lists are set up for only four 'exceptional traps'
  130.    ; 0=> NewWindow trap, 1=> NewControl, 2=> NewDialog, 3=> SFGetFile argument lists.
  131.    ;  Any other trap that used these same type of fields could also use the canned
  132.    ; parameter fields, since the Trap Field is external to toolbx.sub and only the
  133.    ; 'Xfields' values are canned into the program.
  134.    ;
  135.    ; Encoded format for 'exceptional traps' embedded at end of toolbx.sub :
  136.    ; Xfields:
  137.    ;  ____________________________________________________________________________
  138.    ; |31 30 29  27 26  24 23  21 20  18 17  15 14  12 11   9 8    6 5    3 2     0|
  139.    ; | Fcn | Arg1 | Arg2 | Arg3 | Arg4 | Arg5 | Arg6 | Arg7 | Arg8 | Arg9 | Arg10 |
  140.    ; |____________________________________________________________________________|
  141.    ;
  142.    ; where Fcn and Argx have their usual meanings:
  143.    ;**************************************************************************************
  144.  
  145.      0:                                 XDEF    toolbx2
  146.  
  147.      0:                                 Include SysEqu.txt
  148.      0:                                 Include Amacs
  149.  
  150.  
  151.  
  152.      0:                                 QUAL    toolbx2 ; b# =1  s#1  =proc5
  153.  
  154.                                ;-refs - toolbx2
  155.  
  156.      0: 48E7 0082      'H...'  toolbx2  MOVEM.L A0/A6,-(A7)
  157.      4: 4BFA FFFA      1000000          LEA     toolbx2,A5     ; A5 is local stack
  158.      8: 9BFC 0000 0014 '......'         SUBA.L  #20,A5
  159.      E: BBE8 002A      '...*'           CMPA.L  42(A0),A5      ; are we in heap?
  160.     12: 6606           100001A          BNE.S   lab_1          ; no
  161.     14: 337C 0001 FFF8 '3|....'         MOVE    #1,-8(A1)      ; mark as permanent ??
  162.     1A: 2A68 FFFC      '*h..'  lab_1    MOVEA.L -4(A0),A5      ; save QuickDraw globals
  163.     1E: 2600           '&.'             MOVE.L  D0,D3          ; get # of args
  164.     20: E588           '..'             LSL.L   #2,D0          ; get offset to beginning
  165.     22: 49F7 0808      'I...'           LEA     8(A7,D0.L),A4  ; address of first arg (parms)
  166.     26: 2654           '&T'             MOVEA.L (A4),A3        ; get ptr to descriptor parm
  167.     28: 2013           ' .'             MOVE.L  (A3),D0        ; get value of descriptor
  168.     2A: 6A08           1000034          BPL.S   OStrap         ; b32=0 => OStrap, 1=>TBtrap
  169.     2C: 0800 001E      '....'           BTST    #$1E,D0        ; b30=1 => 'Funny' trap
  170.     30: 6600 018A      10001BC          BNE     FunTrap        ; not really a trap
  171.     ;
  172.     ; Operating System traps and Toolbox traps
  173.     ;
  174.     34: 2200           '".'    OStrap
  175.                               MOVE.L    D0,D1                  ; trap descriptor into D1
  176.     36: 343C 0014      '4<..'           MOVE    #20,D2         ; prepare bits 20-31
  177.     3A: E4A1           '..'             ASR.L   D2,D1          ; lower 3 nybbles of trap word
  178.     3C: 0241 0FFF      '.A..'           ANDI    #$FFF,D1       ; mask it off
  179.     40: 0041 A000      '.A..'           ORI     #$A000,D1      ; complete trap address
  180.     44: 3141 0D08      '1A..'           MOVE    D1,$D08(A0)    ; stash it where??
  181.     48: 317C 4ED3 0D0A '1|N...'         MOVE    #$4ED3,$D0A(A0) ; insert 'JMP (A3)' where??
  182.     4E: 4A80           'J.'             TST.L   D0             ; check for toolbox trap
  183.     50: 6B00 0090      10000E2          BMI     TBtrap         ; Hibit set => toolbox trap
  184.     ;
  185.     ; Operating System traps
  186.     ;
  187.     54: 740C           't.'             MOVEQ   #12,D2         ; prepare to discard upper 12..
  188.     56: E5A0           '..'             ASL.L   D2,D0          ; ..bits of descriptor (trapnum)
  189.     58: 2800           '(.'             MOVE.L  D0,D4          ; D4 has parameter controls
  190.     5A: 2C00           ',.'             MOVE.L  D0,D6
  191.     5C: 2C4C           ',L'             MOVEA.L A4,A6          ; ptr to TB parm word
  192.     5E: 5383           'S.'    doNextArg
  193.                                         SUBQ.L  #1,D3          ; bump to next arg control
  194.     60: 6728           100008A          BEQ.S   endParse       ; done parsing
  195.     62: 2666           '&f'             MOVEA.L -(A6),A3       ; point to first arg
  196.     64: 0806 001D      '....'           BTST    #$1D,D6        ; test b17=29-12 of control
  197.     68: 6602           100006C          BNE.S   isVAL          ; 0=>VAL
  198.     6A: 2653           '&S'             MOVEA.L (A3),A3        ; b17=1 is VAR. Put value in A3
  199.     6C: E386           '..'    isVAL    ASL.L   #1,D6          ; shift left arg1
  200.     6E: 640C           100007C          BHS.S   useDregs       ; 1=> use D registers
  201.     70: E386           '..'             ASL.L   #1,D6          ; Aregs. shift again for regnum
  202.     72: 6504           1000078          BLO.S   useA1          ; use A1 if 11
  203.     74: 204B           ' K'             MOVEA.L A3,A0          ; use A0 if 10
  204.     76: 600E           1000086          BRA.S   gotReg
  205.     78: 224B           '"K'    useA1    MOVEA.L A3,A1          ; A1 contains input
  206.     7A: 600A           1000086          BRA.S   gotReg
  207.     7C: E386           '..'    useDregs
  208.                                         ASL.L   #1,D6          ; use D regs. Shift to find which
  209.     7E: 6504           1000084          BLO.S   useD1          ; 01 => D1
  210.     80: 200B           ' .'             MOVE.L  A3,D0          ; 00 => D0
  211.     82: 6002           1000086          BRA.S   gotReg
  212.     84: 220B           '".'    useD1    MOVE.L  A3,D1          ; we'll use D1 reg
  213.     86: E386           '..'    gotReg
  214.                                         ASL.L   #1,D6
  215.     88: 60D4           100005E          BRA     doNextArg      ; continue parsing
  216.     ;
  217.     8A: 47FA 0008      1000094 endParse
  218.                                         LEA     afterTrap,A3   ; set up for after trap returns
  219.     8E: 2C57           ',W'             MOVEA.L (A7),A6        ; stack frame
  220.     90: 4EEE 0D08      'N...'           JMP     $D08(A6)       ; Where is this??
  221.     ;
  222.     ; After execution of trap things resume here
  223.     ;
  224.                                afterTrap
  225.     94: 0804 0013      '....'           BTST    #$13,D4        ; check b7=19-12 of control
  226.     98: 670E           10000A8          BEQ.S   retD0          ; 0=> return val in D reg
  227.     9A: 0804 0012      '....'           BTST    #$12,D4        ; ret in A reg. Check b6=18-12
  228.     9E: 6604           10000A4          BNE.S   retA1          ; ret in A0 if 10, A1 if 11
  229.     A0: 2008           ' .'             MOVE.L  A0,D0          ; use A0 for return
  230.     A2: 600C           10000B0          BRA.S   retD1
  231.     A4: 2009           ' .'    retA1    MOVE.L  A1,D0          ; use A1 for return
  232.     A6: 6008           10000B0          BRA.S   retD1
  233.     A8: 0804 0012      '....'  retD0    BTST    #$12,D4        ; check b6=18-12 of control
  234.     AC: 6702           10000B0          BEQ.S   retD1          ; 0=> D0
  235.     AE: 2001           ' .'             MOVE.L  D1,D0          ; 00 is D0, 01 is D1
  236.     B0: 2057           ' W'    retD1    MOVEA.L (A7),A0
  237.     B2: 45E8 0D06      'E...'           LEA     $D06(A0),A2    ; MemError word??
  238.     B6: 0804 000E      '....'           BTST    #$E,D4         ; check b2=14-12 =>'Save' flag
  239.     BA: 6702           10000BE          BEQ.S   savMemErr      ; set means save
  240.     BC: 4252           'BR'             CLR     (A2)
  241.     BE: 0804 000F      '....'  savMemErr
  242.                                         BTST    #$F,D4         ; check b3=15-12
  243.     C2: 6702           10000C6          BEQ.S   noSave         ; clear means nosave
  244.     C4: 3480           '4.'             MOVE    D0,(A2)        ; stash status in MemError
  245.     C6: E884           '..'    noSave   ASR.L   #4,D4          ; shift control right by 4 bits
  246.     C8: 0244 0003      '.D..'           ANDI    #3,D4
  247.     CC: 0C44 0003      '.D..'           CMPI    #3,D4
  248.     D0: 6604           10000D6          BNE.S   boolVal
  249.     D2: 4880           'H.'             EXT     D0             ; sign extend word
  250.     D4: 6006           10000DC          BRA.S   longX
  251.     D6: 0C44 0001      '.D..'  boolVal
  252.                                         CMPI    #1,D4          ; is it boolean?
  253.     DA: 6602           10000DE          BNE.S   goExit         ; No.
  254.     DC: 48C0           'H.'    longX    EXT.L   D0             ; sign extend longword
  255.     DE: 6000 00FA      10001DA goExit   BRA     exit
  256.     ;
  257.     ; Toolbox traps
  258.     ;
  259.     E2: 2200           '".'    TBtrap   MOVE.L  D0,D1          ; trap descriptor into D1
  260.     E4: 343C 000F      '4<..'           MOVE    #15,D2         ; prepare to discard lower 15 bits
  261.     E8: E4A9           '..'             LSR.L   D2,D1          ; discard lower 5 args, get first
  262.     EA: 0241 0007      '.A..'           ANDI    #7,D1          ; mask off arg 1
  263.     EE: 0C41 0004      '.A..'           CMPI    #4,D1          ; 100=> VAR proc (illegal)
  264.     F2: 670A           10000FE          BEQ.S   Xception       ; More than 6 args=>exception
  265.     ;
  266.     ; regular toolbox trap.  Parse the rest of the descriptor field
  267.     ;
  268.     F4: 343C 000C      '4<..'           MOVE    #12,D2         ; it's a regular trap
  269.     F8: E5A0           '..'             ASL.L   D2,D0          ; shift out trap number
  270.     FA: 2800           '(.'             MOVE.L  D0,D4          ; D4 has control shifted 12 bits
  271.     FC: 600A           1000108          BRA.S   ProcFunc
  272.     ;
  273.     ; 'Exception' traps have more than the usual max of 6 args
  274.     ;
  275.     FE: E580           '..'    Xception
  276.                                         ASL.L   #2,D0          ; prepare to step by 4 bytes
  277.    100: 43FA 00DE      10001E0          LEA     Xfields,A1     ; Exception codes
  278.    ;
  279.    ; The exception trap must have low word with max 14 bits info since it's
  280.    ; left-shifted by 2 below. Currently only offsets 0..3 are employed.
  281.    ; Exception traps must have xxxy000z where z < 7 to fit into 512 bytes for the subroutine
  282.    ;
  283.    104: 2831 0000      '(1..'           MOVE.L  0(A1,D0.W),D4  ; revise control in D4
  284.    ;
  285.    ; Here is the normal entry point for procs or funcs
  286.    ;
  287.    108: 47FA 0086      1000190 ProcFunc
  288.                                         LEA     parsProc,A3    ; prepare for 'proc' service
  289.    10C: 2004           ' .'             MOVE.L  D4,D0          ; shifted control word
  290.    10E: 0280 C000 0000 '......'         ANDI.L  #$C0000000,D0  ; $11... is bool flag b19,18
  291.    ;                                          mask bits 19, 18 of original descriptor
  292.    114: 4A80           'J.'             TST.L   D0             ; check function/proc field
  293.    116: 671E           1000136          BEQ.S   ArgParsed      ; 00=> proc, 01=>word
  294.    ;                                                  10=> long, 11=> bool (byte)
  295.    ;            not a proc.  Must be 01 (word), 10 (longword), 11 (boolean)
  296.    118: 47FA 0066      1000180          LEA     LongRslt,A3    ; set up as 10 (longword)
  297.    11C: 598F           'Y.'             SUBQ.L  #4,A7          ; space for longword on stack
  298.    11E: 0800 001E      '....'           BTST    #$1E,D0        ; check bit 18 = 30-12 of lo fn
  299.    122: 6712           1000136          BEQ.S   ArgParsed      ; x0 => proc or long function
  300.    ;            must be 01 (word) or 11 (boolean)
  301.    124: 548F           'T.'             ADDQ.L  #2,A7          ; adjust stack for Word instead
  302.    126: 47FA 005C      1000184          LEA     WordRslt,A3    ; initialize for Word result
  303.    12A: 0800 001F      '....'           BTST    #$1F,D0        ; check bit 19=31-12 hi fn field
  304.    12E: 6706           1000136          BEQ.S   ArgParsed      ; 0x => word
  305.    ;
  306.    ; Fall-thru result is one-byte value (treated as boolean)
  307.    ;
  308.    130: 47FA 0056      1000188          LEA     BoolRslt,A3    ; set up for bool (use 2 bytes)
  309.    134: 4E71           'Nq'             NOP                    ; spacer for even address
  310.    136: 2004           ' .'    ArgParsed
  311.                                         MOVE.L  D4,D0          ; get shifted descriptor (parms)
  312.    138: E588           '..'             LSL.L   #2,D0          ; shift out Func/Proc flags
  313.    13A: 2C4C           ',L'             MOVEA.L A4,A6          ; A4 has Fortran arg
  314.    ;
  315.    ; Have done function/procedure analysis.  Now figure out the arguments.
  316.    ;
  317.    13C: 4A80           'J.'    parsArgs
  318.                                         TST.L   D0             ; Is parm field empty?
  319.    13E: 673C           100017C          BEQ.S   goTrap         ; Yes. => no args
  320.    ;
  321.    ; Field has arguments.  Parse them
  322.    ;
  323.    140: 2266           '"f'             MOVEA.L -(A6),A1       ; Fortran arg into A1
  324.    142: 0800 001F      '....'           BTST    #$1F,D0        ; check bit 17 =31-14 arg1 val/var
  325.    146: 6716           100015E          BEQ.S   ValArg         ; b17=0 => val, 1=> var
  326.    148: 2F09           '/.'             PUSH.L  A1             ; It's a VAR arg. Push address on stk
  327.    14A: 0800 001E      '....'           BTST    #$1E,D0        ; check bit 16 =30-14 size hi field
  328.    14E: 6728           1000178          BEQ.S   GetNextArg     ; 0x => proc or word result
  329.    ;      It's 1x:  10=>LongWord, 11=>Boolean
  330.    150: 0800 001D      '....'           BTST    #$1D,D0        ; check bit 15 =29-14 size lo
  331.    154: 6722           1000178          BEQ.S   GetNextArg     ; (1)0 => LongWord
  332.    ;      Fallthru is 11=> Boolean
  333.    156: 0291 0000 0001 '......'         ANDI.L  #1,(A1)        ; mask out all but first bit
  334.    15C: 601A           1000178          BRA.S   GetNextArg     ; fallthru: boolean
  335.    ;
  336.    15E: 2211           '".'    ValArg   MOVE.L  (A1),D1        ; get contents of val into D1
  337.    160: 0800 001E      '....'           BTST    #$1E,D0        ; check bit 16 =30-14  hi arg size
  338.    164: 670C           1000172          BEQ.S   ValWord        ; 0x => proc or word
  339.    ;      It's 1x: LongWord or Boolean
  340.    166: 0800 001D      '....'           BTST    #$1D,D0        ; check bit 15 = 29-14 lo size
  341.    16A: 670A           1000176          BEQ.S   ValLong        ; 10=> Long
  342.    ;      Fallthru is Boolean
  343.    16C: 4841           'HA'             SWAP    D1             ; swap hi/lo words of val
  344.    16E: 0241 0100      '.A..'           ANDI    #$100,D1       ; make it single byte value
  345.    ;                                                by modding by 256
  346.    ;
  347.    172: 3F01           '?.'    ValWord  PUSH    D1             ; Word result. Push word
  348.    174: 6002           1000178          BRA.S   GetNextArg
  349.    ;
  350.    176: 2F01           '/.'    ValLong  PUSH.L  D1             ; Longword result
  351.    178: E788           '..'    GetNextArg
  352.                                         LSL.L   #3,D0          ; process next argument
  353.    17A: 60C0           100013C          BRA     parsArgs
  354.    ;
  355.    ; Execute the trap by jumping to place where we stored the trap dispatch
  356.    ; Return will be via (A3)
  357.    ;
  358.    17C: 4EE8 0D08      'N...'  goTrap   JMP     $D08(A0)       ; Dope it out sometime ??
  359.    ;
  360.    ;  These are pointed to by A3 for returning the results to Fortran
  361.    ;
  362.    180: 201F           ' .'    LongRslt POP.L   D0             ; pop a LongWord
  363.    182: 600C           1000190          BRA.S   parsProc
  364.  
  365.  
  366.    184: 301F           '0.'    WordRslt
  367.                                         POP     D0             ; process result as a 'word'
  368.    186: 6006           100018E          BRA.S   xtend
  369.    ;
  370.    ;  Pascal boolean has 0=> False and 1=> True
  371.    ;  Fortran uses 0=> False and -1 => True ($FFFF....)
  372.    ;
  373.    188: 7000           'p.'    BoolRslt MOVEQ   #0,D0         ; Result is boolean (one byte)
  374.    18A: 101F           '..'             POP.B   D0
  375.    18C: 4440           'D@'             NEG     D0            ; Make Pascal 1 (true) into -1
  376.    18E: 48C0           'H.'    xtend    EXT.L   D0            ; sign-extend since Fortran
  377.    ;                                          uses FFF... as true
  378.    ;
  379.    190: 598C           'Y.'    parsProc
  380.                                         SUBQ.L  #4,A4         ; bump arg pointer
  381.    192: 2604           '&.'             MOVE.L  D4,D3         ; D3 has shifted control word
  382.    194: E58B           '..'             LSL.L   #2,D3         ; shift out the Func/Proc field
  383.    196: 4A83           'J.'    PopArg   TST.L   D3            ; any arguments to return?
  384.    198: 6740           10001DA          BEQ.S   exit          ; No.  Exit
  385.    ;
  386.    19A: 0803 001F      '....'           BTST    #$1F,D3       ; check bit 17 = 31-14 val/var flag
  387.    19E: 6716           10001B6          BEQ.S   PopNxtArg     ; 0=>val (nothing to return)
  388.    ;
  389.    ; It's a VAR parameter, so we have to return something back to Fortran
  390.    ;
  391.    1A0: 0803 001E      '....'           BTST    #$1E,D3      ; check bit 16 = 30-14 fn hi flag
  392.    1A4: 6710           10001B6          BEQ.S   PopNxtArg    ; 0x => proc (00) or word(01)
  393.    ;
  394.    ;      It's a LongWord (10) or Boolean (11) variable
  395.    ;
  396.    1A6: 0803 001D      '....'           BTST    #$1D,D3      ; check bit 15 = 29-14 fn lo flag
  397.    1AA: 670A           10001B6          BEQ.S   PopNxtArg    ; x0 => it's a LongWord (10)
  398.    ;
  399.    ;      fallthru case is Boolean.  Since Pascal uses 0 for False and 1 for True
  400.    ;      while Fortran uses 0 for False and -1 for True, we'll test for true and act on it.
  401.    ; Note: If ToolBox ever returns a single-byte var other than Boolean, Fortran would
  402.    ;       have problems here because we force it to return 0 (false) or -1 (true) only.
  403.    ;
  404.    1AC: 2654           '&T'             MOVEA.L (A4),A3      ; get value of result..
  405.    1AE: 2213           '".'             MOVE.L  (A3),D1      ; ..into D1
  406.    1B0: 6702           10001B4          BEQ.S   isFalse      ; Pascal 0 means False. Just exit
  407.    1B2: 72FF           'r.'             MOVEQ   #-1,D1       ; It's True, so we make Fortran true
  408.    1B4: 2681           '&.'    isFalse  MOVE.L  D1,(A3)      ; put bool back into A3
  409.  
  410.    1B6: E78B           '..'    PopNxtArg
  411.                                         LSL.L   #3,D3        ;Do next arg in control word
  412.    1B8: 598C           'Y.'             SUBQ.L  #4,A4        ; bump arg pointer
  413.    1BA: 60DA           1000196          BRA     PopArg
  414.    ;
  415.    ;  These 'Funny' traps aren't really traps.  One sets b31=1 for 'toolbox'
  416.    ; and sets b30=1 for 'funny'.  The low word in descriptor then has a
  417.    ; 'callnum' (0..2) that is used for PTR, GETGLOB, MEMERROR
  418.    ;
  419.    1BC: 103B 0006      10001C4 FunTrap
  420.                                         MOVE.B  jTable(D0.W),D0 ; get offset byte from table
  421.    1C0: 4EFB 0002      10001C4          JMP     jTable(D0.W) ; execute pseudo trap
  422.  
  423.    ;      These appear to be special PTR, GETGLOB, MEMERROR toolbx calls
  424.  
  425.    1C4: '.'                    jTable   DC.B    4          ;sPTR-jTable  offset to PTR
  426.    1C5: '.'                             DC.B    $A         ;sGetGl-jTable offset to GetGlobal
  427.    1C6: '.'                             DC.B    $10        ;sMemEr-jTable offset to MemError
  428.    1C7: '.'                             DC.B    0          ; end of table pad, force even addr
  429.    ; * * * * * * *
  430.    ;      Example:
  431.    ;* FUNCTION PTR (ANYTYPE) : PTR;
  432.    ;*      INTEGER PTR
  433.    ;*      PARAMETER (PTR=Z'C0000000')
  434.    ;
  435.    ; * * * * * * *
  436.    1C8: 202F 000C      ' /..'  sPTR     MOVE.L  12(A7),D0  ; get address of VAR into D0
  437.    1CC: 600C           10001DA          BRA.S   exit
  438.    ; * * * * * * *
  439.    ;      Example:
  440.    ;* FUNCTION GETGLOBAL : PTR;
  441.    ;*      INTEGER GETGLOBAL
  442.    ;*      PARAMETER (GETGLOBAL=Z'C0000001')
  443.    ;
  444.    ; * * * * * * *
  445.    1CE: 2028 FFFC      ' (..'  sGetGl   MOVE.L  -4(A0),D0   ; get address of globals
  446.    1D2: 6006           10001DA          BRA.S   exit
  447.    ; * * * * * * *
  448.    ;      Example:
  449.    ;* FUNCTION MEMERROR : OSERR;                      ; Returns last memory error.
  450.    ;*      INTEGER MEMERROR
  451.    ;*      PARAMETER (MEMERROR=Z'C0000002')
  452.    ;
  453.    ; * * * * * * *
  454.    1D4: 3028 0D06      '0(..'  sMemEr   MOVE    $D06(A0),D0   ; ?? check this out
  455.    1D8: 48C0           'H.'             EXT.L   D0            ; sign-extend
  456.    ;
  457.    1DA: 4CDF 4100      'L.A.'  exit     MOVEM.L (A7)+,A0/A6   ; restore regs and return
  458.    1DE: 4E75           'Nu'             RTS
  459.    ; * * * * * * *
  460.    ;
  461.    ; These are 'extended' parameter sets for calls that have more than 6 arguments.
  462.    ;
  463.    ; These exception codes begin at the 'FCN' field (usually bit19 in descriptor)
  464.    ; but here extended up to b31.  This enables us to have max of 10 arguments in
  465.    ; a toolbx call. Note that the 'control exception' flag (bit 29) is NOT used in
  466.    ; the implementation, even tho the earlier documentation on toolbx.sub said that
  467.    ; it was used.  Instead, 'exceptional traps' (viz. those that have more than six
  468.    ; arguments always set the 'function' field (bits 18 and 19 of descriptor) to '00'
  469.    ; and they always set the 'first arg' field (bits 17 to 15 of descriptor) to '100'
  470.    ; which flags them as VAR procedures (illegal).  The ACTUAL function descriptors
  471.    ; are stored as a table in toolbx.sub as given below.
  472.    ;
  473.    ; Note that entries 0 and 4 are identical, as are 2 and 5. Suggestion is that only
  474.    ; entries 0..3 are implemented??
  475.    ;
  476.                   ;-refs - toolbx2
  477.    1E0: 96CC A680    $96CCA680 Xfields                        ; entry 0 NewWindow
  478.                               ADDRL   com_3
  479.    1E4: 96CC 9250    $96CC9250          ADDRL   com_2         ; entry 1 NewControl
  480.    1E8: 96CC A690    $96CCA690          ADDRL   com_4         ; entry 2 NewDialog
  481.    1EC: 1645 2C40    $16452C40          ADDRL   com_7         ; entry 3 SFGetFile
  482.    1F0: 96CC A680    $96CCA680          ADDRL   com_3         ; entry 4 These not used ??
  483.    1F4: 96CC A690    $96CCA690          ADDRL   com_4         ; entry 5
  484.    1F8: B645 36D9    $B64536D9          ADDRL   com_5         ; entry 6
  485.    1FC: 0000 0000            0          ADDRL   com_6         ; entry 7
  486.  
  487.    1FE:                                 END
  488.    ;**************************************************************************************
  489.    ; The above longword fields are encoded argument lists.  Their structure is as
  490.    ; follows:
  491.    ; Encoded format for 'exceptional traps':
  492.    ;  ____________________________________________________________________________
  493.    ; |31 30 29  27 26  24 23  21 20  18 17  15 14  12 11   9 8    6 5    3 2     0|
  494.    ; | Fcn | Arg1 | Arg2 | Arg3 | Arg4 | Arg5 | Arg6 | Arg7 | Arg8 | Arg9 | Arg10 |
  495.    ; |____________________________________________________________________________|
  496.    ;
  497.    ; where Fcn and Argx have their usual meanings:
  498.    ;         _____
  499.    ; Fcn:   | 0 0 | Procedure
  500.    ;        | 0 1 | Word
  501.    ;        | 1 0 | Longword
  502.    ;        | 1 1 | Byte (boolean)
  503.    ;        |_____|
  504.    ;         ________________________
  505.    ; Argx:  |Val/Var |     Size      |  Val: 0 (Pass by value)  Var: 1 (Pass by address)
  506.    ;        |________|_______________|  Size: 2 bits with same meaning as 'Fcn' field
  507.    ;
  508.    ;**************************************************************************************
  509.    ; Entry 0: ToolBox trap number $A913 (NewWindow ).
  510.    ;          Encoded descriptor is $9132 0000. Xfield is $96CC A680.
  511.    ;           Note the '2' in the fourth nybble of descriptor.
  512.    ;             It's the $100 in 'Arg1' fieldand and is the flag for the 'exceptional trap'
  513.    ;
  514.    ;* FUNCTION NewWindow (WStorage: Ptr; BoundsRect: Rect; Title: Str255;
  515.    ;*                  Visible: Boolean; ProcID: Integer; Behind: WindowPtr;
  516.    ;*                  GoAwayFlag: Boolean; RefCon: LongInt): WindowPtr;
  517.    ;      INTEGER NEWWINDOW
  518.    ;      PARAMETER (NEWWINDOW=Z'91320000')
  519.    ;
  520.    ; the Xfield of $96CC A680 decodes to
  521.    ;  Lfunc, Lval, Lvar, Lvar, Bval, Wval, Lval, Bval, Lval ( a Long Function with 8 args)
  522.    ;
  523.    ;******
  524.    ; Entry 1: ToolBox trap number $A954 (NewControl).
  525.    ;          Encoded descriptor is $9542 0001. Xfield is $96CC 9250.
  526.    ;
  527.    ;* FUNCTION NewControl (TheWindow: windowPtr; BoundsRect: Rect; Title: Str255;
  528.    ;*                   Visible: Boolean; Value: Integer; Min,Max: Integer;
  529.    ;*                   ProcID: Integer; RefCon: LongInt): ControlHandle;
  530.    ;      INTEGER NEWCONTROL
  531.    ;      PARAMETER (NEWCONTROL=Z'95420001')
  532.    ;
  533.    ; the Xfield of $96CC 9250 decodes to
  534.    ;  Lfunc, Lval, Lvar, Lvar, Bval, Wval, Wval, Wval, Wval, Lval ( a Long Function with 9 args)
  535.    ;
  536.    ;*******
  537.    ; Entry 2: ToolBox trap number $A97D (NewDialog).
  538.    ;          Encoded descriptor is $97D2 0002. Xfield is $96CC A690.
  539.    ;
  540.    ;* FUNCTION NewDialog (DStorage: Ptr; BoundsRect: Rect; Title: Str255;
  541.    ;*                  Visible: Boolean; ProcID: Integer; Behind: WindowPtr;
  542.    ;*                  GoAwayFlag: Boolean; RefCon: LongInt; Items: Handle):
  543.    ;*                  DialogPtr;
  544.    ;      INTEGER NEWDIALOG
  545.    ;      PARAMETER (NEWDIALOG=Z'97D20002')
  546.    ;
  547.    ; the Xfield $96CC A690 decodes to
  548.    ; Lfunc, Lval, Lvar, Lvar, Bval, Wval, Lval, Bval, Lval, Lval ( a Long Function with 9 args)
  549.    ;
  550.    ; ********
  551.    ; Entry 3: ToolBox trap number $A9EA (Pack3).
  552.    ;          Encoded descriptor is $9EA2 0003.  Xfield is $1645 2C40.
  553.    ;
  554.    ;      NOTE that Absoft's toolbx.par file says 'selector' is the
  555.    ;            FIRST argument.  It's not.  It's the last.  See also stdfil.for
  556.    ;
  557.    ;* PROCEDURE SFGetFile ( where: Point; prompt: Str25;
  558.    ;*                   fileFilter: ProcPtr; numTypes: Integer;
  559.    ;*                   typeList: SFListPtr; dlgHook: ProcPtr;
  560.    ;*                   VAR reply: SFReply; selector: Integer;);
  561.    ;      INTEGER SFGETFILE                     |___<<< note
  562.    ;      PARAMETER (SFGETFILE=Z'9EA20003')
  563.    ;
  564.    ; the Xfield $1645 2C40 decodes to
  565.    ;   Proc, Lval, Lvar, Lval, Wval, Lval, Lval, Lvar, Wval ( a procedure with 8 args)
  566.    ;
  567.    ;  Here's how it's called in stdfil.for.  Note the last '2' is the 'selector'
  568.    ;          call toolbx(SFGETFILE,where,0,0,n,toolbx(PTR,types),
  569.    ;     +                      0,reply,2)
  570.    ;------->------->------->------>---->|____<<< note
  571.    ;
  572.    ;**************************************************************************************
  573.