


* Usage: ›33;40mQ4mat ›0m[DRIVE]

* Formatiert  DOS Disketten im angegebenen Laufwerk !
* Verbesserung  gegenüber Version 1.06:  Leider hatte
* sich  in  der   Vorversion  1.06  ein  kleiner  Bug
* eingeschlichen.  Bei einem Aufruf von Q4mat  wurden
* 2 Blöcke zuviel als belegt makierte. Statt den 1756
* Blöcken  stehen ab  Version 1.07  1758 dem Benutzer
* zur Verfügung !

* Editor:    AZ Editor V1.50
*            Copyright © by Software Winery

* Assembler: GenAm Macro Assembler V2.11D
*            Copyright ©1985/88 by HiSoft

* Q4mat V1.07 ® 15. April, 1993

* Volker Stepprath
* Tegeler Str.7
* 40789 Monheim
* Deutschland





* Variablen definieren
* --------------------

_SYSBase           equ        4
_LVORead           equ      -42
_LVOWrite          equ      -48
_LVOOutput         equ      -60
_LVOAllocMem       equ     -198
_LVOFreeMem        equ     -210
_LVOFindTask       equ     -294
_LVOOldOpenLibrary equ     -408
_LVOCloseLibrary   equ     -414
_LVOOpenDevice     equ     -444
_LVOCloseDevice    equ     -450
_LVODoIO           equ     -456



* Parameter auswerten
* -------------------

             cmp.l   #5,d0
             bne     _USAGE
             move.b  2(a0),d4
             sub.l   #48,d4
             cmp.b   #0,d4
             blt     _USAGE
             cmp.b   #3,d4
             bgt     _USAGE



* Hauptprogramm
* -------------

_MAIN        bsr     _OPENALL
             bsr     _OPENDEV
             cmp.l   #0,d0
             bne     _DEVFEHLER
             bsr     _RETURN
             bsr     _CHANGESTATE
             cmp.l   #0,d0
             bne     _DISKERRA
             bsr     _PROSTATUS
             cmp.l   #0,d0
             bne     _DISKERRB
             cmp.l   #0,d0
             bne     _DISKERRA
             bsr     _ALLOCMEM
             bsr     _BOOTBLOCK
             bsr     _DOIO
             bsr     _FREEMEM
             bsr     _ALLOCMEM
             bsr     _BITMAP
             bsr     _DOIO
             bsr     _FREEMEM
             bsr     _CLOSEDEV
             bsr     _REMOVE
             bra     _CLOSELIB



* Keine gültigen Parameter
* ------------------------

_USAGE       bsr     _OPENALL
             move.l  #Usage,d2
             moveq   #31,d3
             bsr     _WRITE
             bra     _CLOSELIB



* Auf RETURN-key warten
* ---------------------

_RETURN      lea     Message(pc),a3
             move.b  d4,111(a3)
             add.b   #48,111(a3)
             move.l  #Message,d2
             move.l  #143,d3
             bsr     _WRITE
             move.l  Handle(pc),d1
             jsr     _LVORead(a6)
             rts



* Diskette im Laufwerk ?
* ----------------------

_CHANGESTATE move.l  _SYSBase,a6
             lea     DiskIO(pc),a1
             move    #14,28(a1)
             jsr     _LVODoIO(a6)
             move.l  32(a1),d0
             rts



* Keine Diskette eingelegt !
* --------------------------

_DISKERRA    move.l  #DiskErrA,d2
             moveq   #21,d3
             bsr     _WRITE
             bsr     _CLOSEDEV
             bra     _CLOSELIB



* Diskette schreibgeschützt ?
* ---------------------------

_PROSTATUS   move    #15,28(a1)
             jsr     _LVODoIO(a6)
             move.l  32(a1),d0
             rts



* Diskette ist schreibgeschützt !
* -------------------------------

_DISKERRB    move.l  #DiskErrB,d2
             moveq   #28,d3
             bsr     _WRITE
             bsr     _CLOSEDEV
             bra     _CLOSELIB



* Speicher reservieren
* --------------------

_ALLOCMEM    move.l  #1024,d0
             move.l  #$10003,d1
             jsr     _LVOAllocMem(a6)
             move.l  d0,Diskbuff
             rts



* Speicher löschen
* ----------------

_FREEMEM     move.l  #1024,d0
             move.l  Diskbuff(pc),a1
             jsr     _LVOFreeMem(a6)
             rts



* BootBlock erstellen
* -------------------

