home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
pcpursut
/
pisrc.ark
/
CHAIN.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-07-14
|
3KB
|
167 lines
;***********************************************************************
;
; CHAIN.ASM - Module for chaining to another program. Adapted from Doug
; Huskey article in PICONEWS, March 1983. Called 'Chaining Programs un-
; der CP/M v2.2.
;
;***********************************************************************
;
PUBLIC CHAIN_
;
BDOS EQU 5
OPENF EQU 15
READF EQU 20
DMAF EQU 26
SGUSER EQU 020H
SELDISK EQU 0EH
GETDISK EQU 019H
;
STKSIZE EQU 20
;
CDRIVE EQU 0414H
CUSER EQU 0415H
;
; Looks like
; INT CHAIN(COMFILE)
; CHAR *COMFILE ; / *Name of comfile in FCB format
;
CSEG
CHAIN_: LXI H,2 ; Get 1ST arguement address
DAD SP
MOV E,M ; Get pointer to comfile
INX H
MOV D,M
INX H
LXI SP,LOC$STK+STKSIZE ; New stack pointer
XCHG
LXI D,FCB ; Move string to FCB
MVI C,12
CALL MOVE
LXI D,FCB+12 ; Fill in rest of FCB with zeros
MVI A,0
MVI C,21
CALL FILL
LHLD BDOS+1 ; MAKE SPACE AT TOP OF TPA
LXI B,CODE-FOO-03000H ; 12k below BDOS
DAD B
SHLD JMPR+1 ; Jump address
PUSH H ; Save code address for RET instruction
XCHG ; Make address of FCB
LXI H,FCB-CODE
DAD D
SHLD FCBR+1
PUSH H ; Save FCB Destination address
LXI H,DONE-CODE
DAD D
SHLD FOO2+1
LXI H,CODE ; Relocate code
MVI C,FOO-CODE
CALL MOVE
MVI C, GETDISK
CALL BDOS
STA CURDRIVE
MVI C, SGUSER
MVI E, 0FFH
CALL BDOS
STA CURUSER
;
; Got new drive and used if drive > 0
;
LDA CDRIVE
ORA A
JZ FOO1
;
DCR A ; Select disk
MOV E,A
MVI C, SELDISK
CALL BDOS
;
LDA CUSER ; Select user
MOV E, A
MVI C, SGUSER
CALL BDOS
;
FOO1: POP D ; Recover FCB address, see why local
; stack is needed
MVI C,OPENF ; Open file
CALL BDOS
INR A
JZ 0 ; Reboot if error
;
POP H ; Point stack to top of TPA and save address
SPHL
LDA CURUSER
PUSH PSW
LDA CURDRIVE
PUSH PSW
PUSH H
LXI H,100H ; Point to start of TPA
RET
;
CODE: PUSH H ; Call BDOS
XCHG
MVI C,DMAF
CALL BDOS ; Set DMA address
;
FCBR: LXI D,FOO-FOO ; Read next record
MVI C,READF
CALL BDOS
ORA A
;
FOO2: JNZ DONE ; EOF -> start TPA
POP H ; Recover and bump DMA address
LXI D,128
DAD D
;
JMPR: JMP FOO - FOO ; Jump to code:
;
DONE: POP PSW ; Pop DMA location
POP PSW ; Get old drive
MOV E, A
MVI C, SELDISK
CALL BDOS
POP PSW ; Ger old user
MOV E,A
MVI C, SGUSER
CALL BDOS
LXI D,0
PUSH D
JMP 100H
;
FCB: DS 1 ; Drive code
DS 8 ; File name
DS 3 ; File type
DS 4 ; Control info
DS 16 ; Disk map
DS 1 ; RREC
;
FOO EQU $
;
CODE$LEN EQU FOO - CODE
;
; C = # bytes, HL = source, DE = destination
;
MOVE: MOV A,M
STAX D
INX H
INX D
DCR C
JNZ MOVE
;
RET
;
; A = byte to fill, C = # bytes, DE = start address
;
FILL: STAX D
INX D
DCR C
JNZ FILL
;
RET
;
LOC$STK: DW 10 ; Local stack
;
CURUSER: DB 0
CURDRIVE: DB 0
;