C P / M   6 8 0 0 0   A s s e m b l e r		Revision 02.03		Page   1
Source File: ccpload.s

   1                               *****************************************************************
   2                               *                                                               *
   3                               *               COMMAND FILE LOADER FOR CPM68K                  *
   4                               *               ==============================                  *
   5                               *                                                               *
   6                               *       (c)     COPYRIGHT Digital Research 1983                 *
   7                               *               all rights reserved                             *
   8                               *                                                               *
   9                               *       THIS IS THE DUAL PROCESSOR,ROMABLE CP/M-68K SYSTEM      *
  10                               *       ==================================================      *
  11                               *                                                               *
  12                               *       Description:                                            *
  13                               *       -----------     The command file loader is envoked by   *
  14                               *                       the CCP after the CCP has successfully  *
  15                               *                       opened that file.  The loader must      *
  16                               *                       call the BDOS to obtain the boundries   *
  17                               *                       of the TPA.  The load parameter block   *
  18                               *                       defined in this loader holds all the    *
  19                               *                       memory size and location details.       *
  20                               *                       Next the loader returns the system to   *
  21                               *                       its original user #.  The CCP might     *
  22                               *                       have switched to user zero during its   *
  23                               *                       search for the file.  Next the default  *
  24                               *                       dma address is set for the loaded       *
  25                               *                       program.  Next the command tail is      *
  26                               *                       placed,along with the first two parsed  *
  27                               *                       fcb's,into the user basepage.           *
  28                               *                       Lastly the user stack pointer is set up *
  29                               *                       and the return address is put on the    *
  30                               *                       user stack.  An RTE transferes control. *
  31                               *                       If a load was not successfull, the      *
  32                               *                       appropriate error message is printed.   *
  33                               *                                                               *
  34                               *       Created by:     Tom Saulpaugh                           *
  35                               *                                                               *
  36                               *       Last Modified:  3/02/83                                 *
  37                               *                                                               *
  38                               *****************************************************************
  39                               
  40                               
  41                               
  42                                       .globl _load68k         * make this procedure public
  43                                       .globl _user            * global user # before load occured
  44                                       .globl _cmdfcb          * parsed fcb
  45                                       .globl _tail            * global pointer to command tail
  46                                       .globl _fill_fcb        * procedure to fill fcb's
  47                                       .globl flags            * ROM SYSTEM INITIALIZATION
  48                                       .globl TPAB             * ROM SYSTEM INITIALIZATION
  49                               
  50                               
  51                               reboot   =  0
  52                               printstr =  9
  53                               setdma   = 26
  54                               chuser   = 32
  55                               pgmldf   = 59
C P / M   6 8 0 0 0   A s s e m b l e r		Revision 02.03		Page   2
Source File: ccpload.s

  56                               gettpa   = 63
  57                               
  58                               _load68k:
  59                               *
  60                               *       Load the 68k file into the TPA
  61                               *       ------------------------------
  62                               * 
  63 00000000                              .text
  64                               
  65 00000000 223C00000016                 move.l  #TPAB,d1        * move in address of tpa parameter block
  66 00000006 303C003F                     move.w  #gettpa,d0      * get function number
  67 0000000A 4E42                         trap    #2              * get the tpa limits 
  68 0000000C 23F90000001800000004         move.l  low,lowadr      * put it in the lpb
  69 00000016 23F90000001C00000008         move.l  high,hiadr      * put high tpa addr in lpb
  70 00000020 23FC0000000000000000         move.l  #_cmdfcb,LPB    * get address of opened fcb
  71 0000002A 703B                         move.l  #pgmldf,d0      * move in bdos function no
  72 0000002C 223C00000000                 move.l  #LPB,d1         * d1 points to load block
  73 00000032 4E42                         trap    #2              * do the program load
  74 00000034 4A40                         tst     d0              * was the load successful?
  75 00000036 66000096                     bne     lderr           * if not print error message and return
  76                               *
  77                               *       return to original user #
  78                               *       -------------------------
  79 0000003A 323900000000                 move.w  _user,d1        * put user # to switch to in d1
  80 00000040 7020                         move.l  #chuser,d0      * put bdos func # in d0
  81 00000042 4E42                         trap    #2              * do the user # change
  82                               *
  83                               *       set the default dma address
  84                               *       ---------------------------
  85 00000044 4281                         clr.l   d1              * clear d1 register
  86 00000046 22390000000C                 move.l  baspag,d1       * d1 points to user base page
  87 0000004C D27C0080                     add     #$80,d1         * d1 points to default dma in base page
  88 00000050 2241                         movea.l d1,a1           * save it for later use
  89 00000052 701A                         move    #setdma,d0      * move in bdos function no
  90 00000054 4E42                         trap    #2              * set the default dma address
  91                               *
  92                               *       move in the command tail
  93                               *       ------------------------
  94 00000056 2449                         move.l  a1,a2           * save a pointer to the count field
  95 00000058 5289                         add.l   #$01,a1         * point past count field
  96 0000005A 207900000000                 move.l  _tail,a0        * point to command tail
  97 00000060 4280                         clr.l   d0              * clear out d0
  98 00000062 0C100000             mvtail: cmpi.b  #$00,(a0)       * check for a NULL ending byte
  99 00000066 670C                         beq     done            * NULL byte terminates command
 100 00000068 0C100021                     cmpi.b  #$21,(a0)       * check for an '!'
 101 0000006C 6706                         beq     done            * '!' ends the command
 102 0000006E 12D8                         move.b  (a0)+,(a1)+     * move a byte of the command tail
 103 00000070 5240                         addq    #1,d0           * bump up the character count
 104 00000072 60EE                         bra     mvtail          * continue byte move
 105 00000074 1480                 done:   move.b  d0,(a2)         * put in the character count
 106 00000076 12BC0000                     move.b  #$00,(a1)       * terminate cmd tail with a NULL byte
 107                               *
 108                               *       fill fcb1 & fcb2
 109                               *       ----------------
 110 0000007A 2F3C00000000                 move.l  #_cmdfcb,-(sp)  * put address of fcb buffer onto stack
