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 / SIMTEL / CPMUG / CPMUG001.ARK / LIOS.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  271 lines

  1. ;********************************;
  2. ;   LOGICAL I/O SYSTEM FOR CP/M  ;
  3. ;********************************;
  4.  
  5. ;********************************;
  6. ;   MISCELLANEOUS EQUATES        ;
  7. ;********************************;
  8.  
  9. BOOT    EQU    0000H    ;REBOOT ENTRY POINT
  10. CPM    EQU    0005H    ;CPM ENTRY POINT
  11.  
  12. TBUF    EQU    0080H    ;TRANS. BUFFER
  13. TFCB    EQU    005CH    ;TRANS. FCB
  14.  
  15. SDISK    EQU    14    ;SET DISK FUNCT. CODE
  16. OPEN    EQU    15    ;OPEN FUNCTION CODE
  17. CLOSE    EQU    16    ;CLOSE FUNCTION CODE
  18. DELET    EQU    19    ;DELETE FUNCTION CODE
  19. READ    EQU    20    ;READ FUNCTION CODE
  20. WRITE    EQU    21    ;WRITE FUNCTION CODE
  21. CREAT    EQU    22    ;CREATE FUNCTION CODE
  22. RENAM    EQU    23    ;RENAME FUNCTION CODE
  23.  
  24. ;********************************;
  25. ;          JUMP VECTORS          ;
  26. ;********************************;
  27.  
  28.     ORG    1000H
  29.     JMP    FFCB    ;FILL FCB
  30.     JMP    FMAKE    ;FILE CREATE
  31.     JMP    FOPEN    ;FILE OPEN
  32.     JMP    FCLOS    ;FILE CLOSE
  33.     JMP    FDELE    ;DELETE FILE
  34.     JMP    OUTBT    ;BYTE OUTPUT
  35.     JMP    GETBT    ;BYTE INPUT
  36.  
  37. ;********************************;
  38. ;           F F C B              ;
  39. ; ROUTINE TO FILL IN ID FIELDS   ;
  40. ;            OF FCB              ;
  41. ;                                ;
  42. ; INPUTS:    HL = A(FCB)         ;
  43. ;            DE = A(ID STRING)   ;
  44. ; OUTPUTS:   CARRY = ERROR       ;
  45. ;********************************;
  46.  
  47. FFCB:    MVI    M,00    ;CLEAR FIRST BYTE OF FCB
  48.     INX    H    ;SKIP BYTE
  49.     PUSH    H    ;SAVE FCB NAME ADDRESS
  50.     MVI    C,8+3    ;SIZE OF ID FIELD
  51.     MVI    A,' '    ;SPACE
  52. FFCB0:    MOV    M,A    ;CLEAR ID FIELD TO SPACES
  53.     INX    H
  54.     DCR    C
  55.     JNZ    FFCB0
  56.     POP    H    ;GET ID FIELD ADDR.
  57.     MVI    C,8    ;MAZ SIZE OF NAME
  58. FFCB1:    LDAX    D    ;GET ID BYTES
  59.     CPI    ' '    ;LEADING SPACES?
  60.     JNZ    FFCB2    ;NO, CONTINUE
  61.     INX    D    ;SKIP LEADING SPACES
  62.     JMP    FFCB1
  63. FFCB2:    LDAX    D    ;GET ID BYTE
  64.     CPI    0DH    ;CR?
  65.     RZ        ;YES, DONE
  66.     CPI    ' '    ;IMBEDDED SPACE?
  67.     RZ        ;YES, DONE
  68.     CPI    '.'    ;NAME.TYP SEPARATOR?
  69.     JZ    FFCB3    ;YES, PROCESS TYPE
  70.     MOV    M,A    ;STORE NAME BYTE
  71.     INX    D
  72.     INX    H    ;BUMP POINTERS
  73.     DCR    C    ;DECREMENT MAX COUNT
  74.     JNZ    FFCB2    ;LOOP
  75.     JMP    FFCBE    ;ERROR, NAME TOO BIG
  76.  
  77. FFCB3:    INX    D    ;SKIP OVER '.'
  78. FFCB4:    INX    H    ;SKIP TO TYPE FIELD
  79.     DCR    C
  80.     JNZ    FFCB4
  81.     MVI    C,3    ;SIZE OF TYPE FIELD
  82. FFCB5:    LDAX    D    ;GET ID BYTE
  83.     CPI    0DH    ;CR?
  84.     RZ        ;YES, DONE
  85.     CPI    ' '    ;SPACE?
  86.     RZ        ;YES, DONE
  87.     MOV    M,A    ;STORE TYPE BYTE
  88.     INX    D    ;BUMP POINTER
  89.     INX    H
  90.     DCR    C    ;DECREMENT MAX COUNT
  91.     JNZ    FFCB5    ;LOOP
  92.     RET        ;DONE
  93.  
  94. FFCBE:    STC        ;SET CARRY
  95.     RET
  96.  
  97. ;********************************;
  98. ;           F M A K E            ;
  99. ;  ROUTINE TO CREATE A DISK FILE ;
  100. ;                                ;
  101. ;  INPUT:    DE=A(FCB)           ;
  102. ; OUTPUT:    CARRY=ERROR         ;
  103. ;********************************;
  104.  
  105. FMAKE:    MVI    C,CREAT    ;CREATE CODE
  106.     CALL    CPM    ;ISSUE CREATE
  107.     CPI    0FFH    ;ERROR?
  108.     JZ    FMERR    ;YES
  109.     XRA    A    ;CLEAR CARRY
  110.     RET
  111. FMERR:    STC        ;SET CARRY
  112.     RET        ;EXIT
  113.  
  114. ;********************************;
  115. ;           F O P E N            ;
  116. ;  ROUTINE TO OPEN A DISK FILE   ;
  117. ;                                ;
  118. ;  INPUT:     DE=A(FCB)          ;
  119. ; OUTPUT:     CARRY=ERROR        ;
  120. ;********************************;
  121.  
  122. FOPEN:    MVI    C,OPEN    ;OPNE CODE
  123.     CALL    CPM    ;ISSUE OPEN
  124.     CPI    0FFH    ;ERROR?
  125.     JZ    FOERR    ;YES
  126.     XRA    A    ;CLEAR CARRY
  127.     RET
  128. FOERR:    STC
  129.     RET
  130.  
  131. ;********************************;
  132. ;           F C L O S            ;
  133. ;  ROUTINE TO CLOSE A DISK FILE  ;
  134. ;                                ;
  135. ;  INPUT:     DE=A(FCB)          ;
  136. ; OUTPUT:     CARRY=ERROR        ;
  137. ;********************************;
  138.  
  139. FCLOS:    MVI    C,CLOSE    ;CLOSE CODE
  140.     CALL    CPM
  141.     CPI    0FFH    ;ERROR?
  142.     JZ    FCERR    ;YES
  143.     XRA    A    ;CLEAR CARRY
  144.     RET
  145. FCERR:    STC
  146.     RET
  147.  
  148. ;********************************;
  149. ;            F D E L E           ;
  150. ;  ROUTINE TO DELETE A DISK FILE ;
  151. ;                                ;
  152. ;  INPUT:     DE=A(FCB)          ;
  153. ;********************************;
  154.  
  155. FDELE:    MVI    C,DELET
  156.     CALL    CPM    ;ISSUE DELETE
  157.     XRA    A    ;RESET CARRY
  158.     RET
  159.  
  160. ;********************************;
  161. ;            O U T B T           ;
  162. ;   ROUTINE TO OUTPUT A BYTE     ;
  163. ;                                ;
  164. ;  INPUT:     A=BYTE)            ;
  165. ; OUTPUT:     CARRY=ERROR        ;
  166. ;********************************;
  167.  
  168. OUTBT:    STA    TEMP    ;SAVE BYTE
  169. OUT1:    LXI    H,OBUF+128
  170.     XCHG        ;BUFFER END ADDR IN DE
  171.     LHLD    OUTPT    ;CURRENT ADDR IN HL
  172.     CALL    CPHL    ;TEST FOR END OF BUFFER
  173.     JZ    OUT2    ;YES, WRITE
  174.     LDA    TEMP
  175.     MOV    M,A    ;STORE DATA BYTE IN BUFFER
  176.     INX    H    ;BUMP BUFFER POINTER
  177.     SHLD    OUTPT    ;SAVE BUFFER POINTER
  178.     ORA    A
  179.     RET        ;EXIT
  180. OUT2:    LXI    D,OBUF    ;POINT TO OUTPUT BUFFER
  181.     LXI    H,TBUF    ;TEMP BUFFER
  182.     MVI    B,128
  183.     CALL    MOVE    ;COPY BUFFERS
  184.     MVI    C,WRITE    ;WRITE CODE
  185.     LXI    D,OFCB    ;OUTPUT FCB
  186.     CALL    CPM    ;ISSUE WRITE
  187.     CPI    00    ;OK?
  188.     JNZ    OERR    ;NO
  189. OUT2A:    LXI    H,OBUF    ;RESET POINTER
  190.     SHLD    OUTPT
  191.     JMP    OUT1    ;CONTINUE
  192. OERR:    STC
  193.     RET
  194.  
  195. ;********************************;
  196. ;            G E T B T           ;
  197. ;   ROUTINE TO READ A BYTE       ;
  198. ;                                ;
  199. ;  OUTPUTS:     A=BYTE           ;
  200. ;               CARRY=ERROR      ;
  201. ;********************************;
  202.  
  203. GETBT:    LXI    H,IBUF+128
  204.     XCHG        ;BUFFER END ADDR. IN DE
  205.     LHLD    INPTR    ;CURRENT POINTER IN HL
  206.     CALL    CPHL    ;TEST FOR END OF BUFFER
  207.     JZ    GETB2    ;YES, READ
  208. GETB1:    MOV    A,M    ;GET BYTE
  209.     INX    H    ;BUMP POINTER
  210.     SHLD    INPTR    ;SAVE POINTER
  211.     ORA    A    ;RESET CARRY
  212.     RET
  213. GETB2:    MVI    C,READ    ;READ CODE
  214.     LXI    D,IFCB    ;FCB ADDRESS
  215.     CALL    CPM    ;ISSUE READ
  216.     CPI    00    ;ERROR?
  217.     JNZ    IERR    ;YES
  218.     LXI    D,TBUF    ;POINT TO TEMP BUFFER
  219.     LXI    H,IBUF    ;INPUT BUFFER
  220.     MVI    B,128
  221.     CALL    MOVE    ;COPY BUFFER
  222.     LXI    H,IBUF    ;RESET BUFFER POINTER
  223.     SHLD    INPTR
  224.     JMP    GETB1    ;CONTINUE
  225. IERR:    STC
  226.     RET
  227.  
  228. ;********************************;
  229. ;   MISCELLANEOUS SUBROUTINES    ;
  230. ;********************************;
  231.  
  232. ;********************************;
  233. ;            M O V E             ;
  234. ;  ROUTINE TO MOVE BLOCKS OF DATA;
  235. ;********************************;
  236. MOVE:    LDAX    D    ;GET BYTE
  237.     MOV    M,A    ;STORE BYTE
  238.     INX    H
  239.     INX    D    ;BUMPP POINTERS
  240.     DCR    B    ;DECREMENT COUNT
  241.     JNZ    MOVE    ;LOOP
  242.     RET
  243.  
  244. ;********************************;
  245. ;             C P H L            ;
  246. ;  ROUTINE TO COMPARE HL VS DE   ;
  247. ;********************************;
  248.  
  249. CPHL:    MOV    A,H
  250.     CMP    D
  251.     RNZ
  252.     MOV    A,L
  253.     CMP    E
  254.     RET
  255.  
  256. ;********************************;
  257. ;             D A T A            ;
  258. ;********************************;
  259.  
  260. TEMP:    DS    2    ;TEMP SAVE WORD
  261.  
  262. IFCB:    DS    33    ;INPUT FCB
  263. OFCB:    DS    33    ;OUTPUT FCB
  264.  
  265. OUTPT:    DW    OBUF    ;OUTPUT POINTER
  266. INPTR:    DW    IBUF+128;INPUT POINTER
  267.  
  268. OBUF:    DS    128    ;INPUT BUFFER
  269. IBUF:    DS    128    ;OUTPUT BUFFER
  270.     END
  271.