title 'MML: RELMAP' page 45 ;************* ;* RELMAP * ;************* ;********************************** ;* Copyright: MML Systems Limited * ;* 11 Sun Street, London E.C.2. * ;* 1981 * ;* * ;* Utility to display all names * ;* in a .REL file. * ;* * ;* Format: * ;* RELMAP * ;* * ;* Revisions * ;* ========= * ;* JUNE 81 - Original * ;* AUG 81 - 'table' added * ;* * ;********************************** ; BDOS EQU 5 COUT EQU 2 CIN EQU 1 CSTAT EQU 11 CMSG EQU 9 FWRITE EQU 21 FREAD EQU 20 FOPEN EQU 15 FCREATE EQU 22 FCLOSE EQU 16 FDMA EQU 26 ; ; cr EQU 0DH lf EQU 0AH TAB EQU 09H ; page ORG 100H CPM: EQU $ LXI d,relmap push d ret ; DB cr,lf DB ' PROGRAM RELMAP to map the names defined in a .REL file',cr,lf DB ' COPYWRITE D. POWYS-LYBBE 14 JUL 1981',cr,lf DB ' MML, 11 SUN STREET, LONDON. E.C.2.',cr,lf DB cr,lf DB ' Program reads a .REL file',cr,lf DB cr,lf ; relmap: LXI H,0 DAD SP SHLD OLDSP ;SAVE CALLER'S STACK POINTER LXI SP,OLDSP+127 ;SET UP OURS LXI H,DATASEG ; .REL file copied to DMA address set to program end SHLD DMA ; LXI H,FCB+9 MVI M,'R' INX H MVI M,'E' INX H MVI M,'L' ; FCB set to COM type ; LXI D,FCB MVI C,fopen CALL BDOS ;OPEN FILE CPI 255 JNZ PR05 LXI D,NOTFOUND call conmsg JMP RETURN ;FILE NOT FOUND PR05: LHLD DMA ; Get DMA address ; NXTBUF: ;READ NEXT BUFFER FROM DISK XCHG ; Copy DMA into D,E lhld 6 ; top of memory lxi b,-128 dad b mov a,d cmp h jc mem$ok jnz mem$full mov a,e cmp l jc mem$ok mem$full: LXI D,outofmem call conmsg JMP RETURN ;FILE NOT FOUND mem$ok: MVI C,fdma CALL BDOS ; Set DMA LXI D,FCB MVI C,fread CALL BDOS ;READ RECORD ORA A ; Check if read beyond last record JNZ DISPLAY LHLD DMA ; Get DMA address MVI C,128 MVI B,0 DAD B ; & increment by 128 bytes SHLD DMA SHLD FREE ; Free points to location beyond .REL file JMP NXTBUF NOTFOUND: DB 'NEW .REL FILE',cr,0AH,'$' outofmem: DB cr,0ah,'out of memory',cr,0AH,'$' ; ; START: DS 2 FREE: DS 2 NEWLN: DB cr,lf,'$' ; CONOUT: PUSH H PUSH D push b push psw mov e,a mvi c,cout CALL Bdos call tst$abort pop psw pop b POP D POP H ret ;------- ;Send message terminated by '$' to console ;Reg in: DE->message CONMSG: MVI C,cmsg CALL BDOS ; tst$abort: mvi c,cstat ; just check for any console input CALL Bdos ora a rz mvi c,cin ; YES - Abort run CALL Bdos jmp return ; newline: MVI A,cr CALL conout MVI A,lf CALL conout lda ypos inr a sta ypos sub a sta xpos RET ; ; Display all public and module names ; DISPLAY: LXI D,table call conmsg sub a sta xpos sta ypos lxi h,dataseg-1 shld rel$byte$ptr sub a sta rel$bit$ptr ; stream: call get$nxt$bit ora a jnz stm$type mvi a,8 call skip$bits jmp stream ;------- ; type ; 00 special link ; 01 program relative ; 10 data relative ; 11 common relative ; stm$type: call get$nxt$bit call add$nxt$bit jz stm$link mvi a,16 call skip$bits jmp stream ;------- ; link ; 4 bit control field ; stm$link: call get$nxt$bit call add$nxt$bit call add$nxt$bit call add$nxt$bit jz stm$entry cpi 0001b jz stm$common cpi 0010b jz stm$program cpi 0011b jz stm$lib cpi 0100b jz stm$unsd1 cpi 0101b jz stm$size cpi 0110b jz stm$chain cpi 0111b jz stm$point cpi 1000b jz stm$unsd2 cpi 1001b jz stm$external cpi 1010b jz stm$data cpi 1011b jz stm$locate cpi 1100b jz stm$address cpi 1101b jz stm$segment cpi 1110b jz stm$end cpi 1111b jz stm$eof jmp bad$code stm$entry ; 0000b call stm$name lxi d,p$name call dsp$name jmp stream stm$common ; 0001b call stm$name lxi d,c$name call dsp$name jmp stream stm$program ; 0010b call stm$name lxi d,m$name call dsp$name jmp stream stm$lib ; 0011b call stm$name lxi d,l$name call dsp$name jmp stream stm$unsd1 ; 0100b call stm$name lxi d,u$name call dsp$name jmp stream stm$size ; 0101b call stm$value call stm$name lxi d,cs$name call dsp$name jmp stream stm$chain ; 0110b call stm$value call stm$name lxi d,x$name call dsp$name jmp stream stm$point ; 0111b call stm$value call stm$name lxi d,s$name call dsp$name jmp stream stm$unsd2 ; 1000b call stm$value call stm$name lxi d,u$name call dsp$name jmp stream stm$external ; 1001b call stm$value jmp stream stm$data ; 1010b call stm$value jmp stream stm$locate ; 1011b call stm$value jmp stream stm$address ; 1100b call stm$value jmp stream stm$segment ; 1101b call stm$value jmp stream stm$end ; 1110b call stm$value sub a sta rel$bit$ptr jmp stream stm$eof ; 1111b jmp link$eof ;------- ; value ; frst 2 bits ; 00 absolute ; 01 program relative ; 10 data relative ; 11 common relative ; ; next 16 bits ; address field ; stm$value: mvi a,18 call skip$bits ret ;------- ; name ; 3 bit name count ; count x 8bit ascii characters ; named saved in NAME with trailing blanks ; stm$name: mvi b,8 mvi a,' ' lxi h,txt$name name$init: mov m,a inx h dcr b jnz name$init ; call get$nxt$bit call add$nxt$bit call add$nxt$bit rz lxi h,txt$name mov b,a cr$name: push b push h call get$nxt$bit call add$nxt$bit call add$nxt$bit call add$nxt$bit call add$nxt$bit call add$nxt$bit call add$nxt$bit call add$nxt$bit pop h cpi ' ' jc bad$asc cpi 07fh jc not$bad bad$asc: mvi a,'.' not$bad: mov m,a inx h pop b dcr b jnz cr$name ret ; ; data areas ; xpos: db 0 ; cursor position ypos: db 0 ; cursor position rel$byte$ptr: dw 0 ; current byte position rel$byte: db 0 ; current byte rel$bit$ptr: db 0 ; current bit number txt$name: db '12345678' ; max of 8 byte address db '$' ; ; routines ; ;------- ; display txt$name use prefix defined in (DE) ; dsp$name: lda xpos cpi 80-8-3 cnc newline adi 3 sta xpos call conmsg LXI D,txt$name call conmsg call tst$abort lda xpos adi 8 sta xpos ret p$name: db '/e/','$' c$name: db '/C/','$' m$name: db '/m/','$' l$name: db '/l/','$' u$name: db '/u/','$' cs$name: db '/c/','$' x$name: db '/X/','$' s$name: db '/E/','$' table: db cr,lf,'MML:RELMAP - list of REL symbol names' db cr,lf,'/m/ -> module,' db ' /l/ -> library,' db ' /e/ -> entry list,' db ' /c/ -> common block' db cr,lf,'/E/ -> entry point,' db ' /C/ -> common symbol,' db ' /X/ -> external symbol' db cr,lf,'-------------------------------' db '--------------------------------------' db cr,lf,lf db '$' ; ;add next bit to current bit in a after shifting a ; add$nxt$bit: rlc mov b,a push b call get$nxt$bit pop b ora b ret ; ; fetch next bit as bit 0 in A ; get$nxt$bit: lda rel$bit$ptr dcr a cpi 0 cm get$nxt$byte sta rel$bit$ptr mov b,a lda rel$byte inr b inc$bit: dcr b jz fnd$bit rrc jmp inc$bit fnd$bit: ani 1 ret ; ;fetch next byte ; get$nxt$byte: lhld rel$byte$ptr inx h xchg lhld free mov a,d cmp h jc in$rel jnz bad$code ; error mov a,e cmp l jnc bad$code ; error in$rel: xchg shld rel$byte$ptr mov a,m sta rel$byte mvi a,7 ; start with bit 7 ret ; ; skip B bits ; skip$bits: cpi 0 rz push psw call get$nxt$bit pop psw dcr a jmp skip$bits ; ; found link$eof command ; link$eof: call newline jmp return BAD$CODE: LXI D,prog$err call conmsg RETURN: ;NORMAL RETURN jmp 0 ; prog$err: DB cr,lf,'program error',cr,lf,'$' ; FCB EQU 5CH DMA: DS 2 COUNT: DS 1 DATA: DB 010H ; Next program location can be data DMAOUT EQU 80H BUFFER EQU DMAOUT OLDSP: DS 128 NOSPACE: DB 'DIRECTORY FULL',cr,0AH,'$' OLDFILE: DB 'OLD .REL FILE',cr,0AH,'$' ; ; DATASEG equ $ END