************************************************************
*                                                          *
*  MKDIR - Create Subdirectory                             *
*                                                          *
*  This subprogram will make a subdirectory.               *
*                                                          *
************************************************************

MKDIR0
       ANDI R12,>FF00
       AI   R12,24

       MOVB @>834C,R6
       ANDI R6,>0F00
       JEQ  MKDER7
       AI   R6,->0100

       BL   @MAKEFN
       BL   @GETDDR          Get directory info
       CI   R5,0
       JEQ  MKDER7

* We know the parent directory exists.

MKD1
       LDCR @B03,4           Select BANK with DDR in it.
       MOVB @23(R5),R1       See if there is room for one
       SRL  R1,8             more subdirectory.
       CI   R1,114
       JEQ  MKDER4           See if there are too many subdirectories
       CLR  R0

* OK.  We know there's room for it.  If it doesn't exist,
* create it.

* Copy the name to the FNCB in Bank 0

       LI   R2,NCB+39
       LDCR @B02,4
MKD3   CB   *R2,@PERIOD
       JEQ  MKD4
       DEC  R2
       CI   R2,NCB-1
       JNE  MKD3

MKD4   LI   R3,FNCB
       INC  R2
MKD5   LDCR @B02,4
       CB   *R2,@SPACE
       JEQ  MKD6
       CI   R2,NCB+40
       JEQ  MKD6
       MOVB *R2+,R10
       LDCR @ZERO,4
       MOVB R10,*R3+
       JMP  MKD5

MKD6   LDCR @ZERO,4
MKD7   CI   R3,FNCB+10
       JEQ  MKD8
       MOVB @SPACE,*R3+
       JMP  MKD7

MKDER7 MOVB @B07,@>8350
       LDCR @ZERO,4
       B    @DSRRT

MKD8
       CI   R1,0
       JEQ  MKD16

       CLR  R0
       DEC  R1
MKD9   MOV  R0,R10
       A    R1,R10
       ANDI R10,>FFFE
       A    R5,R10
       LDCR @B03,4
       MOV  @28(R10),R7
       MOV  R6,R3
       SRL  R3,8
       SLA  R3,1
       LDCR @B04,4
       MPY  @SAUTBL(R3),R7
       LI   R2,SECBUF
       SRL  R8,1
       JNC  MKD10
       AI   R2,>100
MKD10  SRL  R7,1
       JNC  MKD11
       AI   R8,>8000
MKD11  LDCR @ZERO,4
       BLWP @BANKIT
       DATA SCSIRD
       JNE  MKDERR

       LI   R7,FNCB
       LI   R8,10
MKD12  C    *R2+,*R7+
       JL   MKD13
       JH   MKD14
       DECT R8
       JNE  MKD12
       JMP  MKDER7           Directory already exists!

MKDERR MOVB @B06,@>8350      Set error code
       LDCR @ZERO,4
       B    @DSRRT

MKDER4 MOVB @B04,@>8350      Out of space - directory full
       LDCR @ZERO,4
       B    @DSRRT

MKD13  C    R0,R1
       JEQ  MKD15
       MOV  R0,R10
       A    R1,R10
       SRL  R10,1
       INC  R10
       MOV  R10,R0
       JMP  MKD9

MKD14  C    R0,R1
       JEQ  MKD16
       MOV  R0,R10
       A    R1,R10
       SRL  R10,1
       C    R10,R0
       JEQ  MKD16
       MOV  R10,R1
       DEC  R1
       JMP  MKD9

MKD15  INC  R0
MKD16
       LDCR @B02,4
       MOV  R0,@MKDIDX

* Now set up the new subdirectory
* Let's allocate an AUs for the DDR and its FDIR
*
       CLR  R3               Start at beginning
       CLR  R7               No preferred AU
       LI   R8,2
       LDCR @ZERO,4
       BLWP @ALLOC
       JNE  MKDERR

       CI   R4,0             See if disk is full
       JEQ  MKDER4

       LDCR @B02,4           Save the AU
       MOV  R5,@MKDAU1

       INC  R5
       CI   R4,1
       JNE  MKD17

* We only got 1 AU, allocate another for the FDIR
*
       LI   R8,1
       LDCR @ZERO,4
       BLWP @ALLOC
       JNE  MKDERR
       CI   R4,0
       JEQ  MKDERR
       LDCR @B02,4
MKD17  MOV  R5,@MKDAU2

* Now build the new DDR in the DFDR buffer
*

* Start by filling in the new directory name
*
       LI   R0,10
       LI   R1,DFDR
       LI   R2,FNCB
MKD18
       LDCR @ZERO,4
       MOV  *R2+,R3
       LDCR @B02,2
       MOV  R3,*R1+
       DECT R0
       JNE  MKD18

       LI   R2,MKDRST
MKD19  MOV  *R2+,*R1+
       CI   R2,MKDRND
       JNE  MKD19

* Now put in the AU of the FDIR.  If we only got 1 AU on the
* call to ALLOC, we have to allocate another one.
*
       MOV  @MKDAU2,*R1+

       LDCR @B04,4           Get AU of parent DDR
       MOV  @SAVEAU,R0
       LDCR @B02,4
       MOV  R0,*R1+

