;***************************************
;*             Q4mat V1.01             *
;*      Formatiert  DOS Disketten      *
;*  Sprache: Kuma-Seka Assembler V3.0  *
;*      (c) 1992 Volker Stepprath      *
;***************************************


;**** Variablen definieren *********
ExecBase    =    4
Open        = - 30
Close       = - 36
Read        = - 42
Write       = - 48
AllocMem    = -198
FreeMem     = -210
FindTask    = -294
OpenLib     = -408
CloseLib    = -414
OpenDevice  = -444
CloseDevice = -450
DoIO        = -456


;**** Parameter auswerten **********
Cmp.l   #5,D0
Bne     xUSAGE
Move.b  2(A0),D4
Sub.b   #48,D4
Cmp.b   #0,D4
Blt     xUSAGE
Cmp.b   #3,D4
Bgt     xUSAGE
Jmp     MAIN


;**** Keine gültigen Parameter *****
xUSAGE:
        Jsr     xOPENLIB
        Jsr     xOPEN
        Move.l  DOSBASE,A6

        Move.l  #TBa,D2
        Move.l  #TBb,D3
        Sub.l   D2,D3
        Move.l  HANDLE,D1
        Jsr     Write(A6)

        Jsr     xCLOSE
        Jsr     xCLOSELIB
Rts     ;***************************


;**** Hauptprogramm ****************
MAIN:
        Jsr     xOPENLIB
        Jsr     xOPEN

        Jsr     xOPENDEV
	Cmp.l	#0,D0
	Bne	xDEVFEHLER

        Jsr     xRETURN
        Jsr     xALLOCMEM
        Jsr     xBOOTBLOCK
        Jsr     xDOIO
        Jsr     xFREEMEM
        Jsr     xALLOCMEM
        Jsr     xBITMAP
        Jsr     xDOIO
        Jsr     xFREEMEM

	Jsr     xCLOSEDEV
	Jsr     xCLOSE
	Jsr     xCLOSELIB
Rts	;***************************


;**** Library öffnen ***************
xOPENLIB:
        Move.l  ExecBase,A6
        Lea     DOSNAME,A1
        Move.l  #0,D0
        Jsr     OpenLib(A6)
        Move.l  D0,DOSBASE
Rts     ;***************************


;**** Device öffnen ****************
xOPENDEV:
        Move.l  ExecBase,A6
        Sub.l   A1,A1
        Jsr     FindTask(A6)
        Move.l  D0,DISKREP+$10
        Lea     DISKIO,A1
        Move.l  #DISKREP,14(A1)
        Clr.l   D1
        Move.l  D4,D0
        Lea     DEVICE,A0
        Jsr     OpenDevice(A6)
Rts     ;***************************


;**** Speicher reservieren *********
xALLOCMEM:
        Move.l  ExecBase,A6
        Move.l  #11264,D0
        Move.l  #$10003,D1
        Jsr     AllocMem(A6)
        Move.l  D0,DISKBUFF
Rts     ;***************************


;**** Speicher löschen *************
xFREEMEM:
        Move.l  ExecBase,A6
        Move.l  #11264,D0
        Move.l  DISKBUFF,A1
        Jsr     FreeMem(A6)
Rts     ;***************************


;**** Daten für BB installieren ****
xBOOTBLOCK:
        Lea     DISKIO,A1
        Move.l  #0,44(A1)
        Move.l  DISKBUFF,A5
        Move.l  #$444f5300,(A5)+
        Move.l  #$c0200f19,(A5)+
        Move.l  #$00000370,(A5)+
        Move.l  #$43fa0018,(A5)+
        Move.l  #$4eaeffa0,(A5)+
        Move.l  #$4a80670a,(A5)+
        Move.l  #$20402068,(A5)+
        Move.l  #$00167000,(A5)+
        Move.l  #$4e7570ff,(A5)+
        Move.l  #$60fa646f,(A5)+
        Move.l  #$732e6c69,(A5)+
        Move.l  #$62726172,(A5)+
        Move.b  #$79,(A5)
Rts     ;***************************


;**** BitMap / RootBlock ***********
xBITMAP:
        Lea     DISKIO,A1
        Move.l  DISKBUFF,A5
        Add     #516,A5
        Move    #54,D0
        Move.l  #$-1,D1
        FILL:
        Move.l  D1,(A5)+
        Dbra    D0,FILL
        Move.l  DISKBUFF,A5
        Move.l  #$2c00*40,44(A1)
        Move    #$2,2(A5)
        Move.b  #$48,15(A5)
        Move.l  #$a661aef3,20(A5)
        Move    #$1,$13a(A5)
        Move    #$371,$13e(A5)
        Move.b  #$5,$1b0(A5)
        Move.b  #$45,$1b1(A5)
        Move.b  #$4D,$1b2(A5)
        Move.b  #$50,$1b3(A5)
        Move.b  #$54,$1b4(A5)
        Move.b  #$59,$1b5(A5)
        Move.b  #$1,$1ff(A5)
        Move.l  #$C000C037,$200(A5)
        Move.b  #$3F,$272(A5)
        Move.b  #$3F,$2dc(A5)
