([] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN!)C>!)C&CCannot boot, DATA DISK!NNNNNNNNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN!)C>!)C&CCannot boot, DATA DISK!NNNNNNNNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNNc Y]NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNNNcBIDE 06/30/00631Dh'E&jNNNNNNNNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN aNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;Hdform6/ASM - LDOS X.X - 02/07/84 ; TITLE '' ;*=*=* ; Version equates ; set only 1 drive model TRUE (-1) ;*=*=* ARM EQU 0 MTI EQU 0 LDI EQU 0 LSI EQU 0 TRS EQU 0 P NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD A,(HL) CP CR+1 ;End of line? JR C,FMT1 ;No parms CP '(' JR NZ,FNDPRN LD DE,PARMTBL ;Parse any parameters CALL @PARAM JP NZ,PRMERR vXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDC EQU 0 IDE EQU -1 ;*=*=* RAM EQU -1 ;True for 6.x LDOS RLS EQU 63H ;Release version # for GAT ;*=*=* ;Define FORM$ and HELLO$ LOGON MACRO ; dummy macro definiton DB NNNNNNNNNNNNNNNNNNNNNNN PBNNNNNNNNNNNNNNNNNNNNNN ;Jump on parm error ;*=*=* ; Scan for drivespec on command line ;*=*=* FMT1 POP HL ;Cmd line again LD A,(HL) ;Ignore spaces INC HL CP 20H JR Z,FMT1 CP 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN '** Dummy Macro **' ENDM COM '' *GET BUILDVER/ASM:3 ;<631> *GET HDFMT1/ASM:3 *GET HDFMT2/ASM:3 *GET HDFMT3/ASM:3 END BEGIN (NNNNNNNNNNNNNNNNNNNNNNN csNNNNNNNNNNNNNNNNNNNNNN:' ;Colon drive indicator? JR NZ,WHDRV LD A,(HL) ;P/u drive # SUB '0' ;Cvrt to ASCII JP C,PRMERR ;0 or larger CP 8 ;Make sure not > 7 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN JP NC,PRMERR LD (DISKIO+1),A ;Stuff drive JR FMT2 ;Don't ask ;***** ; Drive not entered, prompt for it ;***** WHDRV1 CALL ABTJCL ;No reprompt if JCL WHDRV LD HL,WHDRV$ ;"whichtNNNNNNNNNNNNNNNNNNNNNNNsMNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN drive... CALL GETARG ;Get one char SUB '0' ;Cvrt to binary JP C,WHDRV1 ;Error if < 0 CP 8 ;Error if > 7 JP NC,WHDRV1 LD (DISKIO+1),A ;S'INNNNNNNNNNNNNNNNNNNNNNN@|NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN JR CKNAME ;***** ; Prompt user for name parameter ;***** DSKNAM1 CALL ABTJCL DSKNAM LD HL,DSKNAM$ ;"diskette name? LD B,8 CALL GETARGX JR Z,DSKNAM1 ;Reprompt if none entered LfbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,$+3 ADD A,A ;Count * 2 LD BC,0FFFFH ;Init GAT byte to ones CGPC1 SLA B ;Now keep removing low DEC A ; order bits , 1 bit for JR NZ,CGPC1 ; each 9NNNNNNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNND C,B ;Only move to name field LD B,0 ; how many were entered LD DE,GATBUF+0D0H LDIR CKNAME LD DE,GATBUF+0D0H CALL CKMPW0 JP NZ,BADNAM ;*=*=* ; Get today's ɞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNavailable granule LD A,B ;Save the default byte LD (CALC1+1),A ; for dir test LD HL,GATBUF ;Pt to GAT buffer area LD A,(IY+6) ;P/u highest # cylinder CGPC2 LD (HL),B NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNdate ;*=*=* GETDAT LD HL,GATBUF+0D8H ;Get today's date & stuff CALL @DATE ;*=*=* ; Check master password entry ;*=*=* MPWPARM LD HL,0 ;Did user enter the MPW? LD A,H OR L JR Z,M*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Stuff the GAT byte into INC L ; each position of the CP L ; Gat, one byte per JR NC,CGPC2 ; cylinder ;*=*=* ; Test if we are at 202 first by ignoring the ; fir9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNeck if alien drive ENDIF ; JP Z,NOTHARD ;Only HD format allowed LD L,(IY+1) ;Check if on HD driver LD H,(IY+2) ; compatible with this INC HL ; version of FORM... TNNNNNNNNNNNNNNNNNNNNNNN 2!NNNNNNNNNNNNNNNNNNNNNNPW ;Go prompt if not INC A ;Test if just MPW JR Z,MPW ;Go if just MPW LD DE,MPWBUF ;Shift to pswd field LD B,8 MOVMPW LD A,(HL) CP 30H NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN INC HL ;Bump to start of name INC HL INC HL LD DE,FORM$-1 ;Pt to which version LD B,3 ;Check 3 bytes CKVER INC HL INC DE LD A,(DE) tNNNNNNNNNNNNNNNNNNNNNNN grNNNNNNNNNNNNNNNNNNNNNN ;No spaces permitted JR C,PRSMPW ;End also on closing " CP 'a' ;Need cvrt to UC? JR C,MOVMPW1 CP 'z'+1 JR NC,MOVMPW1 RES 5,A ;Cvrt to UC MOVMPW1 LDTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Check if driver name CP (HL) ; is this version's JP NZ,DIFDVR ;Go if wrong version DJNZ CKVER ;*=*=* ; Check on Pack Name entry ;*=*=* NPARM LD HL,0 ;Test if user enterekNNNNNNNNNNNNNNNNNNNNNNN TCNNNNNNNNNNNNNNNNNNNNNN (DE),A INC DE INC HL DJNZ MOVMPW JR PRSMPW ; **** ; Prompt for master password ;***** MPW1 CALL ABTJCL MPW LD HL,MPW$ ;"master... CALL INPMPW JR Z,MPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNd LD A,H ; the NAME parameter OR L JR Z,DSKNAM ;Go if not INC A ;Was it just NAME? JR Z,DSKNAM ;Go if just NAME LD DE,GATBUF+0D0H ;Yes, ma?NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNW1 ;Re-prompt on no entry ;***** ; Parse the password & stuff into GAT sector buf ;***** PRSMPW LD DE,MPWBUF CALL CKMPW ;Check for valid MPW JR NZ,MPW1 ;Invalid entry LD (GATBUF+0CqNNNNNNNNNNNNNNNNNNNNNNND}NNNNNNNNNNNNNNNNNNNNNNove name to field LD B,8 ;8-chars max MOVNAM LD A,(HL) ;P/u a char CP '"' ;Closing " JR Z,CKNAME ;Exit if end of parm CP 20H ;Permit all but contrNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNEH),HL ;Stuff it ;***** ; Routine to galculate the # of grans per logical ; cylinder so that the GAT byte can be constructed ;***** CALCGPC LD A,(IY+8) ;P/u # of grans per cyl RLCA ;Rotate to bits 0[gNNNNNNNNNNNNNNNNNNNNNNNwLNNNNNNNNNNNNNNNNNNNNNNols JP C,CKNAME CP 'a' JR C,MOVNAM1 CP 'z'+1 JR NC,MOVNAM1 XOR 20H ;Turn off lc MOVNAM1 LD (DE),A INC HL INC DE DJNZ MOVNAM QNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN-2 RLCA RLCA AND 7 ;Strip off other data INC A ;Adj for zero offset ;*=*=* ; If double cylindering, double the count ;*=*=* BIT 5,(IY+4) ;Double? JR ZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNB7NNNNNNNNNNNNNNNNNNNNNNmation? ;*=*=* LD HL,$-$ ;NOSTOP entered? NOSTOP EQU $-2 ;Via param LD A,H OR L JP NZ,PFMT6 ;No testing if set LD HL,HITBUF ;Pt to i/o buffer LDNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNb pack MPW XOR A ;Clear carry flag SBC HL,DE ;Did user enter pack MPW? JP NZ,BADMPW ;Abort if no match JR PFMT6 ;*=*=* ; The directory was not readable - req assurance ;*oxNNNNNNNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN DE,0 ;Init to cyl 0, sect 0 CALL RDSEC ;Now try to read BOOT JP NZ,PFMT6 ;Assume unformatted if err LD HL,HASDAT$ ;Init "disk contains data CALL @LOGOT LD HRNNNNNNNNNNNNNNNNNNNNNNN a8NNNNNNNNNNNNNNNNNNNNNN=*=* PFMT5 CALL @LOGOT ;Log "unreadable... CALL ABTJCL1 ;Abort if JCL running LD HL,SURE?$ ;"Are you sure?... LD B,3 CALL GETARGX ;Give user chance to LD A,(HL;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL,NOFMT$ ;Init "non-std format ;*=*=* ; BOOT was read, is there a valid directory pointer ;*=*=* LD A,(HITBUF+2) ;P/u dir cyl # (possible) CP (IY+6) ;Check against max cyl # JR NC,PFMT5 2NNNNNNNNNNNNNNNNNNNNNNN R NNNNNNNNNNNNNNNNNNNNNN) ; proceed with format CP 'Y' JP NZ,FMTABT ;*=*=* ; OK to format - Shift DCT to work area ;*=*=* PFMT6 PUSH IY ;Move drive code table POP DE ;Back into place LD NNNNNNNNNNNNNNNNNNNNNNN۠NNNNNNNNNNNNNNNNNNNNNN;Go if bigger (or =) ;*=*=* ; Read the assummed GAT & test it ;*=*=* LD HL,HITBUF LD E,L ;Tricky way to get a zero LD D,A ;Pt to assumed GAT sector LD HL,HITBUF ;Pt to jNNNNNNNNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNNN HL,TMPDCT LD BC,10 LDIR ;*=*=* ; allow user to lock out tracks manually ;*=*=* ; BIT 3,(IY+3) ;Hard drive? JP Z,NOLCT ;Go if floppy ;Calc possible heads and adjust msg LD ANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbuffer CALL RDSEC ;Read the sector CP 6 ;Dir errcod returned? JR Z,PFMT4 ;Jump if yes & grab data LD HL,CANTRD$ ;Init "unreadable dir... JR PFMT5 PFMT4 LD$dNNNNNNNNNNNNNNNNNNNNNNN4kNNNNNNNNNNNNNNNNNNNNNN,(IY+4) ;Starting head # AND 00001111B ;Field ADD A,30H ;ASCII offset NOP ;Possible DEC if hd # are LD E,A ;Given starting w/0 INC A NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN HL,NODIR$ ;Init "non-init dir LD A,(HITBUF+0DAH) ;Check if date field CP '/' ; is present JR NZ,PFMT5 ;*=*=* ; The directory is readable - request its MPW ;*=*=* PFMT4A LD HL,HITBUNNNNNNNNNNNNNNNNNNNNNNN'&NNNNNNNNNNNNNNNNNNNNNN ;Make number LD D,A ;Save LD (PHYD1$),A ;1st possible head LD A,(IY+7) ;# of heads RLCA RLCA RLCA AND 7 ;Field INC A -rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNF+0D0H LD DE,PACKID$+5 ;Move name & date into LD BC,8 ;Display message field LDIR LD DE,PACKID$+14H LD C,8 LDIR LD HL,PACKID$ CALL @LOGOT ;LoDxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Real # LD (HDNB),A ;Save HCLP INC E ;Start fm 1st hd # -1 DEC A ;Get highest head # JR NZ,HCLP ;By counting LD A,E LD (PHYD2$),A ; %NNNNNNNNNNNNNNNNNNNNNNN$UNNNNNNNNNNNNNNNNNNNNNNst two instructions with LD DE,xxxx ;*=*=* LD A,0CBH ;Continue to stuff GAT DB 11H ; until cyl 202 CGPC3 LD (HL),C INC L CP L JR NZ,CGPC3 ;*=*=* ; Check if tNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNg the id field CALL ABTJCL ;Abort if in JCL ;*=*=* ; User must enter Current Pack's MPW to proceed ;*=*=* OLDMPW LD HL,OLDMPW$ ;"What's the old MPW? CALL INPMPW ;Grab user input to match JR NNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNhis pack is already formatted ;*=*=* PFMT3 PUSH IY ;Xfer DCT ptr to HL POP HL ; & move DCT again LD DE,TMPDCT LD BC,10 LDIR ;*=*=* ; May be formatted, is there SYSTEM infor/NNNNNNNNNNNNNNNNNNNNNNN ˞NNNNNNNNNNNNNNNNNNNNNN Z,OLDMPW LD DE,MPWBUF CALL HASHMPW ;Hash user entry ;***** ; Routine to test master password for match ;***** EX DE,HL ;Xfer hashed MPW to DE LD HL,(HITBUF+0CEH) ;Else gra@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ϟNNNNNNNNNNNNNNNNNNNNNN LD B,E ;#grans to lock LD E,(HL) ;Get alloc byte ;A=grans before locked out trk DEC A ;Offset fm 0 OFFS2 INC A ;Set a bit for each gran PUSH AF CALNNNNNNNNNNNNNNNNNNNNNNNF6NNNNNNNNNNNNNNNNNNNNNNABTJCL ;No errors allowed if JCL LCHD1 LD HL,PHYHD$ ;Which head... CALL GETARG LD HL,$-$ ;Range HDNBRS EQU $-2 CP H JR C,GTPHD ;Too low INC L NNNNNNNNNNNNNNNNNNNNNNN VNNNNNNNNNNNNNNNNNNNNNNL SETBIT ;Of the physical track POP AF DJNZ OFFS2 LD (HL),E ;And put back GAT byte JP LCQUES ;Ask for more ; NOLCT LD HL,DBL$ BIT 5,(IY+4) ;Double tracϐNNNNNNNNNNNNNNNNNNNNNNNߡNNNNNNNNNNNNNNNNNNNNNNCP L JR NC,GTPHD ;Too high LD (LCHD),A ;Save track JR LCTR1 GTPHTR CALL ABTJCL LCTR1 LD HL,PHYTR$ ;Trk #.. LD B,3 CALL GETARGX CALL DECHEX NNNNNNNNNNNNNNNNNNNNNNN e9NNNNNNNNNNNNNNNNNNNNNNking CALL NZ,@DSPLY ;Notify user PAGE ; each position of the CP L ; Gat, one byte per JR NC,CGPC2 ; cylinder ;*=*=* ; Test if we are at 202 first by ignoring the ; firTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Make binary in BC LD A,B OR C JR Z,GTPHTR ;Can't lock out 0 LD HL,$-$ HTRK EQU $-2 ;Highest trk # OR A SBC HL,BC ;Entered >legal? JR:NNNNNNNNNNNNNNNNNNNNNNN0jNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN C,GTPHTR ;Number was too high ; ;Convert physical numbers to logical GAT posn ; LD A,(IY+8) RLCA RLCA RLCA AND 7 INC A LD E,A ;E has grans/cyl (w/o double) aNNNNNNNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD A,$-$ HDNB EQU $-1 ;Number of heads PUSH BC PUSH DE ;Save grans/phys cyl CALL DIVEA@ ;Grans/head POP DE LD D,E ;Save grans/pʚNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNhys cyl LD E,A ;Keep grans/phys trk POP HL ;Trk # to HL LD A,(PHYD1$) LD C,A LD A,$-$ ;Physical hd # LCHD EQU $-1 ;Entered value S3NNNNNNNNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNN LD (HDNBRS),DE ;Save valid range ; ;Set up trk number message LD H,0 LD L,(IY+6) ;Trk count to BC INC HL ;Fix offset fm 0 BIT 5,(IY+4) ;Double? JR Z,ISNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNUB C ;Minus starting offset ;A=trk offset fm logical start/D=grans/trk/HL=trk to lock PUSH DE CALL MULTEA@ ;A=gran offset fm start POP DE BIT 5,(IY+4) ;Double tracking? eNNNNNNNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNNREAL ADD HL,HL ;*2 ISREAL DEC HL ;Back to offset fm 0 LD (HTRK),HL LD DE,PHYT1$ ;Posn for # CALL HEXDEC ;Stuff ASCII JR LCQUES ;Ask question LCQUES1 CA NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNJR Z,N1 SRA H RR L ;Div trk # by 2 ;HL=>logical trk c set if 1st of pair JR NC,N1 ;1st cyl-go ADD A,D ;Else add in a cyls grans N1 LD H,GATBUF<-8 ; +_NNNNNNNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNNLL ABTJCL LCQUES LD HL,LOCK$ ;Lock out any... CALL GETARG CP 'Y' JR Z,LCHD1 ;Yes.. CP 'N' JR Z,NOLCT ;Skip if not wanted JR LCQUES1 GTPHD CALL ]NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN POP DE ENDIF ; IF MTI!TRS!PDC LD HL,SKEWDAT ;Point to skew table ENDIF ; IF LSI!MTI!ARM!TRS!PDC!IDE CALL WRCYL ;Cylinder write JP NZ,IOERR BFMT5 LD NNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN ;Set up for no interleave BIT 3,(IY+3) ;Hard drive? JR NZ,GOFMT LD E,5 ;Set interleave for 5" BIT 5,(IY+3) ;5" floppy? JR Z,GOFMT LD E,5 d7NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNN A,D ;Was this the last INC D ; cylinder to format? CP (IY+6) JR NZ,BFMT1 ENDIF DONTFMT EQU $ ; IF LSI ;*=*=* ; Lockout the alternate cylinder ;*=*=* LaaNNNNNNNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNN;HDFMT2/ASM - Hard format module - 10/31/83 ;Update for IDE Support-06/26/2000 Andrew Quinn IF LDI ;*=*=* ; Begin the actual format - Check for "one" drive ;*=*=* XOR A ;Init the count EXX LD YNNNNNNNNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNNN ;Same, but patchable! GOFMT CALL FMTHD ;Format hard drive JP NZ,IOERR ENDIF ; ;*=*=* ; Clear out the BOOT space ;*=*=* HRDRV1 LD HL,BOOT1 ;CLear the BOOT space PATLP LD (HL),6DH ;UsinNNNNNNNNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNN B,A EXX LD C,(IY+1) ;P/u the driver vector LD B,(IY+2) ; & ck for # parts LD HL,DCT$ TSTDCT PUSH HL LD A,(HL) ;Is this disabled? CP 0C9H JR zsNNNNNNNNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNNg 6DB6 pattern INC L LD (HL),0B6H INC L LD A,L CP 208 JR NZ,PATLP ;*=*=* ; Calculate sectors/track & sectors/cylinder ;*=*=* LD A,(IY+7) ;# of sectors/traNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNZ,NOTRES INC HL LD E,(HL) ;P/u the driver vector INC HL LD D,(HL) XOR A EX DE,HL SBC HL,BC EX DE,HL JR NZ,NOTRES ;Go if not thisDNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNck LD D,A ;-> reg E AND 1FH ;Strip # of heads LD E,A INC E ;Bump for 0 offset LD (SECTRK),A ;Stuff # sectors/track XOR D RLCA NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN driver INC HL INC HL INC HL ;Point to DCT+5 LD A,(HL) CP (IY+5) ;Is this the same drive? JR NZ,NOTRES EXX INC B ;Bump the drDyNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Get # of heads RLCA ; into reg D RLCA INC A ;Adjust for zero offset CALL MULTEA@ BIT 5,(IY+4) ;Double tracking? JR Z,$+3 ADD | NNNNNNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNive count EXX NOTRES POP HL LD DE,10 ;Advance to next one ADD HL,DE LD A,8*10+DCT$&0FFH CP L ;Done with DCTs? JR NZ,TSTDCT EXX FNNNNNNNNNNNNNNNNNNNNNNN $NNNNNNNNNNNNNNNNNNNNNN A,A ;Twice the number LD (SECCYL),A ;*=*=* ; Test if SYSTEM information only ;*=*=* SYSPRM LD HL,0 ;P/u system info only LD A,H ;Don't format if system OR L LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;Check how many drives! DEC B ;Is there only one? EXX JR NZ,HRDRV1 ;Only FORMAT if one!!! ;***** ; Hard drive format - most work done by controller ;***** HRDRV BIT 3,(IY+3) ;Check forGNNNNNNNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN ; info only is req JP NZ,DONTFMT ; ;Don't need to actually format an IDE drive ; IF LSI!MTI!ARM!TRS!PDC!IDE ;*=*=* ; Begin the formatting ;*=*=* LD HL,FMTCYL$ ;"formatting clinder... CALL @DSNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN floppy JR Z,AFLOP ;Go if a floppy LD HL,LAST$ ;Give one last chance to CALL GETARG ;Abort before wiping disk AND 5FH ;Make U/c CP 'Y' ;Must be yeĆNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNPLY BGNFMT LD D,0 ;Init to cyl 0 BFMT1 LD A,D ;P/u cylinder position CALL CVDEC ;Cvrt to decimal PUSH DE ;Don't alter reg D CALL DSPCYL ;Display cyl # ˩NNNNNNNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNNs to continue JP NZ,FMTABT AFLOP LD A,(SYSPRM+1) ;Bypass the formatting OR A ; if system info only JR NZ,HRDRV1 LD HL,FMTG$ ;"formatting - be patient LD DE,0 5XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNZ,BVER9 ;Go on error BVER5 LD A,0 ;P/u sector # INC A ;Bump it up BVER6 LD (BVER5+1),A ; and save new # LD E,A ;Xfer to sector register LD A,(SECCYL) pNNNNNNNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNg AND 1FH INC A ;Adj for zero offset CALL DIVEA@ ;Calc which granule PUSH AF ;Save gran # LD E,(HL) ;P/u current GAT byte CALL SETBIT NNNNNNNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNND HL,ALTLO$ ;"Inhibiting... CALL @DSPLY LD HL,GATBUF+77 LD (HL),0FFH ENDIF ; ;**** Lock out CYL #1 on TRS or PERCOM for diagnostics. IF TRS!PDC LD HL,DIAG$ CALL @DNNNNNNNNNNNNNNNNNNNNNNN INNNNNNNNNNNNNNNNNNNNNN ;Is this = a cyl? CP E JR NZ,BVER2 ;Go if cyl not done ;*=*=* ; Readjust for end of cylinder ;*=*=* BVER8 LD A,D ;P/u current cyl position INC D ;Bump to next cyl *&NNNNNNNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNSPLY LD HL,GATBUF+1 LD (HL),0FFH ENDIF ; VERPRM LD DE,-1 ;P/u verify parm LD A,D ;If 0, don't verify OR E ; JP Z,DONTVER JP NZ,DONTVER ;***** ; NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCP (IY+6) ;Cp to highest # cyl JR NZ,BVER1 ;Go if more to verify ; IF LDI ;*=*=* ; If a floppy, then do the lockout table ;*=*=* BIT 3,(IY+3) ;If floppy, make a JR NZ,CALC=NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN Begin the verification process ;***** LD HL,VERCYL$ ;"Verifying cylinder... CALL @DSPLY LD D,0 ;Init cylinder ctr BVER1 LD L,D ;Pt to GAT byte for this LD H,GATBUF<=NNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNDIR ; lockout, else skip * LD HL,GATBUF ;Allocation table LD DE,GATBUF+60H ;Lockout table LD B,0 ;High order length LD C,(IY+6) ;# of cyls INC C NNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN-8 ; track & bypass verify LD A,(HL) ; if track not formatted INC A JR Z,BVER8 LD A,D ;If this is the DIR cyl, ; IF MTI!LSI!ARM!TRS!PDC!IDE CP (IY+9) NNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN ;Adj for zero offset LDIR ENDIF ; JR CALCDIR ;Go start system info ;*=*=* ; Got verify error ;*=*=* BVER9 EQU $ ; IF LDI BIT 3,(IY+3) ;If floppy, only l/o JR NZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; use VERSYS, else VERSEC LD HL,WRSEC ;Init for reg sector JR NZ,$+5 LD HL,WRSYS ;Init for system sector LD (BVER2W+1),HL ;Stuff vector LD HL,VERSEC JR NZ,NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN,BVER9A ; error 4 & 5 CP 5 ;Data rec not found? JR Z,BVER10 CP 4 ;Parity error? JP NZ,IOERR JR BVER10 BVER9A EQU $ ENDIF ; CP 8 NNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN$+5 LD HL,VERSYS LD (BVER2V+1),HL ENDIF ; CALL CVDEC ;Cvrt to decimal PUSH DE CALL DSPCYL ;Display cylinder # POP DE XOR A ;Initialil"NNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN ;Hard, l/o all except JP Z,IOERR ; device not avail... CP 16 ; & all > 15 JP NC,IOERR ;*=*=* ; Lockout granule (hard) or cylinder (floppy) ;*=*=* BVER10 PUSH DE LD NNNNNNNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNNze starting LD (BVER5+1),A ; sector LD E,A BVER2 LD HL,BOOT1 ;Point to buffer ; IF LDI BIT 3,(IY+3) ;Only WRSEC a hard disk * CALL NZ,WRSEC ;Write first then... kNNNNNNNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNN HL,STAR$ ;Show the * lockout CALL @DSPLY POP DE LD L,D LD H,GATBUF<-8 BIT 3,(IY+3) ;If hard drive, then JR NZ,BVER11 ; only lockout gran LD (HL;*NNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN CALL Z,VERSEC ;SECtor or SYStem verify ENDIF ; IF MTI!LSI!ARM!TRS!PDC!IDE BVER2W CALL WRSEC ;Write first then... BVER2V CALL Z,VERSEC ;SECtor or SYStem verify ENDIF ; JR NmQNNNNNNNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN),0FFH ;Lockout this cylinder JR BVER8 ; its a floppy... ;*=*=* ; Bad sector on hard drive - Lockout the Granule ;*=*=* BVER11 LD A,(IY+8) ;Get # of sectors/gran PUSH DE ;Save this reNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmidpoint ENDIF ; LD C,0 ;Point to GAT byte for LD H,GATBUF<-8 ; this cylinder CALC1 LD A,0 ;P/u default GAT byte CP (HL) ;Is this cylinder locked? JR NNNNNNNNNNNNNNNNNNNNNNN uNNNNNNNNNNNNNNNNNNNNNN CALL VERSEC ;Verify after write JP NZ,IOERR CALL DOT ;Show "." LD DE,1 ;Pt to cyl 0, sector 1 LD C,0 ;Refer to drive 0 CALL RDSECT@ ;RNNNNNNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN Z,GENSYS ;Bypass if available INC C ;Bump C LD A,C RRCA ;Test if odd or even LD A,L ;Get current test pos JR NC,CALC2 ;Jump if C was evenNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNead the real BOOT JP NZ,IOERR LD A,(IY+9) ;Dir cyl into BOOT LD (BOOT1+2),A CALL WRSEC ;Write 0/1 JP NZ,IOERR CALL VERSEC ;Verify after write JP J>NNNNNNNNNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNN ADD A,C ;Add to previous pos LD L,A CP (IY+6) ;Go over the top? JR NZ,CALC1 ;Loop if not JR CALC3 ;Else abort CALC2 SUB C ;Try a lowe$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NZ,IOERR CALL DOT ;*=*=* ; Complete GAT construction ;*=*=* LD A,(IY+6) ;P/u highest # cylinder SUB 22H ;Adj offset from 34 LD (GATBUF+0CCH),A ;Stuff GAT cyl excess LD b1NNNNNNNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNr cylinder # LD L,A JR NZ,CALC1 ;At cylinder 0? CALC3 LD HL,NOCYL$ ;"No dir space avail... JP FMTABT ;*=*=* ; Generate the system initialization ;*=*=* GENSYS LD (IY+9),L ;Stuff NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN A,(IY+4) ;P/u sec siz & # of sides AND 80H+20H LD B,A LD A,(IY+3) ;P/u density AND 40H OR B LD B,A LD A,(IY+8) ;P/u # of grans/cyl RLCA I8NNNNNNNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNNthe dir cyl LD A,L CALL CVDEC ;Cvrt reg A to 3 dec digs LD (DIRASC$),BC ;Stuff into the message LD (DIRASC$+2),A LD HL,DIRCYL$ ;"Dir will be placed... CALL @DSPLY tNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN RLCA RLCA AND 7 LD (CYLGRN+1),A OR B ;Merge the two IF RAM OR 88H ;Set DATA disk bit ENDIF LD (GATBUF+0CDH),A ;Stuff into GAT ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Show gran allocated LD (HL),E ;Restuff into GAT LD A,(IY+8) ;Now point to next sector AND 1FH INC A LD E,A ;Xfer SPG to reg E POP AF ;RcvZ]NNNNNNNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNN LD HL,IPLSYS$ ;"Initializing... CALL @DSPLY LD HL,GATBUF LD A,(HL) ;P/u GAT byte for 1st OR 1 ;Cylinder & show 1st LD (HL),A ;Gran in use for BO$'NNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNr # of bad gran INC A ;Bump to start on next * CALL MULTEA@ ;Calc 1st sector of POP DE ; next gran & continue JR BVER6 ; DONTVER EQU $ ;***** ; 'NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNOTs LD A,(IY+9) ;Dir cyl # into DIR/SYS LD (DIRDIR+16H),A LD L,A ;Show entire directory LD (HL),0FFH ;Cylinder locked out ;*=*=* ; Update BOOT for DIR ;*=*=* LD PNNNNNNNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNN Perform expanding binary search to find ; a cylinder available for the directory ; but start with suggested cylinder ;***** CALCDIR LD A,CR ;Close the display line CALL @DSP ; IF LSI ;Laredo |pNNNNNNNNNNNNNNNNNNNNNNN 6NNNNNNNNNNNNNNNNNNNNNN DE,0 ;Init for cyl 0, sect 0 CALL VERSEC ;Test if formatted JP NZ,NOTFMT ;Error if not LD HL,BOOT1 ;Pt to R/S E/I BOOT rtn LD C,0 CALL RDSECT@ ;Read BOOTPNNNNNNNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNmust use this cyl LD L,(IY+9) ;P/u recommended dir cyl ENDIF ; IF .NOT.LSI LD L,(IY+6) ;P/u highest # cyl INC L ;Bump for 0 offset SRL L ;Find /NNNNNNNNNNNNNNNNNNNNNNN FNNNNNNNNNNNNNNNNNNNNNN1 from Drive 0 JP NZ,IOERR LD A,(IY+9) ;Dir cyl into BOOT LD (BOOT1+2),A LD DE,0 ;Init for cyl 0,sect 0 CALL WRSEC ;Write R/S BOOT sector JP NZ,IOERR eNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN BNNNNNNNNNNNNNNNNNNNNNN ;Plus 1 for 0 offset adj LD (DIRDIR+23),A ;Stuff in DIR/SYS LD A,(IY+9) ;P/u the dir cyl # & LD (DIRDIR+16H),A ; stuff into the DIR rec LD HL,DIRDIR ;Pt to start of DIR data (_NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALL VERSEC ;Verify after write JP NZ,IOERR CALL DOT ;*=*=* ; Write the Granule Allocation Table ;*=*=* LD HL,GATBUF ;Pt to GAT sector buffer LD D,(IY+9) ;P/u the dirWNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD DE,HITBUF ;Pt to start of dir buf LD BC,32 ;Move DIR/SYS into buf LDIR LD D,(IY+9) ;P/u dir cyl # LD E,3 ;Write as sector 3 LD HL,HITBUF ;Pt to stzGNNNNNNNNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNNN cyl LD E,0 ;Denote sector 0 CALL WRSYS ;Write the GAT JP NZ,IOERR CALL VERSYS ;Verify the GAT JP NZ,IOERR CALL DOT ;*=*=* ; Construct the HIT ;*=*k`NNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNart of buffer CALL WRSYS ;Write the sector JP NZ,IOERR CALL VERSYS ;Verify after write JP NZ,IOERR CALL DOT LD HL,HITBUF ;Zero the 1st 32 bytes LD ICNNNNNNNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNN=* LD HL,HITBUF ;Point to the HIT buffer LD (HL),0A2H ;Stuff BOOT/SYS hash code INC HL LD (HL),0C4H ;Stuff DIR/SYS hash code DEC HL LD D,(IY+9) ;P/u dir cyNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN B,32 ;Of the buffer to clear GSYS2 LD (HL),0 ;Where we stuffed the INC HL ;BOOT & DIR dir records DJNZ GSYS2 LD D,(IY+9) ;P/u dir cyl # LD E,4 ;ConkNNNNNNNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNl # LD E,1 ;Pt to sector 1 CALL WRSYS ;Write the HIT JP NZ,IOERR CALL VERSYS ;Verify after write JP NZ,IOERR CALL DOT LD DE,HITBUF ;EsNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNt writing at sect 4 GSYS3 LD HL,HITBUF ;Pt to start of buffer CALL WRSYS ;Write the sector JP NZ,IOERR CALL VERSYS ;Verify the sector JP NZ,IOERR ;*=*=* ; Write the remaioNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN LD DE,GATBUF+255-10;6.2 Media Data Block LD HL,LSIID ;Point to header LD BC,04 ;Set length LDIR ; move it PUSH IY POP HL ;This drive's DCT 6NNNNNNNNNNNNNNNNNNNNNNN dNNNNNNNNNNNNNNNNNNNNNNtablish buffer for LD HL,BOOTDIR ;Dir records LD BC,32 ;Move BOOT/SYS dir record LDIR ; into 1st slot LD D,(IY+9) ;P/u dir cyl LD E,2 ;This wiNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN INC HL INC HL INC HL ;Bypass the JP addr LD C,7 ; bytes to move LDIR ; move it in JR WRGAT1 ;Skip around string LSIID DB 03,'L[uNNNNNNNNNNNNNNNNNNNNNNN 7NNNNNNNNNNNNNNNNNNNNNNll be sector 2 LD HL,HITBUF ;Pt to buffer start CALL WRSYS ;Write the sector JP NZ,IOERR CALL VERSYS ;Verify after write JP NZ,IOERR CALL DOT LD A`NNNNNNNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNSI' ; ;*=*=* ; Write copy of GAT into 0/3 ;*=*=* WRGAT1 LD HL,GATBUF ;Pt to GAT buffer LD D,0 ;Write it out to LD E,3 ;Cyl 0, sector 3 CALL WRSEC ;Write 0/3 NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN,(SECCYL) ;P/u # of records OR A ;If 256 SPC, then JR Z,USE34 ; the CP won't work CP 35 JR C,STUFSPC USE34 LD A,34 ;Max # of sectors LD (SECCYL),LNNNNNNNNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNN JP NZ,IOERR CALL VERSEC ;Verify after write JP NZ,IOERR CALL DOT ;*=*=* ; Write the config sector 0/2 ;*=*=* LD HL,HITBUF ;Zero out buffer GSYS1 LD (HL),0 INC NNNNNNNNNNNNNNNNNNNNNNN qNNNNNNNNNNNNNNNNNNNNNNA STUFSPC LD (DIRDIR+14H),A ;& stuff into DIR/SYS CYLGRN LD A,0 ;P/u # grans/cyl BIT 5,(IY+4) ;Test 2-sided JR Z,$+4 ADD A,A ;Double count on 2-sided INC A rJNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN L JR NZ,GSYS1 LD HL,HITBUF ;Set first byte to xx LD (HL),RLS ;For release number LD DE,2 ;Pt to cyl 0, sector 2 CALL WRSEC ;Write 0/2 JP NZ,IOERRcNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;How many hundreds? JR C,CVD2 ;Go if no more INC C ;Else bump & loop JR CVD1 CVD2 ADD A,100 ;Adjust for underflow LD B,30H CVD3 SUB 10 ;HoNNNNNNNNNNNNNNNNNNNNNNNFINNNNNNNNNNNNNNNNNNNNNNL) ;P/u highest # sector CP E ;Are we finished yet? JR NZ,GSYS3 ;Loop if not LD IX,(DCTPTR) ;Real DCT for drive LD A,(IY+9) ;DIR posn LD (IX+9),A ;+NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNw many 10s JR C,CVD4 ;Go if underflow INC B ;Bump 10s JR CVD3 ;Loop for more CVD4 ADD A,3AH ;Adjust units place RET ;*=*=* ; display cyl # DSPCYL PUSH MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNUpdate for system ;*=*=* ; exit procedures ;*=*=* LD HL,FMTCAO$ ;"Formatting complete... CALL @LOGOT JP @EXIT ;***** ; disk I/O requests ;***** WRCYL PUSH BC LD B,15 ;Write VNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN AF ;Save units place PUSH BC ;Save tens/hundreds LD B,3 LD A,8 BKUP CALL @DSP ;Backspace 3 DJNZ BKUP POP BC LD A,C CALL @DSP FNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNtrack IF TRS!PDC!IDE CALL FMTDVR ;WRCYL code in formatter POP BC RET ELSE JR DISKIO ENDIF ; IF LDI FMTHD PUSH BC LD B,12 ;Format har NNNNNNNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNN ;Display hundreds LD A,B CALL @DSP ;Display tens POP AF ;Get back units CALL @DSP ;Display units RET ;***** ; Hash a diskette password ;***** CKMPW CJNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNd disk JR DISKIO ENDIF ; WRSEC PUSH BC LD B,13 ;Write data sector JR DISKIO WRSYS PUSH BC LD B,14 ;Write system sector JR DISKIO RDSEC PUSH BC PNNNNNNNNNNNNNNNNNNNNNNN $NNNNNNNNNNNNNNNNNNNNNNALL CKMPW0 RET NZ CALL HASHMPW ; IF RAM JP NZ,IOERR ENDIF ; XOR A RET ; HASHMPW LD A,0E4H RST 28H ; CKMPW0 LD B,8 PUSH DE POP HL wHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD B,9 ;Read data sector JR DISKIO VERSEC PUSH BC LD B,10 ;Verify a sector JR DISKIO ;***** ; Perform a verification to ensure system sector ;***** VERSYS CALL VERSEC NNNNNNNNNNNNNNNNNNNNNNNVwNNNNNNNNNNNNNNNNNNNNNN LD A,(HL) ;P/u 1st char JR CKMPW2 ; & check CKMPW1 INC HL LD A,(HL) CP ' ' JR Z,CKMPW7 CP '0' JR C,INVMPW CP '9'+1 ԃNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Sector verify JR Z,VERS1 ;Bypass if not system SUB 6 ;Test read system retcod RET Z ;Go if that's what it was ADD A,6 ;Restore orig retcod RET VNNNNNNNNNNNNNNNNNNNNNNNeFNNNNNNNNNNNNNNNNNNNNNNJR C,CKMPW3 CKMPW2 CP 'A' JR C,INVMPW CP 'Z'+1 JR NC,INVMPW CKMPW3 DJNZ CKMPW1 XOR A ;All OK RET CKMPW5 INC HL CP (HL) ;No imbedded spaces Y$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNERS1 OR 1 ;S/b system, found data LD A,0 RET ; DISKIO LD C,-1 ;P/u drive # LD A,32 ;Init to illegal drive OR A CALL GOIO ;Go after DCT vec]NNNNNNNNNNNNNNNNNNNNNNNv NNNNNNNNNNNNNNNNNNNNNN JR NZ,INVMPW CKMPW7 DJNZ CKMPW5 XOR A ;All OK RET INVMPW LD HL,BADMPW$ LD A,63 ;Indicate extended error OR A ;Set NZ RET ;***** ; RouttNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNtor POP BC RET GOIO JP (IY) ;Vector to DCT ; ;***** ; routine to convert reg A to 3 decimal digits ; in registers C B A ;***** CVDEC LD C,'0' ;Init to count 100's CVD1 SUB 100 yNNNNNNNNNNNNNNNNNNNNNNNE:NNNNNNNNNNNNNNNNNNNNNNines to convert input strings to uc ;***** GETARG LD B,1 ;1 char input GETARGX CALL @DSPLY ;B chars input LD C,0 LD HL,HITBUF ;Buffer area INPT CALL @KEYIN ;Enter them JP سNNNNNNNNNNNNNNNNNNNNNNNuxNNNNNNNNNNNNNNNNNNNNNNning directory ;*=*=* PUSH DE ;Save cyl/sect CALL DOT ;Display a dot for each POP DE ;Directory sector INC E ;Bump the sector pointer LD A,(SECCYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNqyNNNNNNNNNNNNNNNNNNNNNNAND 5FH ;Make U/C LD (HL),A UC2 INC HL DJNZ GETUC ;Do entire input POP HL POP BC LD A,(HL) ;P/u one char OR A ;Make NZ NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Log out POP AF RET ; IOERR PUSH AF ;Save error code LD A,CR CALL @DSP ;Do a CR first POP AF LD L,A LD H,0 OR 0C0H BNNNNNNNNNNNNNNNNNNNNNNN$*NNNNNNNNNNNNNNNNNNNNNN RET ; INPMPW LD B,8 ;Max chars CALL GETARGX ;Input U/C into HITBUF RET Z ;If no input LD DE,MPWBUF ;Then move to MPWBUF PUSH DE LD A,9 ;)NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Mask LD C,A CALL @ERROR IF .NOT.RAM JP @ABORT ENDIF ;*=*=* ; 6.x exit routine follows.... ; provide compatible I/O routines for 6.x LDOS ; accomodate EDAS's insistance on resolving labels ;WiMBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAn extra char means we don't SUB B ;Have to check for zero here LD C,B LD B,0 ;Xfer length LDIR ;Move input LD B,A ;Chars needed LD )NNNNNNNNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNNth MACRO expansion inside of FALSE conditionals ;By not using SVCMAC here IF RAM MOD1 EQU 0 ;Keep EDAS happy when MOD3 EQU 0 ;Evaluating .NOT.RAM option ;*=*=* ; system routines for RAM versvNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN A,' ' ;Load a blank FILLBLK LD (DE),A ;Padd response INC DE DJNZ FILLBLK POP HL ;=>string RET ; ;*=*=* ; Routine to set a bit ;*=*=* SETBIT RLCA XNNNNNNNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNNion of HD formatters ;*=*=* QUIT LD SP,$-$ SPSAV EQU $-2 LD A,106 RST 40 RET @ABORT LD HL,-1 DB 0DDH ;Make next inst IX @EXIT LD HL,0 JR QUIT ; @DSP LD P NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;Shift to "b" field RLCA RLCA OR 0C3H ;Establish as SET b,E LD (SBIT1+1),A ;Alter the OP code SBIT1 SET 0,E ;Turn on the bit RET ;*=*=* ; print one "." ;*=*=* DOT LD ~NNNNNNNNNNNNNNNNNNNNNNNaGNNNNNNNNNNNNNNNNNNNNNN C,A LD A,2 RST 28H RET Z JR IOERR @DSPLY LD A,10 RST 28H RET Z JR IOERR ; DECHEX LD A,96 RST 28H RET HEXDEC LD A,97 RST 4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN A,'.' JP @DSP ;***** ; Temporary storage space for format drive DCT ;***** TMPDCT DS 10 ;***** ; Parm error exit ;***** BADNAM LD HL,BADNAM$ DB 0DDH DIFDVR LD HL,DIFDVR$ ;Driver mismatch... 1NNNNNNNNNNNNNNNNNNNNNNNRvNNNNNNNNNNNNNNNNNNNNNN 28H RET @KEYIN LD A,9 RST 28H RET @PARAM LD A,17 RST 28H RET @LOGOT LD A,12 RST 28H RET MULTEA@ LD C,A LD A,90 RST 28H RET DIVEA@ +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DB 0DDH NOTFMT LD HL,NOTFMT$ DB 0DDH NOTZER LD HL,NOTZER$ ;Can't format drive 0 DB 0DDH ILLEG LD HL,ILLEG$ ;Drive is disabled DB 0DDH BADMPW LD HL,BADMPW$ ;Wrong MPW VNNNNNNNNNNNNNNNNNNNNNNNA;NNNNNNNNNNNNNNNNNNNNNN LD C,A LD A,93 RST 28H RET GETDCT@ LD A,81 RST 28H RET @DATE LD A,18 RST 28H RET RDSECT@ LD A,49 RST 28H RET @ERROR LD A,26 RSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNentered DB 0DDH FMTABT LD HL,FMTABT$ DB 0DDH NOTHARD LD HL,HARD$ DB 0DDH PRMERR LD HL,PRMERR$ CALL @LOGOT JP @ABORT ;*=*=* ; abort if JCL running IF RAM SFLAG$ EQNNNNNNNNNNNNNNNNNNNNNNNr NNNNNNNNNNNNNNNNNNNNNNT 28H RET ; ;*=*=* ; entry point if 6.x ;*=*=* ; BEGIN LD A,106 RST 40 JR Z,BEGINA ;Continue if no break LD HL,-1 RET ; else abort ; BEGINA LD (SPSNNNNNNNNNNNNNNNNNNNNNNNBHNNNNNNNNNNNNNNNNNNNNNN C,FMTABT ;Break pressed! LD A,B OR A RET Z ;No input ; convert input line to U/C PUSH BC PUSH HL GETUC LD A,(HL) CP 'a' JR C,UC2 lNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNU 0 ;Stuffed by init code ENDIF ABTJCL1 NOP ;Patchable w/RET ABTJCL PUSH AF LD A,(SFLAG$) SFLAG EQU $-2 ;RAM version sets address BIT 5,A JR NZ,FMTABTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN INC HL EX (SP),HL PUSH DE LD D,A XOR A HDC2 INC A ADD HL,BC JR C,HDC2 SBC HL,BC LD B,D POP DE DEC A JR y7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN bit 4 => software reset ;*=*=* ERROR EQU DATA+1 ;Error code port WRP EQU DATA+1 ;Write precompensation port SECNT EQU DATA+2 ;Sector count SECNO EQU DATA+3 ;Sector number port CYLLO EQU NNNNNNNNNNNNNNNNNNNNNNNw3NNNNNNNNNNNNNNNNNNNNNN NZ,HDC3 INC C JR Z,HDC5 DEC C LD A,B LD (DE),A JR HDC4 HDC5 DEC C HDC3 ADD A,'0' LD (DE),A LD A,'0' HDC4 INC DE INC C NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DATA+4 ;Cylinder lo CYLHI EQU DATA+5 ;Cylinder hi SDH EQU DATA+6 ;Size/Drive/Head port STATUS EQU DATA+7 ;Status port COMMAND EQU DATA+7 ;Command port ;*=*=* ; Western Digital ConNNNNNNNNNNNNNNNNNNNNNNNg NNNNNNNNNNNNNNNNNNNNNN EX (SP),HL JR NZ,HDC1 POP HL RET TENTBL DW -10000,-1000,-100,-10,-1 ; ENDIF R NZ,HDC1 POP HL RET TENTBL DW -10000,-1000,-100,-10,-1 ; ENDIFPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNtroller OP codes ; ; 0001rrrr - Restore drive ; 0111rrrr - Seek sector/head/cyl ; 0010d000 - Read sector ; 00110000 - Write sector ; 01010000 - Format track ; ; rrrr = step rate ; d = 0=programmed I/O, 1=DMA ;*=*=* ; Driver start ;*=*=* NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAV),SP ;Save callers stack PUSH HL LD A,101 ;@@FLAGS RST 28H ;Find SFLAG$ LD DE,'S'-'A' ;Offset ADD IY,DE ;Calc byte address LD (SFLAG),IY NNNNNNNNNNNNNNNNNNNNNNN THL to number in BC ;*=*=* DECHEX LD DE,0 ;Clear to start CXDEC LD A,(HL) ;P/u char NNNNNNNNNNNNNNNNNNNNNNN 2^NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSUB 30H ;To BCD CP 10 ;Must be less JR NC,DONECON ;End if not digit PUSH HL ;Save ascii ptr LD H,D LD L,E ;Merge digit ADD ~NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN;HDFMT3/ASM - HARD FORMAT module - 02/07/84 ;Adjusted for WD1010 controller 12/12/83 ;Update for IDE Support-06/26/2000 Andrew Quinn IF TRS!PDC!IDE ;Driver to handle FMT command w/WD controller IF TRS HARDWP EQU 0C0H HDCONT NNNNNNNNNNNNNNNNNNNNNNN"`NNNNNNNNNNNNNNNNNNNNNN HL,HL ADD HL,HL ADD HL,DE ADD HL,HL EX DE,HL ADD A,E LD E,A LD A,0 ADC A,D LD D,A POP HL INC HL ;Next charNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN EQU 0C1H DATA EQU 0C9H ;Data transfer port ENDIF IF IDE DATA EQU 040H ENDIF IF PDC DATA EQU 78H ENDIF ;*=*=* ; Calling Sequence ; B => disk command ; |NNNNNNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN JR CXDEC DONECON PUSH DE POP BC ;Put answer in BC RET ; HEXDEC LD A,' ' ;Blank PUSH HL LD HL,TENTBL HDC1 LD C,(HL) INC HL LD B,(HL) NNNNNNNNNNNNNNNNNNNNNNNͫNNNNNNNNNNNNNNNNNNNNNN C => logical drive number ; D => logical cylinder number ; E => logical sector number ; HL => sector I/O buffer address ; IY => drive code table address ;*=*=* ; bit 2 => wait enable ; bit 3 => device enable ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNɪNNNNNNNNNNNNNNNNNNNNNN=*=* RECALC LD L,D ;Xfer cylinder LD H,0 ; BIT 5,(IY+4) ;Double track? JR Z,$+3 ;Go if not ADD HL,HL ;Cyl * 2 ;***** ; Check on track advance ;***** ]YNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN ;P/u sector count ; OUT (SECNT),A ; INC HL ;Point to buffer ; LD A,50H ;Set the FORMAT OP code ; CALL DOCMD ;Do the command POP HL POP DE POP NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD A,(IY+7) ;P/u sectors/track PUSH DE LD D,A ;Hang on to value AND 1FH ;Strip off other data LD E,A INC E ;Adj for zero offset LD NNNNNNNNNNNNNNNNNNNNNNNP=NNNNNNNNNNNNNNNNNNNNNNBC JR NZ,WRERR ; LD A,20H ;Bump sector # for next ADD A,E ; head in cylinder LD E,A ;Pass to sector reg DJNZ DFMT1 ;Loop all heads this cyl XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN C,E ;Keep sec per track XOR D ;Get # of heads RLCA ;Shift heads to 0-2 RLCA RLCA INC A ;Adjust for zero offset PUSH BC CALL MUNNNNNNNNNNNNNNNNNNNNNNNٔNNNNNNNNNNNNNNNNNNNNNNFMTDVR ;*=*=* IF TRS LD A,(IY+3) ;P/u drive address AND 3 ; & remove other junk LD C,A ;Save for counter LD A,0 ;P/u the front panel WP DB NNNNNNNNNNNNNNNNNNNNNNN c NNNNNNNNNNNNNNNNNNNNNNOR A ;No error today JR NOERROR ;Exit ; WRERR LD HL,WRTBL ;Point to error xlate ; ENDERR IF TRS CALL WD1010 ;Clear controller ENDIF IN A,(ERROR) ~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 0DCH ;Ignore next 2 by CALL C, ALIGN RLCA ;Align hard WP bit to b7 DEC C ; according to drive JR NZ,ALIGN ; address OR (IY+3) ;Merge software WP NNNNNNNNNNNNNNNNNNNNNNN 6_NNNNNNNNNNNNNNNNNNNNNN ;Grab error code ERR1 RLCA ;Find error TYPE INC HL ;Bump counter JR NC,ERR1 ;Loop for error byte LD A,(HL) ;P/u error code ; NOERROR EQU $ ERREXIT POP DE NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ENDIF ; IF PDC LD A,(IY+3) ;Just dct bit ENDIF ; IF IDE LD A,(IY+3) ; Just dct bit ENDIF ; AND 00000000B ;Mask all but bit 7 SLA A n^NNNNNNNNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNN POP HL OR A ;Set flag IF TRS WD1010 PUSH AF IN A,(STATUS) AND 00000010B JR Z,CLEAN LD A,10H OUT (HDCONT),A LD A,0CH OUNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Write prot to carry JR NC,DFMT LD A,15 ;WP error OR A RET ; ;*=*=* ; Disk FORMAT routine ;*=*=* DFMT PUSH HL PUSH DE LD A,(IY+7) ;P/u max sector/tracNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNT (HDCONT),A CLEAN POP AF ENDIF RET ;*=*=* ; LDOS error conversion table ; Bit Error RD WR ; 7 Bad block detect 7 14 ; 6 CRC - Data field 4 12 ; 5 CRC - ID field 1 9 ; 4 ID not found qNNNNNNNNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNNk LD B,A AND 1FH LD E,A ;Set it for controller XOR B ;Get # of heads into RLCA ; register B for RLCA ; loop count of # of NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN 5 13 ; 3 Not used 127 127 ; 2 Aborted command 8 8 ; 1 TR000 error 2 10 ; 0 DAM not found 3 11 ;*=*=* WRTBL EQU $-1 DB 14,12,9,13,127,8,10,11 ;*=*=* ; SETUP disk ; IY= DCT ; D =;ENNNNNNNNNNNNNNNNNNNNNNN&aNNNNNNNNNNNNNNNNNNNNNN RLCA ; tracks to format in INC A ;Bump for zero offset BIT 5,(IY+4) ; this cylinder JR Z,$+3 ;Double the count if ADD A,A ; double cylinNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN Cylinder # (0-202) ; E = Sector # (0-255) ;*=*=* SETUPF EQU $ ;Wait until not busy ;*=*=* ; Select routine ;*=*=* PUSH HL ;Save buffer pointer ;*=*=* ; Recalc cyl, sector to head, sector, cyl ;*NNNNNNNNNNNNNNNNNNNNNNNs2NNNNNNNNNNNNNNNNNNNNNNdering LD B,A ; ; DFMT1 PUSH BC ;Save loop counter PUSH DE ;Save sector # CALL SETUPF ;Go to it PUSH HL ;Save pointer ; LD A,(HL) SNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNNNB 'Hard drive cannot be drive 0.',CR WHDRV$ DB 'Which drive is to be used ? ',3 DSKNAM$ DB 'Disk Pack name ? ',3 BADNAM$ DB 'Invalid Disk Pack name.',CR MPW$ DB 'Master password ? ',3 CANTWR$ DB 'Write protected disk.',CR ʯNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNLD D,A ;Point to physical head ;***** ; Xfer head, sector, & cylinder data to WDC ;***** IF .NOT.IDE LD A,(IY+3) ;Grab the drive select AND 3 RLCA ;Shift to bits 3-4 LNNNNNNNNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNNHASDAT$ DB 'Disk contains data -- ',3 NOFMT$ DB 'Non-standard format.',CR CANTRD$ DB 'Unreadable directory.',CR NODIR$ DB 'Non-initialized directory.',CR PACKID$ DB 'Name=XXXXXXXX Date=MM/DD/YY',CR OLDMPW$ DB ' Enter its M ZNNNNNNNNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN RLCA RLCA OR D ;Merge in head select OUT (SDH),A ;Transfer to WDC LD A,0 OR D OUT (SDH),A ENDIF LD A,01H OUT (SECNT),A NNNNNNNNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNNaster Password' DB ' or to abort: ',3 ; IF LDI LAST$ DB LF,'*** Preparing to format ENTIRE ' DB 'hard drive ***',LF DB 'Are you sure you want to format it? ',3 FMTG$ DB 'Formatting..QNNNNNNNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN LD A,0FH ;For 256 byte sectors OUT (SECNO),A LD A,L OUT (CYLLO),A LD A,H OUT (CYLHI),A POP HL ;Rcvr buffer pointer RET ;*=*=* ; RoutineNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.',CR ENDIF ; IF LSI ALTLO$ DB LF,'Inhibiting Alternate cylinder <#77>...',CR ENDIF ; IF TRS!PDC DIAG$ DB LF,'Inhibiting Diagnostic Cylinder <#01>...',CR ENDIF ; DBL$ DB LF,'Note: Each NNNNNNNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN to pass WRITE Command to WDC & do it ;*=*=* DOCMD OUT (COMMAND),A ; & pass to WDC ; LD BC,0<8!DATA ;Set length &port OTIR ;Output the data DWR1 EX (SP),HL ;Delay time to settle NNNNNNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNcylinder equals 2 physical' DB ' tracks.',LF,CR FMTCYL$ DB 29,'Formatting cylinder ',3 VERCYL$ DB 29,'Verifying cylinder ',3 STAR$ DB '* ',3 NOCYL$ DM 'No cylinders available for directory.',CR DIRCYL$ DB '$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN EX (SP),HL ; the controller ; DWR2 IN A,(STATUS) ;Wait until controller RLCA ; is no longer busy JR C,DWR2 IN A,(STATUS) ;Read command end status AND 1 NNNNNNNNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNDirectory will be placed on cylinder ' DIRASC$ DB '000',CR IPLSYS$ DB LF,'Initializing SYSTEM information ',3 FMTCAO$ DB LF,'Formatting complete',CR BADMPW$ DB 'Invalid master password - ' FMTABT$ DB 'Format aborted.',CR SURE?$ DB+ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;NZ=error RET ENDIF ; DCTPTR DW 0 ;Posn of DCT for drive LOCK$ DB 'Lock out track manually ? ',3 PHYHD$ DB 'Enter physical head number <' PHYD1$ DB ' -' PHYD2$ DB ' > ',3 PHYTR$ DBNNNNNNNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNN 'Are you sure you want to format it ? ',3 NOTFMT$ DB 'Can''t, Disk Pack not formatted.',CR DIFDVR$ DB 'Formatter incompatible with disk driver.',CR ILLEG$ DB 'Drive is disabled.',CR JAQRDB$ DB 'Reading System Disk Boot Recor NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLTEA@ POP BC DEC A ;Adjust for compare POP DE ;Rcvr sector CP E ;Is sector on this track? JR NC,REC1 ;Bypass if yes CPL 0NNNNNNNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN 'Enter physical track number <1 -' PHYT1$ DB ' > ',3 IF RAM ;Use CLIENT/ASM ;DB for FORM$ and HELLO$ FORM$ DB '$HD1' HELLO$ DB 'TRSFORM6 - IDE Hard Drive Formatter',LF DB 'Version ' *GET NNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN ;Else subtract off a ADD A,E ; track's # of sectors LD E,A ;Reset sector # INC HL ; and bump cyl # REC1 LD A,C PUSH DE CALL DIVEA@ ;Sector#=NNNNNNNNNNNNNNNNNNNNNNN wNNNNNNNNNNNNNNNNNNNNNN CLIENT:3 ELSE ;Use macro definition if 5.1 ver. LOGON ENDIF MPWBUF DB ' ' ; must be 9 chars PRMERR$ DB 'Parameter error ',CR HARD$ DB 'This format for Hard Drive only.',CR NOTZER$ D@NNNNNNNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN/sectors per head POP DE LD D,A ;Xfer head # needed LD A,(IY+4) ;P/u starting head AND 0FH ;Strip off other data ADD A,D ;Add in relative head ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNNRM+1 DB 'V ' DW VERPRM+1 DB 'NOSTOP' DW NOSTOP ENDIF NOP ;End of table ;***** ; Formatting data and tables ;***** BOOTDIR DB 5EH,0,0,0,0,'BOOT SYS',0FkLNNNNNNNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN;CLIENT/ASM - File to establish sign-on headers ; and version numbers. ; ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !! ; IF @BLD631 ; 12345678901234567890123456789012345678901234567890 DB ' - 6.3.1 'NNNNNNNNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNN6H,37H DB 0F5H,9CH,5,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1 DIRDIR DB 5DH,0,0,0,0,'DIR SYS',0F6H,37H DB 96H,42H,10,0,11H,1,-1,-1,-1,-1,-1,-1,-1,-1 FMTDCT DS 10 SECCYL DS 1 ;# of sectors per cyl SECTRK DHNNNNNNNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNN- Copyright 1982/83/84/86/90 by MISOSYS, ';<631> DB 'Inc., ',10 ;<631> ELSE DB ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst' DB 'ems, Inc. ',10 ENDIF ; ; DB 2NNNNNNNNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNNS 1 ;# of sectors per trk ; IF MTI!TRS!PDC SKEWDAT DB 32 ;# sectors in table DB 0,0,0,4,0,8,0,12,0,16,0,20,0,24,0,28 DB 0,1,0,5,0,9,0,13,0,17,0,21,0,25,0,29 DB 0,2,0,6NNNNNNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN 'All Rights Reserved. Licensed 1982/83/84 to Tandy ' ; DB 'Corporation.',10,13 ; ; DB 'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI' ; DB 'STRIBUTE !! ',10,13 ; DB 'All Rights reserved bjuNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,0,10,0,14,0,18,0,22,0,26,0,30 DB 0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31 ENDIF ; ;*=*=* ; Patch area ;*=*=* ORG $<-8+1<+8 GATBUF DS 203 ;GAT sector buffer DB RLS,0,0,0,0 ;Ver, cyl exc'1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNy LSI, 8970 N. 55th St. Milwa' ; DB 'ukee, Wisc. ',10,13 DB 'All Rights Reserved. Unauthorized duplication is p' DB 'rohibited. ',10,13 LD C,0 ;Find start of DCT$ @@GTD5NNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN, type, pswd DB ' MM/DD/YY' DC 32,0 BOOT1 DS 208 ;BOOT 1 DB 'Copyright(C)1982' DB 'Logical Systems ' DB 'Incorporated (P)' HITBUF DS 256 CR EQU 0DH LFͮNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN EQU 0AH END FORMAT ;Lock out any... CALL GETARG CP 'Y' JR Z,LCHD1 ;Yes.. CP 'N' JR Z,NOLCT ;Skip if not wanted JR LCQUES1 GTPHD CALL NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNd.',CR JAQVDB$ DB 'Verified Written Disk Boot Record.',CR JAQWDB$ DB 'Writing Disk Boot Record.',CR IF RAM ;Use new param format PARMTBL DB 'o'!80H DB 73H,'MPW',0 DW MPWPARM+1 DB NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 74H,'NAME',0 DW NPARM+1 DB 56H,'SYSTEM',0 DW SYSPRM+1 DB 56H,'VERIFY',0 DW VERPRM+1 DB 76H,'NOSTOP',0 DW NOSTOP ELSE PARMTBL DB 'MPW ' DW 9pNNNNNNNNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN MPWPARM+1 DB 'NAME ' DW NPARM+1 DB 'N ' DW NPARM+1 DB 'SYSTEM' DW SYSPRM+1 DB 'S ' DW SYSPRM+1 DB 'VERIFY' DW VERPͶNNNNNNNNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN DATA+6 ;Size/Drive/Head port STATUS EQU DATA+7 ;Status port COMMAND EQU DATA+7 ;Command port ;*=*=* ; Western Digital Controller OP codes ; ; 0001rrrr - Restore drive ; 0111rrrr - Seek sectoNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNN; ; Buildver/asm is a bit of a kludge since not all utilities can load ; equates from LDOS60 and still compile. LOWCORE and everybody else ; relies on this setting, and it eventually ends up in LDOS60/EQU ; for programs that can use that. NNNNNNNNNNNNNNNNNNNNNNN fNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; @BLD631 EQU -1 ; These switches activate patches made since the 1B release. ; It is important that all earlier patches be enabled when a higher ; patch is enabled. ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE:͜NNNNNNNNNNNNNNNNNNNNNNN 5NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN the ; patch addresses listed for SPOOL in S @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) @BLD63VNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1F EQU -1 ;<631>Apply 1F patches (SPOOL) ; Patches G and H were published in TMQ V.i, pages 10 and @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) @BLD631H EQU -1 ;<631>Apply 1H patches (MEM@NNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN; HDWD1/ASM - Western Digital driver 1000/1010 - 06/10/84 TITLE '' SUBTTL '' ORG 3200H ;*=*=* ; Version equates ;*=*=* LF EQU 10 CR+NNNNNNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNNORY) ; ;End of BUILDVER/ASM DROTDROUTDPAGE#RETIMRETNEIFEQ'IFGT(IFLT&LORG7ELSE*IFNE2REPTIRPCDEFBDSYMDATETIMEDEFMDEFSDEFWENDIF)MACROIFDEF+IFREF-TITLE!SPACE$IFLT$.IFEQ$/IFGT$0IFNE$1EXITM9ENTRY:IFNDEF,S)NNNNNNNNNNNNNNNNNNNNNNN :NNNNNNNNNNNNNNNNNNNNNN EQU 13 MINTRK EQU 3 MAXTRK EQU 404 *GET SVCMAC:3 ; ;*=*=* ; Change Log ;Log in drive if possible 04/26/83 ;Store total head count for drive 04/29/83 ; HARDWP EQU 0C0H HDCONT EQU 0C1H ;*=*=* ; MNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNN Calling Sequence ; B => disk command ; C => logical drive number ; D => logical cylinder number ; E => logical sector number ; HL => sector I/O buffer address ; IY => drive code table address ;*=*=* ; ?NNNNNNNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN;Assemble RS hard disk driver for 6.x - 12/12/83 ; ; Modified for IDE Support June 2000 ; @BLD631 EQU -1 *GET HDWD6A/ASM:3 *GET HDWD6B/ASM:3 END BEGIN 3,NNNNNNNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNNbit 2 => wait enable ; bit 3 => device enable ; bit 4 => software reset ;*=*=* DATA EQU 040H ;Data transfer port ERROR EQU DATA+1 ;Error code port WRP EQU DATA+1 ;Write pNNNNNNNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNrecompensation port SECNT EQU DATA+2 ;Sector count SECNO EQU DATA+3 ;Sector number port CYLLO EQU DATA+4 ;Cylinder lo CYLHI EQU DATA+5 ;Cylinder hi SDH EQU =NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN ;Ret w/error LD A,B ;Get fcn SUB 13 ;WRSEC? JR Z,WRSEC DEC A ;Or WRSYS JR Z,WRSEC ;Go on output LDNNNNNNNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNr/head/cyl ; 0010d000 - Read sector ; 00110000 - Write sector ; 01010000 - Format track ; ; rrrr = step rate ; d = 0=programmed I/O, 1=DMA ;*=*=* ; Winchester drive code tables ;*=*=* DCTAB EQU $ DB 0,0,0 ^NNNNNNNNNNNNNNNNNNNNNNN VNNNNNNNNNNNNNNNNNNNNNN ;+set by user entry OUT (COMMAND),A LD HL,0<8!79 LD BC,2<8!' ' ;Blank out 'H' @@VDCTL LD B,50 ;Delay about .32 sec. @@PAUSE NNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN ;Push to correct posn TYPQTY EQU 1 DRVSEL EQU 3 ;DCT pos for select ;*=*=* ; Defaults for ST-506 ;*=*=* DB 8!4 ;5" fixed hard drive DB 10H NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALL DWR2 ;Wait for completion R2 EQU $-2 JR NZ,RETRYR ;Retry if error PCPTRK LD A,00 OUT (ERROR),A ;Set precomp trk# / 4 LINK RET ;End NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Alien, starting head = 0 DB 0 ;<=keep head count here DB 153-1 ;Max cylinder DB 3<5+31 ;4 heads & 32 sectors/tk DB 0<5+15 ;Y "gNNNNNNNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNNcall before install DB 'WD' ;2 more bytes for @ICNFG ; ;*=*=* ; Driver start ;*=*=* START BIT 3,B JR NZ,DIO ;Jump if I/O request ; treat any other request as TSTBSY IFDEFsNNNNNNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNrans/tk" 16 sec/gran DB 76 ;Directory cyl ;*=*=* ; start of driver ;*=*=* DISK JR START ;Branch around linkage DW $-$ ;Last byte used DB 4,'SQNNNNNNNNNNNNNNNNNNNNNNN >NNNNNNNNNNNNNNNNNNNNNN HARDWP TSTBSY LD A,(IY+3) ;P/u drive address AND 3 ; & remove other junk LD C,A ;Save for counter IN A,(HARDWP) ;P/u the front panel WP gXNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN$HD1' ;Progname ; RETRYR LD HL,0<8!79 LD BC,2<8!'H' @@VDCTL ;Init done by ICONFG IFDEF HDCONT INIT LD A,10H ;Software reset OUT (HDCONT),A LD B,4_NNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNDB 0DCH ;Ignore next 2 by CALL C, ALIGN RLCA ;Align hard WP bit to b7 DEC C ; according to drive JR NZ,ALIGN ; address OR (IY+3) PNNNNNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN0H ;Wait about .25 sec. @@PAUSE LD A,0CH ;Set device & wait enable OUT (HDCONT),A EX (SP),HL EX (SP),HL IN A,(STATUS) AND ^NNNNNNNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN ;Merge software WP ELSE ; TSTBSY LD A,(IY+3) ;Just dct bit ENDIF ; AND 00000000B ;Mask all but bit 7 SLA A ;Write prot to carry RET NC 2NNNNNNNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNN 80H ;Check for ready status JR NZ,RETRYR ;Try again if no ready ;*=*=* ; Restore the WDC to set the step rate ;*=*=* ELSE INIT XOR A ENDIF ; LD A,00H OUT $NNNNNNNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNN ;W/0 in a LD A,01000000B ;Show floppy type WP RET ;W/Z set ;*=*=* ; Disk I/O requested ;*=*=* DIO PUSH HL PUSH DE BIT 2,B ;Test inNNNNNNNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN (SDH),A ; set the step rate LD A,16H ;* set 3ms-restore STP1 EQU $-1 ;+set by user entry if >3 OUT (COMMAND),A ;* execute command CALL DWR1 NNNNNNNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNput or output JR Z,INPUT ;Go if read/verify CALL TSTBSY ;If Write, check first R3 EQU $-2 LD A,15 ;Write prot error JR C,POP2 NNNNNNNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN ;Wait until not busy R1 EQU $-2 XOR A OUT (CYLHI),A OUT (CYLLO),A ;Reset for WD1010 LD A,1<4!0 ;Restore w/step rate STP2 EQU $-1 tNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNN $-1 DB 14,12,9,13,127,8,10,11 ; DWR1 EX (SP),HL ;Delay time to settle EX (SP),HL ; the controller ; DWR2 IN A,(STATUS) ;Wait until controller RLCA NNNNNNNNNNNNNNNNNNNNNNN ſNNNNNNNNNNNNNNNNNNNNNN Z,POP1 ;Go if system XOR A JR POP1 ;*=*=* ; sector WRITE routine ;*=*=* ; WRSEC CALL SETUP ;Establish drive linkage R9 EQU $-2 ;*=*=* ; Routine to pass WRITE ComhZNNNNNNNNNNNNNNNNNNNNNNN ENNNNNNNNNNNNNNNNNNNNNN ; is no longer busy JR C,DWR2 IN A,(STATUS) ;Get status again AND 00000001B ;NZ=error RET ;*=*=* ; SETUP disk ; IY= DCT ; D = Cylinder # (0-202)[NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmand to WDC & do it ;*=*=* LD A,30H ;Init write command OUT (COMMAND),A ; & pass to WDC OTIR ;Output the data LD HL,WRTBL ;Point to error xlate R10)NNNNNNNNNNNNNNNNNNNNNNN *tNNNNNNNNNNNNNNNNNNNNNN ; E = Sector # (0-255) ;*=*=* SETUP EQU $ ;Wait until not busy ;*=*=* ; Select routine ;*=*=* PUSH HL ;Save buffer pointer ;*=*=* ; Recalc cyl, sector to head, sector, cyl ;*=*=ƳNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN EQU $-2 CALL DWR1 ;Wait for completion R11 EQU $-2 JR Z,EXIT ; ENDERR CALL WD1010 ;Reset controller if needed R12 EQU $-2 IN A,(ERROR)NNNNNNNNNNNNNNNNNNNNNNN 99NNNNNNNNNNNNNNNNNNNNNN* RECALC LD L,D ;Xfer cylinder LD H,0 ; BIT 5,(IY+4) ;Double track? JR Z,$+3 ;Go if not ADD HL,HL ;Cyl * 2 ;***** ; Check on tracNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Grab error code ERR1 RLCA ;Find error TYPE INC HL ;Bump counter JR NC,ERR1 ;Loop for error byte LD A,(HL) ;P/u error code ; EXIT {NNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNk advance ;***** LD A,(IY+7) ;P/u sectors/track PUSH DE LD D,A ;Hang on to value AND 1FH ;Strip off other data LD E,A INC E NNNNNNNNNNNNNNNNNNNNNNN :JNNNNNNNNNNNNNNNNNNNNNN A,0 ;Not available..for format JR POP2 ;Set NZ/ret w/error ;*=*=* ; Sector read routine ;*=*=* INPUT PUSH BC ;Save fcn # CALL SETUP ;EstablNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN EQU $ ;Restore registers POP2 POP DE POP1 POP HL OR A ;Set flag ;This is to take care of the WD1010 controller CIP bit WD1010 PUSH AF IN A,(STATUS) NNNNNNNNNNNNNNNNNNNNNNN  {NNNNNNNNNNNNNNNNNNNNNNish drive R6 EQU $-2 LD A,20H ;Set controller OP code OUT (COMMAND),A ; & send to WDC CALL DWR1 ;Delay/wait for completion R7 EQU $-2 NNNNNNNNNNNNNNNNNNNNNNN ՁNNNNNNNNNNNNNNNNNNNNNN ; AND 00000010B ;Bit 1 is CIP for 1010 JR Z,CLEAN ;All OK LD A,10H ;Do a software reset OUT (HDCONT),A LD A,0CH ;Then re-ena+NNNNNNNNNNNNNNNNNNNNNNN \(NNNNNNNNNNNNNNNNNNNNNNPOP DE ;Fcn to D PUSH AF ;Save status fm disk BIT 1,D ;Sector verify? JR Z,READ ;Go if read VRLP IN E,(C) DJNZ V^NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNble OUT (HDCONT),A CLEAN POP AF ;Continue RET ;*=*=* ; LDOS error conversion table ; Bit Error RD WR ; 7 Bad block detect 7 14 ; 6 CRC - Data field 4 12 ; 5 CRC - ID fieNNNNNNNNNNNNNNNNNNNNNNN oNNNNNNNNNNNNNNNNNNNNNNRLP DB 11H ;Skip next via LD DE, READ INIR ;Get data POP AF ;Recover completion status LD HL,RDTBL ;Error xlate R8 EQU $-2 2NNNNNNNNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNNld 1 9 ; 4 ID not found 5 13 ; 3 Not used 127 127 ; 2 Aborted command 8 8 ; 1 TR000 error 2 10 ; 0 DAM not found 3 11 ;*=*=* RDTBL EQU $-1 DB 7,4,1,5,127,8,2,3 WRTBL EQU&NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN JR NZ,ENDERR ;Go on error POP DE ;Adjust read error LD A,D ; code if system CP (IY+9) ; sector was read LD A,6 JR BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNto WDC ;***** LD A,(IY+3) ;Grab the drive select AND 3 RLCA ;Shift to bits 3-4 RLCA RLCA OR D ;Merge in head select OUT .NNNNNNNNNNNNNNNNNNNNNNN .uNNNNNNNNNNNNNNNNNNNNNN ;Convert to binary (0-3) JR C,GETDRV ;Re-request if bad range CP 3+1 ;Check max value JR NC,GETDRV ;Re-request if bad range ;*=*=* ; Stuff the drive select address into DCT ;*=*=* NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN (SDH),A ;Transfer to WDC LD A,E OUT (SECNO),A LD A,L OUT (CYLLO),A LD A,H OUT (CYLHI),A POP HL ;Rcvr buffer vNNNNNNNNNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNNN; Merge the drive address OR (IY+DRVSEL) ; into the standard LD (IY+DRVSEL),A ; DCT parameters ;*=*=* ; see if drive type has been established ;*=*=* CALL FNDOLD JR NZ,c NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNpointer LD BC,0<8!DATA ;Set buflen & xfer port RET ; DISKEND EQU $ ;*=*=* ; some patch space - INSTALL must be patched also to load - ;*=*=* DW 0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,/NNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNPRMPT1 ;1st installation of drive LD A,(IX+5) ;IX=>existing DCT LD (IY+5),A ;Propagate to this one AND 00000111B CALL LDMAX ;Set max heads HNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0 RELTAB DW R1,R2,R3,R6,R7 DW R8,R9,R10,R11,R12 TABLEN EQU $-RELTAB/2 DW 0,0,0,0 ;Patch addresses ; end o/NNNNNNNNNNNNNNNNNNNNNNN =8NNNNNNNNNNNNNNNNNNNNNN LD A,(IX+6) ;Cyl count LD (IY+6),A ;Set it SRL A ;Dir cyl in center LD (IY+9),A BIT 5,(IX+4) ;Double? JP Z,STMPNNNNNNNNNNNNNNNNNNNNNNN  zNNNNNNNNNNNNNNNNNNNNNN ;Adj for zero offset LD C,E ;Keep sec per track XOR D ;Get # of heads RLCA ;Shift heads to 0-2 RLCA RLCA INqlNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNf actual I/O driver ; PAGE A,15 ;Write prot error JR C,POP2 ;Ret w/error LD A,B ;Get fcn SUB 13 ;WRSEC? JR Z,WRSECYNNNNNNNNNNNNNNNNNNNNNNN >KNNNNNNNNNNNNNNNNNNNNNNC A ;Adjust for zero offset PUSH BC LD C,A @@MUL8 POP BC DEC A ;Adjust for compare POP DE ;Rcvr sector .RNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN kNNNNNNNNNNNNNNNNNNNNNN CP E ;Is sector on this track? JR NC,REC1 ;Bypass if yes CPL ;Else subtract off a ADD A,E ; track's # of sectors LD  NNNNNNNNNNNNNNNNNNNNNNN  рNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN X)NNNNNNNNNNNNNNNNNNNNNN E,A ;Reset sector # INC HL ; and bump cyl # REC1 @@DIV8 ;Sector#/sectors per head LD D,A ;Xfer head # needed LD A,(IY+4) ;[NNNNNNNNNNNNNNNNNNNNNNN  HNNNNNNNNNNNNNNNNNNNNNN;HDWD2/ASM - WD installation system - 06/10/84 SUBTTL '' ; Modified for IDE Support June 2000 ; ;*=*=* ;Entry point after initial tests ;Set IY=>correct DCT type ;*=*=* USER LD IY,DCTAB ;*=*=*% ; NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNP/u starting head AND 0FH ;Strip off other data ADD A,D ;Add in relative head LD D,A ;Point to physical head ;***** ; Xfer head, sector, & cylinder data aNNNNNNNNNNNNNNNNNNNNNNN  {&NNNNNNNNNNNNNNNNNNNNNN Request physical drive slot first ;*=*=* JR PRMPT4 GETDRV CALL ABTJCL PRMPT4 LD HL,DRIVE$ ;Request physical drive# CALL GETARG ;Display & get argument SUB '1' pNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALL GETARG ;Prmpt/get 1 char SUB '1' JR C,GTMAXHD ;Must be at least 1 CP 8 ;Not over 8 JR NC,GTMAXHD LD (IY+5),A k-NNNNNNNNNNNNNNNNNNNNNNN N]NNNNNNNNNNNNNNNNNNNNNN LD C,A ; CP 00000110 ; 3.0 mS? ; JR NC,FASTOK ;If 3 or less leave 1st cmd ; LD A,(STP1) ;Chg if >3.0 ; AND 11110000B ;Leave command ; OR C ;Merge steiuNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Store total entry CALL LDMAX ;Store away ;*=*=* ; request total tracks on drive ;*=*=* JR PRMPT2 GTTRKS CALL ABTJCL PRMPT2 LD HL,TRK$ ;Prompt LD B,3 { NNNNNNNNNNNNNNNNNNNNNNN }lNNNNNNNNNNNNNNNNNNNNNNp rate bits ; LD (STP1),A ;FASTOK LD A,(STP2) ; AND 11110000B ;P/u command ; OR C ;Merge step ; LD (STP2),A ; STMP CALL SETMAP ; map out headsMNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALL GETARGX ;Get b chars CALL DECHEX ;Make decimal in BC PUSH BC ;Save the trk count LD HL,09 ;Bump up for rounding ADD HL,BCZNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN in use ;*=*=* ;Request heads for partition ;*=*=* JR PRMPT5 REQHD CALL ABTJCL PRMPT5 LD HL,HEADMP$ ;Show in-use CALL @DSPLY LD HL,HEADS$ ;Get number for partition NNNNNNNNNNNNNNNNNNNNNNN mRNNNNNNNNNNNNNNNNNNNNNN LD C,8 ;Divide by 8 now @@DIV16 ; do it LD A,L ; LD HL,PCPTRK+1 ;Point to out instr. ; LD (HL),A ;Put value there NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALL GETARG SUB '1' ;Adjust to binary JR C,REQHD ;Must be > 0 CP (IY+0) ;Free heads left JR NC,REQHD ;User exceed max? NNNNNNNNNNNNNNNNNNNNNNN ^cNNNNNNNNNNNNNNNNNNNNNN POP BC ;Recover the entry LD HL,MINTRK-1 OR A SBC HL,BC JR NC,GTTRKS ;If too small LD HL,MAXTRK OR A SBC 9NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN INC A ;Make real LD C,A LD (NUMHDS),A ;Store number for later DEC A ;Offset fm 0 RRCA ;Shift to 5-7 RRCA XNNNNNNNNNNNNNNNNNNNNNNN  0NNNNNNNNNNNNNNNNNNNNNN HL,BC JR C,GTTRKS LD HL,203 ;Max w/o double trking OR A SBC HL,BC JR NC,SETTRK SET 5,(IY+4) ;Set double bit SRL B NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN RRCA LD B,A ;Save # of heads LD A,(IY+7) ;P/u # of heads in tab AND 1FH ;Strip what's there OR B ;Merge # of heads .NNNNNNNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNN ;Divide by 2 RR C SETTRK LD A,C DEC A ;Offset fm 0 LD (IY+6),A ;Store high Trk # SRL C ;Div by 2 LD NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD (IY+7),A ;Update DCT$+7 init ;*=*=* ; Calculate proper Sectors Per Granule (SPG) ; and Grans per cylinder ;*=*=* LD A,C ;Number of heads ADD A,A ;Double #^NNNNNNNNNNNNNNNNNNNNNNN (?NNNNNNNNNNNNNNNNNNNNNN (IY+9),C ;Dir cyl in center ; LD A,(RESNUM) ;Driver resident? OR A JR NZ,STMP ;Skip step rate if loaded ;*=*=* ;Request drive step rate ;*=*=* ; JR PRMPT3 ZNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN for GPC LD D,15 ;Sec/gran (-1) LD E,8+1 ;Use 16 sec/gran w/4 heads BIT 5,(IY+4) ;Unless dbl bit is set JR Z,UPTO4 LD E,4+1 6INNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN SET 5,(IY+4) ;Set to match JP STMP ;Now map heads in-use ;*=*=* ; Request drive type information ;*=*=* GTMAXHD CALL ABTJCL ;Unless re-prompt PRMPT1 LD HL,HDS$ *NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN JR STMP ;GTSTP CALL ABTJCL ;PRMPT3 LD HL,STP$ ; LD B,3 ; CALL GETARGX ; CALL PARSENM ;Conv to step rate bits ; JR NZ,GTSTP ;If bad entry ; DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN  ymNNNNNNNNNNNNNNNNNNNNNN D ;Number x2 CP '5' JR NZ,NT5 INC D JR IS0 NT5 CP '0' JR Z,IS0 CP CR RET NZ ;D=number fm 0 to 20 (2*enNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Merge sec/gran LD (IY+8),A ; put in DCT ; LD A,(MAXHDS) ;Total available SUB C ;ALL requested? JR Z,PUTRHD ;0 =start head ;*=*=* ; DNNNNNNNNNNNNNNNNNNNNNNN  J\NNNNNNNNNNNNNNNNNNNNNNtry) ;20 = 10 = 0000 ;Otherwise range fm 1 to 15 = bit setting for WD step ;Test range IS0 LD A,D CP 20 JR NZ,RNG XOR A RET ;Set 0 if 10 was entered RNG $NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN If not all heads requested, get starting head ;*=*=* JR PRMPT6 REQSHD CALL ABTJCL ;Quit if JCL PRMPT6 LD HL,STRTHD$ CALL GETARG SUB '1' ;In range? NNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN CP 15+1 JR NC,RNGERR ;Bad entry if >15 CP A ;Set Z RET RNGERR OR 0FFH ;Set NZ RET ;*=*=* ;Stuff max heads on drive A=numb offset fm 0 ;*=*=* LDMAX [\NNNNNNNNNNNNNNNNNNNNNNN ZbNNNNNNNNNNNNNNNNNNNNNN JR C,REQSHD LD C,A ;Save start head PUSH BC CALL FREE ;Are these heads in use POP BC JR NZ,REQSHD ;Get again if bad ;*=*=* ; tNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN RRCA ;Roll to bits 7-5 RRCA RRCA LD C,A LD A,(IY+7) ;Merge AND 00011111B OR C LD (IY+7),A ;Store max heads RET ;*=)NNNNNNNNNNNNNNNNNNNNNNN iSNNNNNNNNNNNNNNNNNNNNNN LD A,C ;P/u starting head PUTRHD OR (IY+4) ;Merge user's start LD (IY+4),A ;Update init DCT$+4 ;*=*=* CALL INSTALL JP @EXIT ;*=*=* ;Convert ANNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN*=* ;Driver dependent strings HELLO$ DB LF DB 'TRSIDE - IDE Disk Driver for LDOS 6.x/5.x ',LF DB 'Version' *GET CLIENT:3 HDS$ DB 'Enter total number of heads' DB ' on drive [TNNNNNNNNNNNNNNNNNNNNNNN <NNNNNNNNNNNNNNNNNNNNNNSCII step rate entry to WD bit field ;*=*=* PARSENM LD D,0 ;Clear for ans CHAR LD A,(HL) ;Read one INC HL ;=>next CP '.' ;Decimal NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN<1-8> ',3 TRK$ DB 'Enter physical tracks per surface: ',3 STP$ DB 'Enter step rate for drive: ',3 DRIVE$ DB 'Enter drive select address <' DB '1-4> ',3 ; ;****************************************** ;Common=:NNNNNNNNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNNNJR Z,POINT ;Go if found CP CR JR Z,ISCR ;End of line SUB '0' ;Make BCD 0-7 RET C ;Out of range CP 7+1 -NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN subroutines for hard disk drivers ;******************************************* ;*=*=* ; Routine to set a bit in head map ;*=*=* SETBIT RLCA ;Shift to "b" field RLCA RLCA OR 0C3H rNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;7.5 is high number except 10 JR NC,RNGERR LD E,A ;Save BCD LD A,D ;Take D*10 ADD A,A ;X2 ADD A,A NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Establish as SET b,E LD (SBIT1+1),A ;Alter the OP code SBIT1 SET 0,E ;Map the head bit RET ;*=*=* ; Routine to test if bit is set in head map ;*=*=* BITBIT RLCA RLCA NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Then 2 is max UPTO4 CP E ;More than max heads (x2)? JR C,G1 ;16 sec grans OK if less LD D,31 ;Else 32 sec/gran LD A,C ;And NNNNNNNNNNNNNNNNNNNNNNN  ,>NNNNNNNNNNNNNNNNNNNNNN;X4 ADD A,D ;X5 ADD A,A ;X10 ADD A,E ;+this one to catch 10.0 JR CHAR ;Get next char ; POINT LD A,(HL) ISCR SLA NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNGPC will be = # heads ;D=sec/gran A=#heads*2 if 2 grans/trk or # if 1 gran/trk G1 DEC A ;GPC offset fm 0 RRCA RRCA RRCA ;Roll to bits 5-7 OR D BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN INC A ;Check each past total LD C,A CALL BITBIT ;For in-use JP NZ,BADTOT ;Abort if any LD A,C JR TSTHGH ;Check up to 8 ; ARNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNN ;P/u Maximum heads RLCA ;Shift into 0-2 RLCA RLCA AND 7 ;Mask off Max sector # INC A ;Adjust for zero offset LD (MNNNNNNNNNNNNNNNNNNNNNNN QNNNNNNNNNNNNNNNNNNNNNNNORES LD A,(MAXHDS) ;P/u maximum LD L,A ;Save SUB D ;Calculate the quantity JP Z,NOHEAD ;Go if none remaining ;Find largest group of contiguous heads rNNNNNNNNNNNNNNNNNNNNNNN ^NNNNNNNNNNNNNNNNNNNNNNAXHDS),A ;Save for later LD B,A ;*=*=* ; Adjust heads in use message ;*=*=* LD HL,INUSE$ LD A,8 SUB B ;Calc index into msg JR Z,GOT8HDS Y"NNNNNNNNNNNNNNNNNNNNNNN `NNNNNNNNNNNNNNNNNNNNNN LD BC,0 ;Init count XOR A ;Start w/0 CNTH1 LD H,A ;Save hd posn CALL BITBIT ;Head available? JR Z,CNTH3 ;YeݹNNNNNNNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN RLCA OR 43H ;Construct BIT b,E LD (BBIT1+1),A BBIT1 BIT 0,E RET ;*=*=* ; get total heads and cyl count if an existing driver is ; found for this drive select address FNDOLD jgNNNNNNNNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNN LD B,A PUSH HL ;Save start of message BLP INC HL ;Bump msg pointer 2 INC HL ; bytes per head loss DJNZ BLP POP DE NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLD A,(RESNUM) ;Get number of DCTs OR A ;Using this driver JR Z,NTHERE ;If none, prompt LD B,A ;Number to B LD HL,DCTPTR ;=>list of addresNNNNNNNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNN ;Recover start of msg LD BC,HEADS$-INUSE$ LDIR ;Reposition message ;*=*=* GOT8HDS LD DE,0 ;Init count & bitmap LD A,(RESNUM) ;How many acti!NNNNNNNNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNNses OLDLP LD E,(HL) ;P/u DCT address INC HL LD D,(HL) ;DE=>DCT INC HL ;=>next pointer PUSH DE POP IX ;IX=NNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNve OR A JR Z,NORES LD B,A LD HL,DCTPTR ;=>saved addresses HCLP PUSH BC ;Save loop counter LD C,(HL) INC HL LD BױNNNNNNNNNNNNNNNNNNNNNNN qNNNNNNNNNNNNNNNNNNNNNN>DCT LD A,(IX) ;Don't use any drive CP 0C9H ; that's disabled JR Z,SKPTHS LD A,(IX+DRVSEL) ;Check if this matches AND 3 =NNNNNNNNNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNN,(HL) ;P/u DCT address INC HL PUSH HL ;Save ptr to next entry PUSH BC POP IX ;Xfer to IX LD A,(IX+1) ;Move address of driver 9NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; the drive # LD C,A ;P/u drive requested LD A,(IY+DRVSEL) AND 3 ;Check if same CP C ;Match up yet? RET Z NNNNNNNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNN LD (IY+1),A ;To new DCT LD A,(IX+2) LD (IY+2),A CALL CNTHDS ;Add 'em up POP HL POP BC DJNZ HCLP LD A,E LD NNNNNNNNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNN ;IX=>DCT for same disk SKPTHS DJNZ OLDLP ;Check the rest NTHERE OR 0FFH ;Force NZ RET ;*=*=* ;SETMAP ;IY=>New DCT containing Drive address in bits 0-2 of IY+3 ;IY+7 = max heads possible in bits $NNNNNNNNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNN (BITMAP),A ;*=*=* ; check for heads in use past entered total ;*=*=* LD A,(MAXHDS) ;Entered # DEC A TSTHGH CP 7 ;Max of 8 JR Z,NORES ;All OK >VNNNNNNNNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNN5-7 ;Sets up Heads in use message ;Sets IY+1&2 to existing driver address if found ;Sets used bits in (BITMAP) ;Sets (MAXHDS) = total heads ;Sets IY+0 = free heads ;*=*=* ; P/u # of heads on the drive & init checks ;*=*=* SETMAP LD A,(IY+7)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNNNeck if this matches AND 3 ; the drive # LD C,A ;P/u drive requested LD A,(IY+DRVSEL) AND 3 ;Check if same CP C NNNNNNNNNNNNNNNNNNNNNNN aNNNNNNNNNNNNNNNNNNNNNN NZ,ISUSED ;Go if already used INC A ;Bump head pointer DJNZ TSTHDS ;Loop for # of heads XOR A RET ;Z=no conflict ISUSED LD HL"NNNNNNNNNNNNNNNNNNNNNNN iNNNNNNNNNNNNNNNNNNNNNN ;Match up yet? RET NZ ;Skip if different unit ; ; IF ARM!ARMM ; LD A,(IX+5) ;P/u the controller ; CP (IY+5-3) ; address & check ; RET NZ ; forNNNNNNNNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNN,HDBAD$ ;Show conflict CALL @DSPLY BDHD OR 0FFH RET ;W/NZ for error ; ;*=*=* ;INSTALL - move driver if necessary ; put JP into (IY) ; move DCT=>IY into address fm (DCTADD) ;*=*=* INSTALL LDfNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNs, count it LD C,0 ;Reset for hd in use CNTH2 LD A,H ;Head posn INC A ;Bits are offset fm 0 CP L ;So matching w/maxhds wNNNNNNNNNNNNNNNNNNNNNNN  ZNNNNNNNNNNNNNNNNNNNNNN a match ; ENDIF ; LD A,(IX+7) ;Accumulate the number RLCA ; of heads already RLCA ; in use RLCA AND 7 INC A uNNNNNNNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN JR NZ,CNTH1 ;Means we are done LD A,B ;Get max count JR GOTMX CNTH3 INC C ;Count free head LD A,C CP B ;Move highestNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN ;Adjust for zero offset LD B,A ;Set new head set loop ADD A,D LD D,A ;Set new total heads ;*=*=* ; Merge bit map into E reg ;*=*=* LD A,(IX+4)aNNNNNNNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNN contiguous JR C,CNTH2 ;Count into B LD B,C ;If B was less JR CNTH2 ;Max of 4 heads if double tracking... GOTMX CP 4+1 JR C,SETMX ;OK if ;NNNNNNNNNNNNNNNNNNNNNNN  real DCT ;*=*=* ; log in correct dir cyl if possible ;*=*=* LD DE,0 ;Read BOOT LD HL,SECBUF CALL READS ;GeONNNNNNNNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNNNhaAnge LD H,(IX+1) LD E,(HL) ;P/U address INC HL LD D,(HL) EX DE,HL ;Offset it ADD HL,BC EX DE,HL LD @"NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNt if formatted JR NZ,NOFMT LD A,(SECBUF+2) ;Get possible dir cyl CP (IY+6) JR NC,NOFMT LD D,A ;Dir cyl CALL READS JR NNNNNNNNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN (HL),D ;And put back DEC HL LD (HL),E INC IX INC IX DEC A JR NZ,RLOOP ;Loop till done ;*=*=* IFDEF LINK ; SeNNNNNNNNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNNN NZ,NOFMT LD A,'/' LD HL,SECBUF+0DAH ;Date field CP (HL) JR NZ,NOFMT LD HL,SECBUF+0DDH ;Second slash CP (HL) JR NZ,NOFMT جNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNt up @ICNFG ;*=*=* POP IX ;Get FLAGTBL LD HL,INIT ;Get entry pt ADD HL,BC ;Relocate it LD (IX+29),L ;Init address LD (IXNNNNNNNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNN LD (IY+9),D ;Stuff correct DIR cyl.. RET READS LD B,9 ;READ command CALL DOIO RET Z ;Normal status CP 6 ; or DIR cyl OK NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+30),H LD (IX+28),0C3H ;Stuff JP instruction ENDIF ; LD HL,(HCPTR) ;Did it move to high$ LD A,H OR L PUSH AF ;NZ if high ;*=*=* ; jNNNNNNNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN RET DOIO JP (IY) ;Do it NOFMT LD HL,NOFMT$ @@LOGOT RET ; ;*=*=* ; Routine to convert ascii =>HL to number in BC DECHEX @@DECHEX ;Make decimal in BC RET ;*=*=* ; `NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN (IY),0C3H ;Stuff JP LD A,(RESNUM) OR A ;Is a copy loaded? JR NZ,ISRES ;Then don't re-load ;*=*=* IFDEF LINK ;If driver has LINK dNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNefined... CALL INIT ;Init drv before moving driver ; Move @ICNFG vector into driver next ;*=*=* LD IX,$-$ FLAGTB EQU $-2 ;Saved address of table LD A,(IX+28) ;GeuNNNNNNNNNNNNNNNNNNNNNNN iNNNNNNNNNNNNNNNNNNNNNN HL,DISK LD BC,DISKEND-DISK ;Calc driver length LDIR LD HL,(LCPTR) LD (HL),E ;Put new free address INC L LD (HL),D POP DE l_NNNNNNNNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNNt opcode LD (LINK),A LD L,(IX+29) ;Get address LD H,(IX+30) LD (LINK+1),HL PUSH IX ;Save table address ENDIF ; ;*=*=* ; Relocate internal re5NNNNNNNNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNNN ;Entry pt LD (IY+1),E ;Driver LSB LD (IY+2),D ;Driver MSB LD HL,HMEM$ POP AF ;Going high? JR Z,ISRES ;Fit*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN  RNNNNNNNNNNNNNNNNNNNNNN JP NZ,USER ;Get input if resident ;*=*=* ;If not already loaded, find space ;*=*=* LD DE,'IK' @@GTDCB ;Locate pointer JP NZ,IOERR DEC L NNNNNNNNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNNaddress ;*=*=* ; Check if requested drive slot is available ;*=*=* POP DE LD A,(DE) ;P/u vector OP CP 0C9H ;RET = disabled JP NZ,CANTDO ;No good if not RETNNNNNNNNNNNNNNNNNNNNNNN  cNNNNNNNNNNNNNNNNNNNNNNLD D,(HL) ;P/u pointer to DEC L ; start of free LD E,(HL) ; low core LD (LCPTR),HL ;Save ptr for later LD HL,DISKEND-DISK-1 @NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNN ;*=*=* ;Look for existing driver ;*=*=* LD C,0 ;Find start of DCT$ @@GTDCT LD IX,DCTPTR ;Save matching DCTs LD B,8 ;# of DCTs TSTDCT LD L,(IY+1) NNNNNNNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNN ADD HL,DE ;Start + driver length LD (SVEND+1),HL LD BC,1300H ;Max addr + 1 XOR A SBC HL,BC ;If space in low mem JP C,USER ~NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD H,(IY+2) ;Point to driver vector PUSH BC INC HL ; in DCT & see if res INC HL ;Point to name length INC HL INC HL LD d4NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Go get input for drive ;*=*=* ; try high memory ;*=*=* @@FLAGS ;IY=>info BIT 0,(IY+'C'-'A') ;Memory frozen? JR NZ,NOROOM ;Can't LD HL,0 LD B,7NNNNNNNNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNN DE,DISK+4 ;Point to this namlen LD A,(DE) ;P/u length & match CP (HL) ; with resident driver JR NZ,NOTRES ;Go if dif lengths INC HL ;AdvanNNNNNNNNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNNL @@HIGH$ LD (SVEND+1),HL ;Save top end LD BC,DISKEND-DISK OR A SBC HL,BC ;Minus length LD B,0 PUSH HL @@HIGH$ (fNNNNNNNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNNce to name field INC DE LD B,A ;Set compare length TSTNAM LD A,(DE) ;Match this driver to CP (HL) ; resident vector JR NZ,NOTRES .NNNNNNNNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNN ;Is new high$ POP HL INC HL ;+1 is start LD (HCPTR),HL ;Save it LD HL,HCPTR LD (LCPTR),HL ;And point to it JP NNNNNNNNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNNN Routine to parse user input parameter ;*=*=* GETARG LD B,1 GETARGX CALL @DSPLY ;Display message KEYIN LD HL,KEYBUF$ LD C,0 @@KEYIN ;Fetch user response XNNNNNNNNNNNNNNNNNNNNNNN   NNNNNNNNNNNNNNNNNNNNNN INC DE ;Bump to next char INC HL DJNZ TSTNAM ;Loop for name length ;Count and save DCT posns w/same driver LD A,(RESNUM) ;Get count so far INC _NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN JP C,ABTJOB LD A,(HL) ;Load value RET ;*=*=* ; BEGIN @@CKBRKC ;Check for break JR Z,BEGINA ; go if not LD HL,-1 ;Else abort RET^NNNNNNNNNNNNNNNNNNNNNNN  ^NNNNNNNNNNNNNNNNNNNNNN A LD (RESNUM),A PUSH IY POP HL ;DCT address LD (IX),L INC IX LD (IX),H INC IX ; NOTRES LD BC,10 ADD rNNNNNNNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN ; BEGINA LD (SPSAV),SP ;Save callers stack LD (DCTADD),DE ;Save passed DCT ptr PUSH DE ;Save DCT address LD HL,HELLO$ CALL @DSPLY ;Wel3NNNNNNNNNNNNNNNNNNNNNNN  mNNNNNNNNNNNNNNNNNNNNNN IY,BC ;Move to next DCT posn POP BC ;Recover count DJNZ TSTDCT ;Do all 8 ; LD A,(RESNUM) ;P/u count OR A ;Any here? NNNNNNNNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNNNcome the user @@FLAGS IFDEF LINK LD (FLAGTB),IY ;Save for install ENDIF LD DE,'S'-'A' ;Find SFLAG$ ADD IY,DE LD (SFLAG),IY ;Save NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNRO #MSG IFEQ %%,1 LD HL,#MSG ENDIF LD A,14 RST 40 ENDM @@VDCTL MACRO LD A,15 RST 40 ENDM @@PAUSE MACRO LD ]NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN USER ;*=*=* ; Error exits ;*=*=* NOROOM LD HL,NOROOM$ DB 0DDH CANTDO LD HL,CANTDO$ DB 0DDH ABTJOB LD HL,ABTJOB$ DB 0DDH NOHEAD LD HL,NOHEAD$ DBNNNNNNNNNNNNNNNNNNNNNNN J#NNNNNNNNNNNNNNNNNNNNNN ;Save area for low mem ptr address DCTADD DW 0 ;Address for this DCT SECBUF DS 256 ;Use to log drive KEYBUF$ EQU $ ;*=*=* END BEGIN NNNNNNNNNNNNNNNNNNNNNNN ÊNNNNNNNNNNNNNNNNNNNNNN 0DDH BADTOT LD HL,BADTOT$ ABORTL @@LOGOT @ABORT @@CKBRKC @@ABORT ;Use abort QUIT LD SP,$-$ SPSAV EQU $-2 @@CKBRKC RET IOERR LD L,A LD 7NNNNNNNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN H,0 OR 0C0H LD C,A @@ERROR JR @ABORT @EXIT LD HL,0 JR QUIT @DSPLY @@DSPLY RET Z JR IOERR ; abort instead or re-prompt if JCL ruWNNNNNNNNNNNNNNNNNNNNNNN ,ANNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNnning ABTJCL PUSH AF PUSH HL LD A,($-$) SFLAG EQU $-2 BIT 5,A ;JCL active? LD HL,JCLAB$ ;=>msg JR NZ,ABORTL ;Log out POP HL ENNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN;SVCMAC/ASM - LS-DOS Version VI *LIST OFF ; @MOD2 EQU 0 @MOD4 EQU -1 @@KEY MACRO LD A,1 RST 40 ENDM @@DSP MACRO LD A,2 RST 40 ENDM @@GET .NNNNNNNNNNNNNNNNNNNNNNN <NNNNNNNNNNNNNNNNNNNNNN ;Else restore regs POP AF RET ;*=*=* ; Messages & Data tables ;*=*=* HCPTR DW 0 ;Pointer if going to HIGH$ NOFMT$ DB LF,'Note: Drive appears to be unformatted.',CR HMEMNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN MACRO LD A,3 RST 40 ENDM @@PUT MACRO LD A,4 RST 40 ENDM @@CTL MACRO LD A,5 RST 40 ENDM @@PRT MACRO LD NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNN$ DB LF,'Note:driver installed in high memory.',CR JCLAB$ DB LF,'Incorrect entry from JCL.',CR HEADMP$ DB 'Heads already in use <' INUSE$ DB '.-.-.-.-.-.-.-.>',CR HEADS$ DB 'Enter number of heads for partit< NNNNNNNNNNNNNNNNNNNNNNN ӴNNNNNNNNNNNNNNNNNNNNNN A,6 RST 40 ENDM @@WHERE MACRO LD A,7 RST 40 ENDM @@KBD MACRO LD A,8 RST 40 ENDM @@KEYIN MACRO LD A,9 RgNNNNNNNNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNNNion <1-' HEADS1$ DB 'X> ',3 STRTHD$ DB 'Enter starting head: ',3 HDBAD$ DB 'Heads requested conflict with ' DB 'heads in-use.',CR NOHEAD$ DB 'No heads available on that drive.',CR BADTOT$ DB 'DNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNST 40 ENDM @@DSPLY MACRO #MSG IFEQ %%,1 LD HL,#MSG ENDIF LD A,10 RST 40 ENDM @@LOGER MACRO LD A,11 RST 40 |NNNNNNNNNNNNNNNNNNNNNNN i,NNNNNNNNNNNNNNNNNNNNNNrive has heads in use higher' DB ' than entered total.',CR ABTJOB$ DB 'Manual abort - Job terminated.',CR NOROOM$ DB 'No memory space available.',CR CANTDO$ DB 'Requested drive slot already in use.',CR PNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ENDM @@LOGOT MACRO #MSG IFEQ %%,1 LD HL,#MSG ENDIF LD A,12 RST 40 ENDM @@MSG MACRO LD A,13 RST 40 ENDM @@PRINT MACNNNNNNNNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNNNDW 0 ;Slack MAXHDS DB 0 ;Total heads on drive RESNUM DB 0 ;Count of DCT's using this driver DCTPTR DW 0,0,0,0,0,0,0 ;Addresses LCPTR DW 0 4XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NjNNNNNNNNNNNNNNNNNNNNNN A,16 RST 40 ENDM @@PARAM MACRO LD A,17 RST 40 ENDM @@DATE MACRO LD A,18 RST 40 ENDM @@TIME MACRO LD A,19 RGNNNNNNNNNNNNNNNNNNNNNNN  }NNNNNNNNNNNNNNNNNNNNNN RST 40 ENDM @@WRTRK MACRO LD A,55 RST 40 ENDM @@RENAM MACRO LD A,56 RST 40 ENDM @@REMOV MACRO LD A,57 RST 40 ;NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNST 40 ENDM @@CHNIO MACRO LD A,20 RST 40 ENDM @@ABORT MACRO LD A,21 RST 40 ENDM @@EXIT MACRO LD A,22 RST 40 eNNNNNNNNNNNNNNNNNNNNNNN  (@NNNNNNNNNNNNNNNNNNNNNN ENDM @@INIT MACRO LD A,58 RST 40 ENDM @@OPEN MACRO LD A,59 RST 40 ENDM @@CLOSE MACRO LD A,60 RST 40 ENDM @@BKSu8NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ENDM @@CMNDI MACRO LD A,24 RST 40 ENDM @@CMNDR MACRO LD A,25 RST 40 ENDM @@ERROR MACRO LD A,26 RST 40 ENDM @@DEBUG MDNNNNNNNNNNNNNNNNNNNNNNN  qNNNNNNNNNNNNNNNNNNNNNNP MACRO LD A,61 RST 40 ENDM @@CKEOF MACRO LD A,62 RST 40 ENDM @@LOC MACRO LD A,63 RST 40 ENDM @@LOF MACRO NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNACRO LD A,27 RST 40 ENDM @@CKTSK MACRO LD A,28 RST 40 ENDM @@ADTSK MACRO LD A,29 RST 40 ENDM @@RMTSK MACRO LD NNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN LD A,64 RST 40 ENDM @@PEOF MACRO LD A,65 RST 40 ENDM @@POSN MACRO LD A,66 RST 40 ENDM @@READ MACRO LD A,67 XrNNNNNNNNNNNNNNNNNNNNNNN  ONNNNNNNNNNNNNNNNNNNNNN A,30 RST 40 ENDM @@RPTSK MACRO LD A,31 RST 40 ENDM @@KLTSK MACRO LD A,32 RST 40 ENDM @@CKDRV MACRO LD A,33 pNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN RST 40 ENDM @@REW MACRO LD A,68 RST 40 ENDM @@RREAD MACRO LD A,69 RST 40 ENDM @@RWRIT MACRO LD A,70 RST 4TNNNNNNNNNNNNNNNNNNNNNNN 8~NNNNNNNNNNNNNNNNNNNNNN RST 40 ENDM @@DODIR MACRO LD A,34 RST 40 ENDM @@RAMDIR MACRO LD A,35 RST 40 ENDM @@DCSTAT MACRO LD A,40 RST 40 NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN0 ENDM @@SEEKSC MACRO LD A,71 RST 40 ENDM @@SKIP MACRO LD A,72 RST 40 ENDM @@VER MACRO LD A,73 RST 40 ENDM @@rNNNNNNNNNNNNNNNNNNNNNNN m-NNNNNNNNNNNNNNNNNNNNNN ENDM @@SLCT MACRO LD A,41 RST 40 ENDM @@RSTOR MACRO LD A,44 RST 40 ENDM @@STEPI MACRO LD A,45 RST 40 ENDM @@SEEK NNNNNNNNNNNNNNNNNNNNNNN ׵NNNNNNNNNNNNNNNNNNNNNNWEOF MACRO LD A,74 RST 40 ENDM @@WRITE MACRO LD A,75 RST 40 ENDM @@LOAD MACRO LD A,76 RST 40 ENDM @@RUN MACRO GNNNNNNNNNNNNNNNNNNNNNNN ^NNNNNNNNNNNNNNNNNNNNNN MACRO LD A,46 RST 40 ENDM @@RSLCT MACRO LD A,47 RST 40 ENDM @@RDSEC MACRO LD A,49 RST 40 ENDM @@VRSEC MACRO LNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD A,77 RST 40 ENDM @@FSPEC MACRO LD A,78 RST 40 ENDM @@FEXT MACRO LD A,79 RST 40 ENDM @@FNAME MACRO LD A,80rNNNNNNNNNNNNNNNNNNNNNNN N"NNNNNNNNNNNNNNNNNNNNNND A,50 RST 40 ENDM @@HDFMT MACRO LD A,52 RST 40 ENDM @@WRSEC MACRO LD A,53 RST 40 ENDM @@WRSSC MACRO LD A,54 NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN RST 40 ENDM @@GTDCT MACRO LD A,81 RST 40 ENDM @@GTDCB MACRO LD A,82 RST 40 ENDM @@GTMOD MACRO LD A,83 RST NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ENDM @@BANK MACRO LD A,102 RST 40 ENDM @@BREAK MACRO #ADR IFEQ %%,1 LD HL,#ADR ENDIF LD A,103 RST 40 ENDM @@CLS MAkNNNNNNNNNNNNNNNNNNNNNNNHhNNNNNNNNNNNNNNNNNNNNNN).></d&!t1> +#~ (1+"+~#(( 0x2+z2?2>( !1> W/!}(20!Z"t2!E>d"r2*t2"v283! ").Z"032+2)2@)2)2+2,D0N01+> 2*3\1b/2,2,!+w#6#w2+90/~#P00> O!+~(@)>(=29/45# , (/4O#45$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCRO LD A,105 RST 40 ENDM @@CKBRKC MACRO LD A,106 RST 40 ENDM *LIST ON END AME',0 DW NPARM+1 DB 56H,'SYSTEM',0 DW SYSPRM+1 DB 56H,'VERIFY',0 DW VzNNNNNNNNNNNNNNNNNNNNNNN{YNNNNNNNNNNNNNNNNNNNNNN0 >(~/ 2+/> P0~ >0+~0~Ɛ'@'P0>( /91 !,4~8>w >:,1!1D0!1D0:,<2,o&331* ,|~>( (P0#N0N0:K/\1>(K/!.K/`(*:1~w>~ MAS 4.3a-]NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNN - Copyright (c) 1982/83/84 by MISOSYS, Inc., All rights reserved. Bad parameter(sParameter error MISOSYS EDAS-4.3 XX/XX/XX XX:XXr2:XX Page CCCASMLIBCMDCIMREFSYMPRNLINES /L /P1 9P2 9P3 9P4 9x2~;rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN[%NNNNNNNNNNNNNNNNNNNNNN'(`8{0˯w#~'(#> G>3> 7(5*+~#"+O > y(20:?<=@[*++"+!+4x!1@000T])))_.3OG>2+> P06#6!+45!,w+>w"p2^#V#2+:+3^#n3N0~P0"p2x3#vNNNNNNNNNNNNNNNNNNNNNNNkgNNNNNNNNNNNNNNNNNNNNNN 40 ENDM @@RDSSC MACRO LD A,85 RST 40 ENDM @@GATRD MACRO LD A,86 RST 40 ENDM @@DIRRD MACRO LD A,87 RST 40 ENDMONNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNXVNNNNNNNNNNNNNNNNNNNNNN @@DIRWR MACRO LD A,88 RST 40 ENDM @@GATWR MACRO LD A,89 RST 40 ENDM @@MUL8 MACRO LD A,90 RST 40 ENDM @@MUL16 MACRO NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD A,91 RST 40 ENDM @@DIV8 MACRO LD A,93 RST 40 ENDM @@DIV16 MACRO LD A,94 RST 40 ENDM @@HEXD MACRO LD ANNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN>4NNNNNNNNNNNNNNNNNNNNNN,95 RST 40 ENDM @@DECHEX MACRO LD A,96 RST 40 ENDM @@HEXDEC MACRO LD A,97 RST 40 ENDM @@HEX8 MACRO LD A,98 RST NNNNNNNNNNNNNNNNNNNNNNN . NNNNNNNNNNNNNNNNNNNNNNMAS6 5Copyright (C) 1984 MISOSYS, Inc., All rights reserved2&>e! ":1!.">2DO>R"9"9"0"9>!2/.Ó/  >O|}>!. ( # 8 ~@)>N!62.!,!&>:]2*+)S ,>N:,W( !-2:fT &!_ !,yNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 40 ENDM @@HEX16 MACRO LD A,99 RST 40 ENDM @@HIGH$ MACRO LD A,100 RST 40 ENDM @@FLAGS MACRO LD A,101 RST 40 :!, >e>;O.!,".(~[ ,>C((><).6, / !w,"/.)>K!+˾!,V(˷OO>2,!@)~(><*x22+|0>2!>:)(V"p2!,v@)Ċ/~)*/}2LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN5{88!+w9AB!+~6#w##4O4(0xAxG!+4>+= xwB O4( x ͝2)Q84A## F#p+͝22)5s{6A!+6(6:+2+A x 2+!+~Jw$B6#wA!+6 ( x ^CJ4 x!+wHAiJ4 xNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENDIF without IUncx9losed conditiona$MAIN @@@NLWOLPWSWEIMNEXRNCNMCINHSLMFNO *r2"+"\-w*v2##w"\J#2`)2)"M2S2)2fT2+2P<2,go" ,")"@)"5>!9w####*+9s#r# ^Q q!)9 @0*9nNNNNNNNNNNNNNNNNNNNNNNNLiNNNNNNNNNNNNNNNNNNNNNN(  x(êAJ4 ^C 7mAA!+~w5{xB0Է(<F!+wA!+~6ͫBB55#s#r#6O4!+ x=>xO>Ʀw͝2,êAO4G(x^C}4ͮB2ͫB(( 6G4^C›AAäAͫB5 P ~ wB5*+##og}$(% /<( =T#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN9~08: ͚2(cx:+ I͝2O͝2=2y!9L(!9O(!9X(!9S(I2!9[+s#r# ^Q q͚2(-2o4!9ͥ52p:9( *9"@)!94:9*9 :9 !9")!94:9('*9`)>N!<2.!(E>:/292929S9:9(!*9)>N!92.!(E>:/S9z292@*ONNNNNNNNNNNNNNNNNNNNNNN_$NNNNNNNNNNNNNNNNNNNNNN}8>84>ÄB5z ={ 8>dz2+>2+M4 'BB M4 xC >2+@̈́BäAg|ªA56A{B M45  ͤABM4 ( x 6A{ÄB>2+xAÄBB $J4 bx ]ͤAB>2+G4A Hx'  2+͝2' ^C)BG4AǝNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNt2"):+ ?:9(29*@)| x;!9@.:9(!,w!&" ,"/*)| !9a.:9D3*+~( ˦ˮO !@"kQ͛O!,w",go"S"3! ,",!-"-!9x029^#V#9>ͼ?!+w#4~=ʴ==›<:9 :92+*9"0:9(!+!2~#P0˾:90ô=:92+>)NNNNNNNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN( x êA!+M4 TOxwBxyAB( A>WwËBG4(xD   22BlAx(6 D6:͠BäAB1E6pG4 ͰAB2+DA 4ͤABx M4lA>62+.AʪAM4 =x 86)B^C6͞DBJ4 x( 4!+6#6C)B x >22+ªA5A6*!NNNNNNNNNNNNNNNNNNNNNNN\WNNNNNNNNNNNNNNNNNNNNNN#*5>*)"3>x !2..*v2s#r#6T]# w#"v283+4~>"/.. ..G?23x!,y/y x/~#A028/x> /9=>*+#"+G:+ D0x( *p2N3>2+>>>o}4(G;( ( x(v8͚2 ͝2NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN2<[x2z(|(0/2,:9x!,v@)˶Ċ/29`)( *9"0></:9ʝ=*9"0͇2=d!8N0D0*+N02+91~ N0G> ~(#:9O~?8 $ >og~P0#R#Ϳ0#vNNNNNNNNNNNNNNNNNNNNNNNofNNNNNNNNNNNNNNNNNNNNNNx4!95͝2!4"4*++0)$( _(2>ͻ4!ͥ5~G~ ͝2(020$(@(_(?(2 >A7B0C1D2E3H4L5BC@DEAHLBSPCIXPIYQNZ`ZaNCbPOdPEePfMgAFsONOFFIRNOTLOWHIGHANDMODORXORSHLSHREQNEGEGTq9NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN#=()3>!bR!kQFxog4~[x=6A+4~og6A)( *9"0></2+:9I<:9!93*9"+:92+rS1+91!+5 :9( P1˯C29w2+*+*+"+"+go"+2+!=:+ON:)oT*v2*)HH"p2##~2+#"+_"):+;>!#"5>:+ڟK8:lQ@qQ}4NNNNNNNNNNNNNNNNNNNNNNN:5NNNNNNNNNNNNNNNNNNNNNNLx5ELT6666f7[76:7-7666666yO ~7#չ  # !@G x!"+DL}4 j4qj4[+ɷ(Y=ʊ7'726.(+(- y(94880QOz( ( (;( ,()(2 *+$( y>ͼ? ( y(oXNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN>(f eQ?;(|* ^O4ͷ>I *9"x>+:92+(GrSSqSMe=PL_?o4j4 ªA!+ pbRp*,~y2J8584͝2 ͷ>’?!bR7ö?ͷ>ʖ?Ò?;(eQ(: ͝2(;(eQ2io4,-(; M;(:9 V0Nͷ> h:9 .>*\-ͥ58-"Z?B~("ͷ>NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNgy(x6=(=(l&|/g}/o7x "+ 0b}5o&) N#F*+ .(8 ( 8 ((,e!+I :ɯog*+"+++6-6&6!(I/(.*(T<6*+z(_Wz"+<z"+)*+)88, "++D7o&NNNNNNNNNNNNNNNNNNNNNNN :NNNNNNNNNNNNNNNNNNNNNN B+Pu@f( !Lh84hK:9 ^Q x?͚22^#~2+{%838ͷ>( :9bR!Y~#fo{LR 2:@>*+*+ͥ507[M*+y +~wlNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL}[+!x790)"+! 2͝20 D(H(O( Q(B D20006T]_ e6!͝2([F(o͝2[F(eo͝2([F(6͝2(.8G5265t4 ͝2. x*GET or *SEARCH erroBad labeBranch out of rangIllegal addressing modI;NNNNNNNNNNNNNNNNNNNNNNN * NNNNNNNNNNNNNNNNNNNNNN@vz ~#fo(  @84ws#r:+x@:9:9( #~+$!+*Y->H >"2@:[-G~bQ(/( :(P0 #믱(GͻR!5>@P0( ~#og@~GAN0!+˾A#~P0O4BxªAO4(LB(G!+~Fw5#sAz(<*,#w",:9bR:+!+(=EGV94~/+#wQG0>QG(QG8(QGeG8]G(eG8]G(eG8]Gn(f EGe94~+!bR}4j4ͼ?^Q,(6 >5"+&NNNNNNNNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNNNBbk0^Qj4<6^Qj4 >( ^Q( q6#"jPs#r!+~2-w#4!VP"6R5s#r#!~5"R!#*p2##F#xPQ( #~;(#"jPsL[MKjPCM͖L:KPw#^#V#S-8?N# 0)5((L*-~#^#V#S-0 5~# (5*jP8 #6"jP"N#~O!Kl=-NNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN"+ >5*+R"S:)ĶO84:+(HX;:)£U 584}4!(5"xH+HLR:+ z("+:+=S:9=(>/>/}/|/:92+!+Ϳ0)3!9D0IO"jP"NT],(>(p!bR:+=͚2;,̝2-(+(2o4!9ͥ58p͝2; @@?:)CKxQ*p2ZSp2*+S+!kQͨQ0Hy2+2Z85~'(+;7? nyO E#~#կ~'(7#~'(;7R(~#~'ÄNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQ(w#5>c:,!1>!1>2͝2(< ͝2( >(6 #2,/G!xI͚2(!*P< ͝2(w#>(6>!*" ,>/G:9!,0:+:9:9:+=S͝2< *+͝2(>(ᯰ>/x/~#//G 5CN0!+#4!aR K4[p2l7NNNNNNNNNNNNNNNNNNNNNNN kNNNNNNNNNNNNNNNNNNNNNN(#&R (,Ox8' (#(*RxG!N (#~ ͝2 ( ̚2 (;ªA>G!+~==R!+++ xR:+ :9!+ 2͹R#~(+ :+O# )30*p2t3N0)3Ϳ0#:+>+ > P0)3:+ +:+ =*,#*+",:8LNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNGB~+(fK4:+=( ^#V14:+O( *M"\Jps#r+B+"\-4##",͚2(S;(xJO# a}4(\ Yq#~4w#6#6#^Q((,(= 6]T#J(w q6#6#6#,(6#6"\J[+#"M?1!+ˆ!46>(͝2 2J'J^Q'(,Missing MACZNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN+((=S!)w/2+#s#r#"))#"+*) w#")< 2+=S:)G:9!) </x/!)~/#~/#~#/2+>͚2xS094:)aRͷ>=!fT~p! 8@0*r2++> =x*+ *\- "\-*r2[+R#DM"+2>2S*r2[v2r+s+!{"zT2:)( "3.(d(xTa!"v2G̀3> )>D2T=2..!$V@0. .G..A.( (.G> 2fTãU.O!+. a8{0˯w>NNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNVw; ͝2(LæO#% ͝2(>&( % 6#+# }4( *,N~8)+w#j4146#"\J6[xL+?7R}L!+~2-N($~w[-!Y-R RK4!- S-S-^Q͚22Mͮ?^#V_?͍LPF#6#(~(AO.w#+lG8]G n("U*Y-"+S:,O. (q( .G..G. !>V.w#!T4K@V )>B/:BV=2.CxU/}!EV2()*CV0# (#",)jT>2[-!9"Y-2@[,! ,R(a![-?) #",͞U:%)2.**)+"*)>C/:fToT!~§T*Y-NNNNNNNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNN(F,(*-~=M2͏MM#4#~?(~O#>!Y@0͓U2)O*r2V+^Sv2cHSearch file is not a PDS! FV*+~_#DM{<GwM4 x ËB x 6xEG4A&  ^CO4B( 6͠B)B6*5ͣBͤA!+6#6K*B>2+5*+:9=( "+QG6A{[C|EeRF+|ʣF:+F !,q2256A^CS+FeRF^Q(},j4͝2j4RNNNNNNNNNNNNNNNNNNNNNNN KNNNNNNNNNNNNNNNNNNNNNNN#"-*-~ :+POo,&"-!Z"p2###"+!-#GOͨQ 0gyH]#(9G*-#(9#~?H>###OOy2Z2+,>~'(;7#~'(˿#yO ~7~#  # :+ʙK*GNNNNNNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN' GF ^2FF WF(SGWF2x͝2'͝2'(2ɷE͝2' xFGF F2+^CeRF͝2( [F(F êA2+/G:,N0E5AS+eRF͝2(, 5S+F *+:+( :+#=(#"+"+2+G/Gx:9=x!,54 6͹R:+G!+0#4N0)3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNEFBDSYMDATETIMEDEFMDEFSDEFWENDIF)MACROIFDEF+IFREF-TITLE!SPACE$IFLT$FY.IFEQ$/IFGT$0IFNE$1EXITM9ENTRY:IFNDEF,SUBTTL"OPTION;^CA^ADAA BRBsBBBBB C"CLCdCCC.DHDEmFHFJOOOEH[HHH7IpIIItGGGGGGGGGiOsOxO~OSNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNͲ)*͍*!1V ͨ)*ͷ)*͍*!36#6+V ͨ)*ͷ)*͍*3!0 )V !3ͨ)*ͷ)*͍*:0(#8>"2020>n(<20~ 20!03 V !3ͨ)*ͷ)*͍*!3 6#V !3ͨ)*ͷ)*͍*:0 *+~ w !Z/ +*I+  ̕NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGG4IK-HHOH)QMember definition error: ZVersion: 01/06/85 15:29:21 .[+s#r# ^Q q͚2(-2o4!9ͥ52p:9( *9"@)!94:9*9 :9 !9")!94:9('*9`)>N!<2.!(E>:/292929S9:9(!*9)>N!92.!(E>:/S9z292@*]NNNNNNNNNNNNNNNNNNNNNNN oNNNNNNNNNNNNNNNNNNNNNN Ͳ)(>> )0d8 d0 8:>*y*x******>~#~ (08:8A8[0 # !o/>?*!3+ڴ*x~a8_w#~D* -> HG> 2*>.**!-!/!/!H-! 0!o/!WkNNNNNNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNNN/!'-!- +*:o > *o&O'+1>j!!O>> >`>a> >> O>ZO>]>Q>>1>>j(!s*>e"*$~'0>~G_<n(G͖+ > _ !+A#0~  j&+n()~W_KB>C}D|EG@G8GLock out track manually ? Enter physical head number < - > Enter physical track number <1 - > $HD1TRSFORM6 - IDE Hard Drive Formatter Version - 6.3.1 - Copy,right 1982/83/84/8kNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNHDFORM*Copyright (C) 1983 by Logical Systems Inc.$!a,*+#~8 ( ~0 +¼*~# (: ~0ڼ*Ҽ*2)*!f-B*08$8$2)ʨ*O+~ʬ*"+0 ^ʸ*nf####\,# *!|(&<(#1~"(+ $a8{0 #*!-D*(HNNNNNNNNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN6/90 by MISOSYS, Inc., All Rights Reserved. Unauthorized duplication is prohibited. Parameter error This format for Hard Drive only. Hard drive cannot be drive 0. Which drive is to be used ? Disk Pack name ? Invalid- Disk Pack nam NNNNNNNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNN11*œ*!1+!|(!<( -~08a8{0˯# %*!-g*( -* "1~<n( = x2'!1~p,0>q, * !|%!3ͭ)%!- +!-:30S!3]W!3ͭ)(!.?!.:3/ 5!38.G.!3. +*!P.g*( -**3R°!NNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNe. Master password ? Write protected disk. Disk contains data -- Non-standard format. Unreadable directory. Non-initialized directory. Name=XXXXXXXX Date=MM/DD/YY Enter its Master Password or to abort:  Note: Each cylinder equal.s 2 physicnNNNNNNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN* +*!/D*~Y´*!* ^ʰ&~0_+S_:.,O>+n(,0&1C^=<͂*s/&!.n*!26m,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNal tracks. Formatting cylinder Verifying cylinder * No cylinders available for directory. Directory will be placed on cylinder 000 Initializing SYSTEM information  Formatting complete Invalid master password - Format aborted. Are/ you sNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNWRW>XYlYLD@JR DBCPJP ORDWEXDSIF%INEIDIRRRLDCIFWMDXDMINCPOPRET EQUADDDECANDXORBIT@SUBRSTSBCRESOUTSETNOPRRAADCCPL/EXXDAA'SLA SRL8SCF7RLARRCCCF?RLCNEGDSRA(INILDINNNNNNNNNNNNNNNNNNNNNNN {NNNNNNNNNNNNNNNNNNNNNN6,} ~W_20<+n(20!| '!.*z))͛')*z z¨'!.*j&1~<(?z !) !)"M'!) !)"P'))ѯ2U'_!2ͣ)̲) ><2U'_:0 z >**!.*j&1^ 6~<+^͂*s~<_<+> *n,=&1>(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCOM5CPDCPIINDLDDORGRLDoRRDgENDERR4IF13IF23IF33REF8IRPCALL PUFXSHDJNZ RLCALDIRRRCALDDROUTIOTIRINIRCPIRENDM6CPDRDEFL HALTvINDROTDROUTDPAGE#RETIMRETNEIFEQ'IFGT(IFLT&LORG7ELSE*IFNE2REPTIRPCDNNNNNNNNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNN y}0 o o !.ô*u })C4/26/!/*!8/*!1~w~ 20o6(Ͳ)¤*!2#+*~ 22ͣ)*Ͳ)*͍*#+*~ 22ͣ)*Ͳ)*͍*~"21~G~@G~2*)211!(###LSI!1ͣ)*Ͳ)*͍*!36, !36cͣ)*(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNK NNNNNNNNNNNNNNNNNNNNNN  3G8Gj&n()~W_KZ=ѻ0/_#>]W~W~F{C}D|E@:2T222222222!2͚9!Q6͈8180w͉6 '~w 59NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN[3NNNNNNNNNNNNNNNNNNNNNN~w?w nm44m4͚9!5͈8180w 5͚9!6͊8̈́8! >^}!B0!B8!B08y=w9q :_; ͳ6͚9!:͔9!<:͈8180? Can't, Disk Pack not formatted. Formatter incompatible with disk driver. Drive is disabled. Reading System Disk Boot Record. Verified Written Disk Boot Record. Writing Disk Boot Record. sMPW$tNAME$VSYSTEM&VVERS0IF*NNNNNNNNNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNN (00'_z~5"5 0( z 0O~w TRSIDE - IDE Disk Driver for LDOS 6.x/5.x Version - 6.3.1 - Copyright 1982/83/84/86/90 by MISOSYS, Inc., All Rights Reserved. Unauthorized duplication is prohibited. EntNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNY 'vNOSTOPP%^BOOT SYS7]DIR SYS7B 71c MM/DD/YY22Copyright(C)1982Logical Systems Incorporated (P)++MNNNNNNNNNNNNNNNNNNNNNNN =QNNNNNNNNNNNNNNNNNNNNNNer total number of heads6 on drive <1-8> Enter physical tracks per surface: Enter step rate for drive: Enter drive select address <1-4> 2|6C26C:_;(!G!`;^#V#~( ~O~~<2^;G!+:>( G##:_;(7G!`;N#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN `NNNNNNNNNNNNNNNNNNNNNNF#~w~w^7{277:^;=( w02c:!+:>1 0w##<~~O~~ nf^#V r+s##= !82 ut6*9|*n;^,V! 2L*n;s,rsr!9(> [p; !r;r8 +:t;0#Wr8 >/!L< !O< r  {8!9> >`͔9!r<> i9~>j(!s~9Sp;!.5͔9>e"7"9e9>Q!`;nf#1NNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN###2 #G #:_;<2_;u#9t# :_;3KI>R„9-V-^"n;!K"7B3>eF $!E>d"7LB>d#"9!9"n;3!;!7;!:!:!:> >j>1>jo&O>!> :o!9 Note: Drive appears to be unformatted. Note)NNNNNNNNNNNNNNNNNNNNNNN-oNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN:driver installed in high memory. Incor:rect entry from JCL. Heads already in use <.-.-.-.-.-.-.-.> Enter number of heads for partition <1-X> Enter starting head: Heads requested conflict with heads in-use. No heads available on that drive. Drive has NNNNNNNNNNNNNNNNNNNNNNNx>@>> G >F>G2ED>G!O >2>2 >AWDX ~O '>@P(c2>8Qx (1=(.>E 3> G2J(X!2 z >( 3>0G!22( 2A#0~G(>> NNNNNNNNNNNNNNNNNNNNNNN¤NNNNNNNNNNNNNNNNNNNNNN heads in use higher than entered total. Mant;ual abort - Job terminated. No memory space available. Requested drive slot already in use. 8~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNt byte used DB 5,'TRSH1' ;Progname ; RETRYR LD HL,'DH' LD (3C00H+62),HL ;Init done by ICONFG IFDEF HDCONT INIT LD A,10H OUT (HDCONT),A LD B,40H CALL @PAUSE fNNNNNNNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNNT OFF IF MOD1 *GET MOD1/EQU ENDIF IF MOD3 *GET MOD3/EQU ENDIF *LIST ON ;DVRWD/ASM - LDOS 5.1 - 01/13/83 - RS/CJ/LM ;*=*=* ;*=*=* ; Calling Sequence ; B => disk command ; C => logical djNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLD A,0CH OUT (HDCONT),A EX (SP),HL EX (SP),HL IN A,(STATUS) AND 80H JR NZ,RETRYR ;*=*=* ; Restore the WDC to set the step rate ;*=*=* ELSE INIT XOR A jWNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;Assemble RS hd driver for 5.1 - 12/12/83 *GET HDWD5A/ASM:2 *GET HDWD5B/ASM:2 END BEGIN NNNNNNNNNNNNNNNNNNNNNNN _2NNNNNNNNNNNNNNNNNNNNNNrive number ; D => logical cylinder number ; E => logical sector number ; HL => sector I/O buffer address ; IY => drive code table address ;*=*=* ; bit 2 => wait enable ; bit 3 => device enable ; bit 4 => softwar6NNNNNNNNNNNNNNNNNNNNNNN֛NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN  aNNNNNNNNNNNNNNNNNNNNNNe reset HARDWP EQU 0C0H HDCONT EQU 0C1H ;*=*=* DATA EQU 0C8H ;Data transfer port ERROR EQU DATA+1 ;Error code port WRP EQU DATA+1 ;Write precompensation port SECNT EQU DATA+2 ;SectoNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 9PNNNNNNNNNNNNNNNNNNNNNNr count SECNO EQU DATA+3 ;Sector number port CYLLO EQU DATA+4 ;Cylinder lo CYLHI EQU DATA+5 ;Cylinder hi SDH EQU DATA+6 ;Size/Drive/Head port STATUS EQU DATA+7 ;Status port COMMAND~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN EQU DATA+7 ;Command port ;*=*=* ; Western Digital Controller OP codes ; ; 0001rrrr - Restore drive ; 0111rrrr - Seek sector/head/cyl ; 0010d000 - Read sector ; 00110000 - Write sector ; 01010000 - Format track ; ; rrrr = step rateaNNNNNNNNNNNNNNNNNNNNNNN)nNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; d = 0=programmed I/O, 1=DMA ;*=*=* ; Winchester drive code tables ;*=*=* DCTAB EQU $ DB 0,0,0 ;Push to correct posn TYPQTY EQU 1 DRVSEL EQU 3 ;DCT pos for select ;*=*=* ; DefaultsNNNNNNNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNƥNNNNNNNNNNNNNNNNNNNNNN for ST-506 ;*=*=* DB 8!4 ;5" fixed hard drive DB 10H ;Alien, starting head = 0 DB 0 ;Unused here DB 153-1 ;Max cylinder DB 3<5+31 ;4 GNNNNNNNNNNNNNNNNNNNNNNNO NNNNNNNNNNNNNNNNNNNNNN; HDWD5A - This one for RADIO SHACK - LDOS 5.1 - 06/10/84 ; Change Log ;Log in drive if possible 04/26/83 ;Store total head count for drive 04/29/83 ;Padded to 399 bytes 06/10/83 ;Added precomp reg init 07/07/83 ;Handle WD1010 controller 12/12/83 ; jNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNheads & 32 sectors/tk DB 0<5+15 ;Y "grans/tk" 16 sec/gran DB 76 ;Directory cyl ;*=*=* ; start of driver ;*=*=* DISK JR START ;Branch around linkage DW $-$ ;LasFBNNNNNNNNNNNNNNNNNNNNNNN|=NNNNNNNNNNNNNNNNNNNNNN TITLE '' SUBTTL '' ORG 6000H ;*=*=* ; Version equates ;*=*=* LF EQU 10 CR EQU 13 MINTRK EQU 3 MAXTRK EQU 404 *GET VERSION *LISNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNN IN E,(C) DJNZ VRLP DB 11H ;Skip next via LD DE, READ INIR ;Get data POP AF ;Recover completion status LD HL,RDTBL ;Error xlate R8 EQU $-2CKNNNNNNNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNN JR NZ,DIO ;Jump if I/O request IFDEF HARDWP TSTBSY LD A,(IY+3) ;P/u drive address AND 3 ; & remove other junk LD C,A ;Save for counter IN A,(HARDWP) NNNNNNNNNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNNN JR NZ,ENDERR ;Go on error POP DE ;Adjust read error LD A,D ; code if system CP (IY+9) ; sector was read LD A,6 JR Z,POP1 ;Go ifNNNNNNNNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNN ;P/u the front panel WP DB 0DCH ;Ignore next 2 by CALL C, ALIGN RLCA ;Align hard WP bit to b7 DEC C ; according to drive JR NZ,ALIGN ; address OR (IfNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN system XOR A JR POP1 ;*=*=* ; sector WRITE routine ;*=*=* ; WRSEC CALL SETUP ;Establish drive linkage R9 EQU $-2 ;*=*=* ; Routine to pass WRITE Command to WDC & do it ;*=*=* LD A,30NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNY+3) ;Merge software WP ELSE ; TSTBSY LD A,(IY+3) ;Just dct bit ENDIF ; AND 80H ;Write protected ??? SLA A ;WP to carry RET NC ;W/0 in A ~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNH ;Init write command OUT (COMMAND),A ; & pass to WDC OTIR ;Output the data LD HL,WRTBL ;Point to error xlate R10 EQU $-2 CALL DWR1 ;Wait for completionNNNNNNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN LD A,01000000B ;Show floppy type WP RET ;W Z,C set ;*=*=* ; Disk I/O requested ;*=*=* DIO PUSH HL PUSH DE BIT 2,B ;Test input or output JR Z,INPUT ;NNNNNNNNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNN R11 EQU $-2 JR Z,EXIT ; ENDERR CALL WD1010 ;Clear controller R12 EQU $-2 IN A,(ERROR) ;Grab error code ERR1 RLCA ;Find error TYPE INC HL ;Bump counyNNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNGo if read/verify CALL TSTBSY ;If Write, check first R3 EQU $-2 LD A,15 ;Write prot error JR C,POP2 ;Ret w/error LD A,B ;Get fcn SUB 13 3~NNNNNNNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNNter JR NC,ERR1 ;Loop for error byte LD A,(HL) ;P/u error code ; EXIT EQU $ ;Restore registers POP2 POP DE POP1 POP HL OR A ;Set flag ;This is to take cQNNNNNNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN ENDIF ; OUT (SDH),A ; set the step rate LD A,16H ;* set 3ms-restore STP1 EQU $-1 ;+set by user entry if >3 OUT (COMMAND),A ;* execute command CALL DWR1 NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;WRSEC? JR Z,WRSEC DEC A ;Or WRSYS JR Z,WRSEC ;Go on output LD A,8 ;Not available..for format JR POP2 ;Set NZ/ret w/error ;*=*=* ; SectouNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Wait until not busy R1 EQU $-2 XOR A OUT (CYLHI),A OUT (CYLLO),A ;Set for WD1010 LD A,1<4!0 ;Restore w/step rate STP2 EQU $-1 ;+set by user entry OUT (NNNNNNNNNNNNNNNNNNNNNNN KNNNNNNNNNNNNNNNNNNNNNNr read routine ;*=*=* INPUT PUSH BC ;Save fcn # CALL SETUP ;Establish drive R6 EQU $-2 LD A,20H ;Set controller OP code OUT (COMMAND),A ; & send to WDC CALL }NNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNCOMMAND),A LD B,50 ;Delay about .32 sec. CALL @PAUSE LD HL,' ' LD (3C00H+62),HL CALL DWR2 ;Wait for completion R2 EQU $-2 JR NZ,RETRYR ;Retry ifNNNNNNNNNNNNNNNNNNNNNNN xNNNNNNNNNNNNNNNNNNNNNNDWR1 ;Delay/wait for completion R7 EQU $-2 POP DE ;Fcn to D PUSH AF ;Save status fm disk BIT 1,D ;Sector verify? JR Z,READ ;Go if read VRLP NNNNNNNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNN error PCPTRK LD A,$-$ OUT (WRP),A ;Set precomp trk#/4 LINK RET ;End call before install DB 'WD' ;2 more bytes for @ICNFG ; ;*=*=* ; Driver start ;*=*=* START BIT 3,B INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNN ; is no longer busy JR C,DWR2 IN A,(STATUS) ;Get status again AND 00000001B ;NZ=error RET ;*=*=* ; SETUP disk ; IY= DCT ; D = Cylinder # (0-202) ; E = Sector # (0-255) ;*NNNNNNNNNNNNNNNNNNNNNNN BNNNNNNNNNNNNNNNNNNNNNN A,E OUT (SECNO),A LD A,L OUT (CYLLO),A LD A,H OUT (CYLHI),A POP HL ;Rcvr buffer pointer LD BC,0<8!DATA ;Set buflen & xfer port RET HOWBIG EQU zNNNNNNNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN=*=* SETUP EQU $ ;Wait until not busy ;*=*=* ; Select routine ;*=*=* PUSH HL ;Save buffer pointer ;*=*=* ; Recalc cyl, sector to head, sector, cyl ;*=*=* RECALC LD L,D ;Xfer cylinderoNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN $-DISK DC 399-HOWBIG,0 ;Pad out to 400 bytes DISKEND EQU $ ;*=*=* ; some patch space - INSTALL must be patched also to load ;*=*=* DW 0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,03NNNNNNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN LD H,0 ; BIT 5,(IY+4) ;Double track? JR Z,$+3 ;Go if not ADD HL,HL ;Cyl * 2 ;***** ; Check on track advance ;***** LD A,(IY+7) ;P/u sectors/track ,TNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN,0,0,0 DW 0,0,0,0,0,0,0,0,0,0 RELTAB DW R1,R2,R3,R6,R7 DW R8,R9,R10,R11,R12 TABLEN EQU $-RELTAB/2 DW 0,0,0,0 ;Patch addresses ; ; end of actual I/O driver ; PAGE ser entry OUT (NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN PUSH DE LD D,A ;Hang on to value AND 1FH ;Strip off other data LD E,A INC E ;Adj for zero offset LD C,E ;Keep sec per track XOR UNNNNNNNNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNN DW 0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0 RELTAB DW R1,R2,R3,R6,R7 DW R8,R9,R10,R11,R12 TABLEN EQU $-RELTAB/2 DW 0,0,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN D ;Get # of heads RLCA ;Shift heads to 0-2 RLCA RLCA INC A ;Adjust for zero offset CALL MULTEA@ DEC A ;Adjust for compare POP !NNNNNNNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNN0,0 ;Patch addresses ; ; end of actual I/O driver ; PAGE $-2 JR NZ,RETRYR ;Retry if error PCPTRK LD A,$-$ OUT (WRP),A ;Set precomp trk#/4 LINK RET ;End call bNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNare of the WD1010 controller CIP bit WD1010 PUSH AF IN A,(STATUS) ; AND 00000010B ;Bit 1 is CIP for 1010 JR Z,CLEAN ;All OK LD A,10H ;Do a software reset OUT (HuNNNNNNNNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNNN DE ;Rcvr sector CP E ;Is sector on this track? JR NC,REC1 ;Bypass if yes CPL ;Else subtract off a ADD A,E ; track's # of sectors LD/NNNNNNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNDCONT),A LD A,0CH ;Then re-enable OUT (HDCONT),A CLEAN POP AF ;Continue RET ;*=*=* ; LDOS error conversion table ; Bit Error RD WR ; 7 Bad block detect 7 14 ; 6 CRC - DatNNNNNNNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNN E,A ;Reset sector # INC HL ; and bump cyl # REC1 LD A,C ;Sector#/sectors per head CALL DIVEA@ LD D,A ;Xfer head # needed LD A,(IY+4) ;P/jNNNNNNNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNNa field 4 12 ; 5 CRC - ID field 1 9 ; 4 ID not found 5 13 ; 3 Not used 127 127 ; 2 Aborted command 8 8 ; 1 TR000 error 2 10 ; 0 DAM not found 3 11 ;*=*=* RDTBL EQU $-1 DB 7,4,1,5,127XNNNNNNNNNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNNu starting head AND 0FH ;Strip off other data ADD A,D ;Add in relative head LD D,A ;Point to physical head ;***** ; Xfer head, sector, & cylinder data to WDC ;***** LD }NNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNN,8,2,3 WRTBL EQU $-1 DB 14,12,9,13,127,8,10,11 ; DWR1 EX (SP),HL ;Delay time to settle EX (SP),HL ; the controller ; DWR2 IN A,(STATUS) ;Wait until controller RLCA 6NNNNNNNNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNN A,(IY+3) ;Grab the drive select AND 3 RLCA ;Shift to bits 3-4 RLCA RLCA OR D ;Merge in head select OUT (SDH),A ;Transfer to WDC LD NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN;HDWD5B - Mod 1,3 TRS HD driver part 2 - 06/10/84 SUBTTL '' ; ;*=*=* ;Entry point after initial tests ;Set IY=>correct DCT type ;*=*=* USER LD IY,DCTAB ;*=*=* ; Request physical drive slot first ;*=*=*MNNNNNNNNNNNNNNNNNNNNNNN jNNNNNNNNNNNNNNNNNNNNNNMax w/o double trking OR A SBC HL,BC JR NC,SETTRK SET 5,(IY+4) ;Set double bit SRA B ;Divide by 2 RR C SETTRK LD A,C DEC A ;Offset fm 0 LD (NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN JR PRMPT4 GET PRMPT4 LD HL,DRIVE$ ;Request physical drive# CALL GETARG ;Display & get argument SUB '1' ;Convert to binary (0-3) JR C,GETDRV ;Re-request if bad range GNNNNNNNNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNNNIY+6),A ;Store high XOR A ;Clear carry RR C ;Div by 2 LD (IY+9),C ;Dir cyl in center ; LD A,(RESNUM) ;Driver resident? OR A JR NZ,STMP ;SkiNNNNNNNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN CP 3+1 ;Check max value JR NC,GETDRV ;Re-request if bad range ;*=*=* ; Stuff the drive sel ;*=*=* ; Merge the drive address OR (IY+DRVSEL) ; into the standard LD (IY+DRVSEL),A ; DCT paWNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNp step rate if loaded ;*=*=* ;Request drive step rate ;*=*=* JR PRMPT3 GTSTP CALL ABTJCL PRMPT3 LD HL,STP$ LD B,3 CALL GETAR CALL PARSENM ;Conv to step rate bits JR NZ,GTSTP ֺNNNNNNNNNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNNrameters ;*=*=* ; see if drive type has been established ;*=*=* CALL FNDOLD JR NZ,PRMPT1 ;1st installation of drive LD A,(IX+5) ;IX=> existing DCT L AND 00000111B ;Valid field CALL LDMAX NNNNNNNNNNNNNNNNNNNNNNN zNNNNNNNNNNNNNNNNNNNNNN ;If bad entry LD C,A CP 00000110 ; 3.0 mS? JR NC,FASTOK ;If 3 or less leave 1st cmd LD A,(STP1) ;Chg if >3.0 AND 11110000B ;Leave command OR C ;Merge step rate bits NNNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN ;Use it LD A,(IX+6) ;P/u cyls LD (IY+6),A SRL A ;/2 LD (IY+9),A ;Dir cyl BIT 5,(IX+4) ;Double? JP Z,STMP SET 5,(IY+4) ;Set JP 0 CP XNNNNNNNNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN ;Not over 8 JR NC,GTMAXHD LD (IY+5),A ;Store total entry CALL LDMAX ;*=*=* ; request total tracks on drive ;*=*=* JR PRMPT2 GTTRKS CALL ABTJCL PRMPT2 L LD B,3 CALL GETARGX ;GezNNNNNNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN (IY+0) ;Free heads left JR NC,REQHD ;User exceed max? INC A ;Make real LD C,A LD (NUMHDS),A ;Store number for later DEC A ;Offset fm 0 RRCA NNNNNNNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNNt b chars CALL DECHEX ;Make decimal in BC PUSH BC LD HL,9 ;Add some for round off ADD HL,BC LD C,8 CALL DIV16 ;Divide HL by C LD A,L LD (PCPTRK+1),A ;StNNNNNNNNNNNNNNNNNNNNNNN15 CP A ;Set Z RET RNGERR OR 0FFH ;Set NZ RET ;*=*=* ; stuf ;*=*=* LDMAX RRCA ;Roll to biv}NNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNNN OR D ; merge sec/gran LD (IY+8),A ; put in DCT ; LD A,(MAXHDS) ;All heads? SUB C ;ALL requested? JR Z,PUTRHD ;0 is starting p ;*=*=* ; If not all heads reNNNNNNNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNNts 7-5 RRCA RRCA LD C,A LD A,(IY+7) ;Merge AND 00011111B OR C LD (IY+7),A ;Store max heads RET ;*=*=* ;Driver dependent strings HELLO$ DB LF DB 'TRSHD5 - WD 1000/1NNNNNNNNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNNquested, get starting head ;*=*=* JR PRMPT6 REQSHD CALL ABTJCL ;Quit if JCL PRMPT6 LD HL,STRTHD$ CALL GETARG SUB '1' ;In range? JR C,REQSHD LD C,A ;Save start head UlNNNNNNNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN010 - ' DB 'Driver - Version 5.1.4/d',LF DB '(C) 1 DB 'Inc.',LF,CR HDS$ DB 'Enter total number of heads' DB ' on drive <1-8> ',3 TRK$ DB 'Enter physical tracks per surface: ',3 STP$ DB 'EntNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PUSH BC CALL FREE ;Are these heads in use POP JR NZ,REQSHD ;Get again if bad ;*=*=* ; LD A,C ;P/u starting head PUTRHD OR (IY+4) ;Merge user's start LD 4NNNNNNNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNer step rate for drive: ',3 DRIVE$ DB 'Enter drive select address <' DB '1-4> ',3 ; ;***************************** ;Common subroutines for hard disk drivers ;******************************************* ;*=*=* ; Routine to set a bit in hea'%NNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN (IY+4),A ;Update init DCT$+4 ;*=*=* CALL INSTALL JP @EXIT ;*=*=* ;Convert ASCII step rate entry to WD bit field ;*=*=* PARSENM LD D,0 ;Clear CHAR LD A,(HL) ;Read one INC HL NNNNNNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNd map ;*=*=* SETBIT RLCA ;Shift to "b" field RLCA RLCA OR 0C3H ;Establish as SET b,E LD (SBIT1+1),A ;Alter the OP code RET ;*=*=* ; Routine to test if bit is set in head map ;*=*=* BYNNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNN ;=>next CP '.' ;Decimal JR Z,POINT ;Go if found CP CR JR Z,ISCR ;End of line SUB '0' ;Make BCD 0-7 RET C ;Out of range CP 7+1 $NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNITBIT RLCA RLCA RLCA OR 43H ;Construct BIT b,E LD (BBIT1+1),A BBIT1 BIT 0,E RET ; ;*=*=* ; get total heads and cyl count if an existing driver is ; found for this drive select add FNDOLD LD A,(RElNNNNNNNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNN ;7.5 is high number except 10 JR NC,RNGERR LD E,A ;Save BCD LD A,D ;Take D*1 ADD A,A ;X2 ADD A,A ;X4 ADD A,D ;X5 ADD A,A NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNSNUM) ;Get number of DCTs OR A ;Using this driver JR Z,NTHERE ;If none, prompt LD B,A ;Number to B LD HL,DCTPTR ;=>list of addresses OLDLP LD E,(HL) ;P/u 'NNNNNNNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNN ;X10 ADD A,E ;+this one to catch 10.0 JR CHAR ;Get next char ; POINT LD A,(HL) ISCR SLA D ;Number x2 CP '5' JR NZ,NT5 INC D JR IS0 NT5 CP ONNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNDCT address INC HL LD D,(HL) ;DE=>DCT INC HL ;=>next pointer PUSH DE POP LD A,(IX) ;Don't use any drive CP 0C9H ; that's disabled JR ZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNse 16 sec/gran w/4 heads BIT 5,(IY+4) ;Unless dbl bit is set JR Z,UPTO4 LD E,4+1 ;Then 2 is max UPTO4 CP E ;More than max heads (x2)? JR C,G1 ;16 sec grans OK if less gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNjINNNNNNNNNNNNNNNNNNNNNNble tracking... GOTMX CP 4+1 JR C,SETMX ;OK if 4 or less BIT 5,(IY+4) ;Is double bit set? JR Z,SETMX ;8 OK if not LD A,4 ;Els SETMX LD (IY+0),A ;Save user limiNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;How many active OR A JR Z,NORES LD B,A LD HL,DCTPTR ;=>saved addresses HCLP PUSH BC ;Save loop coun LD C,(HL) INC HL LD B,(HL) ;P/u DCT address 8NNNNNNNNNNNNNNNNNNNNNNNYxNNNNNNNNNNNNNNNNNNNNNNt ADD A,'0' ;Adjust to ASCII LD (HEADS1$),A ;Update the message ;*=*=* ; Adjust heads in use message ;*=*=* LD HL,INUSE$ LD A,'1' ;Init to head '1' LD B,8 MODHD RRC \NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN INC HL PUSH HL ;Save ptr to next entry PUSH BC POP IX ;Xfer to IX LD A,(IX+1) ;Move address of driver LD (IY+1),A ;To new DCT LD A,(IX+2) LD,NNNNNNNNNNNNNNNNNNNNNNNJ5NNNNNNNNNNNNNNNNNNNNNN E ;If bit set, stuff msg JR NC,$+3 LD (HL INC HL INC HL ;Bump to next pos INC A ;Bump ASCII head # DJNZ MODHD RET ; CNTHDS LD A,(IX) ;Don't use NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN (IY+2),A CALL CNTHDS ;Add 'em up POP HL POP BC DJNZ LD A,E LD (BITMAP),A ;*=*=* ; check for heads in use past entered total ;*=*=* LD A,(MAXHDS) ;Entered # DEC A 3NNNNNNNNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNany drive CP 0C9H ; that's disabled RET Z LD A,(IX+DRVSEL) ;Check if this matches AND 3 ; the drive # LD C,A ;P/u drive requested LD A AND 3 ;1~NNNNNNNNNNNNNNNNNNNNNNNIFNNNNNNNNNNNNNNNNNNNNNN,SKPTHS LD A,(IX+DRVSEL) ;Check if this matches AND 3 ; the drive # LD C,A ;P/u drive requested LD A,(IY+DRVSEL) AND 3 ;Check if same CP C ;Match up yet? RyNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Offset fm 0 TSTHGH CP 7 ;Max of 8 JR Z,NORES ;All OK INC A ;Check each past total LD C,A CALL BITBIT ;For in-use JP NZ,BADTOT ;Ab LNNNNNNNNNNNNNNNNNNNNNNNzwNNNNNNNNNNNNNNNNNNNNNNET Z ;IX=>DCT for sa SKPTHS DJNZ OLDLP ;Check the rest NTHERE OR 0FFH ;Force NZ RET ; ;*=*=* ;SETMAP ;IY=>New DCT containing Drive address in bits 0-2 of IY+3 ;IY+7 = max heads possible in bits 5-7 ;SeNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNND A,C JR TSTHGH ;Check up to 8 ; NORES LD A,(MAXHDS) ;P/u maximum LD L,A ;Save SUB D ;Calculate the quantity JP Z,NOHEAD ;Go if none remaining ;Find largest group:1NNNNNNNNNNNNNNNNNNNNNNN/$NNNNNNNNNNNNNNNNNNNNNNts up Heads in use message ;Sets IY+1&2 to existing driver address if fo ;Sets used bits in (BITMAP) ;Sets (MAXHDS) = total heads ;Sets IY+0 = free heads ;*=*=* ; P/u # of heads on the drive & init checks ;*=*=* SETMAP LD A,(IY+7) ;P/u MaKNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN of contiguous heads LD BC,0 ;Init count XOR A ;Start w/0 CNTH1 LD H,A ;Save hd CALL BITBIT ;Head available? JR Z,CNTH3 ;Yes, count it LD C,0 PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNximum heads RLCA ;Shift into 0-2 RLCA RLCA AND 7 ;Mask off Max sector # INC LD (MAXHDS),A ;Save for later LD B,A ;*=*=* ; Adjust heads in use message ;*=*=* ONNNNNNNNNNNNNNNNNNNNNNN  +NNNNNNNNNNNNNNNNNNNNNN ;Reset for hd in use CNTH2 LD A,H ;Head posn INC A ;Bits are offset fm 0 CP L ;So matching w/maxhds JR NZ,CNTH1 ;Means we are done LD A,B ;Get maxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD HL,INUSE$ LD A,8 SUB B ;Calc index into msg JR Z,GOT8HDS LD B,A PUSH HL ;Save start of message BLP INC HL ;Bump msg pointer 2 INC HL NNNNNNNNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNNN count JR GOTMX CNTH3 INC C ;Co LD A,C CP B ;Move highest contiguous JR C,CNTH2 ;Count into B LD B,C ;If B was less JR CNTH2 ;Max of 4 heads if doucNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; bytes per head l DJNZ BLP POP DE ;Recover start of msg LD BC,HEADS$-INUSE$ LDIR ;Reposition message ;*=*=* GOT8HDS LD DE,0 ;Init count & bitmap LD A,(RESNUM)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNer req NUMHDS EQU $-1 TSTHDS LD C,A ;Save for test CALL BITBIT ;Head bit in use? LD A,C JR NZ,ISUSED ;Go if already used INC A ;Bump head pointer DJNZ TSTHDS ]NNNNNNNNNNNNNNNNNNNNNNNnHNNNNNNNNNNNNNNNNNNNNNNlength LDDR ;Move it LD (HIGH$),DE ;Reset HIGH$ INC DE ;Move to entry pt LD (IY+1),E ;Driver LSB LD (IY+2),D ;Driver MSB ; ISRES PUSH IY POP HL eNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Loop for # of heads XOR A RET ;Z=no confl ISUSED LD HL,HDBAD$ ;Show conflict CALL @DSPLY BDHD OR 0FFH RET ;W/NZ for error ; ;*=*=* ;INSTALL - move driver if necessary eNNNNNNNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNN ;P LD DE,(DCTADD) ;To requested position PUSH DE ;% LD BC,10 LDIR POP IY ; IY=>real DCT ;*=*=* ; log in correct dir cyl if possible ;*=*=* LD DE,0 ;Read BOOT|=NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; put JP into (IY) ; move DCT=>IY into address fm (DCTADD) ;*=*=* INSTALL LD (IY),0C3H ;Stuff JP LD A,(RESNUM) OR A ;Is a JR NZ,ISRES ;Then don't re-load ;*=*=* IFDEF LINK ^NNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN LD HL,SECBUF CALL READS ;Get if formatted JR NZ,NOFMT LD A,(SECBUF+2) ;Get possible di CP (IY+6) JR NC,NOFMT LD D,A ;Dir cyl CALL READS JR NmNNNNNNNNNNNNNNNNNNNNNNN~vNNNNNNNNNNNNNNNNNNNNNNCheck if same CP C ;Match up yet? RET NZ ;Skip if different unit ; ; IF ARM!ARMM ; LD A,(IX+5) ;P/u the controller ; CP (IY+5-3) ; address & check ; RET NZ }YNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;If driver has LINK defined... CALL INIT ;Init drv before moving driver ; Move @ICNFG vector into driver next ;*=*=* LD A,(@ICNFG) ;Get opcode LD (LINK),A LD HL,(@ICNFG+1) ;Get address !(NNNNNNNNNNNNNNNNNNNNNNNMGNNNNNNNNNNNNNNNNNNNNNN ; for a match ; LD A,(IX+7) ;Accumulate the number RLCA ; of heads already RLCA ; in use RLCA AND 7 INC A ;Adjust for zero offset LD NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLD (L ENDIF ; ;*=*=* ; Relocate internal references in driver ;*=*=* LD IX,RELTAB ;Point to relocation tbl LD HL,(HIGH$) ;Find distance to move PUSH HL ;Save HIGH$ LD (DISK+2),HL "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN B,A ;Set new head set loop ADD A,D LD D,A ;Set new total heads ;*=*=* ; Merge bit map into E reg ;*=*=* LD A,(I AND 0FH ;Remove other junk SETHDS PUSH AF ;S NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Set last byte used LD DE,DISKEND-1 ;Current location PUSH DE OR A SBC HL,DE ;Offset to HL LD B,H ;Move to BC LD C,L LD A,TABLEN ;Get table length RLwsNNNNNNNNNNNNNNNNNNNNNNN+%NNNNNNNNNNNNNNNNNNNNNNave head number CALL SETBIT ;Turn on reg E bit POP AF ; corresponding to # INC A ;Bump head number DJNZ SETHDS ;Loop for all heads used RET ;*=*=* ; Test if user enRNNNNNNNNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNNOOP LD L,(IX) ;Get address to change LD H,(IX+1) LD E,(HL) ;P/U address INC HL LD D,(HL) EX DE,HL ;Offset it ADD HL,BC EX DE,HL LD (HL),D ;And put bacfNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNtry conflicts with head map ;*=*=* FREE LD C,A ;Starting # (-1) LD A,(NUMHDS) ;P/u # of heads ADD A,C ;Add to start posn LD B,A ;Ending head # LD A,(MAXHDS) ;P/NNNNNNNNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNNk DE LD (HL),E INC IX INC IX DEC A JR NZ,RLOOP ;Loop till done ;*=*=* IFDEF LINK ; Set up @ICNFG ;*=*=* LD HL,INIT ;Get entry pt ADD HL,BC ;Relocate it LjNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNu max heads CP B ;Will last head be OK? JR C,BDHD ;Go if bad entry LD A,C ;Retrieve number-1 LD E,0 ;P/u in- BITMAP EQU $-1 LD B,0 ;P/u # of heads usxYNNNNNNNNNNNNNNNNNNNNNNN]yNNNNNNNNNNNNNNNNNNNNNND (@ICNFG+1),HL ;Init address LD A,0C3H LD (@ICNFG),A ;Stuff JP instruction ENDIF ; ;*= ; Move driver ;*=*=* POP HL ;Current posn POP DE ;HIGH$ LD BC,DISKEND-DISK ;Calc driver V2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN~ NNNNNNNNNNNNNNNNNNNNNN^BOOT SYSqLNNNNNNNNNNNNNNNNNNNNNNN đNNNNNNNNNNNNNNNNNNNNNNFBHDFMT1 ASMB>*NNNNNNNNNNNNNNNNNNNNNNNM8NNNNNNNNNNNNNNNNNNNNNN]DIR SYSqB"NNNNNNNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNFHDFMT2 ASMB4u9NNNNNNNNNNNNNNNNNNNNNNNԯNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN n7NNNNNNNNNNNNNNNNNNNNNNF*HDFMT3 ASMB3H+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;dNNNNNNNNNNNNNNNNNNNNNNFCLIENT ASMB?SNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNFBUILDVERASMBt2nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFHDDVR6 ASMB bNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFnHDDVR5 ASMB`{NNNNNNNNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNNNF(HDWD6A ASMB4H[*NNNNNNNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNcBIDE 06/30/00631Dh'E[NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+ZNNNNNNNNNNNNNNNNNNNNNN/~)>NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNFHDFORM6 ASMBtFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNFEA CMDBT'FNNNNNNNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNNFHDFORM6 CMDB4NNNNNNNNNNNNNNNNNNNNNNN j6NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFHDDVR6 DCTBT !wNNNNNNNNNNNNNNNNNNNNNNN YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЮNNNNNNNNNNNNNNNNNNNNNNFHDWD5A ASMB.QNNNNNNNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFHDWD5B ASMB\ WNNNNNNNNNNNNNNNNNNNNNNN?eNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFHDWD5B2 ASMB\lUNNNNNNNNNNNNNNNNNNNNNNN,(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN/[NNNNNNNNNNNNNNNNNNNNNNFHDWD6B ASMB| jNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNNFܯSVCMAC ASMBT ENNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNI9NNNNNNNNNNNNNNNNNNNNNNF\PMAS CMDB.G2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNN number of heads for partit HEADS1$ DB 'X> ',3 STRTHD$ DB 'Enter starting head: ',3 HDBAD$ DB 'Heads requested conflict with ' DB 'heads in-use.',CR NOHEAD$ DB 'No heads available on that drive.',CR BADTOT$ DB iNNNNNNNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN IX,DCTPTR ;Save matching DCTs LD B,8 ;# of DCTs TSTDCT LD L,(IY+1) LD H,(IY+2) ;Point to driver vector PUSH BC INC HL INC HL ;Point to name le%NNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNN 'Drive has heads in use higher' DB ' than entered total.',CR ABTJOB$ DB CANTDO$ DB 'Requested drive slot already in use.',CR MAXHDS DB 0 ;Total heads on drive RESNUM DB 0 ;Count ofNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNNNZ,NOFMT LD A,'/' LD HL,SECBUF+0DAH ;Date field CP (HL) JR NZ,NOFMT LD HL,SECBUF+0DDH ;Second slash CP (HL) JR NZ,NOFMT LD (IY+9),D ;Stuff correct DIR cyl.. RET READSNNNNNNNNNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNNNngth INC HL INC HL LD DE,DISK+4 ;Point to this namlen LD A,(DE) ;P/u length & match CP (HL) ; with resident driver JR NZ,NOTRES ;Go if dif lengths INC HL #NNNNNNNNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNN LD B,9 ;READ command CALL DOIO RET Z ;Normal status CP 6 ; or DIR cyl OK RET DOIO JP (IY) ;Do it NOFMT LD HL,NOFMT$ CALL @LOGOT RET1cNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Advance to name field INC DE LD B,A ;Set compare length TSTN CP (HL) ; resident vector JR NZ,NOTRES INC DE ;Bump to next char INC HL DJNZ TSTNAM u NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;% ; ;*=*=* ; Routine to convert ascii =>HL to number in BC ;*=*=* DECHEX LD DE,0 ;Clear to start CVDEC LD A,(HL) ;P/u char CP 10 ;Must be less JR NC,DONECONNNNNNNNNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNN ;Loop for name length ;Count and save DCT posns w/same driver LD A,(RESNUM) ;Get count so far INC A LD (RESNUM),A PUSH IY POP HL ;DCT address LD (IX),L IN LD (IX),NNNNNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN ;End if not digit PUSH HL ;Save ascii ptr LD H,D LD L,E ;Merge digit ADD HL,HL ADD HL,HL ADD HL,DE ADD HL,HL EX DE,HL ADD A,E LD E,A LD A,NNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNH INC IX ; NOTRES LD BC,10 ADD IY,BC ;Move to next DCT posn POP BC ;Recover count DJNZ TSTDCT ;Do all 8 ; JP USER ;Go get input ;*=*=* ; Error exits ;*=*=* CANTDO LD NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0 ADC A,D LD D,A POP HL INC HL ;Next char JR CVDEC DONECON PU POP BC ;Put answer in BC RET ;*=*=* ; Routine to divide HL by C DIV16 LD A,C CALL NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN HL,CANTDO$ DB 0DDH ABTJOB LD HL,ABTJOB$ DB 0DDH NOHEAD LD HL,NO DB 0DDH BADTOT LD HL,BADTOT$ ABORTL CALL @LOGOT JP @ABORT ; abort instead or re-prompt if JCL running ABTJCL >0NNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN @DIV RET ;*=*=* ; Routine to parse user input parameter ;*=*=* GETARG LD B,1 GETARGX CALL @DSPLY ;Display message KEYIN LD HL,KEYBUF$ CALL @KEYIN ;Fetch JP C,ABTJOB ;Break? 7vNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNN PUSH AF PUSH HL LD A,(SFLAG$) BIT 5,A ;JCL active? LD HL,JCLAB$ ;=>msg JR NZ,ABORTL ;Log out POP HL ;Else restore regs POP AF RET ;*=* ; MessagNNNNNNNNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNN LD A,(HL) ;Load value RET ;*=*=* BEGIN LD (DCTADD),DE ;Save passed DCT ptr PUSH DE ;Save DCT address LD HL,HELLO$ CALL @DSPLY ;Welcome the user ;*=*=* ; Check if requeNNNNNNNNNNNNNNNNNNNNNNN~NNNNNNNNNNNNNNNNNNNNNNes & Data tables ;*=*=* ; NOFMT$ DB LF,'Note: Drive appears to be unformatted.',CR ;% JCLAB$ DB LF,'Incorrect entry from JCL.',CR HEADMP$ DB 'Heads already in use <' INUSE$ DB '.-.-.-.-.-.-.-.>',CR HEADS$ DB 'Enter"NNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNsted drive slot is available ;*=*=* POP DE LD A,(D CP 0C9H ;RET = disabled JP NZ,CANTDO ;No good if not RET ;*=*=* ;Look for existing driver ;*=*=* LD IY,DCT$ ;Start of DCT$ LDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN CP 3+1 ;Check max value JR NC,GETDRV ;Re-request if bad range ;*=*=* ; Stuff the drive sel ;*=*=* ; Merge the drive address OR (IY+DRVSEL) ; into the standard LD (IY+DRVSEL),A ; DCT paWNNNNNNNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNNp step rate if loaded ;*=*=* ;Request drive step rate ;*=*=* JR PRMPT3 GTSTP CALL ABTJCL PRMPT3 LD HL,STP$ LD B,3 CALL GETAR CALL PARSENM ;Conv to step rate bits JR NZ,GTSTP ֺNNNNNNNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN DCT's using this driver DCTPTR DW 0,0,0,0,0,0,0 ;Addresses LCPTR DW 0 ;Save area for low mem ptr address DCTADD DW 0 ;Address for this DCT SEC KEYBUF$ EQU $ ;*=*=* END BEGIN @NNNNNNNNNNNNNNNNNNNNNNN wNNNNNNNNNNNNNNNNNNNNNNrameters ;*=*=* ; see if drive type has been established ;*=*=* CALL FNDOLD JR NZ,PRMPT1 ;1st installation of drive LD A,(IX+5) ;IX=> existing DCT L AND 00000111B ;Valid field CALL LDMAX NNNNNNNNNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNN max heads CP B ;Will last head be OK? JR C,BDHD ;Go if bad entry LD A,C ;Retrieve number-1 LD E,0 ;P/u in- BITMAP EQU $-1 LD B,0 ;P/u # of heads us{NNNNNNNNNNNNNNNNNNNNNNN $NNNNNNNNNNNNNNNNNNNNNN ;Use it LD A,(IX+6) ;P/u cyls LD (IY+6),A SRL A ;/2 LD (IY+9),A ;Dir cyl BIT 5,(IX+4) ;Double? JP Z,STMP SET 5,(IY+4) ;Set JP ' ; ;*=*=* ;Entry point after initial tests ;Set IY=>correct DCT type ;*=*=* USER LD IY,DCTAB ;*=*=* ; Request physical drive slot first ;*=*=*MNNNNNNNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNMax w/o double trking OR A SBC HL,BC JR NC,SETTRK SET 5,(IY+4) ;Set double bit SRA B ;Divide by 2 RR C SETTRK LD A,C DEC A ;Offset fm 0 LD (NNNNNNNNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNN JR PRMPT4 GET PRMPT4 LD HL,DRIVE$ ;Request physical drive# CALL GETARG ;Display & get argument SUB '1' ;Convert to binary (0-3) JR C,GETDRV ;Re-request if bad range GNNNNNNNNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNNNIY+6),A ;Store high XOR A ;Clear carry RR C ;Div by 2 LD (IY+9),C ;Dir cyl in center ; LD A,(RESNUM) ;Driver resident? OR A JR NZ,STMP ;SkiNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN ;Shift to 5-7 RRCA RRCA LD B,A ;Save # of LD A,(IY+7) ;P/u # of heads in tab AND 1FH ;Strip what's there OR B ;Merge # of heads LD (IY+7),A ;UpNNNNNNNNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNN ;7.5 is high number except 10 JR NC,RNGERR LD E,A ;Save BCD LD A,D ;Take D*1 ADD A,A ;X2 ADD A,A ;X4 ADD A,D ;X5 ADD A,A NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNdate DCT$+7 init ;*=*=* ; Calculate proper Sectors Per Granule (SPG) ; and Grans per cylinder ;*=*=* LD A,C ;Number of heads ADD A,A LD D,15 ;Sec/gran (-1) LD E,8+1 ;UNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;X10 ADD A,E ;+this one to catch 10.0 JR CHAR ;Get next char ; POINT LD A,(HL) ISCR SLA D ;Number x2 CP '5' JR NZ,NT5 INC D JR IS0 NT5 CP ONNNNNNNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNNse 16 sec/gran w/4 heads BIT 5,(IY+4) ;Unless dbl bit is set JR Z,UPTO4 LD E,4+1 ;Then 2 is max UPTO4 CP E ;More than max heads (x2)? JR C,G1 ;16 sec grans OK if less gNNNNNNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN '0' JR Z,IS0 CP CR RET NZ ;D=number fm 0 to 20 (2*ent ;20 = 10 = 0000 ;Otherwise range fm 1 to 15 = bit setting for WD step ;Test range IS0 LD A,D CP 20 JR NZ,RNG XOR A RET NNNNNNNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN LD D,31 ;Else 32 sec/gran LD A,C ;And G ;D=sec/gran A=#heads*2 if 2 grans/trk or # if 1 gran/trk G1 DEC A ;GPC offset fm 0 RRCA RRCA RRCA ; roll to bits 5-7 NNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNN ;Set 0 if 10 was entered RNG CP 15+1 JR NC,RNGERR ;Bad entry if >15 CP A ;Set Z RET RNGERR OR 0FFH ;Set NZ RET ;*=*=* ; stuf ;*=*=* LDMAX RRCA ;Roll to biv}NNNNNNNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN OR D ; merge sec/gran LD (IY+8),A ; put in DCT ; LD A,(MAXHDS) ;All heads? SUB C ;ALL requested? JR Z,PUTRHD ;0 is starting p ;*=*=* ; If not all heads reNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNts 7-5 RRCA RRCA LD C,A LD A,(IY+7) ;Merge AND 00011111B OR C LD (IY+7),A ;Store max heads RET ;*=*=* ;Driver dependent strings HELLO$ DB LF DB 'TRSHD5 - WD 1000/1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;If bad entry LD C,A CP 00000110 ; 3.0 mS? JR NC,FASTOK ;If 3 or less leave 1st cmd LD A,(STP1) ;Chg if >3.0 AND 11110000B ;Leave command OR C ;Merge step rate bits NNNNNNNNNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNNquested, get starting head ;*=*=* JR PRMPT6 REQSHD CALL ABTJCL ;Quit if JCL PRMPT6 LD HL,STRTHD$ CALL GETARG SUB '1' ;In range? JR C,REQSHD LD C,A ;Save start head UlNNNNNNNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN LD (STP1),A FASTOK LD A,(STP2) AND 11110000B ;P/u command OR C ;Merge step LD (STP2),A ;*=*=* STMP CALL SETMAP ; map out heads in use ;*=*=* ;Request heads for partition ;*=*=* NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN PUSH BC CALL FREE ;Are these heads in use POP JR NZ,REQSHD ;Get again if bad ;*=*=* ; LD A,C ;P/u starting head PUTRHD OR (IY+4) ;Merge user's start LD 4NNNNNNNNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNN JR PRMPT5 REQHD CALL ABTJCL PRMPT5 LD HL,HEADMP$ CALL @DSPLY LD HL,HEADS$ ;Get user input CALL GETAR SUB '1' ;Adjust to binary JR C,REQHD ;Must be > 0 CP XNNNNNNNNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNNN (IY+4),A ;Update init DCT$+4 ;*=*=* CALL INSTALL JP @EXIT ;*=*=* ;Convert ASCII step rate entry to WD bit field ;*=*=* PARSENM LD D,0 ;Clear CHAR LD A,(HL) ;Read one INC HL NNNNNNNNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNN (IY+0) ;Free heads left JR NC,REQHD ;User exceed max? INC A ;Make real LD C,A LD (NUMHDS),A ;Store number for later DEC A ;Offset fm 0 RRCA NNNNNNNNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNN ;=>next CP '.' ;Decimal JR Z,POINT ;Go if found CP CR JR Z,ISCR ;End of line SUB '0' ;Make BCD 0-7 RET C ;Out of range CP 7+1 $NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN oNNNNNNNNNNNNNNNNNNNNNN INC HL PUSH HL ;Save ptr to next entry PUSH BC POP IX ;Xfer to IX LD A,(IX+1) ;Move address of driver LD (IY+1),A ;To new DCT LD A,(IX+2) LD,NNNNNNNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNDCT address INC HL LD D,(HL) ;DE=>DCT INC HL ;=>next pointer PUSH DE POP LD A,(IX) ;Don't use any drive CP 0C9H ; that's disabled JR ZNNNNNNNNNNNNNNNNNNNNNNNDCT for sa SKPTHS DJNZ OLDLP ;Check the rest NTHERE OR 0FFH ;Force NZ RET ; ;*=*=* ;SETMAP ;IY=>New DCT containing Drive address in bits 0-2 of IY+3 ;IY+7 = max heads possible in bits 5-7 ;SeNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNND A,C JR TSTHGH ;Check up to 8 ; NORES LD A,(MAXHDS) ;P/u maximum LD L,A ;Save SUB D ;Calculate the quantity JP Z,NOHEAD ;Go if none remaining ;Find largest group:1NNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNts up Heads in use message ;Sets IY+1&2 to existing driver address if fo ;Sets used bits in (BITMAP) ;Sets (MAXHDS) = total heads ;Sets IY+0 = free heads ;*=*=* ; P/u # of heads on the drive & init checks ;*=*=* SETMAP LD A,(IY+7) ;P/u MaKNNNNNNNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNN of contiguous heads LD BC,0 ;Init count XOR A ;Start w/0 CNTH1 LD H,A ;Save hd CALL BITBIT ;Head available? JR Z,CNTH3 ;Yes, count it LD C,0 PNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN010 - ' DB 'Driver - Version 5.1.4/d',LF DB '(C) 1 DB 'Inc.',LF,CR HDS$ DB 'Enter total number of heads' DB ' on drive <1-8> ',3 TRK$ DB 'Enter physical tracks per surface: ',3 STP$ DB 'EntNNNNNNNNNNNNNNNNNNNNNNN xNNNNNNNNNNNNNNNNNNNNNNximum heads RLCA ;Shift into 0-2 RLCA RLCA AND 7 ;Mask off Max sector # INC LD (MAXHDS),A ;Save for later LD B,A ;*=*=* ; Adjust heads in use message ;*=*=* ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNer step rate for drive: ',3 DRIVE$ DB 'Enter drive select address <' DB '1-4> ',3 ; ;***************************** ;Common subroutines for hard disk drivers ;******************************************* ;*=*=* ; Routine to set a bit in hea'%NNNNNNNNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNN LD HL,INUSE$ LD A,8 SUB B ;Calc index into msg JR Z,GOT8HDS LD B,A PUSH HL ;Save start of message BLP INC HL ;Bump msg pointer 2 INC HL NNNNNNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNd map ;*=*=* SETBIT RLCA ;Shift to "b" field RLCA RLCA OR 0C3H ;Establish as SET b,E LD (SBIT1+1),A ;Alter the OP code RET ;*=*=* ; Routine to test if bit is set in head map ;*=*=* BYNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; bytes per head l DJNZ BLP POP DE ;Recover start of msg LD BC,HEADS$-INUSE$ LDIR ;Reposition message ;*=*=* GOT8HDS LD DE,0 ;Init count & bitmap LD A,(RESNUM)NNNNNNNNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNNITBIT RLCA RLCA RLCA OR 43H ;Construct BIT b,E LD (BBIT1+1),A BBIT1 BIT 0,E RET ; ;*=*=* ; get total heads and cyl count if an existing driver is ; found for this drive select add FNDOLD LD A,(RElNNNNNNNNNNNNNNNNNNNNNNN ^NNNNNNNNNNNNNNNNNNNNNN ;How many active OR A JR Z,NORES LD B,A LD HL,DCTPTR ;=>saved addresses HCLP PUSH BC ;Save loop coun LD C,(HL) INC HL LD B,(HL) ;P/u DCT address 8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNUM) ;Get number of DCTs OR A ;Using this driver JR Z,NTHERE ;If none, prompt LD B,A ;Number to B LD HL,DCTPTR ;=>list of addresses OLDLP LD E,(HL) ;P/u 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 9/NNNNNNNNNNNNNNNNNNNNNNave head number CALL SETBIT ;Turn on reg E bit POP AF ; corresponding to # INC A ;Bump head number DJNZ SETHDS ;Loop for all heads used RET ;*=*=* ; Test if user enRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN count JR GOTMX CNTH3 INC C ;Co LD A,C CP B ;Move highest contiguous JR C,CNTH2 ;Count into B LD B,C ;If B was less JR CNTH2 ;Max of 4 heads if doucNNNNNNNNNNNNNNNNNNNNNNN l|NNNNNNNNNNNNNNNNNNNNNNtry conflicts with head map ;*=*=* FREE LD C,A ;Starting # (-1) LD A,(NUMHDS) ;P/u # of heads ADD A,C ;Add to start posn LD B,A ;Ending head # LD A,(MAXHDS) ;P/NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNble tracking... GOTMX CP 4+1 JR C,SETMX ;OK if 4 or less BIT 5,(IY+4) ;Is double bit set? JR Z,SETMX ;8 OK if not LD A,4 ;Els SETMX LD (IY+0),A ;Save user limiNNNNNNNNNNNNNNNNNNNNNNN _MNNNNNNNNNNNNNNNNNNNNNNu max heads CP B ;Will last head be OK? JR C,BDHD ;Go if bad entry LD A,C ;Retrieve number-1 LD E,0 ;P/u in- BITMAP EQU $-1 LD B,0 ;P/u # of heads usxYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNt ADD A,'0' ;Adjust to ASCII LD (HEADS1$),A ;Update the message ;*=*=* ; Adjust heads in use message ;*=*=* LD HL,INUSE$ LD A,'1' ;Init to head '1' LD B,8 MODHD RRC \NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNer req NUMHDS EQU $-1 TSTHDS LD C,A ;Save for test CALL BITBIT ;Head bit in use? LD A,C JR NZ,ISUSED ;Go if already used INC A ;Bump head pointer DJNZ TSTHDS ]NNNNNNNNNNNNNNNNNNNNNNNOsNNNNNNNNNNNNNNNNNNNNNN E ;If bit set, stuff msg JR NC,$+3 LD (HL INC HL INC HL ;Bump to next pos INC A ;Bump ASCII head # DJNZ MODHD RET ; CNTHDS LD A,(IX) ;Don't use NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;Loop for # of heads XOR A RET ;Z=no confl ISUSED LD HL,HDBAD$ ;Show conflict CALL @DSPLY BDHD OR 0FFH RET ;W/NZ for error ; ;*=*=* ;INSTALL - move driver if necessary eNNNNNNNNNNNNNNNNNNNNNNN|BNNNNNNNNNNNNNNNNNNNNNNany drive CP 0C9H ; that's disabled RET Z LD A,(IX+DRVSEL) ;Check if this matches AND 3 ; the drive # LD C,A ;P/u drive requested LD A AND 3 ;1~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; put JP into (IY) ; move DCT=>IY into address fm (DCTADD) ;*=*=* INSTALL LD (IY),0C3H ;Stuff JP LD A,(RESNUM) OR A ;Is a JR NZ,ISRES ;Then don't re-load ;*=*=* IFDEF LINK ^NNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNCheck if same CP C ;Match up yet? RET NZ ;Skip if different unit ; ; IF ARM!ARMM ; LD A,(IX+5) ;P/u the controller ; CP (IY+5-3) ; address & check ; RET NZ }YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;If driver has LINK defined... CALL INIT ;Init drv before moving driver ; Move @ICNFG vector into driver next ;*=*=* LD A,(@ICNFG) ;Get opcode LD (LINK),A LD HL,(@ICNFG+1) ;Get address !(NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; for a match ; LD A,(IX+7) ;Accumulate the number RLCA ; of heads already RLCA ; in use RLCA AND 7 INC A ;Adjust for zero offset LD NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLD (L ENDIF ; ;*=*=* ; Relocate internal references in driver ;*=*=* LD IX,RELTAB ;Point to relocation tbl LD HL,(HIGH$) ;Find distance to move PUSH HL ;Save HIGH$ LD (DISK+2),HL "NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN B,A ;Set new head set loop ADD A,D LD D,A ;Set new total heads ;*=*=* ; Merge bit map into E reg ;*=*=* LD A,(I AND 0FH ;Remove other junk SETHDS PUSH AF ;S NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Set last byte used LD DE,DISKEND-1 ;Current location PUSH DE OR A SBC HL,DE ;Offset to HL LD B,H ;Move to BC LD C,L LD A,TABLEN ;Get table length RLwsNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Reset for hd in use CNTH2 LD A,H ;Head posn INC A ;Bits are offset fm 0 CP L ;So matching w/maxhds JR NZ,CNTH1 ;Means we are done LD A,B ;Get maxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNk DE LD (HL),E INC IX INC IX DEC A JR NZ,RLOOP ;Loop till done ;*=*=* IFDEF LINK ; Set up @ICNFG ;*=*=* LD HL,INIT ;Get entry pt ADD HL,BC ;Relocate it LjNNNNNNNNNNNNNNNNNNNNNNN [LNNNNNNNNNNNNNNNNNNNNNN0 ADC A,D LD D,A POP HL INC HL ;Next char JR CVDEC DONECON PU POP BC ;Put answer in BC RET ;*=*=* ; Routine to divide HL by C DIV16 LD A,C CALL NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND (@ICNFG+1),HL ;Init address LD A,0C3H LD (@ICNFG),A ;Stuff JP instruction ENDIF ; ;*= ; Move driver ;*=*=* POP HL ;Current posn POP DE ;HIGH$ LD BC,DISKEND-DISK ;Calc driver V2NNNNNNNNNNNNNNNNNNNNNNN h}NNNNNNNNNNNNNNNNNNNNNN @DIV RET ;*=*=* ; Routine to parse user input parameter ;*=*=* GETARG LD B,1 GETARGX CALL @DSPLY ;Display message KEYIN LD HL,KEYBUF$ CALL @KEYIN ;Fetch JP C,ABTJOB ;Break? 7vNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNlength LDDR ;Move it LD (HIGH$),DE ;Reset HIGH$ INC DE ;Move to entry pt LD (IY+1),E ;Driver LSB LD (IY+2),D ;Driver MSB ; ISRES PUSH IY POP HL eNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN LD A,(HL) ;Load value RET ;*=*=* BEGIN LD (DCTADD),DE ;Save passed DCT ptr PUSH DE ;Save DCT address LD HL,HELLO$ CALL @DSPLY ;Welcome the user ;*=*=* ; Check if requeNNNNNNNNNNNNNNNNNNNNNNNxCNNNNNNNNNNNNNNNNNNNNNN ;P LD DE,(DCTADD) ;To requested position PUSH DE ;% LD BC,10 LDIR POP IY ; IY=>real DCT ;*=*=* ; log in correct dir cyl if possible ;*=*=* LD DE,0 ;Read BOOT|=NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNsted drive slot is available ;*=*=* POP DE LD A,(D CP 0C9H ;RET = disabled JP NZ,CANTDO ;No good if not RET ;*=*=* ;Look for existing driver ;*=*=* LD IY,DCT$ ;Start of DCT$ LDNNNNNNNNNNNNNNNNNNNNNNNKrNNNNNNNNNNNNNNNNNNNNNN LD HL,SECBUF CALL READS ;Get if formatted JR NZ,NOFMT LD A,(SECBUF+2) ;Get possible di CP (IY+6) JR NC,NOFMT LD D,A ;Dir cyl CALL READS JR NmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN IX,DCTPTR ;Save matching DCTs LD B,8 ;# of DCTs TSTDCT LD L,(IY+1) LD H,(IY+2) ;Point to driver vector PUSH BC INC HL INC HL ;Point to name le%NNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNZ,NOFMT LD A,'/' LD HL,SECBUF+0DAH ;Date field CP (HL) JR NZ,NOFMT LD HL,SECBUF+0DDH ;Second slash CP (HL) JR NZ,NOFMT LD (IY+9),D ;Stuff correct DIR cyl.. RET READSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNngth INC HL INC HL LD DE,DISK+4 ;Point to this namlen LD A,(DE) ;P/u length & match CP (HL) ; with resident driver JR NZ,NOTRES ;Go if dif lengths INC HL #NNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN LD B,9 ;READ command CALL DOIO RET Z ;Normal status CP 6 ; or DIR cyl OK RET DOIO JP (IY) ;Do it NOFMT LD HL,NOFMT$ CALL @LOGOT RET1cNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Advance to name field INC DE LD B,A ;Set compare length TSTN CP (HL) ; resident vector JR NZ,NOTRES INC DE ;Bump to next char INC HL DJNZ TSTNAM u NNNNNNNNNNNNNNNNNNNNNNN=.NNNNNNNNNNNNNNNNNNNNNN ;% ; ;*=*=* ; Routine to convert ascii =>HL to number in BC ;*=*=* DECHEX LD DE,0 ;Clear to start CVDEC LD A,(HL) ;P/u char CP 10 ;Must be less JR NC,DONECONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;Loop for name length ;Count and save DCT posns w/same driver LD A,(RESNUM) ;Get count so far INC A LD (RESNUM),A PUSH IY POP HL ;DCT address LD (IX),L IN LD (IX),NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOP LD L,(IX) ;Get address to change LD H,(IX+1) LD E,(HL) ;P/U address INC HL LD D,(HL) EX DE,HL ;Offset it ADD HL,BC EX DE,HL LD (HL),D ;And put bacfNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;End if not digit PUSH HL ;Save ascii ptr LD H,D LD L,E ;Merge digit ADD HL,HL ADD HL,HL ADD HL,DE ADD HL,HL EX DE,HL ADD A,E LD E,A LD A,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DCT's using this driver DCTPTR DW 0,0,0,0,0,0,0 ;Addresses LCPTR DW 0 ;Save area for low mem ptr address DCTADD DW 0 ;Address for this DCT SEC KEYBUF$ EQU $ ;*=*=* END BEGIN @NNNNNNNNNNNNNNNNNNNNNNNGgNNNNNNNNNNNNNNNNNNNNNN#45X3 29T!aT4> ͢W~ >W+~XX~0:8; :aT82aT!}( sX> ;:`T!Y͖W!Y͖W:bT<2bTo&]mX*^T|~>( (͢W#͠WàWW!X͊X͏VW!X͊X>~#`CHANGEPAPER DoneXREF filespecObj FilespeNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN max heads CP B ;Will last head be OK? JR C,BDHD ;Go if bad entry LD A,C ;Retrieve number-1 LD E,0 ;P/u in- BITMAP EQU $-1 LD B,0 ;P/u # of heads us{NNNNNNNNNNNNNNNNNNNNNNNT*NNNNNNNNNNNNNNNNNNNNNNcNew fileReplacedBytes in usBytes spar is the first frYee addresLower case permitteLower case converteSure*Z" \String not founBad parameter(sNo such linBuffer fulIllegal commanLine number too largNo text in buffeNo room between lineMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNNISOSYS EDAS-352 XX/XX/XX XX:XX:XX Z Page Parameter errorREFASMCMDP`H`T`DaRnaN[AgiWaFF`[a aEbC^M]U_K_Q`LaII\B_S1[X[Va1p[MEM VPROMPT#XJCL ZABORT jZ!9TF>WZ6!$S"%Tz( @6WP0hV(/NNNNNNNNNNNNNNNNNNNNNNNWYNNNNNNNNNNNNNNNNNNNNNNH INC IX ; NOTRES LD BC,10 ADD IY,BC ;Move to next DCT posn POP BC ;Recover count DJNZ TSTDCT ;Do all 8 ; JP USER ;Go get input ;*=*=* ; Error exits ;*=*=* CANTDO LD NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNdhNNNNNNNNNNNNNNNNNNNNNN HL,CANTDO$ DB 0DDH ABTJOB LD HL,ABTJOB$ DB 0DDH NOHEAD LD HL,NO DB 0DDH BADTOT LD HL,BADTOT$ ABORTL CALL @LOGOT JP @ABORT ; abort instead or re-prompt if JCL running ABTJCL >0NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN1;NNNNNNNNNNNNNNNNNNNNNN PUSH AF PUSH HL LD A,(SFLAG$) BIT 5,A ;JCL active? LD HL,JCLAB$ ;=>msg JR NZ,ABORTL ;Log out POP HL ;Else restore regs POP AF RET ;*=* ; MessagNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNes & Data tables ;*=*=* ; NOFMT$ DB LF,'Note: Drive appears to be unformatted.',CR ;% JCLAB$ DB LF,'Incorrect entry from JCL.',CR HEADMP$ DB 'Heads already in use <' INUSE$ DB '.-.-.-.-.-.-.-.>',CR HEADS$ DB 'Enter"NNNNNNNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNNEDAS3 !Copyright (C) 1980 by Roy SoltoffUW͖W͠Z!$S!X UhD!ZKD!cT!RT[*%T !X!X U%BSXTD:cTW _ !SO!Z(!ZKD*VT 0:cT2cT D J!X0!XÖW$D9͏V6V:a( [XT *ZT#"ZT(~[XT6D %GNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN number of heads for partit HEADS1$ DB 'X> ',3 STRTHD$ DB 'Enter starting head: ',3 HDBAD$ DB 'Heads requested conflict with ' DB 'heads in-use.',CR NOHEAD$ DB 'No heads available on that drive.',CR BADTOT$ DB iNNNNNNNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNN!8T˾ D!cTV˾6W6VG*\T#"\Tp%"\TV%B>͢W͠Zʹ[! Zh[#^#V# *Z[Z!V"Zx !Y!vY9W~#͢W0> !8T~( h(-U45#U (4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpWNNNNNNNNNNNNNNNNNNNNNNZ"S:>T C:V( *h|UU:V!V(2cT!R"VT+"\T$"U*%B|FU@U:VĘ` !1Tw#4~=3k=gj U:V :V(!8T!Y~#͢W˾!3k7XÝd*6Tz(|€h]k!1h͍d!9W:V2:TX!cTvh˶-V2`T:V(Jk>*AT͠W29T͏V~ ͠W-G#~͢Wu##W# NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSկ_W##DM"Z>%d!8T4*Z*Z`>U5>>!R"ZT!Q"\T>2cT!R"VT$"U+"U2aʹ[(- 2aʹ[# 2CTʹ[ ;U3U:cT(o0:a̔b͝U(9WLbGͳ]*Z"Z!:CTx 3]͝U͝U*Zs#r#6T]# 4w#"Z|^+͝Ub͝U ͝UcNNNNNNNNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNN#=(ͤ]>ͳjÕw2`TÐd2:T:V!Vʯj%d1T͏V!=T5 :V(͟VC2V6!3k2'T*1T*4T"4T"+Tgogk"1T2-T:SBw*Z*Ss"Z##~2'T#"%T_"Sd(K(R (k (g* 8dGʉv!3TF(!SF(L dͶdd ?n!;T pmup;mugYdy0ͷ[ !mu7phNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN͝U(6W ͏V!9T6> ͢W ]\Za`i##N#$S\!$S]hV[8 0OxG!b h[A ͠WL 'c͠W ~͢W# 'c͠W{2'TD[f\waE(C ~hV (8w͢W#D ~>!͢W~(͢WͶc>!âWQ6WI(cX(H V6Z)NNNNNNNNNNNNNNNNNNNNNNNP+NNNNNNNNNNNNNNNNNNNNNN ( (: iͶd,- ;( (!x͞e0gYdJu ʹ[[^#~2.T:3T({ 8%8:Sk!0z~#fo{Wugl >*4T*AT͞e07͇w*ATyT :V m ~=h^d~@h^d~#fo~mz~#foCNNNNNNNNNNNNNNNNNNNNNNN`iNNNNNNNNNNNNNNNNNNNNNN Z6Ww ([({(  (z=Zz2'TD[àWz(~#͢W+~!9T ( >͢W55F>͢Wp( !$SB~#͢W:F[/2F[!Y0! YÖWG>!#S#~;'(`8_w#~'(a{_, ] ](}2(@}2X!XÖW!2Yͤ`:[SY22Z*Z[ZRDM!e"Z\ W> G͗NNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN'chV ( Zc~7(#~+w# (8{8ʒO  T]+#w#͢WS( K (!c7hVO܃c~(͢Wܶc8#~ Z!SyUy xU~#A008 :0Ux> Uh3k>*6T#"6TG:>T ͍dx( `*Z͐d>2=TWd!d1RNNNNNNNNNNNNNNNNNNNNNNNSXNNNNNNNNNNNNNNNNNNNNNN^> 7(5*%T~#"%TO > y([0:?<=@[*%T+"%T!'T4\7Y!V"Z7[Z*Z ?0!"Z#8+s#r#N *S88!YÒW\ *S80b\*S^#V+8!YÒWͳ]]ܠZ*Z#:\'TO ##"Z#믕og #DM#"S#"ZNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN:V:V2:T!dɯ2:Tʹ[,>>>od(G;( ( x(gYdͷ[*%T+0%$([>e!A7B0C1D2E3H4L5BC@DEAHLBSPCIXPIYQNZ`ZaNCbPOdPEePfMgAFsIRONeOFFNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNs#r#q#!$Sx, ] ](|(L"S*Z"SDM^#V#^#(`i0"S`i"S bjʹ[ *Z~#fo(!OYÒW8!|]00T])))_ .*Z("*Z#(_T(B( !\*S~#fo]OG>29T> âWwNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNyO ~7#չ  # !G x!"?TDLd d*?Tɷ(>=f'3gf+(- y/O MhYd ( (;( ,()([ *4T$( ul  ogggx "?T+Sg-Mg&\g!(:/(T%(H*(c#(5< *?Tz8 "?TDM z "?T|g}of{^NNNNNNNNNNNNNNNNNNNNNNN5:NNNNNNNNNNNNNNNNNNNNNN*Z8*Z!kYÒW͂^*S"/T͂^*S"1T^"3T[/T*1TR&]"6T*Z^û]͑^ ]\Za*SDM*/T[3TR(R0'*1TR(F8DDM[/TK6T[3T*Z +DM[1T*/T+K6T[3T*Zy^*Z"Z! [!&]*Z6#6͑^, ]\Za^͗^!'T45Sʹ[&]G^_2SF1NNNNNNNNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNNz ?T?Tʹfo&*?T)88, "?TM[?T!})0"?T! [ͷ[0 D(H(O( Q(Be[00eT]_ 0fde eo&d'e0fog*?T"?T?Tͷ[Gefe*GET erroBad labeBranch oK NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT^_2DT[Z͗^(͂^*S^*Z"ZS1T[`*Z[1T###SG# "3T:DTG:S(8.x_*Z#R#DMo&:DTO[3T!FT*Z `ͳ]x_/<*Z#o&*3TR#DMͷ[ʥ^( y(yGX0*Z##~0 w*Z_R"Zx!]͖W!^!-@ʹ[(NNNNNNNNNNNNNNNNNNNNNNN 5NNNNNNNNNNNNNNNNNNNNNNgut of rangIllegal addressing modIllegal opcodMissing informatioNo end statemenMultiple definitioField overfloMultiply defined symboSymbol table overfloTotal errorUndefined symboExpression erroMemory overlay aborteMemory loade!0@õ_is the NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCV&]*U" @ʹ[&]>2cT3U[XT,DU*Z*ZR#]!X͖W*ZR]!X͖W*Z##""S!#SW>H͢W!XÖW>>Uʹ[ >02qB0&]&]ODSͷ[( x2S *Z##^#*Z+0!?YÒW##N#SGy8 # ``2aT2bT<2)@͖WFNNNNNNNNNNNNNNNNNNNNNNNCfNNNNNNNNNNNNNNNNNNNNNN traUhnsfer addresFilespec requireNested *GENested ignoreENDIF without IƠ$MAIN gi*Z"ATw2v2S2>T2a2`Tgo"^T"%B"h!Vw####ʹ[(^-(I,([*%T"%B!V4ʹ[(D-(/, ʹ[(7-("[*%T"h!V4ʹ[(!-( ʹ[(-&]Ͷd!V͞e&]p!h"h>2*T2+m*NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNI͢W_2SN(Y àW!CT4͘`/>a2:T *Z*Z͏V x"Z^#V#29T:CT]^# a͠W~͢W7`>͢W*Z^#V\*S[Z*S*S, ]\*S ] ( !_YÒW&]\[S\ \\[S*S"S>a"Z*Z a~#fo\*S"Z" NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN!$S+BDM(+!$S~G#~bkADCADDANDBIT@CALL CCF?COM&CPCPDCPDRCPICPIRCPL/DAA'DBDECDEFBgxDEFLDEFMDEFSDEFWDIDJNZ DMDSDWEIENDENDIF$EQUERR%EXEXXHA NNNNNNNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNd 'Vo_o d  >2.T@o9ng|?n͵em{_o dĵe  9nVod ( x m{o>2.TxAo_o gp$;d bx ]9nVo>2.Tͻd_n Hx'  2.Tͷ[' onͻd_n( x ?n!.Td TOxwVoxy®NNNNNNNNNNNNNNNNNNNNNNN dNNNNNNNNNNNNNNNNNNNNNNLTvIF IFEQ"IFGT#IFLT!IMININCINDINDRINIINIRJP JR LD@LDDLDDRLDILDIRNEGDNOPORORGOTDROTIROUTgyOUTDOUTIPAGEPOPPUSHRESRET RETIMRETNERLRLARLCRLCARLDoRRNNNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNm_o( ±m>Wwoͻd(   [[fonx(6 }q6:*o9nbo»q6pͻd EnVo21TZqln 49nVox dn>62.Tgqm?nd =x 86ͳno6(qVo;d x( 4!-T6#6Cón x >22.T?n5_n6*Vo _n#_o(6!*oe-o49n >DNNNNNNNNNNNNNNNNNNNNNNN WNNNNNNNNNNNNNNNNNNNNNNRRARRCRRCARRDgRSTSBCSCF7SETSLA SPACESRA(SRL8SUBSUBTTLTITLEXORommmunnnnoojoxooooo&pcpppKrrrrss^t]gztpttt:usssssVdtEDAS3DV1j~z~z!cTwED )`ʹ[ >00&]&]Oʹ[(*%TvNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGwd x o x 6ͻd_n&  odbo( 6*oón6*e-o9n!-T6#6Kʹn>21Te*4T"+T"4T!S6[gr[emoS.Terpu*sJu(j,dͷ[d' ͥr K[erIs ͷ[(@'(͢W55F>͢Wp( !$SB~#͢W:F[/2F[!Y0! YÖWG>!#S#~;'(`8_w#~'(a{_, ] ](}2(@}2X!XÖW!2Yͤ`:[SY22Z*Z[ZRDM!e"Z\ W> G͗vNNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNEs ?n21T{s:S WZreonS.Tpu*sͷ[(, eS.TIs *+T:>T( :1T#=(#"+T"4T2.TG{sx:Vx!S54 6ͺu:1TG!gs.TW#4̠WĤ]:>T!V:;T:3ThYd<23Te͋sVoe͋sz2Smu͜s0>͜s(͜s8(:3ThYd23T 1NNNNNNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNNke"4T"+Tg^d:>Ti:SXw kd!(͵e"+TWu:>T :U>U}U|U!sh͖W!,TWͤ]!h͖WÔj(6 #2`T;{s 6!lu!XÜd:>T $!ͷ[(< !iPͷ[w#>(NNNNNNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN6>!i"^Tlu͜dX:>T :V!V(:(ᯰ(>UxU~#U{s eC͠Wͷ[ ;ͷ[ ( ̴[ (gu;?n>G!>T~== ^+++:V:V+w!,T 3ͺu#~(+ :1TO# ]W*Z`ܠWͤ]W#ͤ]> ͢W:9T ɷNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN( (  @g^d( ws#r!8T*h>H >"2+m:*TG~/( :(͢W #(Gͤ]*Z͓m>* gm<͢W͢W~#o|g͓m~G͗m͠W!8T˾~͢W#~âWdVox?nd(Lbo(G!.T~Fw͵e#slnz 7z*AT [Z]*Z[AT1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#w##4d(0xG!1T4>+= xwbo d( x ͷ[)gYd_n## F#p+es{m!-T6gn(6:1T21T͜m x 21T!.T~Jwͮn6#w͜m!.T6 ( x o;d x!.TwH_ni;d x(  x(?n;d o 7n_n!.T~NNNNNNNNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNNR#DM"AT\>2v*Z[Zr+s+[Sr+s"U+"ZT%#"VT~"Jw!cT[*%T"h:'T2*T!nTͷ[w# dTIU( qwvgYd/2S͔b͝U(!"ZGVbkqw"S{k>2*Tgw2+m!h"haw2S*ZV+^SZ+~+ng:Sww*Z##*AT~_#DM{<xO>Ʀwͷ[,?ndG(goxod8o[5o(( 6ͻdo0n_n9n5oĵe P ~ wVoe*4T##og}$(% /<( =}8g^d>oez ={ 8>dz2.T>21TޫNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN `NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN ENNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN UNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN fNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 7NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN bNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN QNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN3pNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNf#NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNܻNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNE,NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN̅NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN vNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNغNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNb"NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN A-NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNȄNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 'ONNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN7qNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN rcNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN ARNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNQlNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNb]NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN '0NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ESNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN vbNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNf\NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNUmNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN#1NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN QNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN~NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 7NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN qNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN fNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 3NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 5NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN XNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN :NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN66NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN5ENNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN ڎNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNS'NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNʰNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN p(NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN%{NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1DNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN ޏNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNW&NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN t)NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNαNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!zNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN27NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN gNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN wNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN BNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN  sNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN  &NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN  .NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN 6NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! g NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN! T=NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!ݔNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN! ͪNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!DNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!w2NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!"aNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!PNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!nNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN! 2_NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN[] _ a ceNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ٕNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN! c NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!s3NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN! ɫNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!@NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!QNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!&`NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!6^NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN! oNNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNNNNNNNNNNNNNNNNNNNNNNNN! P