Exodus:
OldOpenLibrary       =-408
CloseLibrary         =-414
AllocMem             =-198
FreeMem              =-210
Read                 = -42
Write                = -48
Open                 = -30
Close                = -36
FindTask             =-294
OpenDevice           =-444
CloseDevice          =-450
DoIO                 =-456

        tst.l d0                ;parameterlengte
        beq.s run
        cmp.l #5,d0
        bne.s run
        cmp.b #"d",(a0)         ;test op "dfx:"
        bne.s run
        cmp.b #"f",1(a0)
        bne.s run
        cmp.b #":",3(a0)
        bne.s run
        move.b 2(a0),d0
        sub.b #"0",d0
        move.b d0,device        ;drive aanmelden
run:    move.l 4,a6             ;dos.library openen
        lea dosname,a1
        jsr OldOpenLibrary(a6)
        move.l d0,dosbase
        beq.l error

        move.l #$10002,d1       ;512 byte buffer in chipmem
        move.l #512,d0          ;reserveren
        jsr AllocMem(a6)
        move.l d0,buffer
        beq.l error

        sub.l a1,a1             ;task voor trackdisk.device
        jsr FindTask(a6)
        lea diskport,a0
        move.l d0,16(a0)
        clr.l d0
        move.b device,d0        ;trackdisk.device voor dfx: openen
        moveq #0,d1
        lea diskioreq,a1
        lea trkdisk,a0
        jsr OpenDevice(a6)
        tst.l d0
        bne.l nodrive           ;library sluiten, geheugen vrijgeven

        move.b device,d0        ;drive in titelregel plaatsen
        add.b #"0",d0
        move.b d0,drive
        move.l dosbase,a6       ;raw-venster openen
        move.l #title,d1
        move.l #1005,d2
        jsr Open(a6)
        move.l d0,wdhd          ;windowhandle
        beq.l error

        jsr crsroff             ;cursor uit
        move.l wdhd,d1          ;menu afbeelden
        move.l #top,d2
        move.l #toplen,d3
        jsr Write(a6)

        jsr dumpblock           ;block # en $ weergeven, fouten wissen
        move.b #"r",key         ;read commando simuleren
        bra.s start

main:   jsr dumptype            ;weergave type
        jsr dumpcheck           ;checksum weergeven
        jsr getkey              ;toetsdruk opvragen
start:  cmp.b #$1b,key          ;programma-einde
        beq.s quit
        cmp.b #"r",key          ;block lezen en weergeven
        beq.l readsec
        cmp.b #"w",key          ;block schrijven en weeregeven
        beq.l writesec
        cmp.b #"c",key          ;data checksum aanmaken
        beq.l check
        cmp.b #"#",key          ;decimale blockinvoer en lezen
        beq.l blockedit
        cmp.b #"$",key          ;hexadecimale blockinvoer en lezen
        beq.l blockedithex
        cmp.b #"+",key          ;block +1 lezen
        beq.l up
        cmp.b #"-",key          ;block -1 lezen
        beq.l down
        cmp.b #"a",key          ;ascii invoer
        beq.l asciiedit
        cmp.b #"h",key          ;hex invoer
        beq.l hexedit
        bne.l main

quit:   move.l dosbase,a6       ;venster sluiten
        move.l wdhd,d1
        jsr Close(a6)

        move.l 4,a6             ;trackdisk.device sluiten
        lea diskioreq,a1
        jsr CloseDevice(a6)

nodrive:move.l buffer,a1        ;buffer vrijgeven
        move.l #512,d0
        jsr FreeMem(a6)

        move.l dosbase,a1       ;dos.library sluiten
        jsr CloseLibrary(a6)
        clr.l d0
        rts

error:  moveq #100,d0           ;returncode 100 bij systemfout
        rts

dumphex:move.b #"0",row         ;cursor positioneren
        move.b #"6",row+1
        move.b #"0",col
        move.b #"2",col+1
        move.l buffer,buffptr   ;bufferpointer in het begin
        clr.w adr
        moveq #15,d6            ;16 regels
poshex: jsr cursor              ;adres weergeven
        move.w adr,d0
        jsr convword
        jsr printword
        move.b #" ",key         ;spatie weergeven
        jsr printkey
        add.w #$20,adr          ;adres met $20 verhogen
        moveq #15,d5            ;16 woorden per regel
        lea linebuf,a2          ;buffer voor regel
