home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / debug / wadesrc.lbr / WADE.AZM / WADE.ASM
Assembly Source File  |  1988-06-19  |  3KB  |  202 lines

  1.     title    'Starter for WADE'
  2. ;
  3. ;    Last Edited    85-04-27    Wagner
  4. ;
  5. ;    Copyright (c) 1984, 1985 by
  6. ;
  7. ;        Thomas Wagner
  8. ;        Patschkauer Weg 31
  9. ;        1000 Berlin 33
  10. ;        West Germany
  11. ;
  12. ;       Released to the public domain 1987
  13. ;
  14.     maclib    z80
  15.     maclib    monopt
  16. ;
  17. ;
  18. monstart:
  19.     lxi    sp,stack
  20. ;
  21.     IF    NOT cpm3
  22.     call    prlmove
  23.     ENDIF
  24. ;
  25.     lxi    d,signon
  26.     mvi    c,9
  27.     call    5
  28. ;
  29.     lhld    6        ; start location
  30.     mov    a,h
  31.     rrc
  32.     rrc
  33.     rrc
  34.     rrc
  35.     call    hexdig
  36.     sta    protadr
  37.     mov    a,h
  38.     call    hexdig
  39.     sta    protadr+1
  40. ;
  41.     lxi    d,initpar
  42.     mvi    c,60
  43.     call    5
  44. ;
  45. nomonerr:
  46.     lxi    d,monerr
  47.     mvi    c,9
  48.     call    5
  49.     jmp    0
  50. ;
  51. hexdig:
  52.     ani    0fh
  53.     adi    '0'
  54.     cpi    '9'+1
  55.     rc
  56.     adi    'A'-'0'-10
  57.     ret
  58. ;
  59. ;
  60. signon    db    'WADE 1.5 - Wagner 85-04-27  '
  61.     IF    cpm3
  62.     db    '(CP/M 3 Version'
  63.     ELSE
  64.     db    '(TurboDos & CP/M 2 Version'
  65.     ENDIF
  66.     IF    extended
  67.     db    ', Extended Adressing'
  68.     IF    mega
  69.     db    ' [Mega]'
  70.     ENDIF
  71.     ENDIF
  72.     db    ')',0dh,0ah,'$'
  73. ;
  74. monerr    db    'ERROR, WADE-RSX not present',0dh,0ah,'$'
  75. ;
  76. initpar:
  77.     db    0,0
  78.     dw    protstr
  79. ;
  80. protstr    db    'RPC >= '
  81. protadr    db    '0000',0
  82. ;
  83. ;
  84.     IF    NOT cpm3
  85. ;
  86. monname    db    'MONIT   '
  87. ;
  88. prlmove:
  89.     lxi    h,pgmend+100h+16    ; end of this program + PRL-header
  90.     lxi    b,300h            ; max number of bytes to search
  91. ;
  92. prlsearch:
  93.     push    h
  94.     push    b
  95.     lxi    d,monname
  96.     mvi    b,8
  97. prlcomp:
  98.     ldax    d
  99.     cmp    m
  100.     jrnz    notfound
  101.     inx    d
  102.     inx    h
  103.     djnz    prlcomp
  104.     pop    b
  105.     pop    h        ; we have the address
  106.     jr    moveprl
  107. ;
  108. notfound:
  109.     pop    b
  110.     pop    h
  111.     inx    h
  112.     dcx    b
  113.     mov    a,b
  114.     ora    c
  115.     jrnz    prlsearch
  116.     jmp    nomonerr
  117. ;
  118. moveprl:
  119.     lxi    d,100h+16
  120.     ora    a
  121.     dsbc    d        ; PRL header starts at RSX-name field - 110h
  122. ;
  123.     push    h
  124.     inx    h
  125.     mov    c,m
  126.     inx    h
  127.     mov    b,m        ; program size
  128.     inx    h
  129.     inx    h
  130.     mov    e,m
  131.     inx    h
  132.     mov    d,m        ; additional memory
  133.     xchg
  134.     dad    b        ; program size + addtl mem
  135.     lda    7        ; high byte of bdos-addr
  136.     dcr    a        ; 100h less to be safe
  137.     sub    h        ; subtract total program length
  138.     mov    d,a
  139.     mvi    e,0
  140.     pop    h        ; PRL-file start
  141.     push    b        ; save program size
  142.     push    d        ; start of program
  143.     lxi    d,100h
  144.     dad    d        ; point after PRL-header
  145.     pop    d
  146.     push    d
  147. ;
  148.     ldir            ; move program into correct location
  149. ;
  150.     pop    d        ; start of program
  151.     pop    b        ; program size
  152.     push    d        ; save program start again
  153.     push    h        ; save bitmap addr
  154.     mov    h,d        ; high byte of prog start = offset
  155.     dcr    h        ; - 100h
  156. ;
  157. relocloop:
  158.     mov    a,b
  159.     ora    c
  160.     jz    reldone        ; ready if all bytes relocated
  161.     dcx    b
  162.     mov    a,e
  163.     ani    7        ; new byte ?
  164.     jnz    samebyte
  165.     xthl
  166.     mov    a,m        ; get next reloc byte
  167.     inx    h
  168.     xthl
  169.     mov    l,a
  170. samebyte:
  171.     mov    a,l
  172.     ral
  173.     mov    l,a
  174.     jnc    nooff        ; no offset if bit clear
  175.     ldax    d
  176.     add    h        ; else add offset
  177.     stax    d
  178. nooff:
  179.     inx    d
  180.     jmp    relocloop
  181. ;
  182. reldone:
  183.     pop    d
  184.     pop    h    ; program start
  185.     mvi    l,6
  186.     lded    6    ; get old BDOS entry
  187.     shld    6    ; set new BDOS entry
  188.     lxi    b,4
  189.     dad    b    ; point to "next" address in RSX-Header
  190.     mov    m,e    ; store old BDOS addr at "next" in RSX-Header
  191.     inx    h
  192.     mov    m,d
  193.     ret
  194. ;
  195.     ENDIF
  196. ;
  197. pgmend:
  198. stack    equ    pgmend+100h
  199. ;
  200.     end    monstart
  201. 
  202.