> HDInit 1.12  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 ? v1.12 - Display full info by default, Randomise made safe : &87:init:ver$="1.12" Ffx(0,1)<6:fx(130,0)=&FFFF "Must run on BBC I/O processor": 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 6: @ init J1 ctrl%31,mem%511,info%512:X%=ctrl%:Y%=X%256 T4hdsize%=0:big%=0:hd%=0:scsz%=256:safe%=:full%= ^*A%=05114:info%!A%=0::asm:*FX219,9 h r: | ݤmenu 6:" 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%);")" 6full%:safe%:17; full%:"R: Randomise data"; !full%:" 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":safe%:Random:=0 & A$="Z":SetSize:=0 0! A$=9:符-1:scsz%=768-scsz% : A$=9:-1:full%=full% D =A$="X" N: XDriveInfo b " Current drive: ";~hd%; l0hd%<4:dev%=hd%2:" (IDE device ";dev%;")"; v0hd%>3:dev%=hd%8:" (IDE device ";dev%;")"; 7 IFadfs%:IF(hd%AND6)=4:PRINT" (Floppy ";hd%-4;")"; 8 IFadfs%:IF(hd%AND6)=6:PRINT" (Unknown ";hd%-6;")"; )'" 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%427);~d%+1;": ";(A%/409.6)/10;"M":hsz%=hsz%-A% H'd%=d%+2:d%=2 d%=4 d%=8 d%=12 R \: f Drive p9"Enter logical drive (0-B) :"A$:A$>"`":A$=(A$-32) zQ "0123456789AB",A$):hd%=("&"+A$):big%=0:hdsize%=0:A%=05114:info%!A%=0:  :  Invest A%=05114:mem%!A%=0: 0 IFadfs%:IFhd%>3:scsz%=256:PROCScan:ENDPROC 2!addr%=mem%:A%=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 >big%=:info%?&74=0:big%=:info%?&74=info%?&72:info%?&72=0 9hdsize%=(256*info%?&6D+info%?&6C)*info%?&6E*info%?&70  :  Scan +"Scanning drive ";hd%:big%=0:sec%=&800 4 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 8 step%<1:hdsize%=sec%-1: B L: V3ݤscan(sec%): 13;"Drive size: ";sec%4;"K "; `1adfs%:=scsi(&08,mem%,&100,sec%-1,hd%) =-1 j: t SetSize ~F"Enter drive size, use , &, K or M :"A$ $big%=0:A$,1)="&":hdsize%=A$: ,A$,1)="K" A$,1)="k":hdsize%=A$*4: /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 2 <: FInitHADFS P)!X%=1:A%=14:&FFF1: Get today's date Z;A%=0 6:X%?A%=~X%?A%: : Convert BCD to binary d=?X%<81:?X%=19+?X% ?X%=?X%-81 : Offset from 1981 n5today%=(?X% 16)+8*X%?2+256*X%?1+4096*(?X% 15) xEstart%=2:part%:start%=7 : Start free space after ADFS root dskID%=(65535) : /clear : Clear sector 1safe%: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 64mem%!16=dskID%:mem%!20=0 : Disk ID number @3write(&47,hd%) : Write sector &47 J: T/clear : Clear sector ^0safe%:write(&48,hd%) : Write sector &48 h0safe%:write(&49,hd%) : Write sector &49 r: |<"Drive ";hd%;" initialised to 16383K (16M)":delay(200)  : InitADFS 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 0,write(1,hd%) : Write sector 1 :: D8 S%=2 6:clear : Clear sector NEsafe%:read(S%,hd%):clrdir(S%*4-3): Read sector, clear entries XBS%=2:$mem%=0+"Hugo":mem%?5=0 : Directory identifier bAS%=6:$(mem%+204)="$":mem%!214=2 : Dir name, parent l@S%=6:$(mem%+217)="$":$(mem%+227)="" : Directory title vBS%=6:$(mem%+250)=0+"Hugo":mem%?255=0 : Directory identifier 8write(S%,hd%): : Write sector : B"Drive ";hd%;" initialised to ";size%4;"K (";size%4096;"M)" F"**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); 4/A%=0255:mem%?A%=(255)::write(sec%,hd%) >sec%=sec%+1:0: H: RCwrite(sec%,drv%):cmd%=wr%: IFdrv%>3:PROCwriteX(sec%,drv%):E. \Aread(sec%,drv%):cmd%=rd%: IFdrv%>3:PROCreadX(sec%,drv%):E. f@!addr%=mem%:sc%?2=sec%:sc%?1=(sec%&FF00)256:?nm%=1:nm%?1=0 p2drv%<4:sc%?0=((sec%&FF0000)65536)(drv%*32) z'drv%>3:sc%?0=(drv%3)((drv%8)*8) A%=cmd%:A%=0 : 9writeX(sec%,drv%):A%=scsi(&0A,mem%,&100,sec%,drv%) 8readX(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 .6ݤfx(A%,X%): Y%:Y%=X%256:=((&FFF4)&FFFF00)256 8: B#ݤh0(A%,N%)="0000000"+~A%,N%) L"ݤd(A%,N%)=" "+A%,N%) Vݤstr(A%,N%): A$: `$A%?1>31:A$=A$+A%?1 A$=A$+"." j"?A%>31:A$=A$+?A% A$=A$+"." tA%=A%+2:N%=N%-2:N%<1:=A$ ~: asm:mc%=mc%:mc%: &mc% 511:addr%=&80:sc%=&85:nm%=&88 ?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% TAY .idlp LDA &FF:BMI idescape LDA IDEstatus:BMI idlp &TYA: #16:STA IDEhead :\ Device .LDA #&EC :STA IDEcommand :\ &EC=Identify LDY #0:LDX #1:STX nm% CLC:JMP TransferLoop ( .idescape 2RTS <: F.WaitForData P"LDA &FC47: #8:BEQ WaitForData ZLDA &FC47:RTS d: n.WaitNotBusy x6PHP:JSR L806F :\ Get IDE status ; #&80:BNE WaitNotBusy+1:PLP :\ Wait for IDE not busy BIT &CC:RTS : .L806F PHP:LDA &FC47:STA &8D !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 6)JSR WaitForData: #&21:BNE TransError @\.TransferLoop J%BIT &CD:\BVS TransTube:BCC IORead T .IOWrite ^4LDA (&80),Y:STA &FC40:LDA nm%+1:BEQ TransferByte h:INC &81:LDA (&80),Y:STA &FC48:DEC &81:JMP TransferByte r .IORead |4LDA &FC40:STA (&80),Y:LDA nm%+1:BEQ TransferByte :INC &81:LDA &FC48:STA (&80),Y:DEC &81:JMP TransferByte : .TransferByte 5LDA &FC47: #8:BEQ TransError :\ Run out of data :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 ADEY:LDA (&8E),Y:STA &FC44 :\ Set sector b8-b15 @DEY:LDA (&8E),Y:PHA: #&3F:STA &FC45 :\ Set sector b16-b20 =PLA:ROL A:ROL A:ROL A:ROL A :\ Get Drive 0/1 >INY:INY: (&8E),Y: #&02: (&8E),Y :\ Merge Drive and Head FJSR 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 : ]: :