x:      move.l buffptr,a1
        add.l #2,buffptr        ;bufferpointer+2
        move.w (a1),d0          ;woord halen
        jsr convword            ;in ascii omzetten
        move.l text,(a2)+       ;in regelbuffer kopieren
        dbra d5,x
        jsr printline
        move.b row+1,d0         ;cursor pos. regel +1
        cmp.b #"9",d0
        bne.s l1
        add.b #1,row
        move.b #"0"-1,row+1
l1:     add.b #1,row+1
        dbra d6,poshex
        rts

convdez:lea text,a0             ;woord in d0 omzetten in
        divu #1000,d0           ;decimaalgetal van vier posities
        add.b #"0",d0
        move.b d0,(a0)+
        clr.w d0
        swap d0
        divu #100,d0
        add.b #"0",d0
        move.b d0,(a0)+
        clr.w d0
        swap d0
        divu #10,d0
        add.b #"0",d0
        move.b d0,(a0)+
        clr.w d0
        swap d0
        add.b #"0",d0
        move.b d0,(a0)+
        rts

convword:                       ;woord d0 in ascii text omzetten
        moveq #3,d2
        lea text+4,a0
l0:     move.b d0,d1
        and.b #$0f,d1
        lsr.w #4,d0
        cmp.b #$09,d1
        bgt.s hex
        add.b #"0",d1
        bra.s do
hex:    add.b #"a"-10,d1
do:     move.b d1,-(a0)
        dbra d2,l0
        rts

printword:                      ;tekst weergeven
        move.l wdhd,d1
        move.l #text,d2
        moveq #4,d3
        jsr Write(a6)
        rts

dumpasc:move.b #"2",row         ;block ascii weergeven
        move.b #"3",row+1
        move.b #"0",col
        move.b #"2",col+1
        move.l buffer,buffptr
        clr.w adr
        moveq #7,d6
posasc: jsr cursor              ;adres weergeven
        move.w adr,d0
        jsr convword
        jsr printword
        move.b #" ",key         ;spatie weergeven
        jsr printkey
        add.w #$40,adr
        moveq #63,d5
        lea linebuf,a2          ;regelbuffer
        move.l buffptr,a1
y:      move.b (a1)+,d0         ;byte halen en ascii maskeren
        cmp.b #" ",d0
        blt.s dot
        cmp.b #"z",d0
        bgt.s dot
        move.b d0,(a2)+
        bra.s chr
dot:    move.b #".",(a2)+       ;besturingstekens door "." vervangen
chr:    dbra d5,y
        move.l a1,buffptr
        jsr printline           ;regelbuffer weergeven
        move.b row+1,d0         ;cursor pos. regel +1
        cmp.b #"9",d0
        bne.s l2
        add.b #1,row
        move.b #"0"-1,row+1
l2:     add.b #1,row+1
        dbra d6,posasc
        rts

printline:                      ;regelbuffer weergeven
        move.l wdhd,d1
        move.l #linebuf,d2
        moveq #64,d3
        jsr Write(a6)
        rts

dumpcheck:                      ;checksum weergeven
        move.b #"0",row
        move.b #"4",row+1
        move.b #"5",col
        move.b #"1",col+1
        jsr cursor
        move.l buffer,a0        ;bovenste woord
        move.w 20(a0),d0
        jsr convword
        jsr printword
        move.l buffer,a0        ;onderste woord
        move.w 22(a0),d0
        jsr convword
        jsr printword
        rts

dumpblock:                      ;blocknummer dec. und hex. weergeven
        move.b #"0",row
        move.b #"4",row+1
        move.b #"0",col
        move.b #"9",col+1
        jsr cursor
        move.w block,d0         ;offset voor read/write plaatsen
        mulu #512,d0
        move.l d0,offset
        clr.l d0
        move.w block,d0
        jsr convdez             ;block omzetten in decimaal
        jsr printword
        move.b #"0",row         ;block omzetten in hex
        move.b #"4",row+1
        move.b #"1",col
        move.b #"5",col+1
        jsr cursor
        move.w block,d0
        jsr convword
        jsr printword

        move.l #clear,d4        ;foutmelding wissen
        moveq #clrlen,d5
        jsr doerr
        rts

dumptype:
        move.b #"0",row         ;block type weergeven
        move.b #"2",row+1
        move.b #"0",col
        move.b #"2",col+1
        jsr cursor
        move.l wdhd,d1
        move.l #unkn,d2         ;onbekend type
        moveq #10,d3            ;type lengte
        cmp.w #2,block          ;boot       block=0,1
        bge.s noboot
        move.l #boot,d2
        bra.s noknown
noboot: move.l buffer,a0
        cmp.l #8,(a0)           ;data       1.LW=$00000008
        bne.s nodata
        move.l #dat,d2
nodata: cmp.l #$10,(a0)         ;filelist   1.LW=$00000010
        bne.s nolist
        cmp.l #-3,508(a0)       ;filelist 127.LW=$fffffffd
        bne.s nolist
        move.l #flist,d2
nolist: cmp.l #2,(a0)           ;root,userdir,filehead
                                ;           1.LW=$00000002
        bne.s noknown
        cmp.l #1,508(a0)        ;root     127.LW=$00000001
        bne.s noroot
        move.l #root,d2
noroot: cmp.l #2,508(a0)        ;userdir  127.LW=$00000002
        bne.s noudir
        move.l #udir,d2
noudir: cmp.l #-3,508(a0)       ;filehead 127.LW=$fffffffd
        bne.s noknown
        move.l #fhead,d2
noknown:jsr Write(a6)
        rts

getkey: move.l wdhd,d1          ;wachten op toetsdruk
        move.l #key,d2          ;toetsdruk opvragen
        moveq #1,d3
        jsr Read(a6)
        rts

printkey:                       ;teken key weergeven
        move.l wdhd,d1
        move.l #key,d2
        moveq #1,d3
        jsr Write(a6)
        rts

cursor: jsr cursoff             ;cursor uit zonder statuswijziging
        move.l wdhd,d1          ;cursor op #adres positioneren
        move.l #adrpos,d2
        moveq #7,d3
        jsr Write(a6)
        lea text,a0
        move.l #"    ",(a0)
        btst #0,crsrstatus      ;wanneer cursor uit dan adres wissen
        beq.s noadr
        move.l buffptr,d0       ;anders adres weergeven
        sub.l buffer,d0         ;adres=pointer-start
        jsr convdez
noadr:  jsr printword
        move.l wdhd,d1          ;cursor op $adres positioneren
        move.l #adrpos2,d2
        moveq #7,d3
        jsr Write(a6)
        lea text,a0
        move.l #"    ",(a0)
        btst #0,crsrstatus      ;wanneer cursor uit dan adres wissen
        beq.s noadr2
        move.l buffptr,d0       ;anders adres weergeven
        sub.l buffer,d0
        jsr convword
noadr2: jsr printword
        move.l wdhd,d1          ;cursor positioneren
        move.l #pos,d2
        moveq #7,d3
        jsr Write(a6)
        btst #0,crsrstatus
        beq.s no
        jsr curson              ;cursor aan zonder statuswijziging
no:     rts

crsron: bset #0,crsrstatus      ;cursor aanschakelen
curson: move.l wdhd,d1
        move.l #con,d2
        moveq #3,d3
        jsr Write(a6)
        rts

crsroff:bclr #0,crsrstatus      ;cursor uitschakelen
cursoff:move.l wdhd,d1
        move.l #coff,d2
        moveq #4,d3
        jsr Write(a6)
        rts

doerr:  move.l dosbase,a6       ;foutmelding d4/d5 weergeven
        move.b #"0",row
        move.b #"4",row+1
        move.b #"6",col
        move.b #"0",col+1
        jsr cursor
        move.l wdhd,d1
        move.l d4,d2
        move.l d5,d3
        jsr Write(a6)
        lea diskioreq,a0        ;foutstatus wissen
        clr.l 32(a0)
        rts

mtroff: move.l 4,a6             ;motor uitschakelen
        lea diskioreq,a1
        move.w #9,28(a1)        ;motor uit
        clr.l 36(a1)
        jsr DoIO(a6)
        move.l dosbase,a6
        rts

readsec:move.l 4,a6             ;block na buffer lezen
        lea diskioreq,a1
        move.w #14,28(a1)       ;test of diskette in drive
        jsr DoIO(a6)
        lea diskioreq,a1
        tst.l 32(a1)
        beq.s dsk

        move.l #nderr,d4        ;fout weergeven
        moveq #ndlen,d5
        jsr doerr
        bra.l here              ;read beeindigd

