2 IBM disc dump utility program by Mark Holmes  Main program loop 7  buffer &1500 (buffer=(buffer+&FF) &FF00 2 setup < F2 prompt("Press D(ir), F(iledump) or Q(uit)") P K%= &DF Z" K%="D":display_directory n K%="F":file_dump x K%="Q" 7  " Print out IBM disc directory display_directory  )cluster=get_dir("display directory")  ,% Dump contents of file to screen 6file_dump @ 28,3,24,39,24,12 J! 4);"Enter Filename: "name$ T 28,0,23,39,2 ^prompt(name$) h r*cluster=get_dir(name_convert(name$)) |X cluster=-1: 10,5);name$;" not found":prompt("Press any key to continue"):K%=: Y cluster=0: 10,5);name$;" has no data":prompt("Press any key to continue"):K%=: block_address%=0   convert(cluster) $ cluster=next_cluster(cluster) ' dump(buffer,&200,block_address%) ( block_address%=block_address%+&200  cluster>&FEF  # Loop until WD1770 is not busy  wait $:((?status_reg) busy_bit)<>1  X read sector from disc b,read_sector(side,track,sector,address) l@ address<>0:?(save+1)=address 256:?(save+2)=address 256 v6 side=1:value=(value &10) value=(value &EF) ?dr_ctrl_reg=value ?data_reg=track ?comm_reg=&19  wait ?track_reg=track double ?sector_reg=sector ?comm_reg=&84  wait Q ((?status_reg) error_bit)=&10:"DATA ERROR: ";side;" ";track;" ";sector: ?track_reg=track   , Initialise disc drive control register *#disc_init(drive,side,density) 4 value=4 >+ drive=1:value=value+2 value=value+1 H side=1:value=value+&10 R density<>2:value=value+&20 \?dr_ctrl_reg=value f?comm_reg=&09 p wait z & Search for filename in directory ݤget_dir(search$) I=dir_buffer   ?I<>&E5:B=show_name  I=I+32 , (I=dir_buffer+112*32) (?I=0) B<>-1 =B - Compare search name to directory entry, ? Return cluster number or -1 if no file or 0 if empty file ݤshow_name  fname$=""  J=0 10  fname$=fname$+(I?J)  $fat=(I!26) &FFFF .B search$="display directory":fname$,8);".";fname$,3);" "; 8 =2: 13 B fname$=search$:=fat =-1 4 Return next cluster from file allocation table ݤnext_cluster(start) (fat_entry=fat_buffer!((start 2)*3) byte1=fat_entry &FF "byte2=(fat_entry &FF00)/&100 &byte3=(fat_entry &FF0000)/&10000  , start 2=0:=byte1+((byte2 &F)*&100) ( start 2=1:=byte2/&10+(byte3*&10) 6 convert cluster number to physical disc location convert(cluster_no) #log_sector =(cluster_no-2)*2+12 $phys_side =(log_sector 9) 2 &log_track =(log_sector (9 * 2)) $phys_sector=(log_sector 9) + 1 8read_sector(phys_side,log_track,phys_sector,buffer)   dump data to screen )dump(where%,how_much%,file_offset%) ( I%=where% where%+how_much%-8 8  @%=6 . (129);~file_offset%+I%-where%,(135);  @%=1  J%=0 7 - ~(I%?J% &F0)/&10,~I%?J% &F," ";   (8);(131);  J%=0 7 5 (I%?J%>31) (I%?J%<127):(I%?J%); ".";  " , 6 3 Set up variables, load directory and fat etc.  setup %A%=0:X%=1:A%=((&FFF4)&FF00)256 )machine$="MASTER":A%=2:machine$="B+" 0 A%>2:dr_ctrl_reg=&FE24 dr_ctrl_reg=&FE80 0 A%>2:WD1770_addr=&FE28 WD1770_addr=&FE84 comm_reg=WD1770_addr status_reg=WD1770_addr track_reg=WD1770_addr+1 sector_reg=WD1770_addr+2 data_reg=WD1770_addr+3 busy_bit=&01 error_bit=&10  opt%=0 2 2  P%=&D00 : NMI adress  [OPT opt% (4 PHA \ save accumulator on stack 24 LDA status_reg \ get status register value &F9:double=2 "read_sector(0,0,2,fat_buffer) read_sector(0,0,3,0) read_sector(0,0,4,0) read_sector(0,0,5,0) :read_sector((dir+0) 9,0,((dir+0) 9)+1,dir_buffer) 1read_sector((dir+1) 9,0,((dir+1) 9)+1,0) 1read_sector((dir+2) 9,0,((dir+2) 9)+1,0) 1read_sector((dir+3) 9,0,((dir+3) 9)+1,0) 1read_sector((dir+4) 9,0,((dir+4) 9)+1,0) 1read_sector((dir+5) 9,0,((dir+5) 9)+1,0) 1read_sector((dir+6) 9,0,((dir+6) 9)+1,0)  p' Place message at bottom of screen zprompt(message$)  28,3,24,39,24,12 & (34-(message$))/2,0);message$;  28,0,23,39,2  X, Convert filename into directory format bݤname_convert(string_in$) lI%=string_in$+".",".") v0string_out$=string_in$,I%-1)+9-I%," "),8) 6string_out$=string_out$+string_in$,I%+1)+" ",3) =string_out$  tT[