home *** CD-ROM | disk | FTP | other *** search
- public chain ; (char(12))
- extrn ?signal
- ; /* loads another COM file, and executes it */
- bdos equ 5
- openf equ 15
- readf equ 20
- dmaf equ 26
-
- cseg
- chain:
- mov e,m ! inx h ! mov d,m ! xchg ; get first arg address
- lxi d,fcb ! mvi c,12 ! call move ; move string to fcb
- lxi d,fcb+12 ! mvi a,0 ! mvi c,21 ! call fill
- ; zero rest of fcb
- lhld bdos+1 ! lxi b,-code$len ! dad b ; make space at top of TPA
- shld jmpr+1 ; jump address
- push h ; save code address for RET
- xchg ! lxi h,fcb-code ! dad d ; make address of FCB
- shld FCBR+1 ; and fix LXI
- push h ; save FCB destination address
- lxi h,code ! mvi c,code$len ! call move ; dest. in DE
- pop d ; recover address of FCB
- mvi c,openf ! call BDOS ; open file
- inr a ! jz sig ; if any error, signal error
- pop h ! sphl ! push h ; point stack to top of TPA
- ; and save code addr
- lxi h,100h ; point to start of TPA
- ret
- code:
- push h ! xchg ! mvi c,dmaf ! call BDOS ; set the DMA address
- FCBR: lxi d,$-$ ! mvi c,readf ! call BDOS ; read the next record
- ora a ! jnz 100h ; EOF -> start TPA
- pop h ! lxi d,128 ! dad d ; recover and bump DMA address
- jmpr: jmp $-$ ; jump to code
-
-
- FCB:
- ds 1 ; drive code
- ds 8 ; file name
- ds 3 ; file type
- ds 4 ; control info
- ds 16 ; disk map
- ds 1 ; rrec
- codelen equ $-code
-
- ; c = # bytes
- ; hl = source
- move: ; de = destination
- mov a,m ! stax d
- inx h ! inx d ! dcr c
- jnz move
- ret
-
- ; c = # bytes
- ; d = start addr
- fill: ; a = byte to fill
- stax d ! inx d
- dcr c ! jnz fill
- ret
-
- sig:
- lxi h,siglist ! call ?signal ! jmp 0 ; signal error
-
- siglist: ; (fixed(6),bit(8),ptr,ptr)
- dw sigcode,sigsub,sigfil,message
-
- sigcode db 6 ; undefined file error
- sigsub db 2 ; arbitrary subcode for id
- sigfil dw fpb ; ptr to file parameter block
- message dw quack ; auxiliary operator message
-
- fpb: ; PL/I file parameter block
-
- fcbptr dw FCB-1 ; .fcb-1
- fpblst dw 0 ; (unused) ptr
- column dw 0 ; current column fixed(15)
- curline dw 0 ; current line "
- curpage dw 0 ; current page "
- currec dw 0 ; (unused) "
- lookchr db 0 ; lookahead char char(1)
- ioend dw 0 ; i/o end address
- iostk dw 0 ; user stack upon sio entry
- spacer ds 4 ; spacer
- linesz dw 0 ; line size fixed(15)
- pagesz dw 0 ; page size "
- fixedsz dw 0 ; fixed size "
- blocksz dw 0 ; block size "
- filedes dw 0 ; file descriptor
- dtitle db 0,'' ; default title
- ; char(14) varying
-
- quack db 17,'Bad Chain Attempt',0 ; error message
-
-
-
-