dsk:    lea diskioreq,a1        ;block lezen
        move.w #2,28(a1)
        move.l #512,36(a1)
        move.l buffer,40(a1)
        move.l offset,44(a1)
        jsr DoIO(a6)
        tst.l d0                ;test op readerror
        beq.s noerr

        move.l #rderr,d4        ;fout weergeven
        moveq #rdlen,d5
        jsr doerr
        bra.s here

noerr:  jsr dumpblock           ;blocknummer weergeven, fout wissen
here:   jsr mtroff
        jsr dumpcheck           ;checksum
        jsr dumptype            ;type
        jsr dumphex             ;hex. weergave
        jsr dumpasc             ;ascii weergave
        bra.l main

writesec:                       ;block naar diskette schrijven
        move.l 4,a6
        lea diskioreq,a1
        move.w #14,28(a1)       ;test of diskette in drive
        jsr DoIO(a6)
        lea diskioreq,a1
        tst.l 32(a1)
        beq.s dsk2

        move.l #nderr,d4        ;fout weergeven
        moveq #ndlen,d5
        jsr doerr
        bra.l here2

dsk2:   lea diskioreq,a1
        move.w #15,28(a1)       ;test op write-protect
        jsr DoIO(a6)
        lea diskioreq,a1
        tst.l 32(a1)
        beq.s dsk3

        move.l #pterr,d4        ;fout weergeven
        moveq #ptlen,d5
        jsr doerr
        bra.l here2

dsk3:   move.w #3,28(a1)        ;block schrijven
        move.l #512,36(a1)
        move.l buffer,40(a1)
        move.l offset,44(a1)
        jsr DoIO(a6)
        lea diskioreq,a1
        move.w #4,28(a1)        ;update disk
        move.l #512,36(a1)
        move.l buffer,40(a1)
        move.l offset,44(a1)
        jsr DoIO(a6)
        tst.l d0                ;test op writeerror
        beq.s noerr2

        move.l #wrerr,d4        ;fout wergeven
        moveq #wrlen,d5
        jsr doerr
        bra.s here2

noerr2: jsr dumpblock           ;alles weergeven
here2:  jsr mtroff
        jsr dumpcheck
        jsr dumphex
        jsr dumpasc
        bra.l main

check:  move.l buffer,a0        ;bufferchecksum berekenen
        moveq #126,d0
        clr.l d1
adck:   cmp.w #121,d0           ;checksum niet gebruiken
        bne.s ck
        add.l #4,a0
ck:     sub.l (a0)+,d1
        dbra d0,adck
        move.l buffer,a0        ;checksum invoeren
        move.l d1,20(a0)
        jsr dumpcheck           ;weergaves
        jsr dumphex
        jsr dumpasc
        bra.l main

blockedit:                      ;blocknummer dec. invoeren
        move.b #"0",row
        move.b #"4",row+1
        move.b #"0",col
        move.b #"9",col+1
        jsr cursor
        jsr crsron
        moveq #3,d4             ;4 tekens
        lea text,a5
in:     jsr getkey
        cmp.b #"0",key
        blt.s in
        cmp.b #"9",key
        bgt.s in
        jsr printkey
        move.b key,(a5)+        ;in tekstbuffer
        dbra d4,in
        jsr crsroff
        clr.w block             ;tekstbuffer in hex omrekenen
        lea text,a0
        clr.w d0
        move.b (a0)+,d0
        sub.w #"0",d0
        mulu #1000,d0
        add.w d0,block
        clr.w d0
        move.b (a0)+,d0
        sub.w #"0",d0
        mulu #100,d0
        add.w d0,block
        clr.w d0
        move.b (a0)+,d0
        sub.w #"0",d0
        mulu #10,d0
        add.w d0,block
        clr.w d0
        move.b (a0)+,d0
        sub.w #"0",d0
        add.w d0,block
        cmp.w #1759,block       ;vergelijk met laatste block
        bgt.l blockedit         ;nieuwe invoer
        jsr dumpblock
        bra.l readsec           ;block lezen en weergeven

blockedithex:                   ;block hex invoeren
        move.b #"0",row
        move.b #"4",row+1
        move.b #"1",col
        move.b #"5",col+1
        jsr cursor
        jsr crsron
        lea text,a5
        moveq #3,d4             ;4 tekens
