> HDInit 1.11  Initialise IDE hard drive $ v1.02 - Drives 0-7 all allowed (; v1.03 - Drive reversably initialised, selects drive 0 24 v1.04 - Allows drive size to be set explicitly <. v1.05 - Displays sizes in M as well as K F2 v1.06 - Wipes full root if 'safe' turned off P& v1.07 - Full drive investigation Z v1.08 - Partitions d v1.09 - New FNsum routine n9 v1.10 - Displays full firmware info and device type x* v1.11 - Allows ADFS/HADFS partitions : &87:init:ver$="1.11" adfs%=: adfs%= #adfs%:fs%=fs:fs%<>8:"FADFS" adfs%:"MOUNT 0" %adfs%:fs%<>8:"FX143,18,"+ fs% hadfs%=: hadfs%= %hadfs%:fs%=fs:fs%<>16:"HADFS" 'hadfs%:fs%<>16:"FX143,18,"+ fs% fs%=16 adfs%:hd%=4  err:end: &87: menu:end: :  end:: : ݤerr:::A%=(100):=-1 ": , init 61 ctrl%31,mem%511,info%512:X%=ctrl%:Y%=X%256 @-hdsize%=0:hd%=0:safe%=:scsz%=256:full%= J*A%=05114:info%!A%=0::asm:*FX219,9 T ^: h ݤmenu r6:" BBC IDE Hard Drive Initialiser "ver$'38,"=") |DriveInfo .'"D: Select drive I: Investigate drive" + "S: Scan for size Z: Set drive size" H "F: Format drive W: Wipe data (";"on",safe%);"off",safe%);")" 3full%: "R: Randomise data Toggle width" $'6"Press a key or X to exit:"; ] A$=: 9+"*DdIiFfWwRrSsXxZz",A$):13;32;13;: A$="*" "*"A$: A$: A$="":A$="*" A$=( A$&DF)  A$="D":Drive:=0  A$="F":Format:=0  A$="I":Invest:=0  A$="S":Scan:=0  A$="W":safe%=safe%:=0  A$="R":Random:=0  A$="Z":SetSize:=0 ! A$=9:符-1:scsz%=768-scsz%  A$=9:-1:full%=full% & =A$="X" 0: :DriveInfo D " Current drive: ";~hd%; N0hd%<4:dev%=hd%2:" (IDE device ";dev%;")"; X0hd%>3:dev%=hd%8:" (IDE device ";dev%;")"; b7 IFadfs%:IF(hd%AND6)=4:PRINT" (Floppy ";hd%-4;")"; l8 IFadfs%:IF(hd%AND6)=6:PRINT" (Unknown ";hd%-6;")"; v)'" Device width: ";scsz%32;" bits" Afull%: " Model: "str(info%+54,20)'12;str(info%+74,20) *full%: " Firmware: "str(info%+46,8) +full%: " Serial: "str(info%+20,20) E'" Total sectors: &";h0(hdsize%,8)" (";(hdsize%/204.8)/10;"M)" R " Physical size: C:&";h0(info%!&02,4);" H:";d(info%?&06,2);" S:";info%?&0C R " Logical size: C:&";h0(info%!&6C,4);" H:";d(info%?&6E,2);" S:";info%?&70 G " 8-bit Size: ";d(hdsize%4,8);"K (";(hdsize%/409.6)/10;"M)" 'hd%<4:Info(hd%,14,&200000,"ADFS") 'hd%>3:Info(hd%,12,&10000,"HADFS") 38,"="): : "Info(d%,m%,sz%,fs$):d%=d%m% ( " ";fs$;" drives:";:hsz%=hdsize%: A%=sz%:hsz%: H Drive R9"Enter logical drive (0-B) :"A$:A$>"`":A$=(A$-32) \J "0123456789AB",A$):hd%=("&"+A$):hdsize%=0:A%=05114:info%!A%=0: f p: zInvest: Y% A%=05114:mem%!A%=0: 0 IFadfs%:IFhd%>3:scsz%=256:PROCScan:ENDPROC 2!addr%=mem%:Y%=dev%*16:nm%?1=scsz%256-1: id% CA%=0 255:info%?(A%*2)=mem%?A%:info%?(A%*2+1)=mem%?(A%+256): info%?3+info%?109+info%?115=0:info%?109=info%?116:info%?115=info%?108:A%=(256*info%?109+info%?108)*info%?110*info%?112:info%?3=(A%((info%?6)*(info%?12)))256 hdsize%=info%!&72  :  Scan "Scanning drive ";hd% >sec%=&800: sec%=sec%+sec%: scan(sec%)<>0 sec%>&1FFFFF step%=sec%2:dir%=-1: 'sec%=sec%+step%*dir%:A%=scan(sec%) )step%=step%2: A%=0:dir%=1 dir%=-1  step%<1:hdsize%=sec%-1:  $: .3ݤscan(sec%): 13;"Drive size: ";sec%4;"K "; 81adfs%:=scsi(&08,mem%,&100,sec%-1,hd%) =-1 B: L SetSize VF"Enter drive size, use , &, K or M :"A$ `A$,1)="&":hdsize%=A$: j,A$,1)="K" A$,1)="k":hdsize%=A$*4: t/A$,1)="M" A$,1)="m":hdsize%=A$*4096: ~hdsize%=A$256: :  Format: hdsize%<1:Invest #max%=&200000:hd%>3:max%=&10000 -size%=hdsize%:(hd%5)=1:size%=size%-max% size%>max%:size%=max% 9size%<0:"No space on for drive ";hd%;:delay(200): /size%<&1000:"This appears to be a floppy" Q"Format ";"H",hd%>3);"ADFS drive ";hd%;" to ";size%4;"K (";size%4096;"M)" SA$="":(hd%3)=0 hd%=2:"Leave space for ";"H",hd%<4);"ADFS system? ";:""A$ !part%=A$,1)="Y" A$,1)="y" S"Format? Enter YES to confirm: "A$: A$<>"YES":"Not formatted";:delay(200): hd%<4:InitADFS hd%>3:InitHADFS   : InitHADFS ()!X%=1:A%=14:&FFF1: Get today's date 2;A%=0 6:X%?A%=~X%?A%: : Convert BCD to binary <=?X%<81:?X%=19+?X% ?X%=?X%-81 : Offset from 1981 F5today%=(?X% 16)+8*X%?2+256*X%?1+4096*(?X% 15) PEstart%=2:part%:start%=7 : Start free space after ADFS root ZdskID%=(65535) d: n/clear : Clear sector x1safe%:read(&46,hd%) : Read sector &46 0$mem%="IDEDISK"+hd%+" ": Disk title .$(mem%+16)=0+"(C)JGH"+0: Disk ID string 4mem%!24=dskID% : Disk ID number 6mem%!26=today% : Disk format date 9mem%!28=&411DFFFC : Disk size and flags ?mem%!32=start%:mem%!34=&46-start% : First free space entry =mem%!36=&4A:mem%!38=&FFFC-&4A : Second free space entry ;mem%!40=0 : End of free space map 3write(&46,hd%) : Write sector &46 : /clear : Clear sector 1safe%:read(&47,hd%) : Read sector &47 4$mem%="$ " : Directory name 6mem%!10=&47:mem%!14=0 : Parent directory 4mem%!16=dskID%:mem%!20=0 : Disk ID number 3write(&47,hd%) : Write sector &47 ": ,/clear : Clear sector 60safe%:write(&48,hd%) : Write sector &48 @0safe%:write(&49,hd%) : Write sector &49 J: T<"Drive ";hd%;" initialised to 16383K (16M)":delay(200) ^ h: rInitADFS |Astart%=7:part%:start%=&40000 : Start free space after HADFS : *clear : Clear sector :mem%!0=start% : Start of first free space @mem%!252=size% : Total number of sectors on disk ,mem%?255=0:mem%?255=sum : FSM checksum ,write(0,hd%) : Write sector 0 : *clear : Clear sector ;mem%!0=size%-start% : Length of first free space &mem%!251=(65535) : Disk ID 1mem%?253=0 : Disk boot option Amem%?254=3 : Pointer to end of free space map ,mem%?255=1:mem%?255=sum : FSM checksum ,write(1,hd%) : Write sector 1 : 8 S%=2 6:clear : Clear sector &Esafe%:read(S%,hd%):clrdir(S%*4-3): Read sector, clear entries 0BS%=2:$mem%=0+"Hugo":mem%?5=0 : Directory identifier :AS%=6:$(mem%+204)="$":mem%!214=2 : Dir name, parent D@S%=6:$(mem%+217)="$":$(mem%+227)="" : Directory title NBS%=6:$(mem%+250)=0+"Hugo":mem%?255=0 : Directory identifier X8write(S%,hd%): : Write sector b: lB"Drive ";hd%;" initialised to ";size%4;"K (";size%4096;"M)" vF"**WARNING** You *MUST* reset ADFS to"'"prevent disk corruption." delay(200): : )clear: A%=0 255 4:mem%!A%=0:: 1clrdir(O%): A%=O% 255 26:mem%?A%=0:: : ݤsum: sum%:sum%=255 . A%=254 0 -1:sum%=(sum%+sum%256)255 !sum%=sum%+mem%?A%::=sum%255 :  Random +"Randomise contents of drive ";hd%;"?" L"Enter YES to confirm: "A$: A$<>"YES":"Not randomised";:delay(200): ("Press ESCAPE to terminate ";  sec%=0:6,8);h0(sec%,6);  /A%=0255:mem%?A%=(255)::write(sec%,hd%) sec%=sec%+1:0:  : *Cwrite(sec%,drv%):cmd%=wr%: IFdrv%>3:PROCwriteX(sec%,drv%):E. 4Aread(sec%,drv%):cmd%=rd%: IFdrv%>3:PROCreadX(sec%,drv%):E. >@!addr%=mem%:sc%?2=sec%:sc%?1=(sec%&FF00)256:?nm%=1:nm%?1=0 H2drv%<4:sc%?0=((sec%&FF0000)65536)(drv%*32) R'drv%>3:sc%?0=(drv%3)((drv%8)*8) \A%=cmd%:A%=0 f: p9writeX(sec%,drv%):A%=scsi(&0A,mem%,&100,sec%,drv%) z8readX(sec%,drv%):A%=scsi(&08,mem%,&100,sec%,drv%) ) A%:"Disk error &";~A%;:delay(200)  : "delay(T%):T%=+T%: >T%: : ,ݤscsi(cmd%,addr%,num%,sect%,drv%): fs% fs%=fs: fs%<>8:"FADFS" DX%?0=0:X%!1=addr%:X%?5=cmd%:X%?6=drv%*32+((sect%&1F0000)65536) @X%?7=((sect%&FF00)256):X%?8=sect%:X%!9=num%256:X%!11=num% 4A%=114:&FFF1:A%=?X%: fs%<>8:"FX143,18,"+ fs% =A% : !ݤfs: A%,Y%,E%:=(&FFDA)&FF : #ݤh0(A%,N%)="0000000"+~A%,N%) "ݤd(A%,N%)=" "+A%,N%) $ݤstr(A%,N%): A$: .$A%?1>31:A$=A$+A%?1 A$=A$+"." 8"?A%>31:A$=A$+?A% A$=A$+"." BA%=A%+2:N%=N%-2:N%<1:=A$ L: Vasm:mc%=mc%:mc%: `Joffset%=0: Offset from logical ADFS cylinder to physical IDE cylinder j&mc% 511:addr%=&80:sc%=&85:nm%=&88 t?IDEdata=&FC40:IDEerror=&FC41:IDEcount=&FC42:IDEsector=&FC43 ~DIDEcylinder=&FC44:IDEhead=&FC46:IDEstatus=&FC47:IDEcommand=&FC47 "!IDEdata<>IDEdata!8:scsz%=512 P=0 1 P%=mc%:[OPT P*2 .id% LDA &FF:BMI idescape LDA IDEstatus:BMI id% &TYA: #16:STA IDEhead :\ Device .LDA #&EC :STA IDEcommand :\ &EC=Identify LDY #0:LDX #1:STX nm% CLC:JMP TransferLoop .idescape RTS : .WaitForData "LDA &FC47: #8:BEQ WaitForData LDA &FC47:RTS (: 2.WaitNotBusy <6PHP:JSR L806F :\ Get IDE status F; #&80:BNE WaitNotBusy+1:PLP :\ Wait for IDE not busy PBIT &CC:RTS Z: d .L806F nPHP:LDA &FC47:STA &8D x!LDA &FC47:CMP &8D:BNE L806F+1 PLP:RTS : ..rd%:LDA #&08:STA &84:CLC:BCC CommandStart ..wr%:LDA #&0A:STA &84:SEC:BCS CommandStart : ;.CommandStart :\ C=R/W, &8E/F=>block 4LDA #&7F:STA &8E:LDA #0:STA &8F :\ &8E/F=>block PHP:JSR SetGeometry:PLP .CommandLoop LDX #2:.Twice BJSR SetSector:LDY #0 :\ Set sector, count, command .TransferLoop )JSR WaitForData: #&21:BNE TransError \.TransferLoop %BIT &CD:\BVS TransTube:BCC IORead  .IOWrite "4LDA (&80),Y:STA &FC40:LDA nm%+1:BEQ TransferByte ,:INC &81:LDA (&80),Y:STA &FC48:DEC &81:JMP TransferByte 6 .IORead @4LDA &FC40:STA (&80),Y:LDA nm%+1:BEQ TransferByte J:INC &81:LDA &FC48:STA (&80),Y:DEC &81:JMP TransferByte T: ^.TransferByte h5LDA &FC47: #8:BEQ TransError :\ Run out of data r:INY:BNE TransferLoop:\INC &81 :\ Loop for 256 bytes |3LDA &FC47: #&21:BNE TransError:\ Error occured DEX:BNE Twice 8INC &87:BNE TransCount :\ Increment sector "INC &86:BNE TransCount:INC &85 .TransCount CLC:LDA (&8E),Y: #63:ADC #1:STA &FC43 :\ Set sector b0-b5 NADEY:LDA (&8E),Y:ADC #offset%:STA &FC44 :\ Set sector b8-b15 XEDEY:LDA (&8E),Y:PHA: #&3F:ADC #0:STA &FC45 :\ Set sector b16-b20 b=PLA:ROL A:ROL A:ROL A:ROL A :\ Get Drive 0/1 l>INY:INY: (&8E),Y: #&02: (&8E),Y :\ Merge Drive and Head vFJSR SetDrive:DEY:DEY:DEY:LDA (&8E),Y :\ Get command &08 or &0A .SetCommand < #2:PHA: #2:LSR A:LSR A :\ Copy ~b1 into Cy KPLA:ASL A:ASL A:ASL A:A #&20 :\ Translate CS->&20 or CC->&30 FSTA &FC47:PLP:RTS :\ Set command &08 or &0A : .SetDrive GROL A:ROL A:ROL A: #&13:STA &FC46:RTS :\ Set device + sector b6-b7 : ]: :