> IDEDump 1.30 & Dump out sectors from IDE device 9 v1.25 - Calculates missing b8-b15 of cylinder count (5 v1.26 - Detects big-endian in drive data 2> v1.27 - move assem to end to ease cut/past from IDEPatch < v1.28 - Tidied up display F6 v1.29 - 16bit access uses 1x512 instead of 2x256 PB v1.29a - FNstr() checked A%/A%?1 but outputted A%/A%?256 !!! Z8 v1.30 - Rearranged keys to allow "L"oad and "S"ave d: nM%=7 x8fx(130,0)<>&FFFF:"Must be run in I/O processor":  11::CloseAll:9: "_":A$=(A$-32) "ITFZXCVNM,.WD07HLS ",A$) A$="I":id  IFA$="C":PROCcalc A$="T":test A$="F":half%=half%&100 "IT"+0,A$)=0 A$="N":head%=(head%-1)3 A$="M":head%=(head%+1)3 #A$=".":sector%=(sector%+1)255 #A$=",":sector%=(sector%-1)255 ")A$="C":cylinder%=(cylinder%-1)&FFFF ,)A$="V":cylinder%=(cylinder%+1)&FFFF 6,A$="Z":lau%=(lau%-1)(lau%>1):LAUtoCHS @+A$="X":lau%=(lau%+1)&FFFFFF:LAUtoCHS JA$="W":sz%=sz%1:Help TA$="D":dev%=dev%1 ^'A$="0":M%=&80:M%:Help:mem%=data% h%A$="7":M%=7:M%:Help:mem%=&7C00 rXA$=" ":" Go to sector: &"A$:11;(38);13;:A$<>"":lau%=("&"+A$):LAUtoCHS:A$="" |A$=13:count%=count%+1 A$="_":count%=count%-1 A$="H":cls:Help A$="S":save::Help A$="L":load::Help 0: : cls:M%=&80: )0,17);:A%=17:(39)::7,11);: $Display:8-(M%7),17-(M%3)); +"Sector:";h0(lau%,6);2;"D:";dev%;2; C"C:"h0(cylinder%,4);2;"H:"h0(head%,2);2;"S:"h0(sector%,2) ,'(16);13;:res%255:" Error: ";~res% M%=7:0,23);: dump(mem%):0,23);: : !Help:7-(M%7),18-(M%3)); &>d(sz%*8+8,3);"bit";2;"<-ZX-> D <-CV-> <-->"' 0." Goto sector W: Toggle width" :>" I: Investigate device T: Test speed":M%=&80:40,20); D=" F: High/low 256 bytes L: Load data":M%=&80:40,21); NA" ";7-(M%7);": Screen mode ";7-(M%7);" S: Save data" X&M%=7:0,13);147;38,",")''''''' b l: vX VDU13:PRINT"Status: &"FNh0(A%,4)" Data: &"FNh0(!mem%,8)" ";count%:IFM%=7:ENDPROC : dump(mem%) !30:A%=half% half%+255 16 Eh0(cylinder%,4)":"h0(head%,1)":"h0(sector%,2)" "h0(A%,4)" "; * B%=A% A%+15:h0(mem%?B%,2);" ";: 8 B%=A% A%+15:C%=mem%?B%:C%=127 C%<32:46 C% :A%<&1F0: : : Read:CHStoLAU q!addr%=mem%:sec%?2=lau%:sec%?1=(lau%&FF00)256:sec%?0=(lau%&FF0000)65536:?num%=count%:num%?1=sz%:res%=rd%  : Write:CHStoLAU  n!addr%=mem%:sec%?2=lau%:sec%?1=(lau%&FF00)256:sec%?0=(lau%&FF0000)65536:?num%=1:num%?1=sz%:res%=wr%: :  ECHStoLAU:lau%=(sector%-1)+64*head%+256*cylinder%+dev%*&400000: *: 4ULAUtoCHS:sector%=(lau%63)+1:head%=(lau%&C0)64:cylinder%=(lau%&3FFFFF)256: >: H#ݤh0(A%,N%)="0000000"+~A%,N%) R"ݤd(A%,N%)=" "+A%,N%) \: fid: A%:cls p/ A%=0 255 4:mem%!A%=0:mem%!(A%+256)=0: z+!addr%=mem%:A%=dev%*16:num%?1=sz%: id% Bsz%=0: A%=255 0 -1:mem%?(A%*2+1)=0:mem%?(A%*2)=mem%?A%:  mem%?&75=mem%?&6E :big%=:mem%?&74=0:big%=:mem%?&74=mem%?&72:mem%?&72=0 mem%?&3+mem%?&6D+mem%?&73=0:mem%?&6D=mem%?&74:mem%?&73=mem%?&6C:tot%=(256*mem%?&6D+mem%?&6C)*mem%?&6E*mem%?&70:mem%?&3=(tot%((mem%?6)*(mem%?12)))256 !mem%?&79=0:mem%?&79=mem%?&6C  info: : info:0,24-(M%7)); C" Physical: C:&";hex(mem%+2);" H:";d(mem%?6,2);" S:";mem%?12 H" Logical: C:&";hex(mem%+&6C);" H:";d(mem%?&6E,2);" S:";mem%?&70 Btot%=mem%!&78: tot%=(256*mem%?&6D+mem%?&6C)*mem%?&6E*mem%?&70 tot%=mem%!&78 @" Size: &";hex(mem%+&7A);hex(mem%+&78);(32-10*big%); Amem%?&73+mem%?&75:;" ";tot%4;"K";" ";tot%4096;"M ";127; #'" Serial: "str(mem%+20,10) !" Firmware: "str(mem%+46,4) $"" Model: "str(mem%+54,20) . 8: B7calc: A%,P%,L%:id:size%=65536*mem%?116+mem%?114 L&matches%=0:log%=-1:0,27-(M%4)); V L%=0 255:11,11,11,11,11 `0"Logical: C:&";h0(L%,2)'''''"Total &"; j,tot%=(L%*256+mem%?&6C)*mem%?&6E*mem%?&70 t1h0(tot%,8);" ";tot%4;"K";" ";tot%4096;"M" ~W(tot%&00FF00FF)=size%:"Match at ";tot%4096;"M";13;:matches%=matches%+1:log%=L% 11::(38)'(30);:13,11 -matches%<>1:"Couldn't calculate size": 4L%=log%:tot%=(L%*256+mem%?&6C)*mem%?&6E*mem%?&70 :P%=tot%((mem%?6)*(mem%?12)):mem%?3=P%256:mem%?&6D=L% Bmem%?&73=(tot%&FF00)256:mem%?&75=(tot%&7F000000)(&1000000) ((20);13;:11,11,11,11,11,11:info  :  ݤhex(A%): A$:A$=h0(?A%,2) $A%?1:=h0(A%?1,2)+A$ ="xx"+A$ : ݤstr(A%,N%): A$: $A%?1>31:A$=A$+A%?1 A$=A$+"."  "?A%>31:A$=A$+?A% A$=A$+"." A%=A%+2:N%=N%-1:N%<1:=A$ : (ideInit:ideSize(64,3): 2ideSize(spt%,hds%) <?&FC42=spt%:?&FC43=spt% F2?&FC46=hds%:?&FC47=&91: Initialise parameters P Z: d rdMax n?&FC46=0:?&FC47=&F8 x?&FC47<128 /?&FC47 1: ?&FC41 4:"Not supported": J"Max: C:&";h0(?&FC45,2);h0(?&FC44,2);" H:";?&FC46 15;" S:";?&FC43  : 0test:cls:"Test transfer speed";:max%=256 oldlau%=lau%:T%=: lau%=0 max%-1:!addr%=mem%:sec%?2=lau%:sec%?1=(lau%&FF00)256:sec%?0=(lau%&FF0000)65536:?num%=count%:num%?1=sz%:U%=:A%=rd%:U%=-U%::T%=-T% ?13:"Transfered ";max%*256*(sz%+1);" bytes in ";T%/100;"s" J"Speed: ";max%*256*(sz%+1)(T%/100);"cps over ";max%;" sectors" E"Burst speed: ";25600*(sz%+1)U%;"cps per ";256*(sz%+1);" bytes" lau%=oldlau%:11,11,11: :  A%=0 254:sum%=sum%+mem%?A%:sum%>255:sum%=(sum%+1)&FF h:=sum%&FF r: |)ݤbyte(A%,X%,Y%)=((&FFF4)&FF00)256 6ݤfx(A%,X%): Y%:Y%=X%256:=((&FFF4)&FFFF00)256 :  asm mc%=mc%:mc%=0:mc% 511 8addr%=&80:sec%=&85:cmd%=&84:num%=&88:ptr%=&8E:res%=0 ?IDEdata=&FC40:IDEerror=&FC41:IDEcount=&FC42:IDEsector=&FC43 DIDEcylinder=&FC44:IDEhead=&FC46:IDEstatus=&FC47:IDEcommand=&FC47 !IDEdata<>IDEdata!8:sz%=1  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 num% 0CLC:JMP TransferLoop : .idescape DRTS N: X.WaitForData b"LDA &FC47: #8:BEQ WaitForData lLDA &FC47:RTS v: .WaitNotBusy 6PHP: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 cmd%:CLC:BCC CommandStart /.wr%:LDA #&0A:STA cmd%:SEC:BCS CommandStart : A.CommandStart :\ C=R/W, ptr%=>block  :LDA #addr%-1:STA ptr%:LDA #0:STA ptr%+1 :\ ptr%=>block PHP:JSR SetGeometry:PLP  .CommandLoop *LDX #2:.Twice 4BJSR SetSector:LDY #0 :\ Set sector, count, command >.TransferLoop H)JSR WaitForData: #&21:BNE TransError R\.TransferLoop \%BIT &CD:\BVS TransTube:BCC IORead f: p .IOWrite zLDA num%+1:BEQ IOWrite8bit #INY:LDA (addr%),Y:STA &FC48:DEY LDA (addr%),Y:STA &FC40 "INC addr%:BNE P%+4:INC addr%+1 JMP TransferByte .IOWrite8bit ,LDA (addr%),Y:STA &FC40:JMP TransferByte :  .IORead 7LDA &FC40:STA (addr%),Y:LDA num%+1:BEQ TransferByte "INC addr%:BNE P%+4:INC addr%+1 ,LDA &FC48:STA (addr%),Y:JMP TransferByte : .TransferByte 5LDA &FC47: #8:BEQ TransError :\ Run out of data @INY:BNE TransferLoop :\ Loop for 256 bytes/words 3LDA &FC47: #&21:BNE TransError:\ Error occured $BDEX:BEQ Next :\ Done twice, do next sector .=LDA num%+1:BEQ Twice :\ 8-bit, addr unchanged 8FDEC addr%+1:JMP Twice :\ Step addr back, do second pass B: L .Next V8INC sec%+2:BNE TransCount :\ Increment sector `&INC sec%+1:BNE TransCount:INC sec% j.TransCount tDINC addr%+1:DEC num%:BNE CommandLoop :\ Loop for all sectors ~?LDA #0 :\ Done, no errors .TransError LDX &FC47:LDA &FC41:RTS : .SetGeometry CJSR WaitNotBusy :\ Should check device DLDA #64:STA &FC42:STA &FC43 :\ 64 sectors per track %LDA sec%:LSR A:LSR A:A #3: #&13 =STA &FC46:LDA #&91:STA &FC47 :\ 4 heads per cylinder RTS : .SetSector GPHP:JSR WaitNotBusy :\ Save CC/CS Read/Write &20 or CC->&30 dFSTA &FC47:PLP:RTS :\ Set command &08 or &0A n: x .SetDrive GROL A:ROL A:ROL A: #&13:STA &FC46:RTS :\ Set device + sector b6-b7 : ]: -CloseAll:in%=in%:in%:A%=in%:in%=0:#A% 'out%=out%:out%:A%=out%:out%=0:#A%  Jgbpb(A%,ch%,ad%,nm%,pt%):?X%=ch%:X%!1=ad%:X%!5=nm%:X%!9=pt%:&FFD1: -save:cls:" Save data from IDE device" ҂" File to save to: "f$:" Start sector: &"s$:" Number of sectors: "n$:SC%=("&"+s$):NM%=n$:out%=(f$):13;" ";h0(SC%,6); =lau%=SC%:LAUtoCHS:Read:gbpb(2,out%,mem%,256+256*sz%,0) .SC%=SC%+1:NM%=NM%-1:NM%<1:#out%:out%=0: +load:cls:" Load data to IDE device" a" File to load from: "f$:" Start sector: &"s$:SC%=("&"+s$):in%=(f$):13;" ";h0(SC%,6); =lau%=SC%:LAUtoCHS:gbpb(4,in%,mem%,256+256*sz%,0):Write "SC%=SC%+1:#in%:#in%:in%=0: