home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol073 / widir.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  6.4 KB  |  370 lines

  1. ;****************************************
  2. ;
  3. ;               ISIS II TO CPM
  4. ;             DIRECTORY UTILITY
  5. ;
  6. ;    UPDATE TO GIVE A  W I D E DISPLAY
  7. ;
  8. ;                VERSION 2.2
  9. ;
  10. ;    Updated by Rod Whitworth,
  11. ;           Planet 3 Systems
  12. ;           Bankstown,
  13. ;           Australia
  14. ;
  15. ;****************************************
  16.  
  17. FALSE    EQU    0
  18. TRUE    EQU    NOT FALSE
  19. LOGICAL    EQU    TRUE    ;TRUE IF SECTORS START AT ZERO IN BIOS
  20.             ;SET FALSE IF NO TRANSLATION OCCURS AUTOMATICALLY
  21.  
  22.  
  23.     ORG    100H
  24. ICOPY:    LXI    SP,STACK    ;SET STACK
  25.     LDA    05CH        ;FCB DISK #
  26.     ORA    A        ;IS IT 0 ?
  27.     JZ    DONE        ;CAN'T USE DRIVE A
  28.     SUI    1        ; WOULD ALSO BE A:
  29.     JZ    DONE        ;SO GO HOME TOO
  30.     STA    DRNUM
  31.     MOV    C,A        ;SELECT THE RIGHT ONE
  32.     ADI    'A'
  33.     STA    BMSG        ;CORRECT IDENT
  34.     CALL    SDSK
  35.     CALL    VALID        ;SEE IF SINGLE DENSITY SS FLOP
  36.     CALL    HOME        ;HOME DISK
  37.     LXI    D,DIRLNK    ;POINT TO DIR LINK BLOCK LINK
  38.     LXI    H,DBCA        ;DIR BCA
  39.     CALL    GLB        ;GET LINK BLOCK
  40. ICL0:    LXI    H,DBCA        ;DIR BCA
  41.     CALL    GDB        ;GET DIR BLOCK
  42.     JC    DONE        ;NO MORE DIR BLOCKS, FINISHED
  43.     LXI    H,DBUF        ;DIR BUFFER
  44.     SHLD    DENT        ;SAVE IN POINTER
  45.     MVI    A,8        ;NUMBER OF  ENTRIES/BLOCK
  46.     STA    DCNT        ;SAVE
  47. ICL1:    LHLD    DENT        ;GET DIR ENTRY PTR
  48.     MOV    A,M        ;GET STATUS BYTE
  49.     CPI    00        ;ACTIVE?
  50.     JNZ    ILN1        ;NO, GET NEXT ENTRY
  51.     INX    H        ;POINT TO FN
  52.     PUSH    H        ;SAVE HL
  53.     LXI    D,BMSG
  54.     MVI    C,09
  55.     CALL    CPM        ;PRINT 'B: ' MESSAGE
  56.     POP    H
  57.     CALL    FPRT        ;PRINT FILE ID
  58. ILN1:    LHLD    DENT        ;POINTER TO ENTRY
  59.     LXI    D,16        ;SIZE OF ENTRY
  60.     DAD    D        ;POINT TO NEXT ENTRY
  61.     SHLD    DENT
  62.     LDA    DCNT        ;ENTRY COUNTER
  63.     DCR    A        ;DECREMENT
  64.     STA    DCNT
  65.     JNZ    ICL1        ;LOOP
  66.     JMP    ICL0
  67.  
  68. DONE:    MVI    C,0
  69.     CALL    SDSK
  70.     JMP    BOOT
  71.  
  72. IOERR:    LXI    D,MSG2
  73.     MVI    C,09
  74.     CALL    CPM
  75.     JMP    BOOT
  76.  
  77. ;***************************************;
  78. ;
  79. ;           GLB - GET LINK BLOCK
  80. ;
  81. ;         DE= A(LINK TO LINK BLOCK)
  82. ;         HL= A(BLOCK CONTROL AREA)
  83. ;
  84. ;***************************************;
  85. GLB:    SHLD    BCAP        ;SAVE BCA ADDR
  86.     CALL    SEEKR        ;READ LINK BLOCK
  87.     LHLD    BCAP        ;GET BCA ADDR
  88.     LXI    D,BCBL        ;OFFSET TO LINK BUFFER
  89.     DAD    D
  90.     LXI    D,TBUF
  91.     MVI    B,128
  92.     CALL    MOVE        ;COPY TO LINK BUFFER
  93.     LHLD    BCAP        ;GET BCA ADDR
  94.     LXI    D,BCBL+4    ;OFFSET TO FIRST DATA LINK
  95.     XCHG
  96.     DAD    D        ;DE=A(FIRST DATA LINK)
  97.     XCHG
  98.     LXI    B,BCAL        ;OFFSET TO LINK PTR
  99.     DAD    B
  100.     MOV    M,E
  101.     INX    H
  102.     MOV    M,D        ;SET LINK PTR
  103.     LHLD    BCAP        ;BCA ADDR
  104.     LXI    D,BCALC        ;LINK COUNT
  105.     DAD    D
  106.     MVI    M,62        ;NO OF LINKS
  107.     RET
  108.  
  109. ;****************************************:
  110. ;
  111. ;            GDB:   GET DATA BLOCK
  112. ;
  113. ;            HL= A(BLOCK CONTROL AREA)
  114. ;
  115. ;****************************************;
  116.  
  117. GDB:    SHLD    BCAP        ;SAVE BCA ADDR
  118.     LXI    D,BCAL        ;OFFSET TO LINK BUF
  119.     DAD    D
  120.     MOV    E,M
  121.     INX    H
  122.     MOV    D,M        ;GET LINK ADDR
  123.     PUSH    D        ;SAVE LINK ADDR
  124.     LDAX    D        ;GET LINK BYTE
  125.     MOV    C,A
  126.     INX    D
  127.     LDAX    D        ;GET LINK BYTE
  128.     ORA    C        ;TEST FOR ZERO LINK
  129.     POP    D
  130.     JZ    GDBE        ;ZERO LINK, EOF
  131.     PUSH    D
  132.     PUSH    H
  133.     CALL    SEEKR        ;GET DATA BLOCK
  134.     POP    H
  135.     POP    D
  136.     INX    D
  137.     INX    D
  138.     MOV    M,D
  139.     DCX    H
  140.     MOV    M,E        ;UPDATE LINK PRT
  141.     LHLD    BCAP        ;GET BCA ADDR
  142.     LXI    D,BCBD        ;OFFSET TO DATA BUF
  143.     DAD    D
  144.     LXI    D,TBUF
  145.     MVI    B,128
  146.     CALL    MOVE        ;COPY DATA TO BUF
  147.     LHLD    BCAP        ;GET BCA ADDR
  148.     LXI    D,BCALC        ;LINK COUNT
  149.     DAD    D
  150.     DCR    M        ;DECREMENT
  151.     RNZ            ;OK, CONTINUE
  152.     LHLD    BCAP        ;GET BCA ADDR
  153.     LXI    D,BCBL+2    ;POINT TO LINK BUF
  154.     DAD    D
  155.     MOV    E,M        ;GET LINK
  156.     INX    H
  157.     MOV    D,M
  158.     DCX    H
  159.     MOV    E,A
  160.     ORA    D        ;TEST FOR LINK
  161.     JZ    GDBE        ;END, ERROR
  162.     XCHG            ;DE = A(NEXT LINK)
  163.     LHLD    BCAP        ;BCA ADDR
  164.     CALL    GLB        ;GET LINK BLOCK
  165.     RET
  166.  
  167. GDBE:    STC            ;INDICATE EOF
  168.     RET
  169. ;***************************************;
  170. ;
  171. ;         SEEKR:   SEEK DISK BLOCK
  172. ;
  173. ;         DE = A(LINK)
  174. ;
  175. ;***************************************;
  176.  
  177. SEEKR:    PUSH    D        ;SAVE DE
  178.     LDA    DRNUM        ;THE REQD DRIVE
  179.     MOV    C,A
  180.     LXI    D,1        ;WE'VE BEEN HERE BEFORE
  181.     CALL    SDSK
  182.     POP    D
  183.     PUSH    D
  184.     LDAX    D        ;GET SECTOR
  185.     MOV    C,A
  186.     CALL    SSEC        ;SET SECTOR
  187.     POP    D
  188.     PUSH    D
  189.     INX    D
  190.     LDAX    D        ;GET TRACK
  191.     MOV    C,A
  192.     CALL    STRK
  193.     CALL    READ        ;READ BLOCK
  194.     POP    D
  195.     RET
  196.  
  197. ;*****************************************;
  198. ;
  199. ;    FPRT:   PRINT FILE ID
  200. ;
  201. ;    HL = A(FILE ID)
  202. ;
  203. ;*****************************************;
  204. FPRT:    MVI    B,9        ;ID SIZE
  205. FPRT2:    MOV    A,M        ;GET BYTE
  206.     CPI    00        ;IF ZERO,SKIP
  207.     JNZ    FPRT3
  208.     MVI    A,' '
  209. FPRT3:    MOV    E,A        ;PUT IN E
  210.     PUSH    H        ;SAVE HL
  211.     PUSH    B        ;SAVE BC
  212.     MVI    C,02        ;WRITE CONSOLE
  213.     CALL    CPM        ;PRINT CHAR
  214.     POP    B        ;RESTORE BC
  215.     POP    H        ;RESTORE HL
  216.     INX    H        ;BUMP POINTER
  217.     MOV    A,B
  218.     CPI    04        ;FILE TYPE?
  219.     JNZ    FPRT4
  220.     MVI    E,' '
  221.     MVI    C,02
  222.     PUSH    H
  223.     PUSH    B
  224.     CALL    CPM
  225.     POP    B
  226.     POP    H
  227. FPRT4:    DCR    B
  228.     JNZ    FPRT2
  229.     lda    cols
  230.     dcr    a
  231.     jz    endcol
  232.     sta    cols
  233.     mvi    c,2
  234.     mvi    e,' '
  235.     call    cpm
  236.     mvi    c,2
  237.     mvi    e,' '
  238.     call    cpm
  239.     mvi    c,2
  240.     mvi    e,' '
  241.     call    cpm
  242.     ret
  243. endcol:
  244.     mvi    a,4
  245.     sta    cols
  246.     MVI    C,02
  247.     MVI    E,0DH
  248.     CALL    CPM
  249.     MVI    C,02
  250.     MVI    E,0AH
  251.     CALL    CPM
  252.     RET
  253. cols:    db    4
  254.  
  255. ;*****************************************;
  256. ;
  257. ;       MOVE:   MOVE DATA
  258. ;
  259. ;    DE = A (SOURCE)
  260. ;    HL = A(DEST)
  261. ;    B = COUNT
  262. ;
  263. ;******************************************;
  264.  
  265. MOVE:    LDAX    D        ;GET BYTE
  266.     MOV    M,A        ;STORE BYTE
  267.     INX    H
  268.     INX    D        ;BUMP PTRS
  269.     DCR    B        ;DECREMENT COUNT
  270.     JNZ    MOVE
  271.     RET
  272.  
  273. ;*******************************************;
  274. ;
  275. ;    CPM INTERFACE ROUTINES
  276. ;
  277. ;*******************************************;
  278.  
  279. VALID:    ;CHECKS DPB TO SEE IF SS/SD FLOPPY AND EXIT IF NOT
  280.     ;HL = 0 IF NOT SELECTABLE ELSE DPH ADDR
  281.     MOV    A,H
  282.     ORA    L
  283.     JZ    DONE        ;GO TO CPM
  284.     LXI    D,10
  285.     DAD    D
  286.     MOV    A,M
  287.     INX    H
  288.     MOV    H,M
  289.     MOV    L,A        ;HL -> DPB
  290.     MOV    A,M
  291.     CPI    26
  292.     JNZ    DONE        ;IF NOT 26 SPT
  293.     INX    H
  294.     MOV    A,M
  295.     ORA    A
  296.     JNZ    DONE        ;HIGH BYTE OF SPT
  297.     LXI    D,4
  298.     DAD    D
  299.     MOV    A,M
  300.     CPI    242        ;SINGLE DENSITY DSM
  301.     JNZ    DONE
  302.     RET            ;PRETTY GOOD CHANCE IT'S OK NOW
  303.  
  304. SDSK:    LHLD    0001H        ;GET BIOS ADDR
  305.     MVI    L,1BH
  306.     PCHL
  307. SSEC:    LHLD    0001H
  308.     MVI    L,21H
  309.     IF    LOGICAL        ;PASSED SECTOR IS INCREMENTED
  310.     DCR    C        ;IN THE BIOS - SO REDUCE IT HERE
  311.     ENDIF            ; BEFORE IT GETS 'CORRECTED'...
  312.     PCHL
  313. STRK:    LHLD    0001H
  314.     MVI    L,1EH
  315.     PCHL
  316. READ:    LHLD    0001H
  317.     MVI    L,27H
  318.     PCHL
  319. HOME:    LHLD    0001H
  320.     MVI    L,18H
  321.     PCHL
  322.  
  323. ;******************************************;
  324. ;
  325. ;    BLOCK CONTROL AREA DEFINITIONS
  326. ;
  327. ;******************************************;
  328.  
  329. BCA    EQU    0
  330. BCAL    EQU    0
  331. BCALC    EQU    BCAL+2
  332. BCBL    EQU    BCALC+1
  333. BCBD    EQU    BCBL+128
  334.  
  335. ;******************************************;
  336. ;
  337. ;            DATA
  338. ;
  339. ;******************************************;
  340. DRNUM:    DB    5            ;OUT OF THE WAY
  341. BMSG:    DB    'X: $'
  342. MSG2:    DB    'I/O ERROR',0DH,0AH,'$'
  343.  
  344. DIRLNK:    DB    01,01
  345. DENT:    DS    2
  346. DCNT:    DS    1
  347. BCNT:    DS    2
  348. BCAP:    DS    2
  349.     DS    64
  350. STACK    EQU    $
  351.  
  352. DBCA:    DS    2
  353.     DS    1
  354.     DS    128
  355. DBUF:    DS    128
  356.  
  357. FBCA:    DS    2
  358.     DS    1
  359.     DS    128
  360. FBUF:    DS    128
  361.  
  362. TBUF    EQU    0080H
  363. TFCB    EQU    005CH
  364. CPM    EQU    0005H
  365. BOOT    EQU    0000H
  366. CREATE    EQU    22
  367. WRITE    EQU    21
  368. CLOSE    EQU    16
  369.     END
  370.