home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug046.ark / FDOS-CPM.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.4 KB  |  213 lines

  1. ; 10/12/79: 1140
  2. ; P.P.H. LEE,
  3. ; ROYAL MELBOURNE INSTITUTE OF TECHNOLOGY,
  4. ; APPLIED PHYSICS DEPARTMENT,
  5. ; 124 LATROBE STREET, MELBOURNE,
  6. ; VICTORIA 3000, AUSTRALIA.
  7.  
  8. ; PROGRAM TO TRANSFER AN FDOS II FILE ON DISK DRIVE B:
  9. ; TO CP/M FILE IN DISK DRIVE A:
  10. ; TO USE THE PROGRAM, TYPE FDOS-CPM NFN, WHERE NFN IS A
  11. ; NEW CP/M FILE THAT THE FDOS FILE IS TO BE TRANSFERED
  12. ; INTO. THE PROGRAM WILL ASK FOR THE FDOS FILENAME,
  13. ; WHICH MUST BE 5 CHARACTERS LONG MAXIMUM, WITHOUT
  14. ; DRIVE NUMBER (IT ASSUMES DRIVE #1 ALLWAYS), FOLLOWED
  15. ; BY A <CR>.
  16. ; AT THE COMPLETION OF THE TRANSFER, IT WILL REBOOT BACK
  17. ; TO CP/M.
  18.  
  19. ; EXTERNAL LINKAGES:
  20. TFCB    EQU    5CH    ; CP/M FCB ADDRESS
  21. BOOT    EQU    0    ; CP/M WARM BOOT
  22. BDOS    EQU    5    ; CP/M BDOS JUMP ADDRESS
  23. PBUF    EQU    9    ; CP/M PRINT BUFFER CODE
  24. RDBUF    EQU    10    ; CP/M READ BUFFER CODE
  25. MAKE    EQU    22    ; CP/M MAKE FILE CODE
  26. CLOSE    EQU    16    ; CP/M CLOSE FILE CODE
  27. STDMA    EQU    26    ; CP/M SET DMA ADDRESS
  28. WRITE    EQU    21    ; CP/M WRITE RECORD
  29. IUNIT    EQU    0C433H    ; FDOS INPUT FILE DRIVE NO.
  30. ISIZE    EQU    0C434H    ; FDOS INPUT FILE SIZE
  31. ITRK    EQU    0C436H    ; FDOS INPUT TRAK NUMBER
  32. ISCTR    EQU    0C437H    ; FDOS INPUT SECTOR NUMBER
  33. ICNTR    EQU    0C438H    ; FDOS INPUT BUFFER COUNTER
  34. FREAD    EQU    0C033H    ; FDOS READ SUBROUTINE
  35.  
  36.     ORG    100H
  37.  
  38.     LXI    SP,STACK    ; SET STACK POINTER
  39.     LXI    D,TFCB    ; MAKE CP/M FILE
  40.     MVI    C,MAKE
  41.     CALL    BDOS
  42.     CPI    0FFH    ; ERROR?
  43.     JZ    MKERR    ; BRIF IS
  44.     LXI    D,AFLNM    ; ASK FOR FDOS FILENAME
  45.     MVI    C,PBUF
  46.     CALL    BDOS
  47.     LXI    H,TBUF    ; GET FDOS FILENAME
  48.     LXI    B,0620H    ; INTO IFLNM
  49.     MOV    M,B    ; BUT FIRST SET LENGTH
  50.     INX    H    ; AND CLEAR IT
  51. FNAME:    MOV    M,C    ; WITH SPACES
  52.     INX    H    ; POINT NEXT
  53.     DCR    B    ; DECREMENT COUNTER
  54.     JNZ    FNAME    ; LOOP UNTIL ALL DONE
  55.     LXI    D,TBUF    ; NOW GET IT
  56.     MVI    C,RDBUF    ; USING BDOS
  57.     CALL    BDOS    ; READ BUFFER
  58.     MVI    A,1    ; SET INPUT TO DRIVE #1 (B:)
  59.     STA    IUNIT
  60.     CALL    FIND    ; GET FDOS FILE
  61.     ORA    A    ; FOUND IT?
  62.     JNZ    INERR    ; BRIF NOT
  63. GET:    LXI    H,TBUF    ; POINT TO BUFFER
  64.     LXI    D,TBEND    ; END OF BUFFER
  65. GET1:    CALL    FREAD    ; GET BYTE
  66.     JC    GET2    ; BRIF E-0-F
  67.     MOV    M,A    ; PLACE IN BUFFER
  68.     INX    H    ; POINT NEXT
  69.     CALL    CPHL    ; CHECK IF END OF BUFFER YET
  70.     JNZ    GET1    ; BRIF NOT
  71.     JMP    GET3
  72. GET2:    MVI    A,0FFH    ; SET FLAG
  73.     STA    TBFLG
  74. GET3:    SHLD    TBEND    ; SET END OF BUFFER
  75. LOAD:    LXI    H,TBUF    ; POINT TO START OF BUFFER
  76.     SHLD    TBDMA    ; SAVE IT
  77.     XCHG        ; AND PLACE IN DE
  78. LOAD1:    MVI    C,STDMA    ; SET DMA
  79.     CALL    BDOS
  80.     LXI    D,TFCB    ; POINT TO FCB
  81.     MVI    C,WRITE    ; LOAD TO CP/M FILE
  82.     CALL    BDOS    ; A SECTOR AT A TIME
  83.     ORA    A    ; ANY ERROR?
  84.     JNZ    MKERR    ; BRIF IS
  85.     LHLD    TBDMA    ; GET LAST DMA ADDRESS
  86.     LXI    D,128    ; CALCULATE NEXT
  87.     DAD    D    ; DMA ADDRESS
  88.     SHLD    TBDMA    ; SAVE IT
  89.     XCHG        ; PLACE IT IN DE
  90.     LHLD    TBEND    ; GET END OF BUFFER ADDRESS
  91.     CALL    CPHL    ; ALREADY THERE?
  92.     JNZ    LOAD1    ; BRIF NOT
  93.     LDA    TBFLG    ; GET FLAG
  94.     ORA    A    ; NO MORE?
  95.     JZ    GET    ; BRIF STILL SOME MORE
  96.     LXI    D,TFCB    ; POINT TO FCB
  97.     MVI    C,CLOSE    ; CLOSE CP/M FILE
  98.     CALL    BDOS
  99.     JMP    BOOT    ; AND REBOOT
  100.  
  101. INERR:    LXI    D,NSFL    ; PRINT NO SUCH FILE
  102.     MVI    C,PBUF
  103.     CALL    BDOS
  104.     JMP    BOOT
  105.  
  106. MKERR:    LXI    D,ERMSG    ; PRINT ERROR
  107.     MVI    C,PBUF    ; MESSAGE
  108.     CALL    BDOS
  109.     JMP    BOOT    ; AND REBOOT
  110.  
  111. CPHL:    MOV    A,H    ; COMPARE H
  112.     CMP    D    ; WITH D
  113.     RNZ        ; RIF NOT EQUAL
  114.     MOV    A,L    ; COMPARE L
  115.     CMP    E    ; WITH E
  116.     RET
  117.  
  118. ; MESSAGES:
  119. NSFL:    DB    '* NO SUCH FDOS II FILE *',0DH,0AH,'$'
  120. ERMSG:    DB    '* CP/M DISK FULL *',0DH,0AH,'$'
  121. AFLNM:    DB    'FDOS II FILENAME: $'
  122.  
  123. ; SUBROUTINE TO SET ITRK, ISCTR, ISIZE & ICNTR READY TO
  124. ; START READING THE DIRECTORY TRAK OF AN FDOS II 
  125. ; DISKETTE.
  126.  
  127. INDEX:    LXI    H,24    ; 23 SECTORS
  128.     SHLD    ISIZE    ; STORE IN ISIZE
  129.     LXI    H,ITRK    ; POINT TO ITRK
  130.     MVI    M,0    ; TRAK # 0
  131.     INX    H
  132.     LDA    IUNIT    ; GET INPUT DRIVE NO.
  133. INDX2:    RRC        ; ROTATE TO 2 MSB
  134.     RRC
  135.     ORI    03H    ; INCORPORATE SECTOR # 3
  136.     MOV    M,A    ; LOAD ISCTR
  137.     INX    H    ; POINT TO ICNTR
  138.     MVI    M,0    ; RESET ICNTR
  139.     RET
  140.  
  141. ; SUBROUTINE TO SKIP READING N NUMBER OF BYTE,
  142. ; WHERE N IS IN E REGISTER.
  143.  
  144. SKIPR:    CALL    FREAD
  145.     DCR    E    ; DECREMENT COUNT
  146.     JNZ    SKIPR
  147.     RET
  148.  
  149. ; SUBROUTINE TO OBTAIN THE ADDRESS & SIZE OF THE FILE
  150. ; FROM THE DISKETTE DIRECTORY AND LOAD THEM INTO ITRK,
  151. ; ISCTR & ISIZE, ALSO RESETTING ICNTR TO ZERO.
  152.  
  153. FIND:    CALL    CLEAR    ; CLEAR READ BUFFER
  154.     CALL    INDEX
  155. SECTR:    MVI    D,11    ; 11 FCB PER SECTOR
  156. BLOCK:    MVI    E,11    ; 11 BYTES PER FCB
  157.     LXI    H,TBUF+1 ; GET FILE NAME
  158.     MVI    B,5    ; SET MATCH COUNTER
  159. CHECK:    CALL    FREAD
  160.     JC    NONE    ; BRIF NO MATCH FOUND
  161.     DCR    E    ; DECREMENT FCB BYTE COUNT
  162.     INX    H    ; GET FILE-NAME
  163.     CMP    M    ; COMPARE IT
  164.     JZ    MATCH
  165.     CALL    SKIPR    ; NO MATCH, GET NEXT FCB
  166.     DCR    D    ; DEC. BLOCK COUNT
  167.     JNZ    BLOCK    ; CHECK FOR LAST FCB
  168.     MVI    E,7    ; GET NEXT SECTOR
  169.     CALL    SKIPR
  170.     JMP    SECTR    ; LOOP
  171. MATCH:    DCR    B    ; DEC. MATCH COUNTER
  172.     JNZ    CHECK    ; BRIF INCOMPLETE MATCH
  173.     CALL    FREAD    ; COMPLETE MATCH, SKIP ATTRIBUTE
  174.     CALL    FREAD    ; GET REST OF INFO
  175.     MOV    B,A    ; SAVE TRAK ADDRESS IN B
  176.     CALL    FREAD
  177.     DCR    A    ; DEC SECTOR ADDRESS
  178.     MOV    C,A    ; SAVE SECTOR IN C
  179.     CALL    FREAD
  180.     MOV    H,A    ; SAVE SIZE IN H&L
  181.     CALL    FREAD
  182.     MOV    L,A
  183.     SHLD    ISIZE    ; STORE SIZE IN ISIZE
  184.     MOV    A,B    ; MOVE TRAK ADDR TO ACC
  185.     STA    ITRK    ; LOAD ITRK
  186.     LDA    IUNIT    ; GET DRIVE NO.
  187.     RRC        ; ROTATE TO 2 MSB
  188.     RRC
  189.     ORA    C    ; INCORPORATE DRIVE NO. & SECTOR
  190.     STA    ISCTR    ; LOAD ISCTR
  191.     RLC        ; RESTORE UNIT # TO 2 LSB
  192.     RLC
  193.     STA    IUNIT    ; & REPLACE, INCL SECTOR ADDR
  194.  
  195. ; SUBROUTINE TO CLEAR THE INPUT BUFFER
  196. CLEAR:    LDA    ICNTR    ; GET ICNTR
  197.     ORA    A    ; TEST IT
  198.     RZ        ; RET IF EMPTY
  199.     CALL    FREAD    ; DUMMY READ
  200.     JMP    CLEAR    ; LOOP
  201.  
  202. NONE:    MVI    A,0FFH    ; SET FLAG
  203.     RET
  204.  
  205. ; STORAGES:
  206. TBFLG:    DB    0    ; FLAG: 00 - SOME MORE
  207.             ;    FF - NO MORE
  208. TBDMA:    DS    2    ; DMA START ADDRESS
  209. STACK    EQU    $+64    ; STACK AREA
  210. TBUF    EQU    STACK    ; START OF BUFFER
  211. TBEND    EQU    TBUF+(128*128)    ; END OF BUFFER
  212.     END
  213.