home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug001.ark / IDIR.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  5KB  |  298 lines

  1. ;****************************************
  2. ;
  3. ;               ISIS II TO CPM
  4. ;             DIRECTORY UTILITY
  5. ;
  6. ;                VERSION 1.0
  7. ;
  8. ;****************************************
  9.  
  10.     ORG    100H
  11. ICOPY:    LXI    SP,STACK    ;SET STACK
  12.     MVI    C,1        ;SELECT DISK 1
  13.     CALL    SDSK
  14.     CALL    HOME        ;HOME DISK 1
  15.     LXI    D,DIRLNK    ;POINT TO DIR LINK BLOCK LINK
  16.     LXI    H,DBCA        ;DIR BCA
  17.     CALL    GLB        ;GET LINK BLOCK
  18. ICL0:    LXI    H,DBCA        ;DIR BCA
  19.     CALL    GDB        ;GET DIR BLOCK
  20.     JC    DONE        ;NO MORE DIR BLOCKS, FINISHED
  21.     LXI    H,DBUF        ;DIR BUFFER
  22.     SHLD    DENT        ;SAVE IN POINTER
  23.     MVI    A,8        ;NUMBER OF  ENTRIES/BLOCK
  24.     STA    DCNT        ;SAVE
  25. ICL1:    LHLD    DENT        ;GET DIR ENTRY PTR
  26.     MOV    A,M        ;GET STATUS BYTE
  27.     CPI    00        ;ACTIVE?
  28.     JNZ    ILN1        ;NO, GET NEXT ENTRY
  29.     INX    H        ;POINT TO FN
  30.     PUSH    H        ;SAVE HL
  31.     LXI    D,BMSG
  32.     MVI    C,09
  33.     CALL    CPM        ;PRINT 'B: ' MESSAGE
  34.     POP    H
  35.     CALL    FPRT        ;PRINT FILE ID
  36. ILN1:    LHLD    DENT        ;POINTER TO ENTRY
  37.     LXI    D,16        ;SIZE OF ENTRY
  38.     DAD    D        ;POINT TO NEXT ENTRY
  39.     SHLD    DENT
  40.     LDA    DCNT        ;ENTRY COUNTER
  41.     DCR    A        ;DECREMENT
  42.     STA    DCNT
  43.     JNZ    ICL1        ;LOOP
  44.     JMP    ICL0
  45.  
  46. DONE:    MVI    C,0
  47.     CALL    SDSK
  48.     JMP    BOOT
  49.  
  50. IOERR:    LXI    D,MSG2
  51.     MVI    C,09
  52.     CALL    CPM
  53.     JMP    BOOT
  54.  
  55. ;***************************************;
  56. ;
  57. ;           GLB - GET LINK BLOCK
  58. ;
  59. ;         DE= A(LINK TO LINK BLOCK)
  60. ;         HL= A(BLOCK CONTROL AREA)
  61. ;
  62. ;***************************************;
  63. GLB:    SHLD    BCAP        ;SAVE BCA ADDR
  64.     CALL    SEEKR        ;READ LINK BLOCK
  65.     LHLD    BCAP        ;GET BCA ADDR
  66.     LXI    D,BCBL        ;OFFSET TO LINK BUFFER
  67.     DAD    D
  68.     LXI    D,TBUF
  69.     MVI    B,128
  70.     CALL    MOVE        ;COPY TO LINK BUFFER
  71.     LHLD    BCAP        ;GET BCA ADDR
  72.     LXI    D,BCBL+4    ;OFFSET TO FIRST DATA LINK
  73.     XCHG
  74.     DAD    D        ;DE=A(FIRST DATA LINK)
  75.     XCHG
  76.     LXI    B,BCAL        ;OFFSET TO LINK PTR
  77.     DAD    B
  78.     MOV    M,E
  79.     INX    H
  80.     MOV    M,D        ;SET LINK PTR
  81.     LHLD    BCAP        ;BCA ADDR
  82.     LXI    D,BCALC        ;LINK COUNT
  83.     DAD    D
  84.     MVI    M,62        ;NO OF LINKS
  85.     RET
  86.  
  87. ;****************************************:
  88. ;
  89. ;            GDB:   GET DATA BLOCK
  90. ;
  91. ;            HL= A(BLOCK CONTROL AREA)
  92. ;
  93. ;****************************************;
  94.  
  95. GDB:    SHLD    BCAP        ;SAVE BCA ADDR
  96.     LXI    D,BCAL        ;OFFSET TO LINK BUF
  97.     DAD    D
  98.     MOV    E,M
  99.     INX    H
  100.     MOV    D,M        ;GET LINK ADDR
  101.     PUSH    D        ;SAVE LINK ADDR
  102.     LDAX    D        ;GET LINK BYTE
  103.     MOV    C,A
  104.     INX    D
  105.     LDAX    D        ;GET LINK BYTE
  106.     ORA    C        ;TEST FOR ZERO LINK
  107.     POP    D
  108.     JZ    GDBE        ;ZERO LINK, EOF
  109.     PUSH    D
  110.     PUSH    H
  111.     CALL    SEEKR        ;GET DATA BLOCK
  112.     POP    H
  113.     POP    D
  114.     INX    D
  115.     INX    D
  116.     MOV    M,D
  117.     DCX    H
  118.     MOV    M,E        ;UPDATE LINK PRT
  119.     LHLD    BCAP        ;GET BCA ADDR
  120.     LXI    D,BCBD        ;OFFSET TO DATA BUF
  121.     DAD    D
  122.     LXI    D,TBUF
  123.     MVI    B,128
  124.     CALL    MOVE        ;COPY DATA TO BUF
  125.     LHLD    BCAP        ;GET BCA ADDR
  126.     LXI    D,BCALC        ;LINK COUNT
  127.     DAD    D
  128.     DCR    M        ;DECREMENT
  129.     RNZ            ;OK, CONTINUE
  130.     LHLD    BCAP        ;GET BCA ADDR
  131.     LXI    D,BCBL+2    ;POINT TO LINK BUF
  132.     DAD    D
  133.     MOV    E,M        ;GET LINK
  134.     INX    H
  135.     MOV    D,M
  136.     DCX    H
  137.     MOV    E,A
  138.     ORA    D        ;TEST FOR LINK
  139.     JZ    GDBE        ;END, ERROR
  140.     XCHG            ;DE = A(NEXT LINK)
  141.     LHLD    BCAP        ;BCA ADDR
  142.     CALL    GLB        ;GET LINK BLOCK
  143.     RET
  144.  
  145. GDBE:    STC            ;INDICATE EOF
  146.     RET
  147. ;***************************************;
  148. ;
  149. ;         SEEKR:   SEEK DISK BLOCK
  150. ;
  151. ;         DE = A(LINK)
  152. ;
  153. ;***************************************;
  154.  
  155. SEEKR:    PUSH    D        ;SAVE DE
  156.     MVI    C,1        ;SET DISK B
  157.     CALL    SDSK
  158.     POP    D
  159.     PUSH    D
  160.     LDAX    D        ;GET SECTOR
  161.     MOV    C,A
  162.     CALL    SSEC        ;SET SECTOR
  163.     POP    D
  164.     PUSH    D
  165.     INX    D
  166.     LDAX    D        ;GET TRACK
  167.     MOV    C,A
  168.     CALL    STRK
  169.     CALL    READ        ;READ BLOCK
  170.     POP    D
  171.     RET
  172.  
  173. ;*****************************************;
  174. ;
  175. ;    FPRT:   PRINT FILE ID
  176. ;
  177. ;    HL = A(FILE ID)
  178. ;
  179. ;*****************************************;
  180. FPRT:    MVI    B,9        ;ID SIZE
  181. FPRT2:    MOV    A,M        ;GET BYTE
  182.     CPI    00        ;IF ZERO,SKIP
  183.     JNZ    FPRT3
  184.     MVI    A,' '
  185. FPRT3:    MOV    E,A        ;PUT IN E
  186.     PUSH    H        ;SAVE HL
  187.     PUSH    B        ;SAVE BC
  188.     MVI    C,02        ;WRITE CONSOLE
  189.     CALL    CPM        ;PRINT CHAR
  190.     POP    B        ;RESTORE BC
  191.     POP    H        ;RESTORE HL
  192.     INX    H        ;BUMP POINTER
  193.     MOV    A,B
  194.     CPI    04        ;FILE TYPE?
  195.     JNZ    FPRT4
  196.     MVI    E,' '
  197.     MVI    C,02
  198.     PUSH    H
  199.     PUSH    B
  200.     CALL    CPM
  201.     POP    B
  202.     POP    H
  203. FPRT4:    DCR    B
  204.     JNZ    FPRT2
  205.     MVI    C,02
  206.     MVI    E,0DH
  207.     CALL    CPM
  208.     MVI    C,02
  209.     MVI    E,0AH
  210.     CALL    CPM
  211.     RET
  212. ;*****************************************;
  213. ;
  214. ;       MOVE:   MOVE DATA
  215. ;
  216. ;    DE = A (SOURCE)
  217. ;    HL = A(DEST)
  218. ;    B = COUNT
  219. ;
  220. ;******************************************;
  221.  
  222. MOVE:    LDAX    D        ;GET BYTE
  223.     MOV    M,A        ;STORE BYTE
  224.     INX    H
  225.     INX    D        ;BUMP PTRS
  226.     DCR    B        ;DECREMENT COUNT
  227.     JNZ    MOVE
  228.     RET
  229.  
  230. ;*******************************************;
  231. ;
  232. ;    CPM INTERFACE ROUTINES
  233. ;
  234. ;*******************************************;
  235.  
  236. SDSK:    LHLD    0001H        ;GET BIOS ADDR
  237.     MVI    L,1BH
  238.     PCHL
  239. SSEC:    LHLD    0001H
  240.     MVI    L,21H
  241.     PCHL
  242. STRK:    LHLD    0001H
  243.     MVI    L,1EH
  244.     PCHL
  245. READ:    LHLD    0001H
  246.     MVI    L,27H
  247.     PCHL
  248. HOME:    LHLD    0001H
  249.     MVI    L,18H
  250.     PCHL
  251.  
  252. ;******************************************;
  253. ;
  254. ;    BLOCK CONTROL AREA DEFINITIONS
  255. ;
  256. ;******************************************;
  257.  
  258. BCA    EQU    0
  259. BCAL    EQU    0
  260. BCALC    EQU    BCAL+2
  261. BCBL    EQU    BCALC+1
  262. BCBD    EQU    BCBL+128
  263.  
  264. ;******************************************;
  265. ;
  266. ;            DATA
  267. ;
  268. ;******************************************;
  269. BMSG:    DB    'B: $'
  270. MSG2:    DB    'I/O ERROR',0DH,0AH,'$'
  271.  
  272. DIRLNK:    DB    01,01
  273. DENT:    DS    2
  274. DCNT:    DS    1
  275. BCNT:    DS    2
  276. BCAP:    DS    2
  277.     DS    64
  278. STACK    EQU    $
  279.  
  280. DBCA:    DS    2
  281.     DS    1
  282.     DS    128
  283. DBUF:    DS    128
  284.  
  285. FBCA:    DS    2
  286.     DS    1
  287.     DS    128
  288. FBUF:    DS    128
  289.  
  290. TBUF    EQU    0080H
  291. TFCB    EQU    005CH
  292. CPM    EQU    0005H
  293. BOOT    EQU    0000H
  294. CREATE    EQU    22
  295. WRITE    EQU    21
  296. CLOSE    EQU    16
  297.     END
  298.