Brain Sprinkles‎ > ‎Everything Else‎ > ‎

BPB-37 (Display BIOS Parameter Block, Version 37)

posted 25 Apr 2013, 06:46 by Dom De Vitto
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


print
 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



(the end)
Comments