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 / CPM / NSTAR / NSBAS59.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  23KB  |  990 lines

  1. ;************* THIS IS FILE NSCPM48.ASM ****************
  2. ;
  3. ;THIS PROGRAM IS THE INTERFACE FROM NORTHSTAR
  4. ;BASIC (SPECIAL VERSION AT 800H) RELEASE 4
  5. ;TO CPM V1.4, V2.0, AND CDOS V1.07.  11/20/78
  6. ;
  7. ;    REV 1   4/8/79   GOT IT TO WORK WITH MINOR LIMITATIONS
  8. ;    REV 2   4/14/79     -CREATE FULLY IMPLEMENTED WITH BLOCK SIZE
  9. ;             -FIXED DIRECTORY LIST BUG
  10. ;             -WILL CLOSE UP TO 8 OPEN FILES VERSUS 4 (BUG)
  11. ;             -ADDED PUNCH DEVICE AS DEV #2 IN BASIC
  12. ;    REV 3    5/10/79     -MODIFIED CREATE ROUTINE TO NOT CAUSE BDOS
  13. ;              ERROR WHEN CREATING A FILE WHOSE SIZE IS
  14. ;              LARGER THAN CPM
  15. ;             -RETURN DISK NUMBER WHEN DIRECTORY ENTRY NOT FOUND (BUG)
  16. ;             -DISK/DIRECTORY FULL MESSAGE ON CONSOLE WHEN CREATING
  17. ;              SINCE NS BASIC WON'T ERROR WITH THIS INTERFACE.
  18. ;              JUMP TO WARM BOOT AFTER MESSAGE DISPLAYED.
  19. ;             -ADD VERIFY AFTER WRITE & ERROR MESSAGE JUMP TO JUMP
  20. ;              TABLE SINCE BASIC INSERTS A JUMP ADDRESS AT INIT
  21. ;             -INIT TO JUMP TO WBOOT SINCE BASIC MODIFIES ANYWAY
  22. ;    REV 4    5/28/79  -FIXED MEMSET TO ERROR IF SET IN CPM AREA
  23. ;             -ZEROES OUT A REG IN FCB0 ROUTINE (BUG)
  24. ;             -PATCHES BASIC TO REMOVE LIMIT ON 350 BLOCK SIZE
  25. ;             -AUTO PATCH OF LINE LENGTH=132
  26. ;             -AUTO PATCH OF DELETE ECHO CHAR TO BACKSPACE (CTL-H)
  27. ;    REV 5    6/10/79     -MODIFIED SRCHMOR SUBROUTINE FOR CDOS COMPATIBLITY.
  28. ;              DOES NOT AFFECT REV 4.
  29. ;             -REVISED COMMENTS ON CDOS PATCH AND COMPATIBILITY
  30. ;    REV 6    9/27/79  -ADDED VARIABLES TO ALLOW CHANGE IN STARTING MEMORY
  31. ;              ADDRESS FROM STD CPM TO TRS80 CPM
  32. ;    REV 7    10/29/79 -CORRECTED CLOSE WHEN WRITING A TYPE 3 BLOCK.
  33. ;             -RESTORED NEXT RECORD WHEN CROSSING EXTENTS FOR CDOS.
  34. ;             -CORRECTED TYPO FOR ONE OF THE CDOS PATCHES.
  35. ;    REV 8    11/20/79 -MADE INTERFACE COMPATIBLE WITH CPM V2.0.
  36. ;             -INCREASED MAXIMUM FILE SIZE TO 4096 256-BYTE BLOCKS
  37. ;              FOR 8" QUAD DENSITY. (1 MEGABYTE FILE SIZE)
  38. ;             -PUT . IN FRONT OF FILE TYPE WHEN CATALOGING.
  39. ;
  40. ;    REV 9    07/04/82 -CHANGED REV 8 TO WORK WITH NORTH STAR BASIC
  41. ;              REL. 5.2. ALSO CHANGED ENTRY POINTS TO WORK
  42. ;              LIKE 5.2 DOS.                         -SFK-
  43. ;THIS INTERFACE WILL WORK WITH CPM OR ANY OF ITS
  44. ;DERIVATIVES, E.G., IMDOS, CDOS (V1.07 OR LATER), ETC
  45. ;
  46. ;NOTE:    CDOS V1.07 MUST BE PATCHED IN 4 PLACES; THIS IS INDICATED BY THE [[ ]]
  47. ;    IN THE REMARKS.
  48. ;
  49. ;
  50. ;    *****************************************
  51. ;    *                    *
  52. ;    * YOU MUST MOVE BASIC TO JUST ABOVE THIS*
  53. ;    * INTERFACE.  USE THE BASIC MOVER IN    *
  54. ;    * THE NORTHSTAR USERS GROUP (REL 4)    *
  55. ;    *                    *
  56. ;    * BASIC MOVER PARAMETERS: STD    TRS80    *
  57. ;    *                    *
  58. ;    *    BASIC START ADDR: 800    4A00    *
  59. ;    *    ROM ADDRESS:     E800    E800    *
  60. ;    *    DOS START ADDR:    F6    42F6    *
  61. ;    *    END OF MEMORY ADDR: XXXX    *
  62. ;    *        X=DON'T CARE        *
  63. ;    *****************************************
  64. ;
  65. ;****************************************************************************
  66. ;
  67. ;    RELEASE 4 INCOMPATIBILITIES (THRU REV 4):
  68. ;
  69. ;        1. RND(-1) WILL NOT GENERATE RANDOM NUMBERS
  70. ;
  71. ;    SOFTWARE NOTES:
  72. ;
  73. ;        1. STORAGE ALLOWED FOR ONLY 10 OPEN FILES
  74. ;        2. DO NOT HAVE FILES WITH THE SAME NAME WITH A SINGLE
  75. ;            CHARACTER TYPE.  IF MORE THAN ONE, FUNCTIONS WILL
  76. ;            OPERATE ON 1ST ENTRY FOUND IN DIRECTORY
  77. ;            (EXCLUDING SAVE, NSAVE, LOAD, APPEND)
  78. ;        3. WHEN CREATING A FILE AND THE DISK OR DIRECTORY IS FULL,
  79. ;            THE MESSAGE 'DISK/DIR FULL' IS DISPLAYED ON THE CONSOLE
  80. ;            NOT THE NORTH STAR ERROR MESSAGE.  THIS INTERFACE
  81. ;            IMPLEMENTATION DOES NOT ALLOW ERROR TRAPPING OF DISK
  82. ;            FULL WHEN CREATING.  IT DOES NOT STOP EITHER.
  83. ;            JUMPS TO WARM BOOT AFTER PRINTING MESSAGE.
  84. ;        4. WILL NOT ALLOW MEMSET INTO CPM AREA.  GIVES ARGUMENT ERROR
  85. ;            IF ATTEMPTED.  WHEN BASIC IS BOOTED, MEMSET AT 809H IS
  86. ;            AUTOMATICALLY SET TO THE MAX RAM UP TO BDOS-1 IN CPM.
  87. ;
  88. ;
  89. ;***************************************************************************
  90. ;
  91. ;----------------------------------------------------
  92. ;FCB AND NORTHSTAR DISK PARAMETERS FORMAT
  93. ;
  94. ;  FIELD    POSITION    DESCRIPTION
  95. ;
  96. ;    ET            0        ENTRY TYPE
  97. ;    FN           1-8        FILE NAME
  98. ;    FT           9-11        FILE TYPE
  99. ;    EX             12        FILE EXTENT (0-15)
  100. ;          13-14        NOT USED
  101. ;    RC            15        RECORD COUNT (0-128)
  102. ;    DM          16-31        DISK MAP (16 1K BLKS)
  103. ;    NR            32        NEXT RECORD
  104. ;    DA          33-34        NS DISK ADDRESS
  105. ;    BL          35-36        NUMBER OF 256-BYTE BLOCKS
  106. ;    TY            37        NS FILE TYPE
  107. ;    PB            38        NO. OF BASIC PROGRAM BLKS
  108. ;          39-40        FILE PARAMETERS, NOT USED
  109. ;    DN            41        DRIVE NUMBER FILE IS ON
  110. ;-------------------------------------------------------
  111. ;
  112. ;******CONDITIONAL ASSEMBLIES ******
  113. ;
  114. TRUE    EQU    -1
  115. FALSE    EQU    NOT TRUE
  116. ;
  117. ;
  118. ;***** EQUATES *****
  119. ;
  120. ADDRZ    EQU    0        ;FIRST ADDRESS OF MEMORY
  121.                 ;(STD CPM=0; TRS80 CPM=4200H)
  122. IFBASE    EQU    ADDRZ+100H
  123. BASIC    EQU    IFBASE+0D00H
  124. WBOOT    EQU    ADDRZ
  125. BDOS    EQU    ADDRZ+5
  126. ;
  127. ;*** CPM SYSTEM CALL EQUATES ***
  128. ;
  129. PRINT    EQU    9
  130. SEARCH    EQU    17
  131. NEXT    EQU    18
  132. ;
  133. ;*** BIOS JUMP TABLE RELATIVE ADDRESSES (RELATIVE TO WARM BOOT @ ADDR 6,7) ***
  134. ;
  135. CONST    EQU    3
  136. CONIN    EQU    6
  137. CONOT    EQU    9
  138. LIST    EQU    0CH
  139. PUNCH    EQU    0FH
  140. ;
  141. CTLC    EQU    3
  142. CTLS    EQU    13H        ;FREEZE SCREEN KEY
  143. ;
  144. PRNTNO    EQU    1        ;NS DEVICE NUMBER FOR PRINTER; CALLS CPM LIST
  145. PNCHNO    EQU    2        ;NS DEVICE NUMBER FOR PUNCH
  146. ;
  147. NOFCBS    EQU    10
  148. FCBSIZ    EQU    42        ;NO. OF BYTES IN EXTENDED FCB
  149. CR    EQU    0DH
  150. LF    EQU    0AH
  151. ERRMSG    EQU    0        ;DUMMY ADDRESS
  152. ARGERR    EQU    BASIC+1A0H    ;ENTRY POINT TO BASIC FOR 'ARGUMENT ERROR'
  153. ;
  154. ;*** NORTH STAR BASIC PARAMETERS ***
  155. ;
  156. MEMEND    EQU    9        ;BASIC OFFSET FOR END OF MEMORY
  157. PGMPTR    EQU    BASIC+2DF3H    ;NS BASIC PROGRAM POINTER
  158. ;
  159. ;*** THE FOLLOWING EQUATES ARE FOR DETERMINING WHICH DISK FUNCTION IS
  160. ;    CALLING DLOOK.  THEY ARE THE LEAST SIGNIFICANT ADDRESS BYTE FOR EACH
  161. ;    FUNCTION. ***
  162. ;
  163. TY3ADR    EQU    83H        ;OPEN TYPE 3 FILE
  164. LDADR    EQU    0B4H        ;LOAD OR APPEND
  165. DESADR    EQU    79H        ;DESTROY
  166. FLADR    EQU    0FBH        ;FILE
  167. CRADR    EQU    45H        ;CREATE
  168. NSADR    EQU    2        ;NSAVE
  169. NSCR2    EQU    88H        ;NSAVE OR CREATE FOR THE 2ND TIME
  170. SAVADR    EQU    0CCH        ;SAVE
  171. ;
  172. ;**************************************************************************
  173. ;
  174. ;**** PATCHES TO BASIC MEMSET ROUTINE ****
  175. ;
  176.     ORG    BASIC+52AH
  177. ;
  178.     XCHG            ;PUT MEMSET ADDR IN DE
  179.     LHLD    BDOS+1        ;GET BEGINNING OF CPM ADDR
  180.     JMP    MEMSET
  181. MEMSETR    EQU    $        ;PATCH IN INTERFACE JUMPS TO HERE
  182. ;
  183. ;**** PATCH BASIC TO REMOVE 350 BLOCK SIZE LIMIT ****
  184. ;
  185.     ORG    BASIC+665H
  186. ;
  187.     LXI    H,-4096     ;SHOULD SUFFICE FOR 8" QD
  188. ;
  189. ;**** PATCH BASIC TO ECHO BACKSPACE (CTL-H) ON DELETE ****
  190. ;
  191.     ORG    BASIC+17H
  192. ;
  193.     DB    8
  194. ;
  195. ;**** PATCH BASIC TO LINE LENGTH=132 ****
  196. ;
  197.     ORG    BASIC+0EH
  198. ;
  199.     DB    80
  200. ;
  201. ;
  202. ;***************************************************************************
  203. ;
  204.     ORG    IFBASE
  205. ;
  206. ;**** JUMP TABLE; MATCHES NORTHSTAR DOS ****
  207. ;
  208.     JMP    BSINIT
  209. ;
  210.     ORG    IFBASE+0DH
  211. ;
  212.     JMP    COUT        ;BEGINNING OF EQUIV NS DOS JUMP TABLE
  213.     JMP    CIN
  214.     JMP    INIT
  215.     JMP    CONTC
  216.     JMP    ERRMSG        ;BASIC ERROR MESSAGE; BASIC CHANGES AT INIT
  217.     JMP    DLOOK
  218.     JMP    DWRIT
  219.     JMP    DCOM
  220.     JMP    DLIST
  221.     JMP    WBOOT
  222. RWCHK:    DB    0        ;VERIFY; PUT HERE FOR TABLE INTEGRITY
  223.     JMP    ERRMSG        ;BASIC ERROR MESSAGE; BASIC CHANGES AT INIT
  224. DEN:    DB    0        ;FAKE SINGLE DENSITY
  225. GOTYPE:    DB    1        ;GO TYPE (DUMMY)
  226. BUFPT:    DW    0        ;KEYBUFFER PTR (DUMMY)
  227. DCRSZ:    DB    24        ;SCREEN SIZE (DUMMY)
  228. CONFG:    DB    0        ;DRIVE CONFIG BYTE
  229. ;
  230. ;
  231. ;**** CHECK FOR MEMSET ****
  232. ;
  233. MEMSET:    DCX    H        ;ONE LESS
  234.     XRA    A        ;CLEAR CARRY
  235.     MOV    A,L
  236.     SBB    E        ;MEMSET ADDR-MAX CPM MEM ADDR
  237.     MOV    A,H
  238.     SBB    D
  239.     XCHG            ;HL=MEMSET ADDR
  240.     JC    ARGERR        ;JUMP TO BASIC'S ARGUMENT ERROR
  241.     JMP    MEMSETR
  242. ;
  243. ;**** SET UP BASIC END OF MEMORY ****
  244. ;
  245. BSINIT:    LHLD    BDOS+1
  246.     DCX    H        ;ONE LESS
  247.     SHLD    BASIC+MEMEND
  248.     JMP    BASIC
  249. ;
  250. ;**** CONSOLE OUT INTERFACE ****
  251. ;
  252. COUT:    PUSH    B
  253.     PUSH    D
  254.     PUSH    H
  255.     ORA    A        ;A=0 FOR CONSOLE?
  256.     CZ    CONIT
  257.     CPI    PRNTNO        ;SHALL WE SEND TO LIST DEVICE?
  258.     CZ    LISTIT
  259.     CPI    PNCHNO        ;PUNCH DEVICE NUMBER?
  260.     CZ    PNCHIT
  261.     CPI    PNCHNO+1
  262.     CNC    CONIT        ;DEFAULT TO CONSOLE FOR ALL OTHER DEVICES
  263.     MOV    C,B
  264.     CALL    CBIOS
  265.     POP    H
  266.     POP    D
  267.     POP    B
  268.     MOV    A,B
  269.     RET
  270. ;
  271. CONIT:    MVI    E,CONOT        ;CONSOLE OUT FOR DEV #0
  272.     RET
  273. LISTIT:    MVI    E,LIST
  274.     RET
  275. PNCHIT:    MVI    E,PUNCH
  276.     RET
  277. ;
  278. ;**** CONSOLE IN INTERFACE ****
  279. ;
  280. CIN:    PUSH    B
  281.     PUSH    D
  282.     PUSH    H
  283.     MVI    E,CONIN        ;CONSOLE IN FOR ALL DEV #'S
  284.     CALL    CBIOS
  285.     POP    H
  286.     POP    D
  287.     POP    B
  288.     RET
  289. ;
  290. ;**** CONTROL-C INTERFACE ****
  291. ;
  292. CONTC:    MVI    E,CONST
  293.     CALL    CBIOS
  294.     CPI    0FFH
  295.     RNZ
  296.     MVI    E,CONIN
  297.     CALL    CBIOS
  298.     CPI    CTLS        ;FREEZE THE SCREEN?
  299.     CZ    CIN
  300.     CPI    CTLC
  301.     RET    
  302. ;
  303. CBIOS:    MVI    D,0
  304. CBIOS2:    LHLD    WBOOT+1
  305.     DAD    D
  306.     PCHL
  307. ;
  308. ;**** INITIALIZATION INTERFACE ****
  309. ;
  310. INIT:    RET
  311. ;
  312. ;
  313. ;**** DIRECTORY LOOK UP INTERFACE ****
  314. ;
  315. ;    INPUT:  A=DISK NO.  HL=NAME IN RAM
  316. ;    OUTPUT: A=DISK NO.
  317. ;        CARRY=1 IF FAILURE & HL=1ST FREE DISK ADDR
  318. ;        CARRY=0 IF SUCCESS & HL=8TH BYTE OF DOS ENTRY IN RAM
  319. ;
  320. DLOOK:    STA    DISKNO        ;SAVE DR#
  321.     POP    D        ;GET RETURN ADDRESS
  322.     PUSH    D        ;SAVE IT FOR LATER
  323.     MVI    A,NSCR2        ;2ND NSAVE OR CREATE?
  324.     CMP    E
  325.     JZ    FOOLIT        ;FOOLIT; SAY OK
  326.     PUSH    H        ;SAVE NS NAME PTR
  327.     XRA    A
  328.     STA    EXTENT        ;ZERO EXTENT
  329.     CALL    FCB0        ;ZERO FCB AREA
  330.     POP    H        ;RESTORE NS NAME PTR
  331.     MVI    A,80H        ;FOOL NS BASIC; MAX PGM SIZE=32K
  332.     STA    NSPARMS+5    ;SAVE IT
  333.     LXI    D,FCB+1        ;POINT TO NAME LOC
  334.     MVI    B,8        ;NAME CHARS
  335. NEXTC:    MOV    A,M
  336.     CPI    0DH        ;PUT IN SPACES IF CR
  337.     JZ     SPACES
  338.     CPI    ' '
  339.     JZ     SPACES    
  340.     CPI    ','
  341.     JZ    DRVNO
  342.     STAX    D
  343.     INX    H
  344.     INX    D
  345.     DCR    B
  346.     JNZ    NEXTC
  347.     MOV    A,M
  348.     CPI    ','
  349.     JNZ    SEL
  350. DRVNO:    INX    H
  351.     MOV    A,M
  352.     CPI    '4'        ;IF DRIVE #>=4 THEN ERROR
  353.     JNC    ERROR
  354.     CPI    '1'        ;IF DRIVE #<0 THEN ERROR
  355.     JC    ERROR
  356.     ANI    3
  357.     STA    DISKNO
  358.     XRA    A
  359.     CMP    B
  360.     JZ    SEL
  361. SPACES:    MVI    A,20H
  362.     STAX    D
  363.     INX    D
  364.     DCR    B
  365.     JNZ    SPACES        ;ENOUGH SPACES?
  366. SEL:    CALL    SELECT        ;SET UP DEFAULT BUFFER @ 80H
  367.     CALL    SETBUF0
  368. OPEN:    MVI    A,'?'        ;AMBIGUOUS FILE TYPE
  369.     STA    FCB+9        ;SAVE IN FCB
  370.     LXI    H,2020H        ;BLANKS FOR NO AMBUGUITY
  371.     SHLD    FCB+10
  372.     POP    H        ;GET RETURN ADR
  373.     PUSH    H        ;SAVE IT AGAIN
  374.     MOV    A,L
  375.     CPI    TY3ADR        ;OPEN TYPE<>2 CALLING?
  376.     JZ    OPEN3
  377.     CPI    CRADR        ;CREATE CALLING?
  378.     JZ    OPEN0
  379.     CPI    FLADR        ;FILE CALLING?
  380.     JZ    OPEN0
  381.     CPI    DESADR        ;DESTROY CALLING?
  382.     JZ    OPEN0
  383.     MVI    A,2        ;TYPE 2 ONLY FOR SAVE, NSAVE, LOAD, APPEND
  384.     STA    FILTYP
  385.     ADI    30H
  386.     STA    FCB+9        ;REMOVE AMBIGUITY
  387.     XRA    A
  388.     STA    OLD1
  389.     LXI    H,FCBBAS
  390.     LXI    B,NOFCBS*FCBSIZ    ;ZERO TYPE 3 FCBS
  391.     CALL    MOVEIT    
  392.     JMP    OPEN0
  393. OPEN3:    MVI    A,3        ;SAVE TYPE=3 FOR OPEN
  394.     STA    FILTYP
  395.     CALL    SETTYP3        ;SET UP FCB FOR TYPE <>2 OPEN
  396. OPEN0:    CALL    OPENIT        ;OPEN FILE; FIND THE SAME
  397.     CPI    0FFH        ;CHECK FOR NO ENTRY
  398.     JZ    WRTYP2        ;TEST FOR SAVE BEFORE ERROR
  399.     MVI    C,17        ;GET FIRST DIRECTORY ENTRY
  400.     CALL    READ2
  401.     LXI    H,ADDRZ+80H+9    ;[[[[ LXI D,9 ]]]]
  402.                 ;GET FILE TYPE FROM DIRECTORY (1ST ONE FOUND)
  403.     CALL    DIRENT        ;[[[[ DAD D   NOP   NOP ]]]]
  404.     MOV    A,M
  405.     LXI    D,9        ;REMOVE AMBIGUITY; SAVE TYPE IN DIR
  406.     CALL    ADD16
  407.     SUI    30H
  408.     LXI    D,37        ;SAVE TYPE IN NS PARMS
  409.     CALL    ADD16
  410.     POP    H        ;GET RETURN ADDR
  411.     PUSH    H
  412.     MOV    A,L
  413.     CPI    DESADR        ;DESTROY?
  414.     JZ    DESTROY
  415.     CPI    TY3ADR        ;OPEN TYPE <>2?
  416.     JNZ    FOOLIT        ;FOR SAVE, FILE, LOAD, APPEND, CREATE, NSAVE
  417. BLKS:    LHLD    CURFCB        ;HL=PTR TO CURRENT FCB
  418.     LXI    D,15        ;MOVE PTR TO REC CNT IN FCB
  419.     DAD    D
  420.     MOV    A,M        ;GET REC CNT IN FCB
  421.     STA    RECCNT        ;SAVE IT
  422.     CPI    80H        ;REC CNT = 128 BLKS?
  423.     CZ    SRCHMOR        ;FIND ALL EXTENTS IF IT IS
  424.     LDA    EXTENT        ;GET CURRENT EXTENT
  425.     MVI    H,0        ;COMPUTE EQUIV NS BLKS; * 64
  426.     MOV    L,A
  427.     DAD    H
  428.     DAD    H
  429.     DAD    H
  430.     DAD    H
  431.     DAD    H
  432.     DAD    H        ;HL=# EXTENTS * # 256 BLKS PER EXTENT
  433.     LDA    RECCNT        ;GET REC CNT
  434.     RAR            ;DIVIDE BY 2
  435.     JNC    BLKS1
  436.     INR    A        ;ROUND UP
  437. BLKS1:    ANI    7FH
  438.     MOV    E,A        ;DE=# 256 REC COUNT
  439.     XRA    A
  440.     MOV    D,A        ;D=0
  441.     DAD    D        ;HL=ALLOCATED NS BLKS=(#EXT*256BLKS/EXT)+#256 REC CNT IN LAST EXT
  442.     PUSH    H        ;SAVE IT
  443. BLKS2:    LXI    D,36
  444.     LHLD    CURFCB
  445.     DAD    D        ;PTR TO NS BLKS IN FCB
  446.     POP    D        ;DE=ALLOCATED NS BLKS
  447.     MOV    M,D        ;SAVE BLKS IN FCB
  448.     DCX    H        ;MOVE PTR BACK
  449.     MOV    M,E
  450.     DCX    H        ;MOVE PTR TO NS PARAMETERS IN FCB
  451.     DCX    H
  452. BLKS3:    LDA    DISKNO        ;A=CURRENT DISK NO.
  453.     ORA    A        ;ZERO CARRY FOR NS RETURN
  454.     RET
  455. ;
  456. ;**** INTERFACE TO NORTHSTAR DCOM ROUTINES ****
  457. ;
  458. ;    INPUT:  A=NO OF BLOCKS  B=COMMAND (0=WR, 1=RD, 2=VERIFY)
  459. ;        C=DISK NO.    DE=STARTING RAM ADDRESS
  460. ;        HL=STARTING DISK ADDRESS
  461. ;    OUTPUT: CARRY=1 MEANS ARGUMENTS ILLEGAL
  462. ;
  463. DCOM:    STA    BLKCNT        ;SAVE # BLKS
  464.     SHLD    DISKADR        ;SAVE NS DISK ADR
  465.     LXI    H,-80H
  466.     DAD    D
  467.     SHLD    BUFADR        ;SAVE BUFFER ADR-128
  468.     MOV    A,B
  469.     STA    WR        ;SAVE WRITE OR READ
  470.     MOV    A,C
  471.     ANI    7FH        ;SCRAP DENSITY FLAG
  472.     STA    DISKNO        ;SAVE DR#
  473. SEL1:    CALL    SELECT
  474.     LDA    FILTYP
  475.     CPI    2        ;SKIP OFFSET CALC, IF TYPE 2
  476.     JZ    WRRD
  477. RECNUM:    CALL    FNDFCB
  478.     LXI    D,33
  479.     DAD    D        ;HL=PTR TO NS BASE DISK ADR
  480.     MOV    E,M
  481.     INX    H
  482.     MOV    D,M        ;DE=BASE DISK ADR
  483.     LHLD    DISKADR        ;HL=CURRENT, DE=BASE
  484.     MOV    A,L        ;CURRENT-BASE
  485.     SUB    E
  486.     MOV    L,A
  487.     MOV    A,H
  488.     SBB    D
  489.     MOV    H,A        ;HL=ADDR OFFSET
  490.     DAD    H        ;* 2
  491.     MOV    A,L
  492.     ANI    7FH        ;A=# 128 BYTE BLKS
  493.     DAD    H        ;H=EXTENT
  494.     MOV    B,H        ;TEMP STORE; B=EXTENT
  495.     CALL    ADD16X        ;PT TO NEXT REC & SAVE IT IN NEXT RECORD
  496.     STA    DEVNXT        ;SAVE NEXT REC FOR LATER
  497.     LXI    D,-20        ;EXTENT ADDR WRT PTR
  498.     DAD    D        ;PTR TO EXTENT IN FCB
  499.     MOV    A,B        ;A=EXT #
  500.     STA    EXTENT        ;SAVE IT
  501.     CMP    M        ;SAME ONE?
  502.     CNZ    CLSOPN        ;IF NOT CALL CLOSE/OPEN SUBR
  503. WRRD:    LDA    WR
  504.     ORA    A
  505.     JZ    WRITE
  506.     CPI    1
  507.     JNZ    ERROR1
  508. READ:    LDA    BLKCNT
  509.     ORA    A
  510.     RZ            ;CY=0 FOR BASIC RETURN
  511.     DCR    A
  512.     STA    BLKCNT
  513.     CALL    SETBUF        ;GET 1ST 128-BYTE BLK
  514.     CALL    READIT
  515.     CALL    EOF
  516.     CALL    SETBUF        ;GET 2ND 128-BYTE BLK
  517.     CALL    READIT        ;TO EQUAL 1 256-BYTE BLK
  518.     CALL    EOF
  519.     JMP    READ
  520. ;
  521. WRITE:    LHLD    BLKCNT        ;GET BLOCK COUNT
  522.     XRA    A        ;CHECK FOR LAST ONE
  523.     CMP    L
  524.     JNZ    WRITE1
  525.     CMP    H
  526.     JZ    CLOSE
  527. WRITE1:    DCX    H
  528.     SHLD    BLKCNT        ;SAVE FOR NEXT TIME
  529.     CALL    SETBUF
  530.     CALL    WRITEIT
  531.     CALL    SETBUF
  532.     CALL    WRITEIT
  533.     JMP    WRITE
  534. ;
  535. ;****DESTROY A FILE ****
  536. ;
  537. DESTROY:CALL    DELIT
  538.     JMP    BLKS3
  539. ;
  540. FOOLIT:    LXI    H,80H        ;FOOL NSBASIC; MAX PROGRAM SIZE=32K
  541.     PUSH    H        ;SAVE IT BLKS2
  542.     JMP    BLKS2
  543. ;
  544. WRTYP2:    POP    H        ;GET RETURN ADDR
  545.     PUSH    H        ;SAVE IT FOR RETURN
  546.     MOV    A,L        ;CHECK FOR LSA MATCH
  547.     CPI    CRADR        ;CREATE
  548.     CZ    CRFLAG        ;SET CREATE FLAG
  549.     CPI    NSADR        ;NSAVE
  550.     MVI    A,2        ;ALWAYS NSAVE TYPE 2
  551.     CZ    NSAVE
  552. ERROR:    LXI    H,0        ;FOOL NS BASIC; NEXT DISK ADDR=0
  553.     LDA    DISKNO        ;DISK NUMBER FOR ERROR RETURN
  554. ERROR1:    STC            ;CY=1 FOR FILE NOT FOUND ERROR
  555.     RET    
  556. ;
  557. NSAVE:    STA    NSPARMS+4    ;SAVE FILE TYPE IN NS DIRECTORY
  558. CRNSAV:    ADI    30H        ;CONVERT TO ASCII FOR CPM
  559.     STA    FCB+9        ;SAVE IN FCB
  560.     CALL    DELIT        ;DELETE, MAKE, THEN OPEN FOR NSAVE & CREATE
  561. MAKEIT:    CALL    SETBUF0
  562.     MVI    C,22
  563.     CALL    READ2
  564.     CPI    255        ;JUMP IF DIRECTORY FULL
  565.     JZ    DSKFUL
  566. OPENIT:    CALL    SETBUF0
  567.     MVI    C,15
  568.     JMP    READ2
  569. ;
  570. CRFLAG:    MVI    A,1
  571.     STA    FUNFL        ;SET UP DWRIT FUNCTION FLAG
  572.     RET
  573. ;
  574. ;**** INTERFACE TO DIRECTORY LIST ROUTINE ****
  575. ;    INPUT:   A=DISK NUMBER      L=DEVICE NUMBER
  576. ;
  577. DLIST:    PUSH    H
  578.     STA    DISKNO
  579.     CALL    SELECT
  580.     POP    H
  581.     MOV    A,L
  582.     STA    DEVNXT
  583.     CALL    RESET
  584.     CALL    SETBUF0
  585.     CALL    FCB0        ;ZERO FCB AREA
  586.     LXI    H,FCB        ;NAME & TYPE = AMBIGUOUS (??????)
  587.     MVI    B,11        ;NUMBER OF CHARS IN NAME & TYPE
  588.     MVI    A,'?'
  589. DLIST0:    INX    H
  590.     MOV    M,A
  591.     DCR    B
  592.     JNZ    DLIST0
  593.     CALL    CRLF        ;PRINT CR AND LF
  594.     MVI    C,SEARCH    ;FIND FIRST ENTRY
  595.     CALL    DNEXT0
  596.     CALL    DIRNT        ;[[[[ NOP   NOP   NOP ]]]
  597.                 ;WHICH ONE OF 4; POINT TO IT IN BUFFER
  598.     CALL    PRNTIT        ;PRINT OUT DIRECTORY ENTRY
  599. DLIST1:    CALL    DNEXT        ;GET ALL OTHERS
  600.     CALL    DIRNT        ;[[[[ NOP   NOP   NOP ]]]]
  601.                 ;WHICH ONE OF 4; POINT TO IT IN BUFFER
  602.     CALL    PRNTIT        ;PRINT OUT
  603.     JMP    DLIST1        ;GET MORE
  604. ;
  605. PRNTIT:    LXI    D,12        ;PT TO FILE EXTENT
  606.     DAD    D
  607.     XRA    A
  608.     CMP    M
  609.     RNZ            ;DON'T PRINT EXTENTS >0
  610.     LDA    DISKNO        ;PRINT DRIVE NUMBER
  611.     ADI    40H        ;CONVERT TO A,B,C,D,ETC
  612.     MOV    B,A
  613.     CALL    DPRNT
  614.     MVI    B,':'
  615.     CALL    DPRNT
  616.     LXI    B,-12        ;MOVE POINTER BACK TO BEGINNING
  617.     DAD    B
  618.     MVI    D,8        ;PRINT NAME
  619.     CALL    DLIST3
  620.     MVI    B,'.'        ;PRINT . BEFORE TYPE
  621.     CALL    DPRNT
  622.     MVI    D,3        ;PRINT TYPE
  623.     CALL    DLIST3
  624.     MVI    C,6
  625. SPCIT:    CALL    DPRNT0        ;PRINT 6 SPACES
  626.     DCR    C
  627.     JNZ    SPCIT
  628.     LDA    ACROSS
  629.     DCR    A        ;PRINT 3 ACROSS?
  630.     STA    ACROSS
  631.     CZ    CRLF        ;START NEW LINE
  632.     RET
  633. ;
  634. DNEXT:    MVI    C,NEXT
  635. DNEXT0:    LXI    D,FCB
  636.     CALL    BDOS
  637.     CPI    0FFH
  638.     RNZ
  639.     CALL    CRLF        ;MAKE DISPLAY PRETTY
  640.     POP    H        ;CLEAR OUT STACK
  641.     RET            ;EXIT DIRECTORY LIST ROUTINE
  642. ;
  643. DLIST3:    INX    H        ;PRINT NO. OF BYTES SPECIFIED IN D
  644.     MOV    B,M
  645.     CALL    DPRNT
  646.     DCR    D
  647.     JNZ    DLIST3
  648.     RET;
  649. ;
  650. CRLF:    MVI    B,CR        ;PRINT CR & LF
  651.     CALL    DPRNT
  652.     MVI    B,LF
  653.     CALL    DPRNT
  654. RESET:    MVI    A,3
  655.     STA    ACROSS        ;RESET NUMBER ACROSS SCREEN
  656.     RET
  657. ;
  658. DPRNT0:    MVI    B,' '        ;PRINT SPACE
  659. DPRNT:    LDA    DEVNXT        ;PRINT ON SELECTED DEVICE
  660.     JMP    COUT
  661. ;
  662. ;
  663. ;***** SELECT A DRIVE *****
  664. ;
  665. SELECT:    LDA    DISKNO
  666.     DCR    A
  667.     MVI    C,14
  668.     MOV    E,A
  669.     JMP    BDOS
  670. ;
  671. ;*** FIND AN EXISTING TYPE 3 FCB IF POSSIBLE ***
  672. ;
  673. SETTYP3:MVI    B,NOFCBS    ;B=# OPEN TYPE 3 FILES
  674.     LXI    H,FCBBAS    ;HL=FCBBAS
  675. RT0:    SHLD    CURFCB        ;SAVE IT IN CURRENT FCB
  676.     PUSH    H        ;SAVE IT FOR LATER
  677.     MVI    C,8        ;8 CHARS IN FILE NAME
  678.     LXI    D,FCB        ;SET UP FCB FOR COMPARISON
  679. RT1:    INX    D        ;MOVE PTR TO 1ST CHAR IN NAME
  680.     INX    H        ;DITTO
  681.     LDAX    D        ;FILE NAME MATCH (8 CHARS) & DRIVE #
  682.     CMP    M
  683.     JNZ    NXTBLK
  684.     DCR    C
  685.     JNZ    RT1
  686.     LXI    D,33        ;PTR OFFSET TO DRIVE # IN FCB
  687.     DAD    D        ;MOVE PTR TO DRIVE #
  688.     LDA    DISKNO        ;GET CURRENT DRIVE #
  689.     CMP    M        ;SAME ONE?
  690.     JNZ    NXTBLK        ;MOVE ON IF NOT
  691.     LXI    D,-29        ;PT TO FCB EXTENT
  692.     DAD    D
  693.     XRA    A
  694.     MOV    M,A        ;ZERO OUT EXTENT IN FCB BEFORE OPENING
  695.     POP    B        ;CLEAR OUT STACK
  696.     RET
  697.  
  698. NXTBLK:    POP    H
  699.     LXI    D,FCBSIZ
  700.     DAD    D
  701.     DCR    B
  702.     JNZ    RT0
  703. NEW1:    LDA    OLD1        ;NO MATCH; MAKE NEW ONE
  704.     CPI    NOFCBS        ;NO MORE FCB SPACE?
  705.     CZ    FCBTOP
  706.     INR    A
  707.     STA    OLD1
  708.     LXI    D,FCBSIZ
  709.     LXI    H,FCBBAS-FCBSIZ
  710. NXTBLK1:DAD    D        ;SET UP PTR IN HL
  711.     DCR    A        ;MOVE FCBBAS UNTIL END FOUND
  712.     JNZ    NXTBLK1
  713.     SHLD    CURFCB
  714.     MVI    B,FCBSIZ
  715.     LXI    D,FCB        ;MOVE FCB TO FCB AREA
  716. MOVIT:    LDAX    D
  717.     MOV    M,A
  718.     INX    H
  719.     INX    D
  720.     DCR    B
  721.     JNZ    MOVIT
  722.     LDA    OLD1
  723.     DCR    A
  724.     RLC            ;4K INCREMENTS
  725.     RLC
  726.     RLC
  727.     RLC
  728.     LXI    D,34
  729.     CALL    ADD16        ;ADD OFFSET FOR NS HI ORDER ADDR
  730.     LXI    D,7        ;PTR OFFSET TO DR # IN FCB
  731.     DAD    D        ;MOVE PTR
  732.     LDA    DISKNO        ;GET CURRENT DR #
  733.     MOV    M,A        ;SAVE IT IN FCB
  734.     RET
  735. ;
  736. FCBTOP:    XRA    A
  737.     RET
  738. ;
  739. ;*** SEARCH FOR ALL EXTENTS ***
  740. ;
  741. SRCHMOR:LHLD    CURFCB        ;SEARCH FOR ALL EXTENTS
  742.     LXI    D,12        ;PT TO EXTENT
  743.     DAD    D
  744.     MVI    C,18        ;SEARCH FOR NEXT DIR ENTRY
  745. SRCH0:    PUSH    H        ;SAVE PTR TO EXTENT
  746.     LDA    EXTENT        ;GET EXTENT
  747.     INR    A        ;A=EXT+1
  748.     MOV    M,A        ;NEW EXT=EXT+1
  749.     CALL    READ2
  750.     LXI    H,ADDRZ+80H+15    ;[[[[ LXI D,0FH ]]]]
  751.                 ;PT TO REC CNT IN DEFAULT FCB
  752.     CALL    DIRENT        ;[[[[ DAD D   NOP   NOP ]]]]
  753.                 ;PT TO PARAMETER IN DIRECTORY
  754.     LDA    EXTENT        ;INCREMENT EXTENT
  755.     INR    A
  756.     STA    EXTENT        ;SAVE NEW EXTENT
  757.     MOV    A,M
  758.     STA    RECCNT        ;SAVE LAST RECORD COUNT
  759.     CPI    80H        ;IS EXTENT FULL?
  760.     MVI    C,18        ;SEARCH FOR NEXT DIR ENTRY
  761.     POP    H
  762.     JZ    SRCH0        ;GET ANOTHER EXTENT IF IT IS
  763. SRCH1:    XRA    A        ;ZERO EXTENT IN FCB
  764.     MOV    M,A
  765.     RET
  766. ;
  767.                 ;[[[[ SUBROUTINE NOT USED BY CDOS VERSION ]]]]
  768. DIRNT:    LXI    H,ADDRZ+80H    ;SET UP POINTER TO BUFFER
  769. DIRENT:    ANI    3        ;A=LOC OF DIR ENTRY IN BUFFER (0-3)
  770.     RRC ! RRC ! RRC        ;MULT BY 32
  771.     ADD    L
  772.     MOV    L,A        ;HL=PTR DESIRED DIRECTORY ENTRY
  773.     RET
  774. ;
  775. ;*** READ A TYPE 2 OR 3 BLOCK ***
  776. ;
  777. READIT:    MVI    C,20
  778. READ2:    LHLD    CURFCB
  779.     XCHG
  780. GOBDOS:    JMP    BDOS
  781. ;
  782. ;
  783. ;*** FIND AN EXISTING FCB USING NS PARAMETERS FROM BASIC ***
  784. ;
  785. FNDFCB:    LXI    B,FCBSIZ
  786.     LDA    DISKADR+1    ;A=CURRENT HI BYTE DISK ADR
  787.     MOV    E,A        ;E=CURRENT ADR
  788.     LXI    H,FCBBAS+34
  789.     MOV    A,M        ;A=BASE
  790.     ADI    0FH        ;16 * 256 BLKS OF 256 BYTE EACH, MAX
  791.     CMP    E
  792.     JNC    FNDFCB1        ;IF CUR (E)<=BASE+0FH (A), THEN 0-FFF
  793.     CALL    ADRCK
  794.     JNC    FNDFCB1        ;1000-1FFF
  795.     CALL    ADRCK
  796.     JNC    FNDFCB1        ;2000-2FFF
  797.     CALL    ADRCK
  798.     JNC    FNDFCB1        ;3000-3FFF
  799.     CALL    ADRCK
  800.     JNC    FNDFCB1        ;4000-4FFF
  801.     CALL    ADRCK
  802.     JNC    FNDFCB1        ;5000-5FFF
  803.     CALL    ADRCK
  804.     JNC    FNDFCB1        ;6000-6FFF
  805.     CALL    ADRCK
  806.     JNC    FNDFCB1        ;7000-7FFF
  807.     CALL    ADRCK
  808.     JNC    FNDFCB1        ;8000-8FFF
  809.     DAD    B        ;9000-9FFF
  810. ;
  811. FNDFCB1:LXI    D,-34
  812.     DAD    D        ;HL=PTR TO FCB IN FCB AREA
  813.     SHLD    CURFCB
  814.     RET
  815. ;
  816. ADRCK:    DAD    B
  817.     MOV    A,M
  818.     ADI    0FH
  819.     CMP    E
  820.     RET
  821. ;
  822. ;*** WRITE TO DISK ***
  823. ;
  824. WRITEIT:MVI    C,21
  825.     CALL    READ2
  826.     ORA    A        ;WRITE IS OK IF A=0
  827.     RZ
  828. DSKFUL:                ;IF DIRECTORY FULL, DISK FULL OR FILE
  829.     POP    H        ;EXTENSION ERROR, GIVE INVALID ARGUMENT ERROR
  830.     STC            ;CY=1 FOR BASIC ERROR RETURN
  831.     RET
  832. ;
  833. ;*** SET UP DMA ADDRESS ***
  834. ;
  835. SETBUF:    LDA    FUNFL        ;ARE WE CREATING?
  836.     ORA    A
  837.     JNZ    SETBUF0        ;SKIP INCREMENTING BUFFER IF WE ARE
  838.     LHLD    BUFADR
  839.     LXI    D,80H
  840.     DAD    D
  841.     SHLD    BUFADR
  842.     XCHG
  843.     JMP    SETBUF1
  844. SETBUF0:LXI    D,ADDRZ+80H    ;SET UP DEFAULT BUFFER
  845. SETBUF1:MVI    C,26
  846.     JMP    BDOS
  847. ;
  848. ;*** DIRECTORY WRITE INTERFACE ***
  849. ;    INPUT: HL=POINTER TO NS PARAMETERS
  850. ;
  851. ;    THIS ROUTINE IS ONLY USED FOR CREATE COMMAND TO GET FILE TYPE FROM
  852. ;    NORTH STAR DISK PARAMETERS AND TO RESERVE DISK SPACE FOR THE FILE.
  853. ;    A DUMMY FILE IS CREATED BY WRITING OUT WHATEVER IS IN RAM FROM ADDRZ+
  854. ;    80H TO ADDRZ+0FFH
  855. ;
  856. DWRIT:    LDA    FUNFL        ;CHECK IF CREATE; RETURN IF NOT
  857.     ORA    A
  858.     RZ
  859.     XRA    A
  860.     STA    FCB+32        ;NEXT RECORD =0; CAUSED BY NS BASIC
  861.     LHLD    NSPARMS+2    ;GET BLOCK SIZE
  862.     SHLD    BLKCNT        ;SAVE IT FOR WRITING
  863.     LDA    NSPARMS+4    ;GET TYPE
  864.     CALL    CRNSAV        ;PUT TYPE IN FCB AND MAKE FILE
  865.     CALL    WRITE        ;SAVE DUMMY FILE
  866.     JC    NOSPAC        ;PRINT DISK FULL ERROR SINCE BASIC WON'T
  867.     XRA    A
  868.     STA    FUNFL        ;FUNCTION FLAG=0
  869.     RET
  870. ;
  871. NOSPAC:    MVI    C,PRINT        ;DISK OR DIRECTORY FULL MESSAGE ON CONSOLE
  872.     LXI    D,EMSG
  873.     CALL    BDOS
  874.     JMP    WBOOT        ;EXIT BASIC TO CPM AFTER ERROR MESSAGE
  875. ;
  876. ;
  877. ;*** CLOSE, OPEN, AND MAKE A DIRECTORY ENTRY ***
  878. ;
  879. CLSOPN:    CALL    CLOSE0        ;CLOSE CURRENT EXTENT
  880.     LDA    EXTENT
  881.     LXI    D,12
  882.     CALL    ADD16
  883.     CALL    OPENIT        ;OPEN NEW EXTENT
  884.     CPI    0FFH
  885.     CZ    MAKEIT        ;IF NO EXTENT,MAKE ONE
  886.     LDA    DEVNXT        ;GET NEXT REC
  887. ADD16X:    LXI    D,32
  888. ADD16:    LHLD    CURFCB        ;MOVE PTR WRT TO OFFSET IN DE
  889.     DAD    D
  890.     MOV    M,A
  891.     RET
  892. ;
  893. ;*** PROCESS END OF FILE ***
  894. ;
  895. EOF:    CPI    1        ;ALL BLKS READ?
  896.     RC            ;RETURN IF <1
  897.     CPI    2        ;GIVE INVALID ARGUMENT ERROR
  898.     JZ    ERROR1        ;IF READING UNWRITTEN RA DATA
  899.     POP    H        ;CLEAR OUT RETURN
  900. QUIT:    ORA    A        ;CY=0 FOR BASIC RETURN
  901.     RET
  902. ;
  903. ;*** CLOSE A FILE ***
  904. ;
  905. CLOSE:    LDA    FILTYP        ;CHECK FOR TYPE 3
  906.     CPI    3        ;SPEED PROCESSING IF TYPE 3
  907.     JNZ    CLOSE0        ;OTHERWISE CLOSE EVERY TIME
  908.     LDA    FUNFL        ;CHECK IF CREATE
  909.     ORA    A
  910.     JNZ    CLOSE0
  911.     LHLD    PGMPTR        ;GET CURRENT PROGRAM PTR
  912.     CALL    BLANKS        ;IGNORE BLANKS
  913.     CPI    '8'        ;FILE #>=8?
  914.     JNC    QUIT        ;QUIT IF NOT LEGAL FILE #
  915.     CPI    '0'        ;FILE#<0?
  916.     JC    QUIT        ;QUIT IF NOT A LEGAL FILE #
  917.     CALL    BLANKS        ;IGNORE BLANKS
  918.     CPI    23H        ;# DELIMITER?
  919.     JNZ    QUIT        ;QUIT IF NOT
  920.     CALL    BLANKS        ;IGNORE BLANKS
  921.     CPI    98H        ;CLOSE TOKEN?
  922.     JNZ    QUIT        ;QUIT IF NOT
  923. CLOSE0:    CALL    SETBUF0
  924.     MVI    C,16
  925.     CALL    READ2
  926.     ORA    A        ;CY=0 FOR BASIC RETURN
  927.     RET
  928. ;
  929. BLANKS:    DCX    H
  930.     MOV    A,M
  931.     CPI    20H        ;IS IT A BLANK?
  932.     JZ    BLANKS        ;SKIP IF IT IS
  933.     RET
  934. ;
  935. ;*** DELETE A FILE ***
  936. ;
  937. DELIT:    CALL    SETBUF0
  938.     MVI    C,19
  939.     JMP    READ2
  940. ;
  941. ;*** ZERO DEFAULT FCB ***
  942. ;
  943. FCB0:    LXI    H,FCB        ;PT TO FCB
  944.     SHLD    CURFCB        ;SAVE CURRENT FILE CONTROL BLOCK
  945.     LXI    B,FCBSIZ
  946.     XRA    A        ;A=0
  947. MOVEIT:    MOV    M,A        ;ZERO FCB
  948.     INX    H
  949.     DCX    B
  950.     CMP    C
  951.     JNZ    MOVEIT
  952.     CMP    B
  953.     JNZ    MOVEIT
  954.     RET
  955. ;
  956. ;*** DISK/DIRECTORY FULL ERROR MESSAGE ***
  957. ;
  958. EMSG:    DB    'DISK/DIR FULL',CR,LF,'$'
  959. ;
  960. ;***** BUFFER AREA *****
  961. ;
  962. DISKNO:    DB    1
  963. DEVNXT:    DS    1        ;TEMP SAVE FOR DEV # OR NEXT REC
  964. CURFCB:    DS    2
  965. DISKADR:DS    2
  966. WR:    DS    1
  967. BLKCNT:    DW    0
  968. BUFADR:    DS    2
  969. RECCNT    DS    1
  970. EXTENT:    DS    1
  971. FUNFL:    DB    0
  972. FILTYP:    DS    1
  973. OLD1:    DB    0
  974. ACROSS:    DB    3
  975. FCB:    DS    33
  976. NSPARMS:DS    8
  977.  
  978. FCBBAS:    DS    FCBSIZ
  979. FCBBAS1:DS    FCBSIZ
  980. FCBBAS2:DS    FCBSIZ
  981. FCBBAS3:DS    FCBSIZ
  982. FCBBAS4:DS    FCBSIZ
  983. FCBBAS5:DS    FCBSIZ
  984. FCBBAS6:DS    FCBSIZ
  985. FCBBAS7:DS    FCBSIZ
  986. FCBBAS8:DS    FCBSIZ
  987. FCBBAS9:DS    FCBSIZ
  988. ;
  989.     END    IFBASE
  990.