retry:  jsr getkey
        cmp.b #"0",key
        blt.l retry
        cmp.b #"f",key
        bgt.l retry
        cmp.b #"9",key
        ble.s h0
        cmp.b #"a",key
        bge.s h0
        bra.s retry
h0:     jsr printkey
        move.b key,(a5)+        ;in tekstbuffer schrijven
        dbra d4,retry
        jsr crsroff
        move.b text,d0          ;nibblesgewijs tekst naar hex omzetten
        cmp.b #"9",d0
        bgt.s h1
        sub.b #"0"-"a"+10,d0
h1:     sub.b #"a"-10,d0
        lsl.b #4,d0
        move.b d0,block
        move.b text+1,d0
        cmp.b #"9",d0
        bgt.s h2
        sub.b #"0"-"a"+10,d0
h2:     sub.b #"a"-10,d0
        or.b d0,block
        move.b text+2,d0
        cmp.b #"9",d0
        bgt.s h3
        sub.b #"0"-"a"+10,d0
h3:     sub.b #"a"-10,d0
        lsl.b #4,d0
        move.b d0,block+1
        move.b text+3,d0
        cmp.b #"9",d0
        bgt.s h4
        sub.b #"0"-"a"+10,d0
h4:     sub.b #"a"-10,d0
        or.b d0,block+1
        cmp.w #1759,block       ;vergelijken met laatste block
        bgt.l blockedithex
        jsr dumpblock           ;block weergeven
        bra.l readsec           ;block lezen en weergeven

up:     cmp.w #1759,block       ;volgende block lezen en weergeven
        beq.l main
        add.w #1,block
        jsr dumpblock
        jmp readsec

down:   tst.w block             ;voorafgaande block lezen en weergeven
        beq.l main
        sub.w #1,block
        jsr dumpblock
        jmp readsec

asciiedit:                      ;ascii invoer in buffer
        move.b #"2",row
        move.b #"3",row+1
        move.b #"0",col
        move.b #"7",col+1
        move.l buffer,buffptr
        jsr crsron
        jsr cursor
getasc: jsr getkey

        cmp.b #$9b,key          ;vergelijken met cursor sequentie
        bne.l nocurs
        jsr getkey
        cmp.b #$44,key          ;links
        beq.l ascleft
        cmp.b #$43,key          ;rechts
        beq.l ascright
        cmp.b #$41,key          ;boven
        beq.l ascup
        cmp.b #$42,key          ;onder
        beq.l ascdown
        bra.s getasc

ascright:                       ;cursor rechts of regelbegin
        cmp.b #"7",col
        blt.s csright
        cmp.b #"0",col+1
        blt.s csright
        cmp.b #"3",row
        blt.l csdown
        cmp.b #"0",row+1
        blt.l csdown
        bra.l getasc            ;cursor is links onder

csright:cmp.b #"9",col+1        ;cursor plaatsen
        bne.s m3
        move.b #"0"-1,col+1
        add.b #1,col
m3:     add.b #1,col+1
        add.l #1,buffptr        ;bufferpointer plaatsen
        jsr cursor
        bra.l getasc

csdown: cmp.b #"9",row+1        ;zie boven
        bne.s m2
        move.b #"0"-1,row+1
        add.b #1,row
m2:     add.b #1,row+1
        move.b #"0",col
        move.b #"7",col+1
        add.l #1,buffptr
        jsr cursor
        bra.l getasc

ascdown:cmp.b #"3",row          ;cursor onder wanneer mogelijk
        blt.l rowdown
        cmp.b #"0",row+1
        blt.l rowdown
        bra.l getasc

rowdown:cmp.b #"9",row+1
        bne.s m4
        move.b #"0"-1,row+1
        add.b #1,row
m4:     add.b #1,row+1
        add.l #$40,buffptr      ;bufferpointer volgende regel
        jsr cursor
        bra.l getasc

ascleft:cmp.b #"0",col          ;cursor links of regeleinde
        bgt.s csleft
        cmp.b #"7",col+1
        bgt.s csleft
        cmp.b #"2",row
        bgt.l csup
        cmp.b #"3",row+1
        bgt.l csup
        bra.l getasc            ;cursor is linksboven

csleft: cmp.b #"0",col+1        ;cursor plaatsen
        bne.s m5
        move.b #"9"+1,col+1
        sub.b #1,col
m5:     sub.b #1,col+1
        sub.l #1,buffptr        ;bufferpointer links
        jsr cursor
        bra.l getasc

