; ; TITLE .UTL file linkage macro ; FILENAME UTL.LIB ; AUTHOR Robert A. Van Valzah 11/25/79 ; LAST REVISED R. A. V. 11/25/79 ; REASON removed comments following endm's ; ; ; macro to define a string in memory backwards, followed ; by its lenght ; backwrd macro parm if not nul parm ?last set 0ffh rept 0ffh ;;do forever if ?last=0 ;;well, at least until ?last=0 exitm endif cnt set 0 irpc arg,parm if cnt=?last exitm endif chr set '&ARG' cnt set cnt+1 endm ?last set cnt-1 db chr endm cnt set 0 ;;count lenght of arg irpc arg,parm cnt set cnt+1 endm db cnt endm ; ; macro to produce sid interface for a .UTL file ; utl macro parm1,parm2,parm3 local ep1,ep2,ep3 base: jmp entry symtbl: backwrd parm1 dw ep1 backwrd parm2 dw ep2 backwrd parm3 dw ep3 symlen equ $-symtbl ep1: jmp parm1 ep2: jmp parm2 ep3: jmp parm3 ; ; parameter passed to relhdr ; dw codelen ;length of code to be relocated db '(C) Copyright 1979, Robert A. Van Valzah' getline: ;;get a line to sid buffer lxi b,3 jmp sidlink getchar: ;;get a character from buffer to reg a lxi b,6 ;;converting to upper case jmp sidlink crlf: mvi a,13 call conout mvi a,10 conout: ;;send charcter from reg a to console lxi b,9 jmp sidlink hexode: push d ;;save low byte mov a,d ;;print high byte call hexo pop d ;;get low byte mov a,e ;;fall thru to print it ; hexo: ;;print reg a as two hex digits lxi b,0ch jmp sidlink parseline: ;;parse line in input buffer, returning lxi b,12h ;;reg a = number of args, and carry set jmp sidlink ;;if error getarg: ;;get argument from input buffer to lxi b,15h ;;reg hl jmp sidlink brktest: ;;call bdos break function lxi b,18h sidlink: lhld 39h ;;address field of jmp @ rst 7 dad b ;;add displacement into sid jmp table pchl ;;and vector to desired routine ; ; print message pointed to by reg de unitl 0h is found ; prmsg: ldax d ;;get a character of message ora a ;;end of message? rz ;;yes - all done inx d ;;no - print character push d call conout pop d jmp prmsg ;;print more ; entry: lhld bdos+1 ;;get current sid base shld base+1 ;;store it into utl base lxi h,base ;;make loc 5 jmp to utl base shld bdos+1 lxi d,p1msg ;;print entry point addresses call prmsg lxi d,ep1 call hexode lxi d,p2msg call prmsg lxi d,ep2 call hexode lxi d,p3msg call prmsg lxi d,ep3 call hexode call init ;;if additional init required lxi d,symlen ;;pass symbol table lenght back to sid ret p1msg: db 13, 10, '.&PARM1 = ', 0 p2msg: db 13, 10, '.&PARM2 = ', 0 p3msg: db 13, 10, '.&PARM3 = ', 0 endm