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 / BEEHIVE / COMMS / MODEM9.ARC / FILES.ASM < prev    next >
Assembly Source File  |  1991-02-02  |  11KB  |  677 lines

  1. ;
  2. ;        FILES.ASM
  3. ;
  4. ;Disk file routines for MODEM9.xx.
  5. ;
  6. ;
  7. ;Multi-file access subroutine.  Allows processing of multiple files
  8. ;(i.e., *.ASM) from disk.  This routine builds the proper name in the
  9. ;FCB each time it is called.  This command would be used in such pro-
  10. ;grams such as modem transfer, tape save, etc. in which you want to
  11. ;process single or multiple files.
  12. ;
  13. ;The FCB will be set up with the next name, ready to do normal proces-
  14. ;sing (OPEN, READ, etc.) when routine is called.
  15. ;
  16. ;Carry is set if no more names can be found
  17. ;
  18. MFNAME:    PUSH    B        ;INIT DMA ADDR, FCB
  19.     PUSH    D
  20.     PUSH    H
  21.     MVI    C,STDMA
  22.     LXI    D,80H
  23.     CALL    BDOS
  24.     POP    H
  25.     POP    D
  26.     POP    B
  27.     XRA    A
  28.     STA    FCBEXT
  29.     LDA    MFFLG1
  30.     ORA    A
  31.     JNZ    MFN01        ;IF FIRST TIME
  32.     MVI    A,1        ;TURN OFF 1ST TIME SW
  33.     STA    MFFLG1
  34.     LXI    H,FCB        ;SAVE THE REQUESTED NAME
  35.     LXI    D,MFREQ
  36.     LXI    B,12
  37.     CALL    MOVER
  38.     LDA    FCB
  39.     STA    MFCUR        ;SAVE DISK IN CURRENT FCB
  40.     LXI    H,MFREQ        ;SRCHF REQ NAME
  41.     LXI    D,FCB
  42.     LXI    B,12
  43.     CALL    MOVER
  44.     PUSH    B
  45.     PUSH    D
  46.     PUSH    H
  47.     MVI    C,SRCHF
  48.     LXI    D,FCB
  49.     CALL    BDOS
  50.     POP    H
  51.     POP    D
  52.     POP    B
  53.     JMP    MFN02
  54. ;
  55. MFN01:    LXI    H,MFCUR        ;SRCHF CURR NAME
  56.     LXI    D,FCB
  57.     LXI    B,12
  58.     CALL    MOVER
  59.     PUSH    B
  60.     PUSH    D
  61.     PUSH    H
  62.     MVI    C,SRCHF
  63.     LXI    D,FCB
  64.     CALL    BDOS
  65.     POP    H
  66.     POP    D
  67.     POP    B
  68.     LXI    H,MFREQ        ;SRCHN REQ NAME
  69.     LXI    D,FCB
  70.     LXI    B,12
  71.     CALL    MOVER
  72.     PUSH    B
  73.     PUSH    D
  74.     PUSH    H
  75.     MVI    C,SRCHN
  76.     LXI    D,FCB
  77.     CALL    BDOS
  78.     POP    H
  79.     POP    D
  80.     POP    B
  81. MFN02:    INR    A        ;RETURN CARRY IF NOT FOUND
  82.     STC
  83.     JNZ    MFFIX1
  84.     STA    MFFLG1
  85.     RET
  86. ;
  87. MFFIX1:    DCR    A        ;MOVE NAME FOUND TO CURR
  88.     ANI    3
  89.     ADD    A
  90.     ADD    A
  91.     ADD    A
  92.     ADD    A
  93.     ADD    A
  94.     ADI    81H
  95.     MOV    L,A
  96.     MVI    H,0
  97.     PUSH    H        ;SAVE NAME POINTER
  98.     LXI    D,MFCUR+1
  99.     LXI    B,11
  100.     CALL    MOVER
  101.     POP    H        ;MOVE NAME FOUND TO FCB
  102.     LXI    D,FCB+1
  103.     LXI    B,11
  104.     CALL    MOVER
  105.     XRA    A        ;SETUP FCB
  106.     STA    FCBEXT
  107.     STA    FCBRNO
  108.     RET
  109. ;
  110. ; Move subroutine
  111. ;
  112. MOVER:    MOV    A,M
  113.     STAX    D
  114.     INX    H
  115.     INX    D
  116.     DCX    B
  117.     MOV    A,B
  118.     ORA    C
  119.     JNZ    MOVER
  120.     RET
  121. ;
  122. ;Lists directory and gives free space remaining on the requested drive.
  123. ;
  124. DIRLST:
  125.     LXI    D,CMDBUF    ;PUT COMMAND LINE IN FCB
  126.     LXI    H,5CH
  127.     CALL    CPMLINE
  128.     LXI    H,SRCHFCB
  129.     CALL    INITFCBS
  130.     LDA    6CH        ;GET DRIVE #
  131.     STA    SRCHFCB
  132.     LDA    6DH
  133.     CPI    20H        ;IF BLANK GET ALL NAMES
  134.     PUSH    PSW
  135.     CZ    QSTMARK
  136.     POP    PSW
  137.     CNZ    MOVENAME    ;ELSE MOVE NAME INTO FCB
  138.     LXI    D,80H
  139.     MVI    C,STDMA
  140.     CALL    BDOS
  141.     XRA    A
  142.     STA    NAMEGD
  143.     LDA    NOOFCOL        ;GET NUMBER OF COLUMNS
  144.     STA    NAMECT        ;STORE TO CALCULATE CRLF POSITION
  145.     LXI    D,SRCHFCB
  146.     MVI    C,SRCHF        ;DO FIRST SEARCH
  147.     CALL    BDOS
  148.     CPI    0FFH
  149.     JZ    NOFILE
  150.     PUSH    PSW
  151. DIRLP:    POP    PSW
  152.     CALL    GETADD
  153.     LXI    D,15        ;OFFSET FOR RECORD COUNT
  154.     DAD    D
  155.     MOV    A,M
  156.     ORA    A
  157.     JZ    NEXTSR        ;NO LIST IF FILE IS ZERO LENGTH
  158.     LXI    D,-5
  159.     DAD    D        ;POINT TO $SYS ATTRIB BYTE
  160.     MOV    A,M
  161.     ANI    80H
  162.     JNZ    NEXTSR        ;NO LIST IF $SYS FILE
  163.     LXI    D,-10
  164.     DAD    D        ;POINT TO BEGINNING OF NAME
  165.     INX    H        ;POINT TO FIRST LETTER
  166.     LXI    D,PRNTNAME
  167.     MVI    B,8
  168.     CALL    MOVE
  169.     INX    D
  170.     MVI    B,3
  171.     CALL    MOVE
  172.     CALL    ILPRT
  173. PRNTNAME:
  174.     DB '        ','.','   ',' ', 0   ;8 SPACES, PERIOD, 3 SPACES, 1 SPACE
  175.     MVI    A,0FFH
  176.     STA    NAMEGD
  177. NEXTSR:    LXI    D,SRCHFCB
  178.     MVI    C,SRCHN        ;DO NEXT SEARCH
  179.     CALL    BDOS
  180.     CPI    0FFH
  181.     JZ    DIRDONE
  182.     PUSH    PSW
  183.     LDA    NAMEGD
  184.     ORA    A
  185.     JZ    DIRLP
  186.     LDA    NAMECT
  187.     DCR    A
  188.     STA    NAMECT
  189.     ORA    A
  190.     CZ    NEWCT
  191.     CNZ    FENCE
  192.     XRA    A
  193.     STA    NAMEGD
  194.     JMP    DIRLP
  195. ;
  196. NOFILE:    CALL    ILPRT
  197.     DB    'NO FILE',0
  198. ;
  199. ; Determines free space remaining
  200. ;
  201. DIRDONE:
  202.     LDA    SRCHFCB
  203.     ORA    A
  204.     JZ    DEFLT
  205.     DCR    A
  206.     MOV    E,A
  207.     MVI    C,SELDSK
  208.     CALL    BDOS
  209. DEFLT:    MVI    C,GETPARM     ;CURRENT DISK PARAMETER BLOACK
  210.     CALL    BDOS
  211.     INX    H
  212.     INX    H
  213.     MOV    A,M        ;GET BLOCK SHIFT FACTOR
  214.     STA    BSHIFTF
  215.     INX    H        ;BUMP TO BLOCK MASK
  216.     MOV    A,M        ;GET IT
  217.     STA    BMASK
  218.     INX    H
  219.     INX    H
  220.     MOV    E,M        ;GET MAX BLOCK NUMBER
  221.     INX    H
  222.     MOV    D,M
  223.     XCHG
  224.     SHLD    BMAX        ;PUT IT AWAY
  225.     MVI    C,GETALC     ;ADDRESS OF CP/M ALLOCATION VECTOR
  226.     CALL    BDOS
  227.     XCHG            ;GET ITS LENGTH
  228.     LHLD    BMAX
  229.     INX    H
  230.     LXI    B,0        ;INITIALIZE BLOCK COUNT TO ZERO
  231. GSPBYT:    PUSH    D        ;SAVE ALLOCATION ADDRESS
  232.     LDAX    D
  233.     MVI    E,8        ;SET TO PROCESS 8 BLOCKS
  234. GSPLUP:    RAL            ;TEST BIT
  235.     JC    NOTFRE
  236.     INX    B
  237. NOTFRE:    MOV    D,A        ;SAVE BITS
  238.     DCX    H
  239.     MOV    A,L
  240.     ORA    H
  241.     JZ    ENDALC        ;QUIT IF OUT OF BLOCKS
  242.     MOV    A,D        ;RESTORE BITS
  243.     DCR    E        ;COUNT DOWN 8 BITS
  244.     JNZ    GSPLUP        ;DO ANOTHER BIT
  245.     POP    D        ;BUMP TO NEXT COUNT OF ALLOCATION VECTOR
  246.     INX    D
  247.     JMP    GSPBYT        ;PROCESS IT
  248. ;
  249. ENDALC:    POP    D        ;CLEAR ALLOCATION VECTOR FROM STACK
  250.     MOV    L,C        ;COPY BLOCK TO 'HL'
  251.     MOV    H,B
  252.     LDA    BSHIFTF        ;GET BLOCK SHIFT FACTOR
  253.     SUI    3        ;CONVERT FROM RECORDS TO THOUSANDS
  254.     JZ    PRTFREE        ;SKIP SHIFTS IF 1K BLOCKS
  255. FREKLP:    DAD    H        ;MULTIPLY BLOCKS BY 'K PER BLOCK'
  256.     DCR    A
  257.     JNZ    FREKLP
  258. PRTFREE:
  259.     PUSH    H
  260.     CALL    ILPRT
  261.     DB    CR,LF,'Drive ',0
  262.     LDA    SRCHFCB        ;IF NO DRIVE, GET
  263.     ORA    A        ;LOGGED IN DRIVE
  264.     JNZ    PRNTHD
  265.     MVI    C,CURDSK
  266.     CALL    BDOS
  267.     INR    A
  268. PRNTHD:    ADI    'A'-1
  269.     STA    DRNAME
  270.     CALL    ILPRT
  271. DRNAME:    DB    '  has ',0
  272.     POP    H        ;GET NUMBER OF BYTES AVAILABLE
  273.     CALL    DECOUT
  274.     CALL    ILPRT
  275.     DB    'K bytes free',CR,LF,0
  276.     RET
  277. ;
  278. ; Subroutines
  279. ;
  280. FENCE:    CALL    ILPRT
  281.     DB    '| ',0
  282.     RET
  283. ;
  284. NEWCT:    CALL    CRLF
  285.     LDA    NOOFCOL
  286.     STA    NAMECT
  287.     RET
  288. ;
  289. QSTMARK:
  290.     MVI    A,'?'        ;IF BLANK IN FCB, PUT IN 11 ?'s
  291.     MVI    B,11
  292.     LXI    H,SRCHFCB+1
  293. QSTLP:    MOV    M,A
  294.     INX    H
  295.     DCR    B
  296.     JNZ    QSTLP
  297.     RET
  298. ;
  299. MOVENAME
  300.     LXI    H,6DH
  301.     LXI    D,SRCHFCB+1
  302.     MVI    B,11
  303.     CALL    MOVE        ;MOVE IN MAIN PROGRAM
  304.     RET
  305. ;
  306. GETADD:    ANI    03H        ;GET MOD4 FOR CP/M 1.4
  307.     ADD    A        ;ADD 32
  308.     ADD    A
  309.     ADD    A
  310.     ADD    A
  311.     ADD    A
  312.     MOV    E,A
  313.     MVI    D,0
  314.     LXI    H,80H        ;ADD DMA OFFSET
  315.     DAD    D
  316.     RET
  317. ;
  318. ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'.
  319. ;
  320. CKCPM2:
  321.     MVI    C,12
  322.     CALL    BDOS
  323.     ORA    A    ;RETURN 0 MEANS CP/M 1
  324.     RZ
  325.     MVI    C,STDMA
  326.     LXI    D,80H
  327.     CALL    BDOS
  328.     MVI    C,SRCHF    ;SEARCH FOR FILE
  329.     LXI    D,FCB
  330.     CALL    BDOS
  331.     CPI    0FFH
  332.     RZ
  333.     ADD    A
  334.     ADD    A    ;MULT A-REG BY..
  335.     ADD    A
  336.     ADD    A    ;..32 TO FIND..
  337.     ADD    A    ;..NAME IN DMA.
  338.     LXI    H,80H
  339.     ADD    L
  340.     MOV    L,A    ;HL POINTS TO DIR NAME
  341.     LXI    D,9
  342.     DAD    D    ;POINT TO R/O ATTRIB BYTE
  343.     MOV    A,M
  344.     ANI    80H    ;TEST MSB
  345.     JNZ    MKCHG    ;IF SET, MAKE CHANGE
  346.     INX    H    ;CHECK SYSTEM ATTRIB BYTE
  347.     MOV    A,M
  348.     ANI    80H
  349.     RZ        ;NOT $SYS OR $R/O
  350.     DCX    H
  351. MKCHG:    LXI    D,-8
  352.     DAD    D    ;POINT HL TO FILENAME + 1
  353.     LXI    D,FCB+1    ;MOVE DIR NAME TO FCB..
  354.     MVI    B,11    ;..WITHOUT CHANGING DRIVE.
  355.     CALL    MOVE
  356.     LXI    H,FCB+9    ;R/O ATTRIB
  357.     MOV    A,M
  358.     ANI    7FH    ;STRIP R/O ATTRIB
  359.     MOV    M,A
  360.     INX    H    ;SYS ATTRIB
  361.     MOV    A,M
  362.     ANI    7FH
  363.     MOV    M,A
  364.     LXI    D,FCB
  365.     MVI    C,30    ;SET NEW ATTRIBS IN DIR
  366.     CALL    BDOS
  367. ;
  368. ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE
  369. ;
  370. PLANCHG:
  371.     LXI    H,FCB    ;CHANGE NAME TO TYPE "BAK"
  372.     LXI    D,6CH
  373.     MVI    B,9    ;MOVE DRIVE AND NAME (NOT TYPE)
  374.     CALL    MOVE
  375.     LXI    H,75H    ;START OF TYPE IN FCB2
  376.     MVI    M,'B'
  377.     INX    H
  378.     MVI    M,'A'
  379.     INX    H
  380.     MVI    M,'K'
  381.     LXI    D,6CH
  382.     MVI    C,ERASE    ;ERASE ANY PREV BACKUPS
  383.     CALL    BDOS
  384.     LXI    H,6CH    ;FCB2 DR FIELD SHOULD..
  385.     MVI    M,0    ;..0 FOR RENAME.
  386.     LXI    D,FCB
  387.     MVI    C,23    ;RENAME
  388.     CALL    BDOS
  389.     RET
  390. ;
  391. CKBAKUP:
  392.     LDA    BAKUPBYTE
  393.     ORA    A
  394.     RZ
  395.     MVI    C,SRCHF
  396.     LXI    D,FCB
  397.     CALL    BDOS
  398.     INR    A
  399.     RZ    ;FILE NOT FOUND
  400.     JMP    PLANCHG    ;IN "CKCPM2" - RET DONE THERE
  401. ;
  402. ERASFIL:
  403.     LXI    H,FCB        ;CHECK FOR WILD CARDS
  404.     MVI    B,11
  405. ERASFIL1:
  406.     INX    H        
  407.     MOV    A,M
  408.     CPI    '?'        ;IS IT A WILD CARD?
  409.     JZ    WILDERR        ;GO IF SO
  410.     DCR    B
  411.     JNZ    ERASFIL1
  412.     LDA    BATCHFLG ;DON'T ASK FOR ERASE..
  413.     ORA    A    ;..IN MULTI-FILE MODE,..
  414.     JZ    NOASK    ;..JUST DO IT.
  415.     LXI    D,FCB
  416.     MVI    C,SRCHF
  417.     CALL    BDOS
  418.     INR    A
  419.     RZ
  420.     CALL    ILPRT
  421.     DB    'File exists -- Type ''Y'' to erase: ',BELL,0
  422.     CALL    KEYIN
  423.     PUSH    PSW
  424.     CALL    TYPE
  425.     POP    PSW
  426.     CALL    UCASE
  427.     CPI    'Y'
  428.     JNZ    MENU
  429.     CALL    CRLF
  430. NOASK:    LXI    D,FCB
  431.     MVI    C,ERASE
  432.     JMP    BDOS    ;USE JUMP SO CAN RET TO VARIOUS CALLING ROUTINES
  433. ;
  434. WILDERR:
  435.     POP    H        ;RESTORE STACK
  436.     CALL    ILPRT
  437.     DB    '++ No ambiguous file names allowed ++',CR,LF,BELL,0
  438.     JMP    MENU
  439. ;
  440. BLKFILE:
  441.     CALL    ILPRT    ;ROUTINE IF NO FILE IS NAMED FOR "SEND" OR "RECEIVE"
  442.     DB    CR,LF,'No file specified',CR,LF,BELL,0
  443.     JMP    MENU
  444.  
  445. MAKEFIL:
  446.     LXI    D,FCB
  447.     MVI    C,MAKE
  448.     CALL    BDOS
  449.     INR    A
  450.     RNZ
  451.     CALL    ERXIT
  452.     DB    'Error - Can''t make file',CR,LF
  453.     DB    'Directory is likely full',CR,LF,'$'
  454. ;
  455.     IF    CPM2X
  456. ;
  457. CNREC:    MVI    C,FILSIZ ;COMPUTE FILE SIZE FUNCTION IN CP/M 2.x
  458.     LXI    D,FCB    ;POINT TO FILE CONTROL BLOCK
  459.     CALL    BDOS
  460.     LHLD    FCB+33    ;GET RECORD COUNT
  461.     SHLD    RCNT    ;STORE IT
  462.     LXI    H,0    ;ZERO HL
  463.     SHLD    FCB+33    ;RESET RANDOM RECORD IN FCB
  464.     RET
  465. ;
  466.     ENDIF    ;CPM2X
  467. ;
  468.     IF    NOT CPM2X
  469. ;
  470. CNREC:    MVI    A,'?'    ;MATCH ALL EXTENTS
  471.     STA    FCBEXT
  472.     MVI    A,0FFH
  473.     STA    MAXEXT    ;INIT MAX EXT NO.
  474.     MVI    C,SRCHF    ;GET 'SEARCH FIRST' FNC
  475.     LXI    D,FCB
  476.     CALL    BDOS    ;READ FIRST
  477.     INR    A    ;WERE THERE ANY?
  478.     JNZ    SOME    ;GOT SOME
  479.     CALL    ERXIT
  480.     DB    '++ File not found ++$'
  481. ;
  482. ;READ MORE DIRECTORY ENTRIES
  483. ;
  484. MOREDIR:
  485.     MVI    C,SRCHN    ;SEARCH NEXT
  486.     LXI    D,FCB
  487.     CALL    BDOS    ;READ DIR ENTRY
  488.     INR    A    ;CHECK FOR END (0FFH)
  489.     JNZ    SOME    ;NOT END OF DIR...PROCESS EXTENT
  490.     LDA    MAXEXT    ;HIT END...GET HIGHEST EXTENT NO. SEEN
  491.     MOV    L,A    ;WHICH GIVES EXTENT COUNT -1
  492.     MVI    H,0
  493.     MOV    D,H
  494.     LDA    RCNT    ;GET RECORD COUNT OF MAX EXTENT SEEN
  495.     MOV    E,A    ;SAVE IT IN DE
  496.     DAD    H
  497.     DAD    H    ;MULTIPLY # OF EXTENTS -1
  498.     DAD    H    ; TIMES 128
  499.     DAD    H
  500.     DAD    H
  501.     DAD    H
  502.     DAD    H
  503.     DAD    D    ;ADD IN SIZE OF LAST EXTENT
  504.     SHLD    RCNT    ;SAVE TOTAL RECORD COUNT
  505.     RET        ;AND EXIT
  506. ;
  507. ;POINT TO DIRECTORY ENTRY
  508. ;
  509. SOME:    DCR    A    ;UNDO PREV 'INR A'
  510.     ANI    3    ;MAKE MODULUS 4
  511.     ADD    A    ;MULTIPLY...
  512.     ADD    A    ;..BY 32 BECAUSE
  513.     ADD    A    ;..EACH DIRECTORY
  514.     ADD    A    ;..ENTRY IS 32
  515.     ADD    A    ;..BYTES LONG
  516.     LXI    H,80H    POINT TO BUFFER
  517.     ADD    L    ;POINT TO ENTRY
  518.     ADI    15    ;OFFSET TO RECORD COUNT
  519.     MOV    L,A    ;HL NOW POINTS TO REC COUNT
  520.     MOV    B,M    ;GET RECORD COUNT
  521.     DCX    H
  522.     DCX    H    ;BACK DOWN TO EXTENT NUMBER
  523.     DCX    H
  524.     LDA    MAXEXT    ;COMPARE WITH CURRENT MAX.
  525.     ORA    A    ;IF NO MAX YET
  526.     JM    BIGGER    ;THEN SAVE RECORD COUNT ANYWAY
  527.     CMP    M
  528.     JNC    MOREDIR
  529. BIGGER:    MOV    A,B    ;SAVE NEW RECORD COUNT
  530.     STA    RCNT
  531.     MOV    A,M    ;SAVE NEW MAX. EXTENT NO.
  532.     STA    MAXEXT
  533.     JMP    MOREDIR    ;GO FIND MORE EXTENTS
  534. ;
  535.     ENDIF    ;NOT CPM2X
  536. ;
  537. OPENFIL:
  538.     XRA    A
  539.     STA    FCBEXT
  540.     LXI    D,FCB
  541.     MVI    C,OPEN
  542.     CALL    BDOS
  543.     INR    A
  544.     JNZ    OPENOK
  545.     CALL    ERXIT
  546.     DB    'Can''t open file$'
  547. OPENOK:
  548.     LDA    QFLG
  549.     ORA    A
  550.     RZ
  551.     CALL    SENDTIM        ;A LIB MACRO SHOWS TIME TO SEND    
  552.     RET
  553. ;
  554. CLOSFIL:
  555.     LXI    D,FCB
  556.     MVI    C,CLOSE
  557.     CALL    BDOS
  558.     INR    A
  559.     RNZ
  560.     CALL    ERXIT
  561.     DB    'Can''t close file$'
  562. RDSECT:
  563.     LDA    SECINBF
  564.     DCR    A
  565.     STA    SECINBF
  566.     JM    RDBLOCK
  567.     LHLD    SECPTR
  568.     LXI    D,80H
  569.     CALL    MOVE128
  570.     SHLD    SECPTR
  571.     RET
  572. ;
  573. RDBLOCK:
  574.     LDA    EOFLG
  575.     CPI    1
  576.     STC
  577.     RZ
  578.     MVI    C,0
  579.     LXI    D,DBUF
  580. RDSECLP:
  581.     PUSH    B
  582.     PUSH    D
  583.     MVI    C,STDMA
  584.     CALL    BDOS
  585.     LXI    D,FCB
  586.     MVI    C,READ
  587.     CALL    BDOS
  588.     POP    D
  589.     POP    B
  590.     ORA    A
  591.     JZ    RDSECOK
  592.     DCR    A
  593.     JZ    REOF
  594.     CALL    ERXIT
  595.     DB    '++ File read error ++$'
  596. RDSECOK:
  597.     LXI    H,80H
  598.     DAD    D
  599.     XCHG
  600.     INR    C
  601.     MOV    A,C
  602.     CPI    DBUFSIZ*8 ;BUFFER SIZE IN 128 BYTE SECTORS
  603.     JZ    RDBFULL
  604.     JMP    RDSECLP
  605. ;
  606. REOF:    MVI    A,1
  607.     STA    EOFLG
  608.     MOV    A,C
  609. RDBFULL:
  610.     STA    SECINBF
  611.     LXI    H,DBUF
  612.     SHLD    SECPTR
  613.     LXI    D,80H
  614.     MVI    C,STDMA
  615.     CALL    BDOS
  616.     JMP    RDSECT
  617. ;
  618. WRSECT:
  619.     LHLD    SECPTR
  620.     XCHG
  621.     LXI    H,80H
  622.     CALL    MOVE128
  623.     XCHG
  624.     SHLD    SECPTR
  625.     LDA    SECINBF
  626.     INR    A
  627.     STA    SECINBF
  628.     CPI    DBUFSIZ*8 ;BUFFER SIZE IN 128 BYTE SECTORS
  629.     RNZ
  630. WRBLOCK:
  631.     LDA    SECINBF
  632.     ORA    A
  633.     RZ
  634.     MOV    C,A
  635.     LXI    D,DBUF
  636. DKWRLP:
  637.     PUSH    H
  638.     PUSH    D
  639.     PUSH    B
  640.     MVI    C,STDMA
  641.     CALL    BDOS
  642.     LXI    D,FCB
  643.     MVI    C,WRITE
  644.     CALL    BDOS
  645.     POP    B
  646.     POP    D
  647.     POP    H
  648.     ORA    A
  649.     JNZ    WRERR
  650.     LXI    H,80H
  651.     DAD    D
  652.     XCHG
  653.     DCR    C
  654.     JNZ    DKWRLP
  655.     XRA    A
  656.     STA    SECINBF
  657.     LXI    H,DBUF
  658.     SHLD    SECPTR
  659.     RET
  660. ;
  661. WRERR:    MVI    C,CAN
  662.     CALL    SEND
  663.     CALL    ERXIT
  664.     DB    CR,LF,'Error writing file',CR,LF,'$'
  665. ;
  666.     LINK    FINISH
  667. ;
  668. 
  669.     MVI    C,STDMA
  670.     CALL    BDOS
  671.     LXI    D,FCB
  672.     MVI    C,READ
  673.     CALL    BDOS
  674.     POP    D
  675.     POP    B
  676.     ORA    A
  677.