csup:   cmp.b #"0",row+1        ;cursor regeleinde
        bne.s m6
        move.b #"9"+1,row+1
        sub.b #1,row
m6:     sub.b #1,row+1
        move.b #"7",col
        move.b #"0",col+1
        sub.l #1,buffptr
        jsr cursor
        bra.l getasc

ascup:  cmp.b #"2",row          ;cursor regel naar boven wanneer mogelijk
        bgt.l rowup
        cmp.b #"3",row+1
        bgt.l rowup
        bra.l getasc

rowup:  cmp.b #"0",row+1
        bne.s m8
        move.b #"9"+1,row+1
        sub.b #1,row
m8:     sub.b #1,row+1
        sub.l #$40,buffptr      ;bufferpointer regel naar boven
        jsr cursor
        bra.l getasc

nocurs: cmp.b #$1b,key          ;escape toets = einde invoer
        beq.l ascend    
        cmp.b #" ",key          ;toetsen maskeren
        blt.l getasc
        cmp.b #"z",key
        bgt.l getasc

        cmp.b #"7",col          ;teken links of regelbegin
        blt.s doright           ;weergave
        cmp.b #"0",col+1
        blt.s doright
        cmp.b #"3",row
        blt.l dodown
        cmp.b #"0",row+1
        blt.l dodown
        jsr printkey
        move.l buffptr,a0       ;invoeren in buffer
        move.b key,(a0)
        bra.l asciiedit         ;cursor home

doright:cmp.b #"9",col+1        ;teken links weergeven
        bne.s m0
        move.b #"0"-1,col+1
        add.b #1,col
m0:     add.b #1,col+1
        jsr printkey
        move.l buffptr,a0
        move.b key,(a0)         ;invoeren in buffer
        add.l #1,buffptr
        jsr cursor
        bra.l getasc

dodown: cmp.b #"9",row+1        ;teken regelbegin weergeven
        bne.s m1
        move.b #"0"-1,row+1
        add.b #1,row
m1:     add.b #1,row+1
        move.b #"0",col
        move.b #"7",col+1
        jsr printkey
        move.l buffptr,a0
        move.b key,(a0)         ;invoeren in buffer
        add.l #1,buffptr
        jsr cursor
        bra.l getasc

ascend: jsr crsroff             ;einde ascii-invoer
        jsr dumphex             ;hex weergeven
        bra.l main

hexedit:move.b #"0",row         ;hexinvoer in buffer
        move.b #"6",row+1       ;analoog ascii-invoer
        move.b #"0",col         ;uitzondering: cursor in 2stapsgewijze
        move.b #"7",col+1       ;              wijziging in bytes
        move.l buffer,buffptr
        jsr crsron
        jsr cursor
gethex: jsr getkey
        cmp.b #$9b,key
        bne.l noxcurs
        jsr getkey
        cmp.b #$44,key
        beq.l hexleft
        cmp.b #$43,key
        beq.l hexright
        cmp.b #$41,key
        beq.l hexup
        cmp.b #$42,key
        beq.l hexdown
        bra.l gethex

hexright:
        cmp.b #"6",col
        blt.s xcsright
        cmp.b #"9",col+1
        blt.s xcsright
        cmp.b #"2",row
        blt.l xcsdown
        cmp.b #"1",row+1
        blt.l xcsdown
        bra.l gethex

xcsright:
        cmp.b #"9",col+1
        bne.s n3
        move.b #"1"-2,col+1
        add.b #1,col
n3:     add.b #2,col+1
        add.l #1,buffptr
        jsr cursor
        bra.l gethex

xcsdown:cmp.b #"9",row+1
        bne.s n2
        move.b #"0"-1,row+1
        add.b #1,row
n2:     add.b #1,row+1
        move.b #"0",col
        move.b #"7",col+1
        add.l #1,buffptr
        jsr cursor
        bra.l gethex

hexdown:cmp.b #"2",row
        blt.l rowxdown
        cmp.b #"1",row+1
        blt.l rowxdown
        bra.l gethex

rowxdown:
        cmp.b #"9",row+1
        bne.s n4
        move.b #"0"-1,row+1
        add.b #1,row
n4:     add.b #1,row+1
        add.l #$20,buffptr
        jsr cursor
        bra.l gethex