_BOOTBLOCK   lea     DiskIO(pc),a1
             move.l  #0,44(a1)
             move.l  Diskbuff(pc),a5
             moveq   #12,d4
             lea     BootBlock(pc),a4

_FILLBB      move.l  (a4)+,(a5)+
             dbra    d4,_FILLBB
             rts



* BitMap / RootBlock erstellen
* ----------------------------

_BITMAP      lea     DiskIO(pc),a1
             move.l  Diskbuff(pc),a5
             add     #516,a5
             moveq   #54,d0

_FILLBM      move.l  #-1,(a5)+
             dbra    d0,_FILLBM

             move.l  Diskbuff(pc),a5
             move.l  #$2c00*40,44(a1)
             move.w  #$2,2(a5)
             move.b  #$48,15(a5)
             move.l  #$a661aef3,20(a5)
             move.w  #$1,$13a(a5)
             move.w  #$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  #$C037,$200(a5)
             move.b  #$3F,$272(a5)
             rts



* Devicekommandos ausführen
* -------------------------

_DOIO        lea     DiskIO(pc),a1
             move    #3,28(a1)
             move.l  Diskbuff(pc),40(a1)
             move.l  #1024,36(a1)
             jsr     _LVODoIO(a6)
             move    #4,28(a1)
             jsr     _LVODoIO(a6)
             rts



* Disk kurz entfernen
* -------------------

_REMOVE      move.l  #Remove,d2
             moveq   #37,d3
             bra     _WRITE



* Drive nicht vorhanden
* ---------------------

_DEVFEHLER   move.l  #DevErr,d2
             moveq   #22,d3
             bsr     _WRITE
             bra     _CLOSELIB



* Allgemeine Textausgabe
* ----------------------

_WRITE       move.l  _DOSBase(pc),a6
             move.l  Handle(pc),d1
             jsr     _LVOWrite(a6)
             rts



* Device öffnen
* -------------

_OPENDEV     move.l  _SYSBase,a6
             sub.l   a1,a1
             jsr     _LVOFindTask(a6)
             move.l  d0,DiskRep+$10
             lea     DiskIO(pc),a1
             move.l  #DiskRep,14(a1)
             clr.l   d1
             move.l  d4,d0
             lea     Device(pc),a0
             jsr     _LVOOpenDevice(a6)
             rts


* Device schließen
* ----------------

_CLOSEDEV    move.l  _SYSBase,a6
             lea     DiskIO(pc),a1
             move    #9,28(a1)
             move.l  #0,36(a1)
             jsr     _LVODoIO(a6)
             lea     DiskIO(pc),a1
             jsr     _LVOCloseDevice(a6)
             rts



* Library & Fenster öffnen
* ------------------------

_OPENALL     move.l  _SYSBase,a6
             lea     Dosname(pc),a1
             jsr     _LVOOldOpenLibrary(a6)
             move.l  d0,_DOSBase
             move.l  _DOSBase(pc),a6
             jsr     _LVOOutput(a6)
             move.l  d0,Handle
             rts



* Library schließen & Tschüss
* ---------------------------

_CLOSELIB    move.l  _SYSBase,a6
             move.l  _DOSBase(pc),a1
             jsr     _LVOCloseLibrary(a6)
             rts



* Speicherreservierung
* --------------------

_DOSBase  dc.l 0
Diskbuff  dc.l 0
Handle    dc.l 0
DiskRep   ds.l 8
DiskIO    ds.l 20
Dosname   dc.b 'dos.library',0
Device    dc.b 'trackdisk.device',0

Message   Dc.b $9b,$c
          Dc.b $9b,'32;43m Q4mat V1.07 (r) 15-Apr-94 by Volker Stepprath '
          Dc.b $9b,'0m',10,10
          Dc.b 'Insert DOS disk to be formatted in drive ',$9b,'32;40mDF : '
          Dc.b $9b,'0m!',10,'Press RETURN when ready:'

Remove    dc.b 10,'Remove disk to inform validator...',10,10

Usage     dc.b 'Usage: ',$9b,'33;40mQ4mat',$9b,'0m [DRIVE]',10

DevErr    dc.b 'Drive not available !',10

DiskErrA  dc.b 10,'No disk in drive !',10,10

DiskErrB  dc.b 10,'Disk is write protected !',10,10

BootBlock dc.l $444f5300,$c0200f19,$370,$43fa0018,$4eaeffa0,$4a80670a,$20402068
          dc.l $167000,$4e7570ff,$60fa646f,$732e6c69,$62726172,$79000000
