home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / debug / ddtz27.ark / CCINSTAL.MAC < prev    next >
Text File  |  1986-01-25  |  7KB  |  248 lines

  1. title    'CCPLUS/DDT INSTALLER - load and lock in CCPLUS'
  2. ; ***************************************
  3. ; * Copyright (C) 1986    86/01/06    *
  4. ; *                    *
  5. ; * by    C.B. Falconer    (203) 281-1438    *
  6. ; *    680 Hartford Tpk.        *
  7. ; *    Hamden, Conn. 06517        *
  8. ; *                    *
  9. ; * All rights reserved            *
  10. ; ***************************************
  11. ;
  12. ; Modified from RELOCCP (RSX12 package) for quick CCPLUS installation
  13. ;    ****    SEE CCPLOCK.MAC for instructions    ****
  14. ;
  15. ; 86/1/26 Revised to handle the non-std Osborne I system.
  16. ;
  17. ; Relocate a program, by pages, to reside below BDOS. The program to
  18. ; be relocated is at 0200h up, assembled as if it begins at location
  19. ; 0. Following the program code proper is a relocation bit map. Each
  20. ; byte specifies relocation for 8 bytes of the program, with the ms
  21. ; bit of the relocation byte corresponding to the lower of the 8
  22. ; object bytes.
  23. ;    The 0 based image at location 0200h is:
  24. ;        jmp somewhere;    the entry point.
  25. ;        dw  codesize;    to be moved/relocated
  26. ;        db  pages;    of memory required, total
  27. ;
  28. ; The bit image is formed by comparing the code image with another
  29. ; assembled for org 100.  See "makeprl" and "vect" below for details.
  30. ;
  31. ; The first execution of this system forms the relocation bit vector
  32. ; from the two images, and self-modifies to become a loader on the
  33. ; next execution.
  34. ;
  35.     aseg;            For M80
  36. ;
  37. true    equ    -1
  38. false    equ    not true
  39. ;
  40. ; Set this true to create a loader for non-standard systems, such
  41. ; as the Osborne I, which do not supply the necessary 12 stack bytes.
  42. ; The system then can no longer "ret" to CCP, which is not needed
  43. ; for a CCP or equivalent loader anyhow.
  44. badccp    equ    true
  45. ;
  46. ; cp/m values
  47. cout    equ    2
  48. tstr    equ    9
  49. reboot    equ    0
  50. bdos    equ    5
  51. @bdos    equ    bdos+1
  52. ;
  53.     org    0100h
  54. ;
  55.     if    badccp;        RET to CCP not available.
  56.      lxi    sp,@prgimg
  57.     endif
  58.     lxi    h,@prgimg+3
  59.     mov c,m    ! inx h ! mov b,m;    get size
  60.     inx h    ! mov a,m;        pages
  61.     lxi    h,@prgimg
  62.     mov d,h    ! mov e,l;    save pointer to start
  63.     dad    b;        ^ to 1st relocation byte
  64. ;    "    "
  65. ; (a) is pages, (bc) is size, (de) is start, (hl) is reloc bits
  66. ;    "    "
  67. ; The following location, after forming the relocation bits,
  68. ; is automatically patched to be "jmp relocup".
  69. patch:    jmp    makeprl;    on 1st execution only
  70. ;    "    "        fall through as noted above
  71. ; do relocation, move and execute
  72. ; (a) is pages, (bc) is size, (de) is start, (hl) is reloc bits
  73. relocup:
  74.     push    h
  75.     lxi    h,reboot
  76.     shld    patch+1;    prevent re-execution
  77.     lhld    @bdos;        form origin for relocated
  78.     cma;                code on page boundary
  79.     add    h;        Truncate bdos ptr downward
  80.     adi    1;        can allow for extra space
  81.     pop    h;        ^ relocation bits
  82. ;    "    "
  83. ; relocate the image (de)^, length (bc), in place, by (a) pages,
  84. ; using the bit vector at (hl).  At completion the image is ready to
  85. ; be moved into place at location (a) [entry] * 256.
  86. ; h,l
  87. reloc:    push    b;        save    length
  88.     push    d;            & pointer to image
  89.     push    psw;            & relocation amount
  90.     call    vlength;    form bit vector length
  91. reloc1:    pop    psw
  92.     push    b;        save byte counter
  93.     push    psw;        relocation amount
  94.     mvi    c,8
  95.     mov    b,m;        get reloc bits
  96.     xchg
  97. reloc2:    mov a,b    ! add a ! mov b,a
  98.     jnc    reloc3;        dont relocate this
  99.     pop    psw;        relocation amount
  100.     push    psw
  101.     add m    ! mov m,a
  102. reloc3:    inx    h;        next obj byte
  103.     dcr c    ! jnz reloc2;    more bits to scan
  104.     xchg
  105.     inx    h;        next reloc bit vector
  106.     pop    psw
  107.     pop    b
  108.     push    psw
  109.     dcx b    ! mov a,b ! ora c
  110.     jnz    reloc1;        more
  111.     pop    h;        h := pushed a
  112.     mov    l,b;        0, form origin
  113.     pop    d;        ^image
  114.     pop    b;        restore length
  115. ;    "    "        relocation done
  116.     push    h;        save as execution point, move exit
  117. ;    "    "
  118. ; move (bc) bytes from (de)^ to (hl)^.  (bc) <> 0 on entry.
  119. ; a,f,b,c,d,e,h,l
  120. move:    ldax d    ! mov m,a;    move relocated code
  121.     inx d    ! inx h ! dcx b
  122.     mov a,b    ! ora c
  123.     jnz    move
  124.     ret;            execute relocated code
  125. ;
  126. ; form length of relocation bit vector = ((bc)+7) DIV 8)
  127. ; a,f,b,c
  128. vlength:
  129.     push    h;        round size up to multiple of 8
  130.     lxi h,7    ! dad b
  131.     mov c,l    ! mov b,h
  132.     pop    h
  133. ;    "    "
  134. ; shift (bc) right 3 places, 0s in
  135. ; a,f,b,c
  136. bcrz3:    call    bcrz
  137. ;    "    "
  138. ; shift (bc) right 2 places, 0s in
  139. ; a,f,b,c
  140. bcrz2:    call    bcrz
  141. ;    "    "
  142. ; shift (bc) right, inserting zero bit
  143. ; a,f,b,c
  144. bcrz:    ora    a;        clear any cy
  145.     mov a,b    ! rar ! mov b,a
  146.     mov a,c    ! rar ! mov c,a
  147.     ret
  148. ;
  149. ; make relocatable code file from double image at 0200h up
  150. ; A 2nd image is located immediately above the zero based
  151. ; image, assembled for origin at 0100h.
  152. makeprl:
  153.     push    h
  154.     lxi    h,relocup
  155.     shld    patch+1;    next execution moves
  156.     pop    h
  157. ;    "    "
  158. ; make bit vector. At entry:
  159. ;     (bc) = bytes to examine
  160. ;    (de) = ^0 based image
  161. ;    (hl) = ^0100h based image, and to start of bit
  162. ;        vector storage area.
  163. ; At exit (hl) points to free byte above computed relocation vector.
  164. ; a,f,b,c,d,e,h,l
  165. vect:    call    vlength;    form bit vector length
  166.     push    b;        save vector byte counter
  167.     push    h;        save vector storage ptr.
  168. vect1:    lxi    b,8;        bit count and zero reloc byte
  169. vect2:    ldax    d
  170.     sub    m
  171.     adi    1;        carry if difference was 1
  172.     mov    a,b
  173.     adc    a;        2*a+cy
  174.     mov    b,a
  175.     inx d    ! inx h
  176.     dcr c    ! jnz vect2;    same vector byte
  177.     pop    b;        ^vector storage
  178.     stax    b;        save vector byte
  179.     inx    b
  180.     xthl;            save ^1 based,
  181.     dcx    h;        get & decrement ctr
  182.     mov a,h    ! ora l
  183.     xthl;            restack counter
  184.     push    b;        and vector pointer
  185.     jnz    vect1;        more bytes to generate
  186.     pop    h;        point to next free byte
  187.     pop    b;        purge stack
  188. ;    "    "
  189.     push    h
  190.     lxi    d,pgmsg
  191.     mvi    c,tstr
  192.     call    bdos
  193.     pop h    ! dcx h;    ^last used byte
  194.     push h    ! mov a,h
  195.     call    tadzs;        signal pages to save
  196.     pop    h
  197.     mov a,l    ! ora a
  198.     jm    reboot;        last 1/2 page used
  199.     mov    a,h
  200.     dcr    a
  201.     push    psw
  202.     mvi    a,'('
  203.     call    couta;        signal usage for "SAVE nn+"
  204.     pop    psw;        available in CCPLUS
  205.     call    tadzs
  206.     mvi    a,'+'
  207.     call    couta
  208.     mvi    a,')'
  209.     call    couta
  210.     jmp    reboot
  211. ;
  212. ; output (a) in dec. to console, no leading zeroes
  213. ; a,f,b,c,d,e,h,l
  214. tadzs:    mov l,a    ! mvi h,0
  215. ;    "    "
  216. ; output (hl) in dec. to console. Suppress leading zeros.
  217. ; a,f,b,c,d,e,h,l
  218. tdzs:    lxi    b,0f00ah;    c=divisor=1 , b=iter cnt=-16
  219.     xra    a;        clear
  220. tdzs1:    dad    h;        m := (hl)/10; rdr to (a)
  221.     ral;            shift off into (a)
  222.     cmp    c;        test
  223.     jc    tdzs2;        no bit
  224.     sub    c;        bit = 1
  225.     inx    h
  226. tdzs2:    inr b    ! jm tdzs1;    not done
  227.     push    psw;        save output digit
  228.     mov a,h    ! ora l
  229.     cnz    tdzs;        not left digit, recursive
  230.     pop    psw;        last unlisted digit
  231.     adi    '0'
  232. ;     "    "
  233. ; output (a) to console
  234. ; a,f,b,c,d,e,h,l
  235. couta:    mov    e,a;        output (a) to console
  236.     mvi    c,cout
  237.     jmp    bdos;        and exit
  238. ;
  239. pgmsg:    if    NOT badccp
  240.      db    'Now '
  241.     endif
  242.     db    'SAVE $'
  243. ;
  244. ; Where the zero based program image belongs.
  245. @prgimg    equ    ($+0ffh) AND 0ff00h
  246. ;
  247.     end
  248. W