Rts     ;***************************


;**** Devicekommando ausführen *****
xDOIO:
        Move.l  ExecBase,A6
        Lea     DISKIO,A1
        Move    #11,28(A1)
        Move.l  DISKBUFF,40(A1)
        Move.l  #11264,36(A1)
        Jsr     DoIO(A6)
Rts     ;***************************


;**** Datei öffnen *****************
xOPEN:
        Move.l  DOSBASE,A6
        Move.l  #FENSTER,D1
        Move.l  #1005,D2
        Jsr     Open(A6)
        Move.l  D0,HANDLE
Rts     ;***************************


;**** Press RETURN *****************
xRETURN:
        Move.l  DOSBASE,A6
        Move.l  HANDLE,D1
        Move.l  #BORDER,D2
        Move.l  #BORDEREND,D3
        Sub.l   D2,D3
        Jsr     Write(A6)

        Cmp.b   #0,D4
        Beq     DA
        Cmp.b   #1,D4
        Beq     DB
        Cmp.b   #2,D4
        Beq     DC
        Cmp.b   #3,D4
        Beq     DD

        RETURN2:
        Move.l  HANDLE,D1
        Sub.l   D2,D3
        Jsr     Write(A6)

        Move.l  HANDLE,D1
        Move.l  #TAa,D2
        Move.l  #TAb,D3
        Sub.l   D2,D3
        Jsr     Write(A6)

        Move.l  HANDLE,D1
        Jsr     Read(A6)
Rts     ;***************************

DA:
        Move.l  #DFA,D2
        Move.l  #DFAe,D3
Jmp     RETURN2
DB:
        Move.l  #DFB,D2
        Move.l  #DFBe,D3
Jmp     RETURN2
DC:
        Move.l  #DFC,D2
        Move.l  #DFCe,D3
Jmp     RETURN2
DD:
        Move.l  #DFD,D2
        Move.l  #DFDe,D3
Jmp     RETURN2
;***********************************


;**** Drive nicht vorhanden ********
xDEVFEHLER:
	Move.l	DosBase,A6
	Move.l	HANDLE,D1
	Move.l	#DEVERR,D2
	Move.l	#DEVERREND,D3
	Sub.l	D2,D3
	Jsr	Write(A6)

	Jsr	xCLOSE
	Jsr	xCLOSELIB
Rts	;***************************


;**** Datei schließen **************
xCLOSE:
        Move.l  DOSBASE,A6
        Move.l  HANDLE,D1
        Jsr     Close(A6)
Rts     ;***************************


;**** Device schließen *************
xCLOSEDEV:
        Move.l  ExecBase,A6
        Lea     DISKIO,A1
        Move    #9,28(A1)
        Move.l  #0,36(A1)
        Jsr     DoIO(A6)
        Lea     DISKIO,A1
        Jsr     CloseDevice(A6)
Rts     ;***************************


;**** Library schließen ************
xCLOSELIB:
        Move.l  ExecBase,A6
        Move.l  DOSBASE,A1
        Jsr     CloseLib(A6)
Rts     ;***************************


;**** Daten ************************
DOSNAME:        Dc.b `dos.library`,0

DEVICE:         Dc.b `trackdisk.device`,0

Even
DOSBASE:        Dc.l 0

DISKIO:         Blk.l 20,0

DISKREP:        Blk.l 8,0

DISKBUFF:       Dc.l 0

FENSTER:        Dc.b `*`,0

HANDLE:         Dc.l 0

BORDER:
Dc.b $9b,$c
Dc.b $9b,"32;43m Q4mat version 1.01 ©11/92 by Volker Stepprath "
Dc.b $9b,"0m",10,10
Dc.b "Insert DOS disk to be formatted in drive ",$9b,"32;40m"
BORDEREND:

TAa:
Dc.b $9b,"0m!",10,"Press RETURN when ready:"
TAb:

TBa:
Dc.b "USAGE: ",$9b,"33;40mQ4mat",$9b,"0m [DRIVE]",10
TBb:

DFA:
Dc.b "DF0: "
DFAe:

DFB:
Dc.b "DF1: "
DFBe:

DFC:
Dc.b "DF2: "
DfCe:

DFD:
Dc.b "DF3: "
DFDe:

DEVERR:
Dc.b "Drive not available !",10
DEVERREND:
