New Sector Viewer Released by John Brooks

A new 503 byte Sector Viewer created by John Brook has been released.   The viewer includes all source code as well as the executable.  According to John’s post on CSA2, ”

This is a single-block (503-byte) ProDOS utility which will read DOS 3.3 sectors and dump+display them as both hex and ascii.

It runs on all Apple II computers including Integer ROM and ][+ machines.

It is a SYS file and can be run from Basic.System or launched directly. It will quit to Basic if present or Quit to ProDOS.

The following disk image contains View.Sector and it’s source code, as well as the program which inspired it: the DOS.SECTOR.VIEW utility and it’s source code.

https://drive.google.com/file/d/0B9I8jo6bktRAVjNvcXotZmNZems/view?usp=sharing

Enjoy.

-JB
@JBrooksBSI

CALL-151
2000:D8 58 8D 0C C0 8D 00 C0 20 93 FE 20 89 FE 8D FB 04 20 2F FB 20 58 FC A9 11 85 67 A9 0F 85 68 A2
2020:0D A0 27 B9 A7 21 99 50 07 B9 7F 21 99 D0 07 88 10 F1 24 CA 8A 29 0F 85 60 4A F0 F7 08 09 B0 8D
2040:71 07 0A 0A 0A 0A 28 A0 B1 B0 03 09 80 C8 85 62 8C 77 07 A5 67 0A 0A 0A 85 65 A9 00 2A 85 66 A4
2060:68 B9 6F 21 4A 05 65 85 65 A9 00 85 63 69 10 85 64 49 A1 8D 5A 07 A9 16 85 23 20 5B FB A2 04 BD
2080:6A 21 85 24 B5 64 20 DA FD CA D0 F3 8A 20 5B FB A2 03 86 61 20 00 BF 80 61 00 D0 42 A8 AA 85 24
20A0:F0 03 20 8E FD 98 20 DA FD A9 BA 20 ED FD A5 32 49 C0 85 32 B9 00 11 20 DA FD C8 F0 06 A5 24 C9
20C0:1B 90 EB A0 1C BD 00 11 09 80 C9 A0 B0 02 A9 AE 91 28 E8 F0 0C C8 C0 28 90 EB 8A A8 B0 C4 20 58
20E0:FC 06 29 20 18 FD C9 9B D0 16 20 39 FB AD 00 BE C9 4C F0 09 A9 65 8D 97 20 A2 04 D0 95 4C 00 BE
2100:A6 68 A4 67 C9 88 F0 04 C9 8B D0 11 CA 10 05 A2 0F 88 30 CF 86 68 84 67 A6 60 4C 34 20 C9 95 F0
2120:04 C9 8A D0 0E E8 E0 10 90 EA A2 00 C8 C0 24 90 E3 B0 B0 A6 60 C9 AD F0 D8 C9 BD F0 EF C9 89 D0
2140:03 4C 33 20 C9 A0 F0 D0 69 47 C9 F9 90 0A 2A 29 0F AA C5 60 D0 C4 F0 E9 A0 27 B9 CF 21 99 D0 07
2160:88 10 F7 2C 00 C0 10 FB 4C 21 20 07 05 11 19 01 0F 0C 0D 0A 0B 08 09 06 07 04 05 02 03 00 0E 16
2180:09 05 17 2E 13 05 03 14 0F 12 20 20 02 19 20 0A 0F 08 0E 20 02 12 0F 0F 0B 13 20 20 32 31 2D 0D
21A0:01 12 2D 32 30 31 37 C2 CC CB BD A4 B0 B0 B0 B0 AF B0 A0 D4 D2 CB BD A4 B0 B0 A0 D3 C5 C3 BD A4
21C0:B0 B0 A0 D3 CC CF D4 BD B6 A0 C4 D2 D6 BD B1 2D 2F 3D 3A 14 12 0B 20 20 0C 2F 12 3A 13 05 03 20
21E0:20 05 13 03 3A 02 19 05 20 20 14 01 02 2F 23 3A 0E 05 17 20 04 13 0B
BSAVE VIEW.SECTOR,A$2000,L$1F7

*—————————–
* View.Sector – ProDOS util to
* display DOS 3.3 sectors as
* hex and ascii
*
* By John Brooks,  21-Mar-2017
*—————————–
lst     off

typ     $FF             ;Make ProDOS SYS file
org     $2000

*—————————–
MaxTrack    =       35              ;Allow 36 tracks (0-35)

BlkBuf      =       $1000           ;Stats print expects blocks at $1000 or $1100
SecBuf      =       BlkBuf+$100     ;Selected half-block (sector) is loaded here

*—————————–
dum     $60
ZpSltDrv    ds      1               ;0000SSSD. S:slot 0-7. D:0=Drive2, 1=Drive1
ZpParams    ds      1               ;P8 parameters: Read Block or Quit
ZpUnit      ds      1               ;P8 unit: DSSS0000
ZpBlkPtr    ds      2               ;P8 Ptr to BlkBuf or BlkBuf+$100 based on sector
ZpBlkNum    ds      2               ;P8 Block containing requested sector
ZpTrk       ds      1               ;Track to read
ZpSec       ds      1               ;Sector to read
dend

*—————————–
P8cQuit     =       $65             ;P8 Cmd: Quit
P8cRdBlk    =       $80             ;P8 Cmd: Read Block

P8Basic     =       $BE00
P8Mli       =       $BF00

*—————————–
ZpWindBtm   =       $23
ZpCH        =       $24
ZpBasL      =       $28
ZpInvFlg    =       $32

IoText22    =       $750
IoText23    =       $7D0
IoKbd       =       $C000
IoClr80Col  =       $C000
IoClr80Vid  =       $C00C
RmInit      =       $FB2F
RmSetTxt    =       $FB39
RmTabV      =       $FB5B
RmHome      =       $FC58
RmRdKey1    =       $FD18
RmCrOut     =       $FD8E
RmPrByte    =       $FDDA
RmCOut      =       $FDED
RmSetKbd    =       $FE89
RmSetVid    =       $FE93

*—————————–
SecView
cld                     ;No BCD
cli                     ;Enable IIGS control panel access
sta     IoClr80Vid      ;Disable 80 column display
sta     IoClr80Col      ;Bank in 40 column video memory
jsr     RmSetVid        ;Use ROM text output
jsr     RmSetKbd        ;Use ROM keyboard input
sta     $4fb
jsr     RmInit          ;Clear text windows
jsr     RmHome          ;Clear screen

lda     #$11            ;Start at DOS catalog: Track=$11
sta     ZpTrk
lda     #$0F            ;Sector=$0F
sta     ZpSec

ldx     #6*2+1          ;Start with slot 6, drive 1

ShowMsg     ldy     #40-1
:Print      lda     MsgStat,y
sta     IoText22,y      ;Stats on line 22
lda     MsgInfo,y
sta     IoText23,y      ;Info on line 23
dey
bpl     :Print

db      $24             ;BIT. Skip dex & use X slot/drive as-is
NextDisk    dex                     ;Go to next drive or slot
SetDisk     txa
and     #$f             ;Make 0000SSSD
sta     ZpSltDrv
lsr                     ;A=00000SSS, C=drive #
beq     NextDisk        ;Slot 0 is illegal, spin to slot 7,d1
php                     ;Save C=drive #
ora     #”0″            ;Convert slot to ascii
sta     IoText22+33     ;Display new slot
asl                     ;*16 to make prodos unit: 0SSS0000
asl
asl
asl
plp                     ;Pull C=drive #
ldy     #”1″
bcs     :Drive1
ora     #$80            ;Set ProDOS unit to drive 2: 1SSS0000
iny                     ;Display drive is “2”
:Drive1     sta     ZpUnit
sty     IoText22+39     ;Display drive #

lda     ZpTrk
asl
asl
asl
sta     ZpBlkNum        ;Block = 8 * Trk
lda     #0
rol
sta     ZpBlkNum+1      ;Set block high byte

ldy     ZpSec           ;Use sector to calc the block half
lda     Sec2Blk,Y       ; and low 3 bits of block num
lsr                     ;c=1 if sec in 1st half of blk, c=0 if 2nd half
ora     ZpBlkNum
sta     ZpBlkNum        ;Set low 3 bits of block num

lda     #0
sta     ZpBlkPtr
adc     #>BlkBuf        ;Load block to $1000 or $1100 based on block half
sta     ZpBlkPtr+1
eor     #$A1            ;Convert $10/$11 to ascii $B1(“1”) or $B0(“0″)
sta     IoText22+10     ;Display block half ascii

lda     #22
sta     ZpWindBtm       ;Window the top 22 text lines (protect last 2 lines)
jsr     RmTabV          ;Show stats on 23rd line
ldx     #4              ;Print 4x hex stats bytes
:ShowHex    lda     StatHPos-1,x
sta     ZpCH            ;Set hor pos
lda     ZpBlkNum-1,x    ;Get stat value
jsr     RmPrByte        ;Show as hex
dex
bne     :ShowHex

txa                     ;X=0
jsr     RmTabV          ;VTab to top line to show sector contents

ldx     #3              ;3 params for ProDOS read block
GoQuit      stx     ZpParams
jsr     P8Mli
ModP8Cmd    db      P8cRdBlk
da      ZpParams
bne     ReadErr         ;Skip sector display if there’s an error

:ShowSec    tay                     ;Start hex display at sec byte 0
tax                     ;Start asc display at sec byte 0
sta     ZpCH            ;Start at col 0
beq     :Start          ;Always. Stay on top row

:NewLine    jsr     RmCrOut         ;Go to next row
:Start      tya
jsr     RmPrByte        ;Show sec offset
lda     #”:”
jsr     RmCOut

:PrByte     lda     ZpInvFlg
eor     #$c0            ;Alternate normal (even byte) & inverse (odd byte)
sta     ZpInvFlg
lda     SecBuf,y        ;Print byte of sector
jsr     RmPrByte
iny
beq     :DoAscii        ;If end of sec, print ascii
lda     ZpCH
cmp     #12*2+3         ;12 bytes per row + 3 hdr
bcc     :PrByte

:DoAscii    ldy     #12*2+4         ;H pos for ascii print
:PrAscii    lda     SecBuf,x
ora     #$80
cmp     #” ”            ;Check for control chars
bcs     :AsciiOk
lda     #”.”            ;Replace non-printing bytes with “.”
:AsciiOk    sta     (ZpBasL),y      ;Show ascii of sector byte
inx
beq     ToMenu          ;If end of sector bytes then done
iny
cpy     #40             ;Are we at the end of the text row?
bcc     :PrAscii

txa                     ;Y=sec offset of next line
tay
bcs     :NewLine        ;Always

ReadErr     jsr     RmHome          ;If block read error, clear sector display
ToMenu      asl     ZpBasL+1        ;Hide RdKey cursor

Menu        jsr     RmRdKey1
cmp     #$9b            ;ESC key
bne     :NotEsc
jsr     RmSetTxt        ;Clear text window
lda     P8Basic
cmp     #$4c            ;Is basic.system loaded?
beq     :GoBasic
lda     #P8cQuit        ;No basic. Do P8 quit cmd
sta     ModP8Cmd
ldx     #4              ;P8 quit  param count
bne     GoQuit          ;Always.
:GoBasic    jmp     P8Basic         ;Exit to basic.system

:NotEsc     ldx     ZpSec           ;Prepare to change Track & Sector
ldy     ZpTrk
cmp     #$88            ;LEFT key
beq     :DecSec
cmp     #$8B            ;UP key
bne     :NotDec
:DecSec     dex                     ;Previous sector
bpl     :PutSec
:DecWrap    ldx     #15             ;Sector wrapped
:PrevTrk    dey                     ;Previous track
bmi     Menu            ;Clamp track at 0
:PutSec     stx     ZpSec           ;Save changed track and/or sector
sty     ZpTrk
:Refresh    ldx     ZpSltDrv        ;X=drive to read
:SetDisk    jmp     SetDisk         ;Read sector & display

:NotDec     cmp     #$95            ;RIGHT key
beq     :IncSec
cmp     #$8A            ;DOWN key
bne     :NotInc
:IncSec     inx                     ;Next sector
cpx     #16
bcc     :PutSec
ldx     #0
:NextTrk    iny                     ;Next track
cpy     #MaxTrack+1
bcc     :PutSec         ;Ignore if track is out of range
bcs     Menu            ;Always

:NotInc     ldx     ZpSltDrv
cmp     #”-”            ;- key: Track -= 1
beq     :PrevTrk
:NotDash    cmp     #”=”            ;= key: Track += 1
beq     :NextTrk
:NotEql     cmp     #$89            ;TAB key: next drive or slot
bne     :NotTab
:NextDsk    jmp     NextDisk

:NotTab     cmp     #” ”            ;SPACE key: reload current track,sector & display
beq     :Refresh
:NotSpc     adc     #$FF-“7”-1      ;-1:c=1. Move ascii “1-7” to $F9-$FF
cmp     #$F9
bcc     :NotSlot
rol                     ;Set 1111SSS1: drive 1 of selected slot
and     #$0F            ;0000SSSD
tax                     ;New slot+drive
cmp     ZpSltDrv        ;Compare to current slot & drive
bne     :SetDisk        ;If new slot, then use slot with drive 1
beq     :NextDsk        ;Always. Same slot, use drive 2

:NotSlot    ldy     #40-1           ;Print 40 char help text
:ShowHlp    lda     MsgHelp,y
sta     IoText23,y      ;Display on last row
dey
bpl     :ShowHlp
:WaitKey    bit     IoKbd
bpl     :WaitKey
jmp     ShowMsg         ;Redraw stats & info, then show sector

StatHPos    db      7,5,17,25       ;H offsets to print block lo, block hi, trk, sec

Sec2Blk     db      0*2+1,7*2+1,6*2+0,6*2+1  ;Block offset & half for each sector
db      5*2+0,5*2+1,4*2+0,4*2+1
db      3*2+0,3*2+1,2*2+0,2*2+1
db      1*2+0,1*2+1,0*2+0,7*2+0

MsgInfo     inv     “VIEW.SECTOR  BY JOHN BROOKS  21-MAR-2017”
MsgStat     asc     “BLK=$0000/0 TRK=$00 SEC=$00 SLOT=6 DRV=1”
MsgHelp     inv     “-/=:TRK  L/R:SEC  ESC:BYE  TAB/#:NEW DSK”

lst     off

You can download the disk image with the viewer at:
https://drive.google.com/file/d/0B9I8jo6bktRAVjNvcXotZmNZems/view
Please follow and like us:

About the Author

billm

A.P.P.L.E. Chairman of the Board and Club president — Bill worked for the founder, Val J. Golding and A.P.P.L.E. from 1981 to 1982. In 1999, he began archiving the materials which were distributed and sold by A.P.P.L.E.. That project led to the group that remained of A.P.P.L.E. Bill was involved in the financial industry in Tokyo and has over 20 major office infrastructure projects to his name. In March 2001, he retired to write books and to spend more time pursuing personal interests. As the president of the users group, Bill is in charge of distribution of Call-A.P.P.L.E. magazine as well as the organization of this web site. Bill currently resides in Tokyo, Japan and Shelton, Wa splitting time between the places.