home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol175 / files.a86 < prev    next >
Encoding:
Text File  |  1984-07-15  |  10.2 KB  |  606 lines

  1. ;
  2. ;        FILES.A86
  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:                ;INIT DMA ADDR, FCB
  19.     MOV    CL,STDMA
  20.     MOV    DX,OFFSET 80H
  21.     INT    224
  22.     MOV    byte ptr .FCBEXT,0
  23.     TEST    MFFLG1,0FFH
  24.     JNZ    MFN01        ;IF FIRST TIME
  25.     MOV    MFFLG1,1    ;TURN OFF 1ST TIME SW
  26.     MOV    BX,OFFSET FCB    ;SAVE THE REQUESTED NAME
  27.     MOV    DX,OFFSET MFREQ
  28.     MOV    CX,OFFSET 12
  29.     CALL    MOVER
  30.     MOV    AL,BYTE PTR .FCB
  31.     MOV    MFCUR,AL    ;SAVE DISK IN CURRENT FCB
  32.     MOV    BX,OFFSET MFREQ    ;SRCHF REQ NAME
  33.     MOV    DX,OFFSET FCB
  34.     MOV    CX,OFFSET 12
  35.     CALL    MOVER
  36.     PUSH    CX
  37.     PUSH    DX
  38.     PUSH    BX
  39.     MOV    CL,SRCHF
  40.     MOV    DX,OFFSET FCB
  41.     INT    224
  42.     POP    BX
  43.     POP    DX
  44.     POP    CX
  45.     JMP    MFN02
  46. ;
  47. MFN01:
  48.     MOV    BX,OFFSET MFCUR    ;SRCHF CURR NAME
  49.     MOV    DX,OFFSET FCB
  50.     MOV    CX,OFFSET 12
  51.     CALL    MOVER
  52.     MOV    CL,SRCHF
  53.     MOV    DX,OFFSET FCB
  54.     INT    224
  55.     MOV    BX,OFFSET MFREQ    ;SRCHN REQ NAME
  56.     MOV    DX,OFFSET FCB
  57.     MOV    CX,OFFSET 12
  58.     CALL    MOVER
  59.     MOV    CL,SRCHN
  60.     MOV    DX,OFFSET FCB
  61.     INT    224
  62. MFN02:
  63.     INC    AL        ;RETURN CARRY IF NOT FOUND
  64.     STC
  65.     JNZ    MFFIX1
  66.     MOV    MFFLG1,AL
  67.     RET
  68. ;
  69. MFFIX1:
  70.     DEC    AL        ;MOVE NAME FOUND TO CURR
  71.     AND    AL,3
  72.     ADD    AL,AL
  73.     ADD    AL,AL
  74.     ADD    AL,AL
  75.     ADD    AL,AL
  76.     ADD    AL,AL
  77.     ADD    AL,81H
  78.     MOV    BL,AL
  79.     MOV    BH,0
  80.     PUSH    BX        ;SAVE NAME POINTER
  81.     MOV    DX,OFFSET MFCUR+1
  82.     MOV    CX,OFFSET 11
  83.     CALL    MOVER
  84.     POP    BX        ;MOVE NAME FOUND TO FCB
  85.     MOV    DX,OFFSET FCB+1
  86.     MOV    CX,OFFSET 11
  87.     CALL    MOVER
  88.     XOR    AL,AL        ;SETUP FCB
  89.     MOV    BYTE PTR .FCBEXT,AL
  90.     MOV    BYTE PTR .FCBRNO,AL
  91.     RET
  92. ;
  93. ; Move subroutine
  94. ;
  95. MOVER:    MOV    AL,BYTE PTR [BX]
  96.     XCHG    BX,DX
  97.     MOV    BYTE PTR [BX],AL
  98.     XCHG    BX,DX
  99.     INC    BX
  100.     INC    DX
  101.     DEC    CX
  102.     JNZ    MOVER
  103.     RET
  104. ;
  105. ;Lists directory and gives free space remaining on the requested drive.
  106. ;
  107. DIRLST:
  108.     MOV    DX,OFFSET CMDBUF    ;PUT COMMAND LINE IN FCB
  109.     MOV    BX,OFFSET 5CH
  110.     CALL    CPMLINE
  111.     MOV    BX,OFFSET SRCHFCB
  112.     CALL    INITFCBS
  113.     MOV    AL,BYTE PTR .6CH    ;GET DRIVE #
  114.     MOV    SRCHFCB,AL
  115.     MOV    AL,BYTE PTR .6DH
  116.     CMP    AL,20H        ;IF BLANK GET ALL NAMES
  117.     PUSH    AX
  118.     JNZ    DIRLST1
  119.     CALL    QSTMARK
  120. DIRLST1:
  121.     POP    AX
  122.     JZ    DIRLST2
  123.     CALL    MOVENAME    ;ELSE MOVE NAME INTO FCB
  124. DIRLST2:
  125.     MOV    DX,OFFSET 80H
  126.     MOV    CL,STDMA
  127.     INT    224
  128.     MOV    NAMEGD,0
  129.     MOV    AL,NOOFCOL    ;GET NUMBER OF COLUMNS
  130.     MOV    NAMECT,AL    ;STORE TO CALCULATE CRLF POSITION
  131.     MOV    DX,OFFSET SRCHFCB
  132.     MOV    CL,SRCHF    ;DO FIRST SEARCH
  133.     INT    224
  134.     CMP    AL,0FFH
  135.     JZ    NOFILE
  136.     PUSH    AX
  137. DIRLP:
  138.     POP    AX
  139.     CALL    GETADD
  140.     ADD    BX,15        ;OFFSET FOR RECORD COUNT
  141.     MOV    AL,BYTE PTR [BX]
  142.     OR    AL,AL
  143.     JZ    NEXTSR        ;NO LIST IF FILE IS ZERO LENGTH
  144.     ADD    BX,-5        ;POINT TO $SYS ATTRIB BYTE
  145.     MOV    AL,BYTE PTR [BX]
  146.     AND    AL,80H
  147.     JNZ    NEXTSR        ;NO LIST IF $SYS FILE
  148.     ADD    BX,-10        ;POINT TO BEGINNING OF NAME
  149.     INC    BX        ;POINT TO FIRST LETTER
  150.     MOV    DX,OFFSET PRNTNAME
  151.     MOV    CH,8
  152.     CALL    MOVE
  153.     INC    DX
  154.     MOV    CH,3
  155.     CALL    MOVE
  156.     CALL    ILPRT
  157. PRNTNAME:
  158.     DB '        ','.','   ',' ', 0   ;8 SPACES, PERIOD, 3 SPACES, 1 SPACE
  159.     MOV    NAMEGD,0FFH
  160. NEXTSR:
  161.     MOV    DX,OFFSET SRCHFCB
  162.     MOV    CL,SRCHN    ;DO NEXT SEARCH
  163.     INT    224
  164.     CMP    AL,0FFH
  165.     JZ    DIRDONE
  166.     PUSH    AX
  167.     TEST    NAMEGD,0FFH
  168.     JZ    DIRLP
  169.     DEC    NAMECT
  170.     JNZ    NEXTSR1
  171.     CALL    NEWCT
  172.     JMPS    NEXTSR2
  173. NEXTSR1:
  174.     CALL    FENCE
  175. NEXTSR2:
  176.     MOV    NAMEGD,0
  177.     JMP    DIRLP
  178. ;
  179. NOFILE:
  180.     CALL    ILPRT
  181.     DB    'NO FILE',0
  182. ;
  183. ; Determines free space remaining
  184. ;
  185. DIRDONE:
  186.     MOV    AL,SRCHFCB
  187.     OR    AL,AL
  188.     JZ    DEFLT
  189.     DEC    AL
  190.     MOV    DL,AL
  191.     MOV    CL,SELDSK
  192.     INT    224
  193. DEFLT:
  194.     MOV    CL,GETPARM     ;CURRENT DISK PARAMETER BLOACK
  195.     INT    224
  196.     ADD    BX,2
  197.     MOV    AL,ES: BYTE PTR [BX]        ;GET BLOCK SHIFT FACTOR
  198.     MOV    BSHIFTF,AL
  199.     INC    BX        ;BUMP TO BLOCK MASK
  200.     MOV    AL,ES: BYTE PTR [BX]        ;GET IT
  201.     MOV    BMASK,AL
  202.     ADD    BX,2
  203.     MOV    DX,ES: WORD PTR [BX] ; GET MAX BLOCK NUMBER
  204. ;    MOV    DL,ES: BYTE PTR [BX] ;GET MAX BLOCK NUMBER
  205. ;    INC    BX
  206. ;    MOV    DH,ES: BYTE PTR [BX]
  207. ;    XCHG    BX,DX
  208.     MOV    BMAX,DX        ;PUT IT AWAY
  209.     MOV    CL,GETALC     ;ADDRESS OF CP/M ALLOCATION VECTOR
  210.     INT    224
  211.     XCHG    BX,DX        ;GET ITS LENGTH
  212.     MOV    BX,BMAX
  213.     INC    BX
  214.     MOV    CX,0        ;INITIALIZE BLOCK COUNT TO ZERO
  215. GSPBYT:
  216.     PUSH    DX        ;SAVE ALLOCATION ADDRESS
  217.     XCHG    BX,DX
  218.     MOV    AL,ES: BYTE PTR [BX]
  219.     XCHG    BX,DX
  220.     MOV    DL,8        ;SET TO PROCESS 8 BLOCKS
  221. GSPLUP:
  222.     RCL    AL,1        ;TEST BIT
  223.     JC    NOTFRE
  224.     INC    CX
  225. NOTFRE:
  226.     MOV    DH,AL        ;SAVE BITS
  227.     DEC    BX
  228.     MOV    AL,BL
  229.     OR    AL,BH
  230.     JZ    ENDALC        ;QUIT IF OUT OF BLOCKS
  231.     MOV    AL,DH        ;RESTORE BITS
  232.     DEC    DL        ;COUNT DOWN 8 BITS
  233.     JNZ    GSPLUP        ;DO ANOTHER BIT
  234.     POP    DX        ;BUMP TO NEXT COUNT OF ALLOCATION VECTOR
  235.     INC    DX
  236.     JMP    GSPBYT        ;PROCESS IT
  237. ;
  238. ENDALC:
  239.     POP    DX        ;CLEAR ALLOCATION VECTOR FROM STACK
  240.     MOV    BX,CX        ; COPY TO BX
  241.     MOV    AL,BSHIFTF    ;GET BLOCK SHIFT FACTOR
  242.     SUB    AL,3        ;CONVERT FROM RECORDS TO THOUSANDS
  243.     JZ    PRTFREE        ;SKIP SHIFTS IF 1K BLOCKS
  244. FREKLP:
  245.     ADD    BX,BX        ;MULTIPLY BLOCKS BY 'K PER BLOCK'
  246.     DEC    AL
  247.     JNZ    FREKLP
  248. PRTFREE:
  249.     PUSH    BX
  250.     CALL    ILPRT
  251.     DB    CR,LF,'Drive ',0
  252.     MOV    AL,SRCHFCB    ;IF NO DRIVE, GET
  253.     OR    AL,AL        ;LOGGED IN DRIVE
  254.     JNZ    PRNTHD
  255.     MOV    CL,CURDSK
  256.     INT    224
  257.     INC    AL
  258. PRNTHD:
  259.     ADD    AL,'A'-1
  260.     MOV    DRNAME,AL
  261.     CALL    ILPRT
  262. DRNAME    DB    '  has ',0
  263.     POP    BX        ;GET NUMBER OF BYTES AVAILABLE
  264.     CALL    DECOUT
  265.     CALL    ILPRT
  266.     DB    'K bytes free',CR,LF,0
  267.     RET
  268. ;
  269. ; Subroutines
  270. ;
  271. FENCE:
  272.     CALL    ILPRT
  273.     DB    '| ',0
  274.     RET
  275. ;
  276. NEWCT:
  277.     CALL    CRLF
  278.     MOV    AL,NOOFCOL
  279.     MOV    NAMECT,AL
  280.     RET
  281. ;
  282. QSTMARK:
  283.     MOV    AL,'?'        ;IF BLANK IN FCB, PUT IN 11 ?'s
  284.     MOV    CH,11
  285.     MOV    BX,OFFSET SRCHFCB+1
  286. QSTLP:
  287.     MOV    BYTE PTR [BX],AL
  288.     INC    BX
  289.     DEC    CH
  290.     JNZ    QSTLP
  291.     RET
  292. ;
  293. MOVENAME:
  294.     MOV    BX,OFFSET 6DH
  295.     MOV    DX,OFFSET SRCHFCB+1
  296.     MOV    CH,11
  297.     CALL    MOVE        ;MOVE IN MAIN PROGRAM
  298.     RET
  299. ;
  300. GETADD:
  301.     AND    AL,03H        ;GET MOD4 FOR CP/M 1.4
  302.     ADD    AL,AL        ;ADD 32
  303.     ADD    AL,AL
  304.     ADD    AL,AL
  305.     ADD    AL,AL
  306.     ADD    AL,AL
  307.     MOV    DL,AL
  308.     MOV    DH,0
  309.     MOV    BX,OFFSET 80H    ;ADD DMA OFFSET
  310.     ADD    BX,DX
  311.     RET
  312. ;
  313. ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'.
  314. ;
  315. CKCPM2:
  316.     MOV    CL,STDMA
  317.     MOV    DX,OFFSET 80H
  318.     INT    224
  319.     MOV    CL,SRCHF    ;SEARCH FOR FILE
  320.     MOV    DX,OFFSET FCB
  321.     INT    224
  322.     CMP    AL,0FFH
  323.     JNZ    CKCPM2A
  324.     RET
  325. CKCPM2A:
  326.     ADD    AL,AL
  327.     ADD    AL,AL        ;MULT A-REG BY..
  328.     ADD    AL,AL
  329.     ADD    AL,AL        ;..32 TO FIND..
  330.     ADD    AL,AL        ;..NAME IN DMA.
  331.     MOV    BX,OFFSET 80H
  332.     ADD    AL,BL
  333.     MOV    BL,AL        ;HL POINTS TO DIR NAME
  334.     MOV    DX,OFFSET 9
  335.     ADD    BX,DX        ;POINT TO R/O ATTRIB BYTE
  336.     MOV    AL,BYTE PTR [BX]
  337.     AND    AL,80H        ;TEST MSB
  338.     JNZ    MKCHG        ;IF SET, MAKE CHANGE
  339.     INC    BX        ;CHECK SYSTEM ATTRIB BYTE
  340.     MOV    AL,BYTE PTR [BX]
  341.     AND    AL,80H
  342.     JNZ    CKCPM2B        ; IS $SYS OR $R/O
  343.     RET
  344. CKCPM2B:
  345.     DEC    BX
  346. MKCHG:
  347.     MOV    DX, -8
  348.     ADD    BX,DX        ;POINT HL TO FILENAME + 1
  349.     MOV    DX,OFFSET FCB+1    ;MOVE DIR NAME TO FCB..
  350.     MOV    CH,11    ;..WITHOUT CHANGING DRIVE.
  351.     CALL    MOVE
  352.     MOV    BX,OFFSET FCB+9    ;R/O ATTRIB
  353.     AND    BYTE PTR [BX],07FH    ; STRIP R/O ATTRIB
  354.     INC    BX
  355.     AND    BYTE PTR [BX],07FH    ; STRIP SYS ATTRIB
  356.     MOV    DX,OFFSET FCB
  357.     MOV    CL,30    ;SET NEW ATTRIBS IN DIR
  358.     INT    224
  359. ;
  360. ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE
  361. ;
  362. PLANCHG:
  363.     MOV    BX,OFFSET FCB    ;CHANGE NAME TO TYPE "BAK"
  364.     MOV    DX,OFFSET 6CH
  365.     MOV    CH,9    ;MOVE DRIVE AND NAME (NOT TYPE)
  366.     CALL    MOVE
  367.     MOV    BX,OFFSET 75H    ;START OF TYPE IN FCB2
  368.     MOV    BYTE PTR [BX],'B'
  369.     INC    BX
  370.     MOV    BYTE PTR [BX],'A'
  371.     INC    BX
  372.     MOV    BYTE PTR [BX],'K'
  373.     MOV    DX,OFFSET 6CH
  374.     MOV    CL,ERASE    ;ERASE ANY PREV BACKUPS
  375.     INT    224
  376.     MOV    BX,OFFSET 6CH    ;FCB2 DR FIELD SHOULD..
  377.     MOV    BYTE PTR [BX],0    ;..0 FOR RENAME.
  378.     MOV    DX,OFFSET FCB
  379.     MOV    CL,23    ;RENAME
  380.     INT    224
  381.     RET
  382. ;
  383. CKBAKUP:
  384.     MOV    AL,BAKUPBYTE
  385.     OR    AL,AL
  386.     JZ    CKBAKUPR
  387.     MOV    CL,SRCHF
  388.     MOV    DX,OFFSET FCB
  389.     INT    224
  390.     INC    AL
  391.     JZ    CKBAKUPR
  392.     JMP    PLANCHG    ;IN "CKCPM2" - RET DONE THERE
  393. CKBAKUPR:
  394.     RET
  395. ;
  396. ERASFIL:
  397.     MOV    BX,OFFSET FCB    ;CHECK FOR WILD CARDS
  398.     MOV    CH,11
  399. ERASFIL1:
  400.     INC    BX
  401.     MOV    AL,BYTE PTR [BX]
  402.     CMP    AL,'?'        ;IS IT A WILD CARD?
  403.     JZ    WILDERR        ;GO IF SO
  404.     DEC    CH
  405.     JNZ    ERASFIL1
  406.     MOV    AL,BATCHFLG     ;DON'T ASK FOR ERASE..
  407.     OR    AL,AL        ;..IN MULTI-FILE MODE,..
  408.     JZ    NOASK        ;..JUST DO IT.
  409.     MOV    DX,OFFSET FCB
  410.     MOV    CL,SRCHF
  411.     INT    224
  412.     INC    AL
  413.     JZ    CKBAKUPR
  414.     CALL    ILPRT
  415.     DB    'File exists -- Type ''Y'' to erase: ',BELL,0
  416.     CALL    KEYIN
  417.     PUSH    AX
  418.     CALL    TIPE
  419.     POP    AX
  420.     CALL    UCASE
  421.     CMP    AL,'Y'
  422.     JZ    ERASEIT
  423.     JMP    MENU
  424.  
  425. ERASEIT:
  426.     CALL    CRLF
  427. NOASK:
  428.     MOV    DX,OFFSET FCB
  429.     MOV    CL,ERASE
  430.     INT    224
  431.     RET
  432. ;
  433. WILDERR:
  434.     POP    BX        ;RESTORE STACK
  435.     CALL    ILPRT
  436.     DB    '++ No ambiguous file names allowed ++',CR,LF,BELL,0
  437.     JMP    MENU
  438. ;
  439. BLKFILE:
  440.     CALL    ILPRT    ;ROUTINE IF NO FILE IS NAMED FOR "SEND" OR "RECEIVE"
  441.     DB    CR,LF,'No file specified',CR,LF,BELL,0
  442.     JMP    MENU
  443.  
  444. MAKEFIL:
  445.     MOV    DX,OFFSET FCB
  446.     MOV    CL,MAKE
  447.     INT    224
  448.     INC    AL
  449.     JZ    MAKEFIL1
  450.     RET
  451. MAKEFIL1:
  452.     CALL    ERXIT
  453.     DB    'Error - Can''t make file',CR,LF
  454.     DB    'Directory is likely full',CR,LF,'$'
  455. ;
  456. CNREC:
  457.     MOV    CL,FILSIZ     ;COMPUTE FILE SIZE FUNCTION IN CP/M 2.x
  458.     MOV    DX,OFFSET FCB    ;POINT TO FILE CONTROL BLOCK
  459.     INT    224
  460.     MOV    BX,WORD PTR .FCB+33    ;GET RECORD COUNT
  461.     MOV    RCNT,BX    ;STORE IT
  462.     MOV    BX, 0    ;ZERO HL
  463.     MOV    WORD PTR .FCB+33,BX    ;RESET RANDOM RECORD IN FCB
  464.     RET
  465. ;
  466. OPENFIL:
  467.     XOR    AL,AL
  468.     MOV    BYTE PTR .FCBEXT,AL
  469.     MOV    DX,OFFSET FCB
  470.     MOV    CL,OPEN
  471.     INT    224
  472.     INC    AL
  473.     JNZ    OPENOK
  474.     CALL    ERXIT
  475.     DB    'Can''t open file$'
  476. OPENOK:
  477.     MOV    AL,QFLG
  478.     OR    AL,AL
  479.     JNZ    OPENOK1
  480.     RET
  481.  
  482. OPENOK1:
  483.     CALL    SENDTIM        ;A LIB MACRO SHOWS TIME TO SEND    
  484.     MOV    BYTE PTR .FCBRNO,0  ; MJM - 9.01.05 FIX BATCH SEND
  485.     MOV    BYTE PTR .FCBEXT,0  ; MJM - 9.01.05 FIX BATCH SEND
  486.     RET
  487. ;
  488. CLOSFIL:
  489.     MOV    DX,OFFSET FCB
  490.     MOV    CL,CLOSE
  491.     INT    224
  492.     INC    AL
  493.     JZ    CLOSFIL1
  494.     RET
  495.  
  496. CLOSFIL1:
  497.     CALL    ERXIT
  498.     DB    'Can''t close file$'
  499. RDSECT:
  500.     DEC    SECINBF
  501.     JS    RDBLOCK
  502.     MOV    BX,SECPTR
  503.     MOV    DX,OFFSET 80H
  504.     CALL    MOVE128
  505.     MOV    SECPTR,BX
  506.     RET
  507. ;
  508. RDBLOCK:
  509.     MOV    AL,EOFLG
  510.     CMP    AL,1
  511.     STC
  512.     JNZ    RDBLOCK1
  513.     RET
  514. RDBLOCK1:
  515.     MOV    CL,0
  516.     MOV    DX,OFFSET DBUF
  517. RDSECLP:
  518.     PUSH    CX
  519.     PUSH    DX
  520.     MOV    CL,STDMA
  521.     INT    224
  522.     MOV    DX,OFFSET FCB
  523.     MOV    CL,READ
  524.     INT    224
  525.     POP    DX
  526.     POP    CX
  527.     OR    AL,AL
  528.     JZ    RDSECOK
  529.     DEC    AL
  530.     JZ    REOF
  531.     CALL    ERXIT
  532.     DB    '++ File read error ++$'
  533. RDSECOK:
  534.     MOV    BX,OFFSET 80H
  535.     ADD    BX,DX
  536.     XCHG    BX,DX
  537.     INC    CL
  538.     MOV    AL,CL
  539.     CMP    AL,DBUFSIZ*8 ;BUFFER SIZE IN 128 BYTE SECTORS
  540.     JZ    RDBFULL
  541.     JMP    RDSECLP
  542. ;
  543. REOF:    MOV    AL,1
  544.     MOV    EOFLG,AL
  545.     MOV    AL,CL
  546. RDBFULL:
  547.     MOV    SECINBF,AL
  548.     MOV    BX,OFFSET DBUF
  549.     MOV    SECPTR,BX
  550.     MOV    DX,OFFSET 80H
  551.     MOV    CL,STDMA
  552.     INT    224
  553.     JMP    RDSECT
  554. ;
  555. WRSECT:
  556.     MOV    BX,SECPTR
  557.     XCHG    BX,DX
  558.     MOV    BX,OFFSET 80H
  559.     CALL    MOVE128
  560.     XCHG    BX,DX
  561.     MOV    SECPTR,BX
  562.     MOV    AL,SECINBF
  563.     INC    AL
  564.     MOV    SECINBF,AL
  565.     CMP    AL,DBUFSIZ*8     ;BUFFER SIZE IN 128 BYTE SECTORS
  566.     JZ    WRBLOCK
  567.     RET
  568. WRBLOCK:
  569.     MOV    AL,SECINBF
  570.     OR    AL,AL
  571.     JNZ    WRBLOCK1
  572.     RET
  573. WRBLOCK1:
  574.     MOV    CL,AL
  575.     MOV    DX,OFFSET DBUF
  576. DKWRLP:
  577.     PUSH    BX
  578.     PUSH    DX
  579.     PUSH    CX
  580.     MOV    CL,STDMA
  581.     INT    224
  582.     MOV    DX,OFFSET FCB
  583.     MOV    CL,WRITE
  584.     INT    224
  585.     POP    CX
  586.     POP    DX
  587.     POP    BX
  588.     OR    AL,AL
  589.     JNZ    WRERR
  590.     MOV    BX,OFFSET 80H
  591.     ADD    BX,DX
  592.     XCHG    BX,DX
  593.     DEC    CL
  594.     JNZ    DKWRLP
  595.     XOR    AL,AL
  596.     MOV    SECINBF,AL
  597.     MOV    BX,OFFSET DBUF
  598.     MOV    SECPTR,BX
  599.     RET
  600. ;
  601. WRERR:    MOV    CL,CAN
  602.     CALL    SEND
  603.     CALL    ERXIT
  604.     DB    CR,LF,'Error writing file',CR,LF,'$'
  605. ;
  606.