I wrote this in 1989-1990 and published it on 11th November 1992 (!), and found it again, still on the U-Mich Atari ST Archive. Here is the documentation file:BPB-37.TOS by Domenico De Vitto <ddv@uk.ac.bton.unix> (only till 1/7/1995)
Well this the first bit o' program that I am going to fling into the big wide world, and I'm only doing it because I'm off ill and this is one (the one ?) bit of program that works 100% and cannot be improved (I think ...) that I have ever wrote. First it was written many years ago (1989-1990???), not based or idea copied from anything, it simply tells you all about the boot sector details of a drive and also gets the lower-screen-half from the TOS, in case you need to compare the details.
As you all thought that was a copyright notice and naturally skipped it, I needn't be embarresed further in the document so anwards & upways...
Running it ... It should have a 'TOS' extention because of its nature but I haven't seen any difference when it has a PRG or TTP extention so it can be changed. It is meant to be run from the desktop so don't moan about it clearing you shell screen, anyway I think it looks nice.
Things it does... I was going to enter a huge piece of text on its workings but that is really boring for all the non-programmers, and they can read the source.
This is what it does: If you're in medium-rez it changes down to low - perfectly legal this and it's clearer.
Drops the title on the top line.
Gets from the TOS the valid drive letters and displays them.
Gets a key from the keyboard & converts it to uppercase (if a letter!).
If the key is a valid drive letter (bit complex this check) it displays the drive you selected (now in uppercase).
Reads in the bootsector from the right drive, even if the disc has just been swapped.
If the read sector call returns non-zero - error - tell the user & skip the display of the boot sector info.
Otherwaise.. Displays all the info it can about the boot-sector : Boot branch - 'system disks' & the like use this to load the operating system, games (can) use it for loading quickly, as do virii. - if this is 0 you cannie have a boot-sector virus on the disk.(theory?) Volume serial - used by the system to tell if you swapped disks, every disk should have a random serial put here at format time for this purpose. Bytes per sector - $200 (512 decimal) on most disks - if its not the same at the ACTUAL sector size system may(??) go mad as a sponge. Sectors per cluster - 'cluster' being the smallest number of sectors one file can use on the disk, usually 2 (sectors). Reseerved sectors - always at least one as the boot sector counts as the first. Used by system-loaders & VERY BIG virii (gulp). File Allocation Tables (FATs) (number of) - FATs are used to keep track of all the places on the disk where your files are etc. 'Cause the're so important there are this many (usually 2) copies updated at the same time. Max root dir entries - the largest number of files that you can have in the root dir, usually 128 for floppies. Folders are files and can grow in size if more file entries (=name,date modified,size in bytes etc) are needed, but the root dir is a set size and therfore can only hold a limited number of file entries. Sectors - the total number of sectorson the media including reserved sectors, any hidden sectors, the FATs, the root dir and the 'data area' where your files & folders are stored. Media descripter - this is meant to describe the media type on PCs ie hard disk, 3.5" floppy etc, etc. should really be $F8, but the TOS ignores it completely, so it is whatever your formatter sets it to be! Sectors per FAT - this is the size in sectors of EACH File Allocation Table. Sectors per track - The number of sectors per track usually 9 or 10. therefore TRACKS = (total sectors / sides on media) / sectors per track. Sides on media - for floppies 1 or 2 is valid, but hard disk controllers can pull a few tricks on the TOS and pretend there are more 'sides' - 64 is not unusual. Hidden sectors - this isn't very well documented anywhere, but I think these are like 'extra reserved sectors' - comments anyone ? Calculated dir sector - worked out as : reserved sectors + hidden sectors + (number of FATs * sectors per FAT) this should be the first root dir sector. I have recently used this info to write zeros to this sector and then ran a file system checker (FCHK.TOS) to clean up the mess and leave me with a completely clean hard disk partition ! (I wanted this as well!)
Information from the TOS This info I added to BPB-37 'cause it gives : Total clusters - should be something like (you may need to +/- 1 ? to this) (total sectors - system sectors) / sectors per cluster where system sectors is calculated dir sector + ( number of root dir entries * 32 / bytes per sector ) Free clusters - the number of free clusters. Sectors per cluster - a less trustable source of this value than direct from the boot sector, but what the TOS THINKS it is. Bytes per sector - likewise. 'Therefore free space' - free space in bytes (using the TOS values) as free clusters * sectors per cluster * bytes per sector divided by 1024 to get Kb.
Phew ! After you have read all the info it waits for a keypress (any).
If it was originally in medium rez it changes back and resets the colours so the system as it was - all legal calls !!!
Then...... it quits back to the calling desktop/shell etc.
Phew ! - all the equations & algos by the way are from the top of my head so don't trust me, check them yourself.
Notes. It gives you a lot of info, it fits in 2K (the original version was less than 1Kb). It was written in assembly using Genst 1.25 (Thanks ST-Format !) and the book 'The conise atari st 68000 programmer's reference guide' by Kathrine Peel (one really good book).
Copyrights & the disclaimers I wrote this software but you use it at your own risk, so don't get me in court is it causes earthquakes in El-Salvador or something. You may copy, distribute, BUT NOT SELL IT, modest distribution costs may be charged - but remember it's FREE.
If you do pass it on you should pass this doc file on with it so that it's ease of use is not lost down the generations.
Please feel free to use the routines in the source code in your own programs but bear in mind that once the program all fitted in less than 2K I paid no attention to speed, effeciency or 'properness' of the code, but I think that it all works properly !
This doc file is toooooo huge for the program now so just remember this: If you believe this software to be worth paying for, then pay me 10% of what it's worth - thats how much I'd get if I marketed it. Course you could simply send me any tips/advice/good jokes and then we can get on with the job of writing better software for the ST range.
Any problems/enquiries etc with the program please E-mail me at :
ddv@uk.ac.bton.unix
Yours,
Domenico De Vitto.
And the source MC68000 assembler: program bsr setscreen bsr getdrive bsr readboot bsr interpret bsr extrainfo bsr pressanykeytoexit bsr resetscreen clr.w -(sp) trap #1 setscreen move.w #4,-(sp) trap #14 * get screen mode in d0 addq.l #2,sp cmp.w #1,d0 bne dontchgmode move.w d0,screenmode * if med-res save 1 in screenmode move.w #0,-(sp) move.l #-1,-(sp) move.l #-1,-(sp) move.w #5,-(sp) trap #14 * change to mode 0 add.l #12,sp move.l #colregs,-(sp) move.w #6,-(sp) trap #14 addq.l #6,sp dontchgmode bsr print dc.b 27,"E","BPB-37 by Domenico De Vitto",0 rts getdrive move.w #10,-(sp) trap #13 addq.l #2,sp move.l d0,drivemap bsr showdrives bsr getdrv rts showdrives bsr print dc.b 10,13,"Drives Available :",0 even moveq #0,d7 drvloop bsr checkdrive tst d0 bne nextdrv moveq #65,d0 add.b d7,d0 bsr printchr nextdrv addq #1,d7 btst #5,d7 beq drvloop rts getdrv bsr print dc.b 10,13,"Enter Drive Letter :",0 even gdrvloop bsr getkey bsr convertlu sub.b #65,d0 bmi gdrvloop cmp #31,d0 bpl gdrvloop exg d0,d7 bsr checkdrive bne gdrvloop move.w d7,driveselect exg d0,d7 add.b #65,d0 bsr printchr rts readboot move.w driveselect,-(sp) move.w #0,-(sp) move.w #1,-(sp) move.l #buffer,-(sp) move.w #2,-(sp) * must be read 2 in order to catch disk changes. move.w #4,-(sp) trap #13 add.l #14,sp rts interpret tst d0 beq okdrive bsr print dc.b 10,13,"Error Reading Drive",0 even rts okdrive bsr print dc.b 10,13,27,"p"," From the Boot sector : ",27,"q" dc.b 10,13,"Branch to boot code :$",0 even move.w buffer(pc),d0 bsr hexword86 bsr print dc.b 10,13,"Volume Serial # :$",0 even move.w buffer+8(pc),d0 bsr hexword86 move.b buffer+10(pc),d0 bsr hexprint bsr print dc.b 10,13,"Bytes per sector :$",0 even move.l buffer+10(pc),d0 ror.l #8,d0 bsr hexword86 bsr print dc.b 10,13,"Sectors per Cluster :$",0 even move.w buffer+12(pc),d0 ror.w #8,d0 bsr hexprint bsr print dc.b 10,13,"Reserved Sectors (inc. boot) :$",0 even move.w buffer+14(pc),d0 bsr hexword86 bsr print dc.b 10,13,"File Allocation Tables (FATs):$",0 even move.b buffer+16(pc),d0 bsr hexprint bsr print dc.b 10,13,"Max Root Directory entries :$",0 even move.l buffer+16(pc),d0 ror.l #8,d0 bsr hexword86 bsr print dc.b 10,13,"Sectors (inc reserved) :$",0 even move.l buffer+18(pc),d0 ror.l #8,d0 bsr hexword86 bsr print dc.b 10,13,"Media Descripter (not used by TOS) :$",0 even move.b buffer+21(pc),d0 bsr hexprint bsr print dc.b 10,13,"Sectors per FAT :$",0 even move.w buffer+22(pc),d0 bsr hexword86 bsr print dc.b 10,13,"Sectors per Track :$",0 even move.w buffer+24(pc),d0 bsr hexword86 bsr print dc.b 10,13,"Sides on media :$",0 even move.w buffer+26(pc),d0 bsr hexword86 bsr print dc.b 10,13,"Hidden Sectors :$",0 even move.w buffer+28(pc),d0 bsr hexword86 bsr print dc.b 10,13,"Calculated dir sector :$",0 even moveq #0,d0 move.b buffer+16(pc),d0 move.w buffer+22(pc),d1 ror.w #8,d1 mulu d1,d0 move.w buffer+14(pc),d1 ror.w #8,d1 add.l d1,d0 rol.l #8,d0 bsr hexprint rol.l #8,d0 bsr hexprint * print longword of start sect of dir rol.l #8,d0 bsr hexprint rol.l #8,d0 bsr hexprint rts extrainfo move.w driveselect(pc),d0 addq.w #1,d0 move.w d0,-(sp) pea driveextra(pc) move.w #54,-(sp) trap #1 addq.l #8,sp bsr print dc.b 10,13,27,"p"," From the Operating System (TOS) : ",27,"q" dc.b 10,13,"Total Clusters :$",0 move.l driveextra+4(pc),d0 bsr hexlongst bsr print dc.b 10,13,"Free Clusters :$",0 move.l driveextra(pc),d0 bsr hexlongst bsr print dc.b 10,13,"Sectors per Cluster :$",0 move.l driveextra+12(pc),d0 bsr hexlongst bsr print dc.b 10,13,"Bytes per Sector :$",0 move.l driveextra+8(pc),d0 bsr hexlongst bsr freespace rts freespace jsr print dc.b 10,13,"Therefore Free space = ",0 even move.l driveextra(pc),d0 * no free clusters move.l driveextra+12(pc),d6 * sects per cluster mulu driveextra+10(pc),d6 mulu d6,d0 divu #$400,d0 * mulu and print free space move.w d0,digibyte jsr digits jsr print dc.b "K of ",0 move.l driveextra+4(pc),d0 * total no of clusters move.l driveextra+12(pc),d6 * sects per cluster mulu driveextra+10(pc),d6 mulu d6,d0 divu #$400,d0 move.w d0,digibyte jsr digits jsr print dc.b " total",0 rts pressanykeytoexit bsr print dc.b 10,13,27,"p"," Press any key to exit ",27,"q",0 even bsr getkey rts resetscreen tst screenmode beq resetscreenexit move.w #1,-(sp) move.l #-1,-(sp) move.l #-1,-(sp) move.w #5,-(sp) trap #14 add.l #12,sp move.l #colregs,-(sp) move.w #6,-(sp) trap #14 addq.l #6,sp resetscreenexit rts *************************************** *** digital word print ,word in digibyte bsr digits digits moveq.l #0,d7 move.w digibyte,d7 divu #10000,d7 bsr digiprint moveq.l #0,d7 move.w digibyte,d7 divu #1000,d7 bsr digiprint moveq.l #0,d7 move.w digibyte,d7 divu #100,d7 bsr digiprint moveq.l #0,d7 move.w digibyte,d7 divu #10,d7 bsr digiprint move.w #$ffff,digiflag move.w digibyte,d7 swap d7 bsr digiprint clr.w digiflag rts digiprint swap d7 move.w d7,digibyte swap d7 tst.b d7 beq digizero move.w #$ffff,digiflag digiret1 add.w #"0",d7 digiret2 move.w d7,-(sp) move.w #2,-(sp) trap #1 addq.l #4,sp rts digizero tst digiflag bne digiret1 rts * The end of VERY long digital print routine ! digiflag dc.w 0 digibyte dc.w 0 getkey move.l #$20002,-(SP) trap #13 add.l #4,SP rts hexlongst move.l d0,-(sp) rol.l #8,d0 bsr hexprint rol.l #8,d0 bsr hexprint rol.l #8,d0 bsr hexprint rol.l #8,d0 bsr hexprint move.l (sp)+,d0 rts hexprint move.l d0,-(sp) asr.l #4,d0 bsr hpnext move.l (sp),d0 bsr hpnext move.l (sp)+,d0 rts hpnext andi.l #$f,d0 cmpi.b #10,d0 bmi hpnext2 addq.b #7,d0 hpnext2 addi.b #48,d0 move.w d0,-(sp) move.w #2,-(sp) trap #1 addq.l #4,sp rts hexword86 move.l d0,-(sp) bsr hexprint ror.l #8,d0 bsr hexprint move.l (sp)+,d0 rts move.l (sp),-(sp) move.w #9,-(sp) trap #1 addq.l #6,sp move.l (sp)+,a0 ploop move.w (a0),d0 tst.b d0 beq pend asr.w #8,d0 tst.b d0 beq pend adda #2,a0 bra ploop pend adda #2,a0 move.l a0,-(sp) rts printchr move.l d0,-(sp) and.l #$ff,d0 move.w d0,-(sp) move.w #2,-(sp) move.w #3,-(sp) trap #13 add.l #6,sp move.l (sp)+,d0 rts checkdrive move.l drivemap,d6 btst d7,d6 * drv to check = d7 beq checkdrivexit moveq #0,d0 * ret code in d0 rts * -1 = not there, 0=ok checkdrivexit moveq #-1,d0 rts convertlu cmp.b #"a",d0 * if d0>=asc "a" subtract 32 from it bmi convertexit * eg a => A , z => Z sub.b #32,d0 convertexit rts driveextra ds.l 4 drivemap dc.l 0 driveselect dc.w 0 colour0 dc.w 16 screenmode dc.w 0 colregs dc.l $ffff3f00 dc.l $f8f80000 ds.l 6 buffer |
Brain Sprinkles > Everything Else >