home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / BDSC / BDSC-2 / L2-225.ARK / RDRL.MAC < prev    next >
Text File  |  1988-05-21  |  2KB  |  170 lines

  1.  
  2.     ext    cread1
  3.     public    rdrl
  4.  
  5.     cseg
  6. rdrl:
  7.     push    b
  8.     call    readcode
  9.     lxi    h,cdrec
  10.     pop    b
  11.     ret
  12.  
  13.  
  14. READBIT:
  15.     PUSH    H
  16.     LXI    H,HOLDBYTE
  17.     MOV    A,M
  18.     INX    H
  19.     INR    M
  20.     JNZ    RDSAMEBYT
  21.     CALL    READFILECHR
  22.     MVI    M,0F8H
  23. RDSAMEBYT:
  24.     ADD    A
  25.     DCX    H
  26.     MOV    M,A
  27.     POP    H
  28.     RET
  29.  
  30. READ8BITS:
  31.     MVI    C,8
  32.  
  33. READCBITS:
  34.     MVI    B,0
  35.  
  36. SHIFTBIT:
  37.     CALL    READBIT
  38.     MOV    A,B
  39.     RAL
  40.     MOV    B,A
  41.     DCR    C
  42.     JNZ    SHIFTBIT
  43.     RET
  44.  
  45. ;Read code item
  46. READCODE:
  47.     XRA    A
  48.     STA    segtype
  49.     sta    itemtype
  50.     sta    dataword+1
  51.     sta    entryname
  52.     CALL    READBIT
  53.     JC    CODE1
  54.     CALL    READ8BITS    ;read absolute byte
  55.     sta    dataword
  56.     RET
  57.  
  58. CODE1:
  59.     MVI    C,2
  60.     CALL    READCBITS
  61.     ORA    A
  62.     JZ    CODE100    ;special link item?
  63. ;here it's a relative 16-bit address
  64.     CALL    CDSEGADDR
  65.     mvi    a,1
  66.     sta    itemtype
  67.     RET
  68.  
  69. CODE100:
  70.     mvi    a,2
  71.     sta    itemtype
  72.     PUSH    H
  73.     MVI    C,4    ;read the control field
  74.     sta    linktype
  75.     CALL    READCBITS
  76.     CPI    5
  77.     PUSH    PSW
  78.     JC    CDSYMARG    ;go read B-field
  79.  
  80.     CPI    0FH    ;end file?
  81.     JZ    CDINST
  82. ;here link items 5,6,7,8,9,10,11,12,13,14
  83. ; which have an A-field
  84.     MVI    C,2    ;read the A-field address type
  85.     CALL    READCBITS
  86.     CALL    CDSEGADDR
  87.  
  88. ;link items 0,1,2,3,4 have only a B-field
  89. CDSYMARG:
  90.     POP    PSW
  91.     PUSH    PSW
  92. ;items 8,9,10,11,12,13,14 have only an A-field
  93.     CPI    8
  94.     JNC    CDINST
  95.     PUSH    D
  96.     MVI    C,3    ;get length of symbol
  97.     CALL    READCBITS
  98.     LXI    H,ENTRYNAME
  99.     MOV    M,A    ;enter the length
  100.     cpi    7    ;if 7 length, make 8 with wild '?' at end
  101.     jz    .cds0
  102.     ora    a
  103.     JNZ    .cds1
  104. .cds0:    INR    M    ;if 0 length, make it 1 long
  105. .cds1:    INX    H
  106.     MVI    M,' '    ;... with first char = SP
  107.     MOV    E,A
  108. ;E = length
  109. NXTCDCHAR:
  110.     DCR    E    ;if now length = 0, done reading symbol
  111.     JM    .cds2
  112.     CALL    READ8BITS
  113.     MOV    M,A
  114.     INX    H
  115.     JMP    NXTCDCHAR
  116. .cds2:    mov    a,m    ;8th bit already set if len "8"
  117.     cpi    '?' or 80h
  118.     jz    .cds2a
  119.     dcx    h    ;else set 8th bit
  120.     mov    a,m
  121.     ori    80H
  122.     mov    m,a
  123. .cds2a:    POP    D
  124.  
  125. CDINST:
  126.     POP    PSW
  127.     LXI    H,0FF00H
  128.     cpi    15    ;if eof, align for next REL read
  129.     jz    .cds3a
  130.     CPI    14
  131.     JNZ    .cds3
  132. .cds3a:    SHLD    HOLDBYTE
  133. .cds3:
  134.     sta    linktype
  135.     POP    H
  136.     RET
  137.  
  138. CDSEGADDR:
  139.     STA    segtype        ;SEGREF
  140.     CALL    READ8BITS    ;DE = 16 bit address
  141.     MOV    E,B
  142.     CALL    READ8BITS
  143.     MOV    D,B
  144.     xchg
  145.     shld    dataword
  146.     ret
  147.  
  148. holdbyte:    db    0,0ffh
  149.  
  150. cdrec:
  151. itemtype:    db    0    ;0=code, 1=address, 2=link item
  152. segtype:    db    0
  153. linktype:    db    0
  154. dataword:    dw    0
  155. entryname:    db    0,0,0,0,0,0,0,0,'?' or 80h
  156.  
  157.  
  158. READFILECHR:
  159.     PUSH    H
  160.     PUSH    D
  161.     push    b
  162.     call    cread1
  163.     mov    a,l
  164.     pop    b
  165.     POP    D
  166.     POP    H
  167.     RET
  168.  
  169.     end
  170.