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 / ZSYS / SIMTEL20 / SYSLIB / SLIB2.LBR / SFAPPEND.Z80 < prev    next >
Text File  |  2000-06-30  |  3KB  |  149 lines

  1. ;
  2. ; SYSLIB Module Name: SFAPPE
  3. ; Author: Richard Conn
  4. ; SYSLIB Version Number: 3.6
  5. ; Module Version Number: 1.1
  6.  
  7.     public    f$appl,f$append
  8.  
  9. ;
  10. ;  SEE DOCUMENTATION WITH EACH ROUTINE FOR DETAILS
  11. ;
  12.  
  13. ;
  14. ;  Externals
  15. ;
  16.     ext    initfcb
  17.  
  18. ;
  19. ;  BDOS Function calls et al
  20. ;
  21. BDOS    EQU     5    ; BDOS address
  22. OPENF    EQU    15    ; Open file function
  23. WRITEF    EQU    21    ; Write sequential
  24. RREAD    EQU    33    ; Random read function
  25. GETFS    EQU    35    ; Get file size function
  26.  
  27. ;
  28. ;  Macros
  29. ;
  30. PUTRG    MACRO
  31.     PUSH    HL
  32.     PUSH    DE
  33.     PUSH    BC
  34.     ENDM
  35. ;
  36. GETRG    MACRO
  37.     POP    BC
  38.     POP    DE
  39.     POP    HL
  40.     ENDM
  41.  
  42. ;
  43. ;  F$APPEND OPENS THE INDICATED FILE (WHOSE FCB IS PTED TO BY DE) FOR
  44. ;  APPENDING, WITH THE NEXT RECORD TO BE APPENDED BEING AFTER THE LAST
  45. ;  RECORD OF THE FILE.  SUBSEQUENT F$WRITE CALLS WILL APPEND TO THE FILE
  46. ;  AFTER THE LAST RECORD IN THE FILE.
  47. ;
  48. ;  ON INPUT, DE = ADDRESS OF FCB (36 BYTES)
  49. ;  ON OUTPUT, A = ERROR CODE AND Z IS SET ACCORDINGLY
  50. ;    A = 0 AND Z IF NO ERROR
  51. ;    A = 1 AND NZ IF FILE NOT FOUND
  52. ;    A = 2 AND NZ IF FILE FULL
  53. ;    A = 3 AND NZ IF FILE EMPTY
  54. ;  IF SUCCESS, THE TBUFF AREA CONTAINS THE LAST RECORD IN THE FILE
  55. ;
  56. ;    USAGE EXAMPLE:
  57. ;        ...
  58. ;        LXI    D,FCB
  59. ;        CALL    F$APPEND
  60. ;        < FILL TBUFF >
  61. ;        LXI    D,FCB
  62. ;        CALL    F$WRITE    ; RECORD IS APPENDED AFTER LAST RECORD IN FILE
  63. ;        ...
  64. ;
  65. F$APPEND:
  66.     PUTRG
  67.     CALL    F$APPL        ; DO APPEND
  68.     JP    NZ,DONE
  69.     LD    C,WRITEF    ; WRITE RECORD
  70.     CALL    BDOS
  71.     XOR    A        ; NO ERROR
  72.     JP    DONE
  73.  
  74. ;
  75. ;  F$APPL OPENS THE INDICATED FILE (WHOSE FCB IS PTED TO BY DE) FOR
  76. ;  APPENDING. SUBSEQUENT F$WRITE CALLS WILL APPEND TO THE FILE STARTING
  77. ;  AT THE LAST RECORD IN THE FILE.
  78. ;
  79. ;  ON INPUT, DE = ADDRESS OF FCB (36 BYTES)
  80. ;  ON OUTPUT, A = ERROR CODE AND Z IS SET ACCORDINGLY
  81. ;    A = 0 AND Z IF NO ERROR
  82. ;    A = 1 AND NZ IF FILE NOT FOUND
  83. ;    A = 2 AND NZ IF FILE FULL
  84. ;    A = 3 AND NZ IF FILE EMPTY
  85. ;  IF SUCCESS, THE TBUFF AREA CONTAINS THE LAST RECORD IN THE FILE
  86. ;
  87. ;    USAGE EXAMPLE:
  88. ;        ...
  89. ;        LXI    D,FCB
  90. ;        CALL    F$APPL
  91. ;        < FILL TBUFF >
  92. ;        LXI    D,FCB
  93. ;        CALL    F$WRITE    ; LAST RECORD OF ORIGINAL FILE IS REWRITTEN
  94. ;        ...
  95. ;
  96. F$APPL:
  97.     PUTRG
  98.     CALL    INITFCB        ;INIT THE FCB
  99.     LD    C,OPENF        ;OPEN FILE PTED TO BY DE
  100.     CALL    BDOSE
  101.     CP    0FFH        ;ERROR?
  102.     JP    Z,NOFILE
  103.     LD    C,GETFS        ;GET FILE SIZE
  104.     CALL    BDOSE
  105.     LD    HL,35        ;CHECK FOR FULL FILE
  106.     ADD    HL,DE
  107.     LD    A,(HL)        ;GET VALUE
  108.     OR    A        ;MUST BE ZERO
  109.     JP    NZ,FULLFILE
  110.     DEC    HL        ;GET RECORD NUMBER OF LAST RECORD
  111.     LD    B,(HL)
  112.     DEC    HL
  113.     LD    C,(HL)        ;BC = RECORD NUMBER
  114.     LD    A,B        ;CHECK FOR ZERO
  115.     OR    C
  116.     JP    Z,EMFILE    ;DONE IF NO RECORDS
  117.     DEC    BC        ;DECREMENT TO LAST RECORD
  118.     LD    (HL),C        ;STORE RECORD NUMBER - 1
  119.     INC    HL
  120.     LD    (HL),B
  121.     LD    C,RREAD        ;READ LAST RECORD AT RANDOM
  122.     CALL    BDOSE
  123.     XOR    A        ;NO ERROR
  124. DONE:
  125.     GETRG
  126.     RET
  127. NOFILE:
  128.     LD    A,1        ;ERROR CODE FOR NO FILE
  129.     JP    FILE
  130. FULLFILE:
  131.     LD    A,2        ;ERROR CODE FOR FULL FILE
  132.     JP    FILE
  133. EMFILE:
  134.     LD    A,3        ;ERROR CODE FOR EMPTY FILE
  135. FILE:
  136.     GETRG
  137.     OR    A        ;SET NZ
  138.     RET
  139. ;
  140. ;  CALL BDOS AND SAVE DE
  141. ;
  142. BDOSE:
  143.     PUSH    DE
  144.     CALL    BDOS
  145.     POP    DE
  146.     RET
  147.  
  148.     END
  149.