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