C P / M   6 8 0 0 0   A s s e m b l e r		Revision 02.03		Page   3
Source File: ccpload.s

 111 00000080 3F3C0001                     move.w  #1,-(sp)        * put 1 on stack(parm1) 
 112 00000084 4EB900000000                 jsr     _fill_fcb       * jump to 'C' code & fill cmdfcb with parm1
 113 0000008A 5C8F                         add.l   #6,sp           * clean off the stack
 114 0000008C 4280                         clr.l   d0              * clear register d0
 115 0000008E 705C                         moveq   #$5c,d0         * put basepage address of fcb1 in d0
 116 00000090 6142                         bsr     movfcb          * put fcb1 in the basepage
 117 00000092 2F3C00000000                 move.l  #_cmdfcb,-(sp)  * put address of fcb buffer onto stack
 118 00000098 3F3C0002                     move.w  #2,-(sp)        * put 2 on stack(parm2)
 119 0000009C 4EB900000000                 jsr     _fill_fcb       * jump to 'C' code & fill cmdfcb with parm2
 120 000000A2 5C8F                         add.l   #6,sp           * clean off the stack
 121 000000A4 4280                         clr.l   d0              * clear register d0
 122 000000A6 7038                         moveq   #$38,d0         * put basepage address of fcb1 in d0
 123 000000A8 612A                         bsr     movfcb          * put fcb2 in the basepage
 124                               *
 125                               *       now push rte stuff on stack
 126                               *       ---------------------------
 127 000000AA 207900000010                 movea.l usrstk,a0       * get user stack pointer
 128 000000B0 22790000000C                 move.l  baspag,a1       * get basepage address
 129 000000B6 2F290008                     move.l  8(a1),-(sp)     * push address we want to jump to
 130 000000BA 40C0                         move    sr,d0           * get the status register in d0
 131 000000BC 02405F00                     andi    #$5f00,d0       * mask trace,system bits,user flags
 132 000000C0 3F00                         move.w  d0,-(sp)        * push it on stack
 133 000000C2 2109                         move.l  a1,-(a0)        * push addr of basepage onto user stack
 134 000000C4 213C000000D0                 move.l  #cmdrtn,-(a0)   * push return address onto user stack
 135 000000CA 4E60                         move.l  a0,usp          * set up user stack pointer
 136 000000CC 4E73                         rte
 137                               *
 138                               *       load error
 139                               *       ----------
 140                               lderr:
 141 000000CE 4E75                         rts                     * return with error code in d0
 142                               cmdrtn:
 143 000000D0 7000                         move    #reboot,d0      * reboot CPM
 144 000000D2 4E42                         trap    #2
 145                               movfcb:
 146 000000D4 D0B90000000C                 add.l   baspag,d0       * get offset into basepage 
 147 000000DA 2040                         move.l  d0,a0           * move address into a0
 148 000000DC 227C00000000                 move.l  #_cmdfcb,a1     * a1 points to fcb to be moved
 149 000000E2 4280                         clr.l   d0              * clear register d0
 150 000000E4 7023                         moveq   #35,d0          * get length of fcb
 151                               mov1:
 152 000000E6 10D9                         move.b  (a1)+,(a0)+     * move a byte into the basepage
 153 000000E8 51C8FFFC                     dbf     d0,mov1         * if not done branch to mov1            
 154 000000EC 4E75                         rts
 155                               
 156                               
 157 00000000                              .bss
 158                               
 159                                       .even
 160                               *
 161                               * LOAD PARAMETER BLOCK
 162                               *
 163 00000000                      LPB:     .ds.l   1
 164 00000004                      lowadr:  .ds.l   1
 165 00000008                      hiadr:   .ds.l   1
C P / M   6 8 0 0 0   A s s e m b l e r		Revision 02.03		Page   4
Source File: ccpload.s

 166 0000000C                      baspag:  .ds.l   1
 167 00000010                      usrstk:  .ds.l   1
 168 00000014                      flags:   .ds.w   1
 169                               
 170                               *
 171                               * TPA Parameter Block
 172                               *
 173                                       .even
 174 00000016                      TPAB:   .ds.w   1
 175 00000018                      low:    .ds.l   1
 176 0000001C                      high:   .ds.l   1
 177                               
 178                               
 179                               
 180                               
 181                               
 182                               
 183                               
 184                               
 185                               
 186                               
 187                               
 188 00000020                              .end
C P / M   6 8 0 0 0   A s s e m b l e r		Revision 02.03		Page   5
Source File: ccpload.s

S y m b o l   T a b l e

LPB       00000000 BSS   TPAB      00000016 BSS   _cmdfcb   ******** EXT   _fill_fc  ******** EXT   
_load68k  00000000 TEXT  _tail     ******** EXT   _user     ******** EXT   baspag    0000000C BSS   
chuser    00000020 ABS   cmdrtn    000000D0 TEXT  done      00000074 TEXT  flags     00000014 BSS   
gettpa    0000003F ABS   hiadr     00000008 BSS   high      0000001C BSS   lderr     000000CE TEXT  
low       00000018 BSS   lowadr    00000004 BSS   mov1      000000E6 TEXT  movfcb    000000D4 TEXT  
mvtail    00000062 TEXT  pgmldf    0000003B ABS   printstr  00000009 ABS   reboot    00000000 ABS   
setdma    0000001A ABS   usrstk    00000010 BSS   