mirror of
https://github.com/a2-4am/wozardry.git
synced 2024-10-31 20:05:09 +00:00
Add example showing how to dump the address fields of sectors
This commit is contained in:
parent
d191bfb2c3
commit
505d19fd28
110
README.md
110
README.md
@ -556,3 +556,113 @@ as a nibble:
|
|||||||
>>> hex(next(tr.nibble()))
|
>>> hex(next(tr.nibble()))
|
||||||
'0xfe'
|
'0xfe'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### `Sector` interface
|
||||||
|
|
||||||
|
There is no sector interface but it is easy enough to add one. First some
|
||||||
|
helper functions:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Decode two disk bytes using 4&4 encoding to a single byte
|
||||||
|
def four_and_four(tr):
|
||||||
|
odd = (next(tr.nibble()) << 1) | 1
|
||||||
|
evn = (next(tr.nibble()) << 0)
|
||||||
|
sum = odd & evn
|
||||||
|
return sum
|
||||||
|
|
||||||
|
# Dump the sector meta-data.
|
||||||
|
# NOTE: This assumes the track bit_index is JUST past the prologue D5 AA 96 header bytes.
|
||||||
|
#
|
||||||
|
# The DOS 3.3 Address Field format is:
|
||||||
|
#
|
||||||
|
# D5 AA 96 vol1 vol2 trk1 trk2 sec1 sec2 chk1 chk2 DE AA EB
|
||||||
|
# \_______/ \______/
|
||||||
|
# prologue epilogue
|
||||||
|
#
|
||||||
|
# Legend:
|
||||||
|
# vol1 -- Disk Volume, odd byte
|
||||||
|
# vol2 -- Disk Volume, even byte
|
||||||
|
# trk1 -- Track Number, odd byte
|
||||||
|
# trk2 -- Track Number, even byte
|
||||||
|
# sec1 -- Sector Number, odd byte
|
||||||
|
# sec2 -- Sector Number, even byte
|
||||||
|
# sum1 -- Checksum, odd byte
|
||||||
|
# sum2 -- Checkusm, even byte
|
||||||
|
#
|
||||||
|
def meta_sector(tr):
|
||||||
|
print( "--- Address Field ---" )
|
||||||
|
print( "Bit Position: " + hex(tr.bit_index) )
|
||||||
|
vol = four_and_four(tr)
|
||||||
|
trk = four_and_four(tr)
|
||||||
|
sec = four_and_four(tr)
|
||||||
|
sum = four_and_four(tr)
|
||||||
|
print( " Vol: $" + hex(vol)[2:] )
|
||||||
|
print( " Trk: $" + hex(trk)[2:] )
|
||||||
|
print( " Sec: $" + hex(sec)[2:] )
|
||||||
|
print( " Sum: $" + hex(sum)[2:] )
|
||||||
|
print( "Bit Position: " + hex(tr.bit_index) )
|
||||||
|
return
|
||||||
|
|
||||||
|
# Find the start of the next DOS 3.3 sector
|
||||||
|
def next_sector(tr):
|
||||||
|
tr.find(bytes.fromhex("D5 AA 96"))
|
||||||
|
return
|
||||||
|
|
||||||
|
# Reset the bit position to the start of the track data
|
||||||
|
def reset_sectors(tr):
|
||||||
|
tr.bit_index = 0
|
||||||
|
return
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Then we can dump the _Address Field_ of the first few sectors via:
|
||||||
|
|
||||||
|
```
|
||||||
|
import wozardry
|
||||||
|
with open( "DOS 3.3 System Master.woz", "rb" ) as fp:
|
||||||
|
woz_image = wozardry.WozDiskImage(fp)
|
||||||
|
|
||||||
|
tr = woz_image.seek(0)
|
||||||
|
reset_sectors(tr)
|
||||||
|
|
||||||
|
next_sector(tr)
|
||||||
|
meta_sector(tr)
|
||||||
|
|
||||||
|
next_sector(tr)
|
||||||
|
meta_sector(tr)
|
||||||
|
|
||||||
|
next_sector(tr)
|
||||||
|
meta_sector(tr)
|
||||||
|
```
|
||||||
|
|
||||||
|
You will see this output:
|
||||||
|
|
||||||
|
```
|
||||||
|
--- Address Field ---
|
||||||
|
Bit Position: 0xb8
|
||||||
|
Vol: $fe
|
||||||
|
Trk: $0
|
||||||
|
Sec: $0
|
||||||
|
Sum: $fe
|
||||||
|
Bit Position: 0xf8
|
||||||
|
--- Address Field ---
|
||||||
|
Bit Position: 0xcf6
|
||||||
|
Vol: $fe
|
||||||
|
Trk: $0
|
||||||
|
Sec: $1
|
||||||
|
Sum: $ff
|
||||||
|
Bit Position: 0xd36
|
||||||
|
--- Address Field ---
|
||||||
|
Bit Position: 0x1934
|
||||||
|
Vol: $fe
|
||||||
|
Trk: $0
|
||||||
|
Sec: $2
|
||||||
|
Sum: $fc
|
||||||
|
Bit Position: 0x1974
|
||||||
|
```
|
||||||
|
|
||||||
|
When you are all done quit the Python interpreter via:
|
||||||
|
|
||||||
|
```
|
||||||
|
quit()
|
||||||
|
```
|
||||||
|
Loading…
Reference in New Issue
Block a user