* Now blank out all subdirectory pointers

MKD20  CLR  *R1+
       CI   R1,DFDR+256
       JNE  MKD20

* We got the DDR set up, now write it out to disk.
*

       MOV  @MKDAU1,R7
       MOV  R6,R3
       SRL  R3,8
       SLA  R3,1
       LDCR @B04,4
       MOV  @SAUTBL(R3),R3
       MPY  R3,R7
       LI   R2,SECBUF

       SRL  R8,1
       JNC  MKD21
       AI   R2,>100
MKD21  SRL  R7,1
       JNC  MKD22
       AI   R8,>8000
MKD22
       LDCR @ZERO,4

* If we are using >1 sector/au and we are in the 1st half of
* the 512 byte block, there is no need to read the old data

       CI   R3,1
       JEQ  MKD23
       CI   R2,SECBUF
       JEQ  MKD24
*      CI   R7,0
*      JNE  MKD24
*      CI   R8,0
*      JNE  MKD24
MKD23
       BLWP @BANKIT
       DATA SCSIRD
       JNE  MKD29
MKD24
       LI   R0,256
       LI   R4,DFDR
MKD25  LDCR @B02,4
       MOV  *R4+,R9
       LDCR @ZERO,4
       MOV  R9,*R2+
       DECT R0
       JNE  MKD25

       BLWP @BANKIT
       DATA SCSIWT
       JNE  MKD29

* If we're writing out the VIB, write out the copy as well

       CI   R7,0
       JNE  MKD25A
       CI   R8,0
       JNE  MKD25A
       AI   R8,16
       BLWP @BANKIT
       DATA SCSIWT
MKD25A
* Now we'll write out the FDIR.  All entries are blank except
* for the last one which points back to the DDR

       MOV  R5,R7
       MPY  R3,R7
       LI   R2,SECBUF

       SRL  R8,1
       JNC  MKD26
       AI   R2,>100
MKD26  SRL  R7,1
       JNC  MKD27
       AI   R8,>8000
MKD27
       LDCR @ZERO,4

       CI   R3,1
       JEQ  MKD28
       CI   R2,SECBUF
       JEQ  MKD30

MKD28  BLWP @BANKIT
       DATA SCSIRD
       JEQ  MKD30
MKD29  B    @MKDERR

MKD30  LI   R0,254
MKD31  CLR  *R2+
       DECT R0
       JNE  MKD31

       LDCR @B02,4           Now get AU of DDR
       MOV  @MKDAU1,R5
       LDCR @ZERO,4
       MOV  R5,*R2

       BLWP @BANKIT
       DATA SCSIWT
       JNE  MKD29

* Now write out the DDR to disk.  Increment the # of files
* and add the AU to the table of subdirectories
*
       BL   @GETDDR
       LDCR @B03,4           Select RAM bank 3
       AB   @B01,@23(R5)     Increment # of subdirectories

* the AU of the new DDR goes
*
       LDCR @B02,4
       MOV  @MKDIDX,R10
       LDCR @B03,4
       SLA  R10,1
       A    R5,R10
       AI   R10,28

       MOV  R5,R1
       AI   R1,254

MKD32  C    R1,R10
       JEQ  MKD33
       MOV  @-2(R1),*R1
       DECT R1
       JMP  MKD32
MKD33
       LDCR @B02,4           Save the AU
       MOV  @MKDAU1,R2
       LDCR @B03,4
       MOV  R2,*R1

* Now write the parent DDR back out to disk and
* we're done!
*
       LDCR @B04,4
       MOV  @SAVEAU,R7       Get AU of parent DDR

       MOV  R6,R3
       SRL  R3,8
       SLA  R3,1
       MOV  @SAUTBL(R3),R3
       MPY  R3,R7
       LI   R2,SECBUF
       SRL  R8,1
       JNC  MKD34
       AI   R2,>100
MKD34  SRL  R7,1
       JNC  MKD35
       AI   R8,>8000
MKD35
       LDCR @ZERO,4

* We don't have to read the old data if we have more
* than 1 sector/AU and we're writing at the beginning
* of a 512 byte block.  However, if we're writing
* out the VIP, we must read because the bitmap.

       CI   R3,1
       JEQ  MKD36
       CI   R2,SECBUF
       JNE  MKD36
       CI   R7,0
       JNE  MKD37
       CI   R8,0
       JNE  MKD37

MKD36  BLWP @BANKIT
       DATA SCSIRD
       JNE  MKD39

MKD37  LI   R0,256
MKD38  LDCR @B03,4
       MOV  *R5+,R1
       LDCR @ZERO,4
       MOV  R1,*R2+
       DECT R0
       JNE  MKD38

       BLWP @BANKIT
       DATA SCSIWT
       JEQ  MKD40
MKD39  B    @MKDERR

* Hooray!  We're done.  Write out a success code and return

MKD40  MOVB @ZERO,@>8350
       B    @DSRRT

MKDRST DATA 0
       BYTE 0
       TEXT 'DIR'
       DATA 0                Sectors/AU
       DATA 0,0              Date/Time of creation
       BYTE 0                # of files
       BYTE 0                # of subdirectories
MKDRND
