************************************************************************ * Q4mat ( Quick Format ) V2.00 © 27-09-1998 by Testaware * --------------------------------------------------------------------- * * Code: Peace^Testaware / Volker Stepprath * Home: http://www.testaware.de.tp * * Usage: Q4mat [drive (name)] * * Assembler: GenAm Macro Assembler V2.11D Copyright © HiSoft 1985,8 * * Editor: CygnusEd Professional II © 1987 - 1989 by CygnusSoft Software ************************************************************************ opt o+ Output RAM:Q4mat ************************************************************************ ;Variablen definieren _LVORead equ -42 _LVOWrite equ -48 _LVOOutput equ -60 _LVODeviceProc equ -174 _LVOAllocMem equ -198 _LVOFreeMem equ -210 _LVOFindTask equ -294 _LVOPutMsg equ -366 _LVOGetMsg equ -372 _LVOWaitPort equ -384 _LVOCloseLibrary equ -414 _LVOOpenDevice equ -444 _LVOCloseDevice equ -450 _LVODoIO equ -456 _LVOOpenLibrary equ -552 *********************************************************************** ;Datenstruktur RsReset MY_BASE rs.b 0 my_ParamStr rs.l 1 my_ParamLen rs.l 1 my_DosBase rs.l 1 my_OutPut rs.l 1 my_DiskReply rs.l 8 my_DiskIO rs.l 20 my_DiskBuffer rs.b 1024 my_WorkBuffer rs.b 1024 my_SIZEOF rs.w 0 *********************************************************************** ;Macros definieren EXE MACRO move.l 4.w,a6 jsr _LVO\1(a6) ENDM DOS MACRO move.l my_DosBase(a5),a6 jsr _LVO\1(a6) ENDM LIB MACRO jsr _LVO\1(a6) ENDM LAB MACRO jmp _LVO\1(a6) ENDM *********************************************************************** ;Parameter retten, Speicher für Datenstruktur reservieren Start clr.b -1(a0,d0.l) move.l a0,d6 move.l d0,d7 move.l #my_SIZEOF,d0 move.l #$10003,d1 EXE AllocMem tst.l d0 beq Exit movea.l d0,a5 move.l d6,my_ParamStr(a5) move.l d7,my_ParamLen(a5) *********************************************************************** ;Funktionen der dos.library bereitstellen lea DosLib(pc),a1 moveq #0,d0 LIB OpenLibrary move.l d0,my_DosBase(a5) DOS Output move.l d0,my_OutPut(a5) *********************************************************************** ;Parametertest nach DFn:, Mindestlänge sowie TrkDev bereitstellen PCheck move.l my_ParamStr(a5),a0 move.l my_ParamLen(a5),d0 cmpi.l #5,d0 ;Mindestlänge DFn: + Lf blt.s 2$ ;Fehler cmpi.b #':',3(a0) ;Test nach DFn: bne.s 2$ ;Fehler move.b 2(a0),d4 ;LW Nummer subi.b #'0',d4 suba.l a1,a1 ;Eigener Task EXE FindTask lea my_DiskReply(a5),a2 move.l d0,$10(a2) lea my_DiskIO(a5),a1 move.l a2,14(a1) moveq #0,d1 move.l d4,d0 lea TrkDev(pc),a0 LIB OpenDevice ;TrackDisk.Dev. öffnen tst.l d0 ;Alles geklappt bne.s 1$ ;Nein! Fehler bsr.s WaitRet bra.s 3$ ;Programm beenden 1$ lea TxAvail(pc),a0 ;Fehler aufgetreten bsr Print bra.s 3$ 2$ bsr.s Usage ;Benutzerhinweis 3$ bra Finish ;Programm beenden ************************************************************************ ;Keine gültigen Parameter Usage lea TxUsage(pc),a0 bra Print ************************************************************************ ;Auf RETURN-key warten & Disk formatieren WaitRet lea TxMess(pc),a0 lea TxDrive(pc),a1 add.b d4,2(a1) bsr Print moveq #-1,d7 ;Disk-Interrupt aus bsr Busy move.l my_OutPut(a5),d1 lea TxMess(pc),a0 move.l a0,d2 moveq.l #1,d3 DOS Read bsr.s Q4Mat 1$ moveq #0,d7 ;Disk-Interrupt an bra Busy ************************************************************************ ;BootBlock & RootBlock formatieren Q4Mat lea my_DiskIO(a5),a1 move.w #14,28(a1) TD_CHANGESTATE EXE DoIO tst.l 32(a1) ;Disk in LW beq.s 1$ ;Ja! lea TxNotIn(pc),a0 ;Nein! bra PrintUp ;Mitteilung 1$ move.w #15,28(a1) ;TD_PROTECTION LIB DoIO tst.l 32(a1) ;Disk schreibgeschützt beq.s 2$ ;Nein! lea TxPrtec(pc),a0 ;Ja! bra PrintUp ;Mitteilung 2$ lea my_DiskIO(a5),a1 ;BootBlock mit DOS-Markierung move.l #$444F5300,my_DiskBuffer(a5) move.l #0,44(a1) bsr Write ;BootBlock schreiben lea my_DiskIO(a5),a1 ;RootBlock installieren lea my_DiskBuffer+516(a5),a0 moveq #54,d0 3$ not.l (a0)+ ;BitMap mit Leerblöcke füllen dbra d0,3$ lea my_DiskBuffer(a5),a0 ;RootBlk installieren move.l #$00002C00*40,44(a1) ;RootBlk Position für StdIOReq move.l #$00000002,(a0) ;Type move.b #$00000048,15(a0) ;HT-Size not.l 312(a0) ;BM-Flag move.l #$00000371,316(a0) ;BM-Pages lea $1B0(a0),a2 ;Position für Name move.l my_ParamLen(a5),d0 cmpi.l #6,d0 ;Wurde Disk-Name angegeben? ble.s 4$ ;Nein, Def. Name verwenden subi.l #6,d0 ;Länge Disk-Name move.b d0,(a2)+ move.l my_ParamStr(a5),a1 lea 5(a1),a1 ;Zeiger auf Disk-Name bra.s 5$ 4$ lea TxName(pc),a1 ;Def. Name übergeben 5$ move.b (a1)+,(a2)+ ;Name kopieren bne.s 5$ move.b #$00000001,$1FF(a0) move.l #$0000C037,$200(a0) move.b #$0000003F,$272(a0) lea my_DiskBuffer(a5),a0 ;CheckSum neu berechnen movea.l a0,a1 moveq.l #0,d0 move.w #$7F,d1 clr.l 20(a0) 6$ sub.l (a0)+,d0 dbf d1,6$ move.l d0,20(a1) ;CheckSum eintragen bsr.s Write ;RootBlock schreiben lea my_DiskIO(a5),a1 ;Motor abschalten move.w #9,28(a1) move.l #0,36(a1) LIB DoIO lea TxValid(pc),a0 ;Textausgabe alles OK! bra PrintUp ************************************************************************ ;Disk-Interrupt aus/anschalten ;D7 => Argument True/False Busy lea TxDrive(pc),a0 clr.b 4(a0) move.l a0,d1 DOS DeviceProc move.l d0,d6 beq.s 1$ suba.l a1,a1 EXE FindTask move.l d0,d5 addi.l #$5C,d5 lea my_WorkBuffer+$14(a5),a0 lea my_WorkBuffer(a5),a1 move.l a0,10(a1) move.l a1,(a0) move.l d5,4(a0) move.l #$1F,8(a0) move.l d7,$14(a0) movea.l d6,a0 LIB PutMsg movea.l d5,a0 LIB WaitPort movea.l d5,a0 LIB GetMsg 1$ rts ************************************************************************ ;Devicekommandos ausführen Write lea my_DiskIO(a5),a1 move.w #3,28(a1) lea my_DiskBuffer(a5),a0 move.l a0,40(a1) move.l #1024,36(a1) EXE DoIO move.w #4,28(a1) LAB DoIO *********************************************************************** ;Textausgabe » NULL Byte Test « A0 = TextPtr PrintUp move.l a0,-(sp) lea TxULine(pc),a0 bsr.s Print move.l (sp)+,a0 Print move.l my_OutPut(a5),d1 move.l a0,d2 moveq #0,d3 1$ tst.b (a0)+ beq.s 2$ addq.l #1,d3 bra.s 1$ 2$ DOS Write rts *********************************************************************** ;Programmende Finish move.l $4.w,a6 ;ExecBase move.l my_DosBase(a5),d0 ;DosLib beq.s 1$ ;Konnte nicht geöffnet werden movea.l d0,a1 LIB CloseLibrary 1$ lea my_DiskIO(a5),a1 ;DeviceStruc tst.w 28(a1) ;Wurde Kommando übergeben beq.s 2$ ;Nein! Fehler aufgetreten LIB CloseDevice 2$ move.l #my_SIZEOF,d0 ;DatenStruc freigeben movea.l a5,a1 LIB FreeMem Exit RTS ************************************************************************ ;Datenreservierung TxMess dc.b 'Insert disk to format in ' TxDrive dc.b 'DF0:',0 TxUsage dc.b 10,'Usage: ',$9B,'33mQ4mat',$9B,'0m [drive (name)]',10,10 dc.b ' drive - DF0: increase to DF3:',10,10 dc.b ' Optional (name) as new diskname',10,10 dc.b $9B,'33mQ4mat',$9B,'0m V2.00 ',$9B,'33mFD',$9B,'0m © 1998 by V.Stepprath, Testaware',10,10,0 TxAvail dc.b 'Drive not available!',10,0 TxNotIn dc.b 'No disk in drive!',10,0 TxPrtec dc.b 'Disk is write protected!',10,0 TxValid dc.b 'Disk is validated!',10,0 TxULine dc.b $9B,$46,$9B,$4D,0 TxName dc.b 5,'Empty',0 TrkDev dc.b 'trackdisk.device',0 DosLib dc.b 'dos.library',0 END