hexleft:cmp.b #"0",col
        bgt.s xcsleft
        cmp.b #"7",col+1
        bgt.s xcsleft
        cmp.b #"0",row
        bgt.l xcsup
        cmp.b #"6",row+1
        bgt.l xcsup
        bra.l gethex

xcsleft:cmp.b #"1",col+1
        bne.s n5
        move.b #"9"+2,col+1
        sub.b #1,col
n5:     sub.b #2,col+1
        sub.l #1,buffptr
        jsr cursor
        bra.l gethex

xcsup:  cmp.b #"0",row+1
        bne.s n6
        move.b #"9"+1,row+1
        sub.b #1,row
n6:     sub.b #1,row+1
        move.b #"6",col
        move.b #"9",col+1
        sub.l #1,buffptr
        jsr cursor
        bra.l gethex

hexup:  cmp.b #"0",row
        bgt.l xrowup
        cmp.b #"6",row+1
        bgt.l xrowup
        bra.l gethex

xrowup: cmp.b #"0",row+1
        bne.s n8
        move.b #"9"+1,row+1
        sub.b #1,row
n8:     sub.b #1,row+1
        sub.l #$20,buffptr
        jsr cursor
        bra.l gethex


noxcurs:cmp.b #$1b,key
        beq.l hexend    
        cmp.b #"0",key
        blt.l gethex
        cmp.b #"f",key
        bgt.l gethex
        cmp.b #"9",key
        ble.s ok0
        cmp.b #"a",key
        bge.s ok0
        bra.l gethex
ok0:    jsr printkey
ok2:    move.l wdhd,d1
        move.l #key2,d2
        moveq #1,d3
        jsr Read(a6)
        cmp.b #"0",key2
        blt.s ok2
        cmp.b #"f",key2
        bgt.s ok2
        cmp.b #"9",key2
        ble.s ok1
        cmp.b #"a",key2
        blt.s ok2
        
ok1:    move.b key,d0           ;key en key2 in bytes omzetten
        cmp.b #"9",d0
        bgt.s ok3
        sub.b #"0"-"a"+10,d0
ok3:    sub.b #"a"-10,d0
        lsl.b #4,d0
        move.b d0,byte
        move.b key2,d0
        cmp.b #"9",d0
        bgt.s ok4
        sub.b #"0"-"a"+10,d0
ok4:    sub.b #"a"-10,d0
        or.b d0,byte

        cmp.b #"6",col
        blt.s doxright
        cmp.b #"9",col+1
        blt.s doxright
        cmp.b #"2",row
        blt.l doxdown
        cmp.b #"1",row+1
        blt.l doxdown
        move.l wdhd,d1
        move.l #key2,d2
        moveq #1,d3
        jsr Write(a6)
        move.l buffptr,a0
        move.b byte,(a0)
        bra.l hexedit

doxright:
        cmp.b #"9",col+1
        bne.s n0
        move.b #"1"-2,col+1
        add.b #1,col
n0:     add.b #2,col+1
        move.l wdhd,d1
        move.l #key2,d2
        moveq #1,d3
        jsr Write(a6)
        move.l buffptr,a0
        move.b byte,(a0)
        add.l #1,buffptr
        jsr cursor
        bra.l gethex

doxdown:cmp.b #"9",row+1
        bne.s n1
        move.b #"0"-1,row+1
        add.b #1,row
n1:     add.b #1,row+1
        move.b #"0",col
        move.b #"7",col+1
        move.l wdhd,d1
        move.l #key2,d2
        moveq #1,d3
        jsr Write(a6)
        move.l buffptr,a0
        move.b byte,(a0)
        add.l #1,buffptr
        jsr cursor
        bra.l gethex

hexend: jsr crsroff             ;einde hex-invoer
        jsr dumpasc             ;ascii weergeven
        bra.l main

;       TEKSTEN, VARIABELEN EN TABELLEN

title:  dc.b "raw:0/0/640/256/"
        dc.b "      DISK-MONITOR VERSION 1.0    "
        dc.b "      INSERT DISK TO EXAMINE IN DF"
