home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / asmutl / maksrl.lbr / MAKSRL.MQC / MAKSRL.MAC
Encoding:
Text File  |  1986-11-29  |  6.1 KB  |  386 lines

  1. ; MAKSRL - PROGRAM TO MAKE SELF-RELOCATING PROGRAM
  2. ; DASM'D AND MOD'D FROM MAKELUX 03/29/85 BY RDL
  3. ;
  4. ;  LAST CHANGED 04/01/85 RDL
  5. ;
  6.     NAME    ('MAKSRL')
  7. ;
  8. ; Thi≤ prograφ wil∞ creatσ ß self-relocatinτ program¼ tha⌠ is¼ ß 
  9. ;ááááprograφ whicΦ automaticall∙ relocate≤ itselµ t∩ higΦ memor∙ 
  10. ;ááááupoε beginninτ execution«  MAKSR╠ i≤ invokeΣ witΦ ß file-
  11. ;áááánamσ heade≥ whicΦ identifie≤ thσ tw∩ sourcσ file≤ describeΣ 
  12. ;áááábelow¼ anΣ thσ destinatioε file«  Thσ header¼ <hedr>¼ ma∙ 
  13. ;áááácontaiε ß drivσ designation«  MAKSR╠ require≤ tw∩ sourcσ 
  14. ;ááááfiles¼ botΦ oµ whicΦ mus⌠ bσ createΣ b∙ L8░ froφ thσ SAM┼ 
  15. ;áááá.RE╠ file«  Thσ firs⌠ file¼ <hedr>.CO0¼ i≤ createΣ witΦ 
  16. ;ááááL80'≤ /P:░ option«  Thσ seconΣ file¼ <hedr>.CO1¼ i≤ createΣ 
  17. ;áááánormally¼ o≥ witΦ /P:100«  Iµ botΦ oµ thesσ arσ found¼ 
  18. ;ááááMAKSR╠ create≤ <hedr>.CO═ whicΦ contain≤ thσ codσ froφ 
  19. ;áááá<hedr>.RE╠ anΣ ß loade≥ whicΦ relocate≤ thσ codσ t∩ higΦ 
  20. ;áááámemory«  A≤ aε example¼ thσ commanΣ MAKSR╠ LU╪ wil∞ creatσ 
  21. ;ááááLUX.CO═ froφ LUX.CO░ anΣ LUX.CO1.
  22. ;
  23. ;
  24. ;    SET THE FOLLOWING PARAMATER BEFORE ASSEMBLY
  25. COMBEG    EQU    100H    ;BEGINNING ADDRESS OF FINISHED .COM FILE
  26. ;
  27. ;
  28.     .Z80
  29.     ASEG
  30.     ORG    100H
  31. ;
  32. BDOS    EQU    0005H
  33. EXIT    EQU    0000H
  34. ;
  35. CR    EQU    0DH
  36. LF    EQU    0AH
  37. ;
  38. OPEN    EQU    15    ;OPEN FILE FUNCTION
  39. CLOSE    EQU    16    ;CLOSE FILE FUNCTION
  40. DELETE    EQU    19    ;DELETE FILE FUNCTION
  41. RDSEQ    EQU    20    ;READ SEQUENTIAL FUNCTION
  42. WRTSEQ    EQU    21    ;WRITE SEQUENTIAL FUNCTION
  43. MAKEF    EQU    22    ;MAKE FILE FUNCTION
  44. SETDMA    EQU    26    ;SET DMA FUNCTION
  45. ;
  46.     $EJECT
  47. ;
  48. ;
  49. ;    START OF EXECUTABLE CODE
  50. ;
  51. MAKSRL:    LD    SP,(BDOS+1)    ;SET STACK POINTER
  52. ;
  53.     LD    A,(05DH)    ;CHECK IF FILE NAME ENTERED
  54.     CP    ' '
  55.     JR    NZ,MKL000
  56.     CALL    ILPRNT
  57.     '  No file name specified', CR, LF, 0
  58.     JP    EXIT
  59. ;
  60. MKL000:    LD    HL,5CH        ;COPY FILE NAME HEDR TO CO0FCB
  61.     LD    DE,CO0FCB
  62.     LD    BC,9
  63.     LDIR
  64. ;
  65.     LD    HL,5CH        ;COPY FILE NAME HEDR TO CO1FCB
  66.     LD    DE,CO1FCB
  67.     LD    BC,9
  68.     LDIR
  69. ;
  70.     LD    HL,5CH        ;COPY FILE NAME HEDR TO COMFCB
  71.     LD    DE,COMFCB
  72.     LD    BC,9
  73.     LDIR
  74. ;
  75. ;
  76. ;    OPEN THE ORG 0 IMAGE FILE
  77. ;
  78.     LD    DE,CO0FCB
  79.     LD    C,OPEN
  80.     CALL    BDOS
  81.     INC    A
  82.     JR    NZ,MKL002
  83.     CALL    ILPRNT
  84.     DB    '  .CO0 open error', CR, LF, 0
  85.     JP    EXIT
  86. ;
  87.     $EJECT
  88. ;
  89. ;
  90. ;    READ THE ORG 0 IMAGE INTO PLACE
  91. ;
  92. MKL002:    LD    HL,RELCOD-80H
  93. ;
  94. MKL003:    LD    DE,80H
  95.     ADD    HL,DE
  96.     PUSH    HL
  97.     EX    DE,HL
  98.     LD    C,SETDMA
  99.     CALL    BDOS
  100.     LD    DE,CO0FCB
  101.     LD    C,RDSEQ
  102.     CALL    BDOS
  103.     POP    HL
  104.     OR    A
  105.     JR    Z,MKL003
  106. ;
  107.     LD    (ENDPTR),HL
  108.     LD    DE,RELCOD
  109.     XOR    A
  110.     SBC    HL,DE
  111.     LD    (LENGTH+OFFSET),HL
  112. ;
  113.     $EJECT
  114. ;
  115. ;
  116. ;    SET UP TO READ CO1
  117. ;
  118.     LD    DE,CO1FCB
  119.     LD    C,OPEN
  120.     CALL    BDOS
  121.     INC    A
  122.     JR    NZ,MKL004
  123.     CALL    ILPRNT
  124.     DB    '  .CO1 open error', CR, LF, 0
  125.         JP    EXIT
  126. ;
  127. ;
  128. ;    CREATE REL BIT MAP
  129. ;
  130. MKL004:    LD    HL,RELCOD
  131.     LD    IX,(ENDPTR)
  132. MKL005:    LD    (IX+0),0
  133.     LD    B,8
  134. MKL006:    CALL    NX1BYT
  135.     JR    C,MKL008
  136.     CP    (HL)
  137.     JR    Z,MKL007
  138.     SCF
  139. MKL007:    RL    (IX+0)
  140.     INC    HL
  141.     DJNZ    MKL006
  142.     INC    IX
  143.     JR    MKL005
  144. ;
  145.     $EJECT
  146. ;
  147. ;
  148. ;    SETUP TO WRITE THE .COM FILE
  149. ;
  150. MKL008:    INC    IX
  151.     LD    (ENDPTR),IX
  152. ;
  153.     LD    HL,(ENDPTR)    ;CALCULATE LENGTH OF .COM FILE
  154.     LD    DE,SRLRLC+OFFSET
  155.     XOR    A
  156.     SBC    HL,DE
  157. ;
  158.     LD    DE,7FH        ;ROUND UP TO FULL SECTOR
  159.     ADD    HL,DE
  160. ;
  161.     SLA    L        ;DERIVE SECTOR COUNT
  162.     RL    H
  163.     LD    A,H
  164.     LD    (RECCNT),A
  165. ;
  166.     LD    DE,COMFCB    ;DELETE ANY EXISTING .COM FILE
  167.     LD    C,DELETE
  168.     CALL    BDOS
  169. ;
  170.     LD    DE,COMFCB    ;CREATE THE NEW FILE
  171.     LD    C,MAKEF
  172.     CALL    BDOS
  173.     INC    A
  174.     JR    NZ,MKL00C
  175.     CALL    ILPRNT
  176.     DB    '  Cannot create .COM file', CR, LF, 0
  177.     JP    EXIT
  178. ;
  179.     $EJECT
  180. ;
  181. ;
  182. ;    WRITE THE .COM FILE
  183. ;
  184. MKL00C:    LD    HL,SRLRLC+OFFSET
  185.     LD    A,(RECCNT)
  186.     LD    B,A
  187. ;
  188. MKL00D:    PUSH    HL
  189.     PUSH    BC
  190.     EX    DE,HL
  191.     LD    C,SETDMA
  192.     CALL    BDOS
  193.     LD    DE,COMFCB
  194.     LD    C,WRTSEQ
  195.     CALL    BDOS
  196. ;
  197.     POP    BC
  198.     POP    HL
  199.     LD    DE,80H
  200.     ADD    HL,DE
  201.     OR    A
  202.     JR    NZ,MKL00E
  203.     DJNZ    MKL00D
  204. ;
  205.     LD    DE,COMFCB
  206.     LD    C,CLOSE
  207.     CALL    BDOS
  208.     INC    A
  209.     JP    NZ,EXIT
  210. ;
  211. MKL00E:    CALL    ILPRNT
  212.     DB    '  .COM file write error', CR, LF, 0
  213.     LD    DE,COMFCB
  214.     LD    C,CLOSE
  215.     CALL    BDOS
  216.     LD    DE,COMFCB
  217.     LD    C,DELETE
  218.     CALL    BDOS
  219.     JP    EXIT
  220. ;
  221.     $EJECT
  222. ;
  223. ;
  224. ;    RETURN THE NEXT BYTE FROM THE CO1 FILE
  225. ;    SET CARRY ON EOF
  226. ;
  227. NX1BYT:    PUSH    BC
  228.     PUSH    DE
  229.     PUSH    HL
  230. MKL012:    LD    A,(BYTCTR)
  231.     INC    A
  232.     LD    (BYTCTR),A
  233.     CP    81H
  234.     JR    NC,MKL013
  235.     LD    HL,(BYTPTR)
  236.     LD    A,(HL)
  237.     INC    HL
  238.     LD    (BYTPTR),HL
  239.     POP    HL
  240.     POP    DE
  241.     POP    BC
  242.     OR    A
  243.     RET
  244. ;
  245. MKL013:    XOR    A
  246.     LD    (BYTCTR),A
  247.     LD    DE,0080H
  248.     LD    (BYTPTR),DE
  249.     LD    C,SETDMA
  250.     CALL    BDOS
  251.     LD    DE,CO1FCB
  252.     LD    C,RDSEQ
  253.     CALL    BDOS
  254.     OR    A
  255.     JR    Z,MKL012
  256.     POP    HL
  257.     POP    DE
  258.     POP    BC
  259.     SCF
  260.     RET
  261. ;
  262.     $EJECT
  263. ;
  264. ;
  265. ;    IN-LINE STRING PRINT
  266. ;
  267. ILPRNT:    EX    (SP),HL
  268. MKL015:    LD    A,(HL)
  269.     OR    A
  270.     JR    Z,MKL016
  271.     CALL    MKL017
  272.     INC    HL
  273.     JR    MKL015
  274. ;
  275. MKL016:    EX    (SP),HL
  276.     RET
  277. ;
  278. MKL017:    PUSH    AF
  279.     PUSH    BC
  280.     PUSH    DE
  281.     PUSH    HL
  282.     AND    7FH
  283.     LD    E,A
  284.     LD    C,2
  285.     CALL    BDOS
  286.     POP    HL
  287.     POP    DE
  288.     POP    BC
  289.     POP    AF
  290.     RET
  291. ;
  292.     $EJECT
  293. ;
  294. ;
  295. ;    STORAGE
  296. ;
  297. BYTPTR:    DW    0        ;BYTE POINTER FOR CO1 READ
  298. BYTCTR:    DB    80H        ;BYTE COUNTER FOR CO1 READ
  299. RECCNT:    DB    0        ;CNT OF RECS TO SAVE IN .COM
  300. ENDPTR:    DW    0        ;POINTER TO END OF CODE IMAGE
  301. ;
  302. CO0FCB:    DB    0, '        CO0', 0, 0, 0, 0
  303.     DS    16
  304.     DB    0, 0, 0, 0
  305. ;
  306. CO1FCB:    DB    0, '        CO1', 0, 0, 0, 0
  307.     DS    16
  308.     DB    0, 0, 0, 0
  309. ;
  310. COMFCB:    DB    0, '        COM', 0, 0, 0, 0
  311.     DS    16
  312.     DB    0, 0, 0, 0
  313. ;
  314.     $EJECT
  315. ;
  316. ;
  317. ;    THE SRLRLC CODE STARTS THE FINISHED .COM FILE
  318. ;
  319. ; SRLRLC - RELOCATING LOADER FOR SRL PGM
  320. ;
  321. ; THIS CODE IS THE FIRST TO EXECUTE WHEN THE FINISHED
  322. ; PROGRAM IS EXECUTED.
  323. ;
  324. ;
  325. OFFSET    EQU    $-COMBEG
  326.     .PHASE    COMBEG
  327. ;
  328. ;
  329. ;    DO THE ADDRESS MODS FOR THE CODE
  330. ;
  331. SRLRLC:    LD    HL,(BDOS+1)    ;CALC STARTING ADDR FOR RELOC
  332.     LD    DE,(LENGTH)    ;DE = PGM LENGTH
  333.     XOR    A
  334.     SBC    HL,DE
  335.     LD    L,0
  336.     LD    (DEST),HL
  337.     LD    C,H        ; C = MSB OF RELOCATED PGM
  338.     LD    HL,RELCOD-OFFSET
  339.     ADD    HL,DE
  340.     PUSH    HL
  341.     POP    IX        ;IX = REL MAP PTR
  342.     LD    HL,RELCOD-OFFSET;HL = PGM IMAGE PTR
  343. ;
  344. LRL005:    LD    B,8        ; B = BIT CTR
  345. LRL006:    RL    (IX+0)
  346.     JR    NC,LRL007
  347.     LD    A,(HL)        ;RELOCATE A BYTE
  348.     ADD    A,C
  349.     LD    (HL),A
  350. LRL007:    INC    HL
  351.     DEC    DE
  352.     LD    A,E
  353.     OR    D
  354.     JR    Z,MOVE
  355.     DJNZ    LRL006
  356.     INC    IX
  357.     JR    LRL005
  358. ;
  359.     $EJECT
  360. ;
  361. ;
  362. ;    MOVE THE CODE INTO PLACE
  363. ;
  364. MOVE:    LD    HL,RELCOD-OFFSET
  365.     LD    DE,(DEST)
  366.     LD    BC,(LENGTH)
  367.     LDIR
  368.     LD    HL,(DEST)    ;GO EXECUTE THE CODE
  369.     JP    (HL)
  370. ;
  371. ;
  372. ;    STORAGE FOR LOADER
  373. ;
  374. LENGTH:    DW    0
  375. DEST:    DW    0
  376. ;
  377.     .DEPHASE
  378. ;
  379. RELCOD    EQU    $        ;REL CODE IMAGE (ORG 0) GOES HERE
  380.                 ;THE BIT MAP FOLLOWS THE REL CODE
  381. ;
  382. ;
  383. ;    THAT'S ALL, FOLKS!
  384. ;
  385.     END    MAKSRL
  386.