home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / pcpursut / pisrc.ark / CHAIN.ASM < prev    next >
Assembly Source File  |  1988-07-14  |  3KB  |  167 lines

  1. ;***********************************************************************
  2. ;
  3. ; CHAIN.ASM - Module for chaining to another program.  Adapted from Doug
  4. ; Huskey article in PICONEWS, March 1983.  Called 'Chaining Programs un-
  5. ; der CP/M v2.2.
  6. ;
  7. ;***********************************************************************
  8. ;
  9.     PUBLIC    CHAIN_
  10. ;
  11. BDOS    EQU    5
  12. OPENF    EQU    15
  13. READF    EQU    20
  14. DMAF    EQU    26
  15. SGUSER    EQU    020H
  16. SELDISK    EQU    0EH
  17. GETDISK    EQU    019H
  18. ;
  19. STKSIZE    EQU    20
  20. ;
  21. CDRIVE    EQU    0414H
  22. CUSER    EQU    0415H
  23. ;
  24. ; Looks like
  25. ; INT CHAIN(COMFILE)
  26. ; CHAR *COMFILE ;    / *Name of comfile in FCB format
  27. ;
  28.     CSEG
  29. CHAIN_:    LXI    H,2        ; Get 1ST arguement address
  30.     DAD    SP
  31.     MOV    E,M        ; Get pointer to comfile
  32.     INX    H
  33.     MOV    D,M
  34.     INX    H
  35.     LXI    SP,LOC$STK+STKSIZE ; New stack pointer
  36.     XCHG
  37.     LXI    D,FCB        ; Move string to FCB
  38.     MVI    C,12
  39.     CALL    MOVE
  40.     LXI    D,FCB+12    ; Fill in rest of FCB with zeros
  41.     MVI    A,0
  42.     MVI    C,21
  43.     CALL    FILL
  44.     LHLD    BDOS+1        ; MAKE SPACE AT TOP OF TPA
  45.     LXI    B,CODE-FOO-03000H ; 12k below BDOS
  46.     DAD    B
  47.     SHLD    JMPR+1        ; Jump address
  48.     PUSH    H        ; Save code address for RET instruction
  49.     XCHG            ; Make address of FCB
  50.     LXI    H,FCB-CODE
  51.     DAD    D
  52.     SHLD    FCBR+1
  53.     PUSH    H        ; Save FCB Destination address
  54.     LXI    H,DONE-CODE
  55.     DAD    D
  56.     SHLD    FOO2+1
  57.     LXI    H,CODE        ; Relocate code
  58.     MVI    C,FOO-CODE
  59.     CALL    MOVE
  60.     MVI    C, GETDISK
  61.     CALL    BDOS
  62.     STA    CURDRIVE
  63.     MVI    C, SGUSER
  64.     MVI    E, 0FFH
  65.     CALL    BDOS
  66.     STA    CURUSER
  67. ;
  68. ; Got new drive and used if drive > 0
  69. ;
  70.     LDA    CDRIVE
  71.     ORA    A
  72.     JZ    FOO1
  73. ;
  74.     DCR    A        ; Select disk
  75.     MOV    E,A
  76.     MVI    C, SELDISK
  77.     CALL    BDOS
  78. ;
  79.     LDA    CUSER        ; Select user
  80.     MOV    E, A
  81.     MVI    C, SGUSER
  82.     CALL    BDOS
  83. ;
  84. FOO1:    POP    D        ; Recover FCB address, see why local
  85.                 ;   stack is needed
  86.     MVI    C,OPENF        ; Open file
  87.     CALL    BDOS
  88.     INR    A
  89.     JZ    0        ; Reboot if error
  90. ;
  91.     POP    H        ; Point stack to top of TPA and save address
  92.     SPHL
  93.     LDA    CURUSER
  94.     PUSH    PSW
  95.     LDA    CURDRIVE
  96.     PUSH    PSW
  97.     PUSH    H
  98.     LXI    H,100H        ; Point to start of TPA
  99.     RET
  100. ;
  101. CODE:    PUSH    H        ; Call BDOS
  102.     XCHG
  103.     MVI    C,DMAF
  104.     CALL    BDOS        ; Set DMA address
  105. ;
  106. FCBR:    LXI    D,FOO-FOO    ; Read next record
  107.     MVI    C,READF
  108.     CALL    BDOS
  109.     ORA    A
  110. ;
  111. FOO2:    JNZ    DONE        ; EOF -> start TPA
  112.     POP    H        ; Recover and bump DMA address
  113.     LXI    D,128
  114.     DAD    D
  115. ;
  116. JMPR:    JMP    FOO - FOO    ; Jump to code:
  117. ;
  118. DONE:    POP    PSW        ; Pop DMA location
  119.     POP    PSW        ; Get old drive
  120.     MOV    E, A
  121.     MVI    C, SELDISK
  122.     CALL    BDOS
  123.     POP    PSW        ; Ger old user
  124.     MOV    E,A
  125.     MVI    C, SGUSER
  126.     CALL    BDOS
  127.     LXI    D,0
  128.     PUSH    D
  129.     JMP    100H
  130. ;
  131. FCB:    DS    1        ; Drive code
  132.     DS    8        ; File name
  133.     DS    3        ; File type
  134.     DS    4        ; Control info
  135.     DS    16        ; Disk map
  136.     DS    1        ; RREC
  137. ;
  138. FOO    EQU    $
  139. ;
  140. CODE$LEN EQU    FOO - CODE
  141. ;
  142. ; C = # bytes, HL = source, DE = destination
  143. ;
  144. MOVE:    MOV    A,M
  145.     STAX    D
  146.     INX    H
  147.     INX    D
  148.     DCR    C
  149.     JNZ    MOVE
  150. ;
  151.     RET
  152. ;
  153. ; A = byte to fill, C = # bytes, DE = start address
  154. ;
  155. FILL:    STAX    D
  156.     INX    D
  157.     DCR    C
  158.     JNZ    FILL
  159. ;
  160.     RET
  161. ;
  162. LOC$STK:  DW    10        ; Local stack
  163. ;
  164. CURUSER:  DB    0
  165. CURDRIVE: DB    0
  166. ;
  167.