drive:  dc.b 0,":   ",0
top:    dc.b $0a

        ;    invers               1.char        normaal  rest

        dc.b "            "
        dc.b " ",$9b,"0;31;43",$6d,"Esc",$9b,"0;31;40",$6d,"ape"
        dc.b " ",$9b,"0;31;43",$6d,"#",$9b,"0;31;40",$6d," Block"
        dc.b " ",$9b,"0;31;43",$6d,"$",$9b,"0;31;40",$6d," Block"
        dc.b " ",$9b,"0;31;43",$6d,"+",$9b,"0;31;40",$6d," Up"
        dc.b " ",$9b,"0;31;43",$6d,"-",$9b,"0;31;40",$6d," Down"
        dc.b " ",$9b,"0;31;43",$6d,"R",$9b,"0;31;40",$6d,"ead"
        dc.b " ",$9b,"0;31;43",$6d,"W",$9b,"0;31;40",$6d,"rite"
        dc.b " ",$9b,"0;31;43",$6d,"C",$9b,"0;31;40",$6d,"hecksum"
        dc.b " ",$9b,"0;31;43",$6d,"A",$9b,"0;31;40",$6d,"scii"
        dc.b " ",$9b,"0;31;43",$6d,"H",$9b,"0;31;40",$6d,"ex"
        dc.b $0a,$0a
        dc.b " Block #     $      Buffer #     $      Checksum $"
        dc.b $0a,"---------------------------------------------------"
        dc.b "--------------------------"
toplen=*-top

        ; BLOCKTYPE

boot:   dc.b "BOOTBLOCK "
root:   dc.b "ROOTBLOCK "
flist:  dc.b "FILELIST  "
fhead:  dc.b "FILEHEADER"
dat:    dc.b "DATABLOCK "
udir:   dc.b "USERDIR   "
unkn:   dc.b "----------"

        ; DISK FEHLERMELDUNGEN

nderr:  dc.b $9b,"43",$6d,"NO DISK IN DRIVE !",$9b,"40",$6d
ndlen=*-nderr
rderr:  dc.b $9b,"43",$6d,"   READ-ERROR !   ",$9b,"40",$6d
rdlen=*-rderr
wrerr:  dc.b $9b,"43",$6d,"   WRITE-ERROR !  ",$9b,"40",$6d
wrlen=*-wrerr
pterr:  dc.b $9b,"43",$6d,"WRITE-PROTECTION !",$9b,"40",$6d
ptlen=*-pterr
clear:  dc.b "    NO ERROR !    "
clrlen=*-clear


even
crsrstatus:
        dc.w 0
adr:    dc.w 0
text:   dc.b "0000"
key:    dc.b 0
key2:   dc.b 0
byte:   dc.b 0
even
linebuf:blk.b 64,0      ;buffer voor omzettingen

        ;sequentie voor algemene cursorpositionering

pos:    dc.b $9b
row:    dc.b "00",$3b
col:    dc.b "00",$48

        ;zie boven voor adresteller dez en hex

adrpos: dc.b $9b,"04",$3b,"29",$48
adrpos2:dc.b $9b,"04",$3b,"35",$48

        ;sequentie voor cursor aan en uit

con:    dc.b $9b,$20,$70
coff:   dc.b $9b,$30,$20,$70

dosname:dc.b "dos.library",0
trkdisk:dc.b "trackdisk.device",0
device: dc.b 0

even
dosbase:dc.l 0
wdhd:   dc.l 0          ;vensterhandle

block:  dc.w 880        ;startblock
offset: dc.l 0          ;offset voor read/write =512*block
buffptr:dc.l 0          ;bufferpointer
buffer: dc.l 0          ;bufferstart

diskport:
        dc.l 0          ;0
        dc.l 0          ;4
        dc.w $0400      ;8
        dc.l 0          ;10
        dc.b 0          ;14
        dc.b 31         ;15
        dc.l 0          ;16     task adr. hierin
LH1:    dc.l LH2        ;20
LH2:    dc.l 0          ;24
        dc.l LH1        ;28
        dc.b 0          ;32
        dc.b 0          ;33

diskioreq:
        dc.l 0          ;0
        dc.l 0          ;4
        dc.b 5          ;8
        dc.b 0          ;9
        dc.l 0          ;10
        dc.l diskport   ;14
        dc.w 48         ;18
        dc.l 0          ;20
        dc.l 0          ;24
        dc.w 0          ;28 IO_CMD
        dc.w 0          ;30
        dc.l 0          ;32 IO_ERROR
        dc.l 0          ;36 IO_LENGTH
        dc.l 0          ;40 IO_DATA
        dc.l 0          ;44 IO_OFFSET
        dc.l 0
        dc.l 0

