home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / PASCALZ4.ZIP / D3 / BYTIN.SRC < prev    next >
Text File  |  1999-04-05  |  3KB  |  163 lines

  1. ;RETURNS BYTE FROM FILE ONE BYTE AT A TIME
  2. ;
  3.     NAME BYTIN
  4.     ENTRY .BYTIN
  5.     EXT .SELDSK,.POPHDB,.PUSHBD
  6.     INCLUDE DEFLT.SRC
  7. ;
  8. ;
  9. .BYTIN    CALL    .PUSHBD        ;SAVE ALL REGISTERS EXCEPT A
  10.     LXI    D,BYTPT
  11.     DAD    D
  12.     MOV    A,M
  13.     INX    H
  14.     CMP    M
  15.     CMC            ; MAKE CARRY 0 UNLESS END OF BLOCK.
  16.     JNZ    NTEMPT        ; BRANCH AROUND BLOCK READ IF NOT EMPTY.
  17.  
  18. ;THIS READS A 256 BYTE BLOCK INTO THE DATA AREA OF THE FILE DESCRIPTOR
  19. ;POINTED TO HL - LSBYT. IT MODIFIES BYTPT, LSBYT, ALL REGISTERS EXCEPT HL AND A.
  20.     PUSH    PSW
  21.     PUSH    H
  22.     LXI    D,-LSBYT-3
  23.     DAD    D        ;FLAGS BYTE
  24.     BIT    4,M        ;'RANDOMLY ACCESSED' BIT
  25.     JZ    BYTIN1        ;NOT RANDOMLY ACCESSED
  26.  
  27.     IF    NOT COMPILER    ;COMPILER DOESN'T USE DIRECT ACCESS
  28. ;RANDOMLY ACCESSED.  FILL BUFFER USING RANDOM READ FUNCTION
  29.     INX    H
  30.     INX    H
  31.     INX    H        ;FCB
  32.     CALL    .SELDSK        ;SELECT PROPER DRIVE
  33.     POP    D
  34.     PUSH    D
  35.     INX    D        ;START OF DATA BUFFER
  36.     MVI    C,26        ;CP/M CODE FOR SETTING DMA ADDRESS
  37.     CPM        
  38.     POP    H
  39.     PUSH    H
  40.     LXI    D,-LSBYT+RANREC  ;LOW BYTE OF RANDOM RECORD NUMBER
  41.     DAD    D
  42.     INR    M        ;INCREMENT COUNT
  43.     MOV    A,M
  44.     CPI    1
  45.     JRNC    RRDSET    
  46.     INX    H        ;CARRY TO HIGH BYTE
  47.     INR    M
  48.     JRNZ    RRDSET
  49.     INX    H        ;CARRY TO OVERFLOW BYTE
  50.     INR    M
  51. RRDSET    POP    H
  52.     PUSH    H
  53.     LXI    D,-LSBYT    ;FBA
  54.     DAD    D
  55.     XCHG
  56.     MVI    C,33        ;RANDOM READ
  57.     CPM        
  58. ;READ SECOND SECTOR
  59.     POP    H
  60.     PUSH    H
  61.     LXI    D,128+DATAB-LSBYT
  62.     DAD    D        ;SECOND HALF OF DATA BUFFER
  63.     XCHG
  64.     MVI    C,26        ; SET DMA ADDRESS
  65.     CPM        
  66.     POP    H
  67.     PUSH    H
  68.     LXI    D,-LSBYT+RANREC
  69.     DAD    D
  70.     INR    M        ;INCREMENT RANDOM RECORD COUNT
  71.     MOV    A,M
  72.     CPI    1
  73.     JRNC    RRESET
  74.     INX    H        ;CARRY TO HIGH BYTE OF RECORD COUNT
  75.     INR    M
  76.     JRNZ    RRESET
  77.     INX    H        ;CARRY TO OVERFLOW BYTE OF RECORD COUNT
  78.     INR    M
  79. RRESET:    POP    H
  80.     PUSH    H
  81.     LXI    D,-LSBYT
  82.     DAD    D        ;FCB
  83.     XCHG
  84.     MVI    C,33        ;RANDOM READ
  85.     CPM        
  86.     POP    H
  87.     POP    PSW
  88.     ORA    A        ;CLEAR CARRY FOR NOT EOF 
  89.     JMP    NTEMPT
  90.     ENDIF
  91.  
  92. ;DOING SEQUENTIAL READS
  93. BYTIN1:    POP    H
  94.     PUSH    H
  95.     MOV    A,M
  96.     ADI    1        ; TEST LSBYT FOR FFH
  97.     JNC    BEOF        ; END OF FILE HAS BEEN REACHED.
  98.     LXI    D,FCB-LSBYT
  99.     DAD    D        ; HL NOW POINTS TO FCB.
  100.     CALL    .SELDSK        ; SELECT PROPER DRIVE.
  101.  
  102.     POP    D
  103.     PUSH    D
  104.     INX    D        ; DE NOW POINTS TO START OF DATA BUFFER.
  105.     MVI    C,26        ; CP/M CODE FOR SETTING DMA ADDRESS.
  106.     CPM        
  107.     POP    H
  108.     PUSH    H
  109.     LXI    D,FCB-LSBYT
  110.     DAD    D
  111.     XCHG
  112.     MVI    C,20        ; CP/M CODE FOR READ SECTOR.
  113.     CPM        
  114.     ORA    A
  115.     JRNZ    EOF99
  116.  
  117. ;READ SECOND SECTOR TO FILL 256 BYTE BLOCK.
  118.     POP    H
  119.     PUSH    H
  120.     LXI    D,128+DATAB-LSBYT
  121.     DAD    D        ; HL NOW POINTS TO SECOND HALF OF DATA BUFFER.
  122.     XCHG
  123.     MVI    C,26        ; CP/M CODE FOR SETTING S_DMA ADDRESS.
  124.     CPM        
  125.     POP    H
  126.     PUSH    H
  127.     LXI    D,FCB-LSBYT
  128.     DAD    D        ; HL NOW POINTS TO FCB.
  129.     XCHG
  130.     MVI    C,20        ; CP/M CODE FOR READ SECTOR.
  131.     CPM        
  132.     ORA    A
  133.     JRNZ    EOF360
  134.     POP    H
  135.     POP    PSW
  136.     ORA    A        ; CLEAR CARRY FOR NOT EOF INDICATION.
  137.     JMPR    NTEMPT
  138.  
  139. EOF99
  140. BEOF    POP    H
  141.     POP    PSW
  142.     STC            ; SET CARRY FOR EOF INDICATION.
  143.     JMPR    NTEMPT
  144.  
  145. EOF360    POP    H
  146.     MVI    M,7FH        ; CODE FOR HALF FULL BUFFER.
  147.     POP    PSW
  148.     ORA    A        ; NOT EOF QUITE YET.
  149.  
  150. NTEMPT    PUSH    PSW        ; SAVE CARRY (CARRY = 1 ===> EOF).
  151.     INR    A        ; INCREMENT BYTE POINTER/COUNTER.
  152.     DCX    H
  153.     MOV    M,A        ; STORE UPDATED BYTE POINTER.COUNTER.
  154.     MOV    E,A
  155.     MVI    D,0        ; MAKE HIGH BYTE OF OFFSET INTO DATA BLOCK ZERO.
  156.     INX    H
  157.     INX    H
  158.     DAD    D        ; HL NOW POINTS TO DATA BYTE.
  159.     POP    PSW        ; RESTORE CARRY.
  160.     MOV    A,M
  161.     JMP    .POPHDB
  162. ;
  163.