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