        ; Bootsektorerzeugung nur fr TT	geschrieben von T.Thiel
		;													22.3.92
		; -schaltet den Cache des 68030 ein
		; -zeigt Uhrzeit und Datum mit Wochentag 
		;   /der Wochentag sollte fr die n„chsten Jahrzehnte stimmen
		;   /zwar verfgt der TT ber einen Uhrenchip, der auch einen
		;   Wochentag kennt, doch ist dieser unabh„ngig vom Datum, so
		;   daž man nach jedem Schaltjahr nicht nur das Datum, sondern
		;	auch den Tag korrigieren muž (Womit? und Warum?)
		;	/ein TT ist heut nicht mit einer Armbanduhr zu vergleichen,
		;	die den Wochentag aus dem Datum errechnet
		; -simmuliert nach bestimmter Zeit einen Tastendruck
		;   
		; assembliert mit dem PASM 68040 Assembler von Pure Software

wartezeit		equ 1700 	; in 1/200 Sekunden
		;		    >>>>	; legt die Wartezeit nach einschalten
							; des Rechners fest, nach der von der
							; Festplatte gebootet werden kann
							; z.B. 1700 == 8,5s  fr LPS120S
gemdos  		equ 1
bios    		equ 13
xbios   		equ 14
rwabs   		equ 4
cconin  		equ 8
cconws  		equ 9
protobt         equ 18
gettime			equ 23
ikbdws			equ 25
_hz_200			equ $4ba
        ;
        .TEXT 
start:  
        lea.l   clrscr(pc),a0
        bsr     print
        ;
        lea.l   insert(pc),a0
        bsr     input
        cmpi.b  #$1b,d0
        beq.s   quit
        cmpi.b	#$0d,d0
		bne.s	start
		clr.w   -(sp)
        clr.w   -(sp)
        move.w  #1,-(sp)
        pea     buffer(pc)
        move.w  #2,-(sp)
        move.w  #rwabs,-(sp)
        trap    #bios
        lea.l   14(sp),sp
        tst.w   d0
        bne.s   quit
        move.w  #$6038,buffer
        lea.l   buffer+$38(pc),a0
        lea.l   boot(pc),a1
        move.w  #bootend-boot+1,d0
copy:   move.b  (a1)+,(a0)+
        dbra    d0,copy
        move.w  #1,-(sp)
        move.w  #-1,-(sp)
        pea     -1
        pea     buffer(pc)
        move.w  #protobt,-(sp)
        trap    #xbios
        lea.l   14(sp),sp
        clr.w   -(sp)
        clr.w   -(sp)
        move.w  #1,-(sp)
        pea     buffer(pc)
        move.w  #3,-(sp)
        move.w  #rwabs,-(sp)
        trap    #bios
        lea.l   14(sp),sp
        bra     start
quit:   clr.w   -(sp)
        trap    #gemdos
input:  move.l  a0,-(sp)
        move.w  #cconws,-(sp)
        trap    #gemdos
        addq.l  #6,sp
        move.w  #cconin,-(sp)
        trap    #gemdos
        addq.l  #2,sp
        rts     
        ;
print:  move.l  a0,-(sp)
        move.w  #cconws,-(sp)
        trap    #gemdos
        addq.l  #6,sp
        rts     
		;
		;
		;
        ;
        ; -------- Bootprogramm -------
        ;
        ;
boot:   
		movec.l cacr,d0			; Cache einschalten
		ori.w	#$0311,d0
		movec.l	d0,cacr
		;
		move.w	#gettime,-(sp)
		trap	#xbios
		addq.l	#2,sp			
		move.l	#63,d1
		move.l	#31,d2
		move.l	#31,d3
		move.l	#15,d4
		move.l	#127,d5
		lsr.l	#5,d0
		and.l	d0,d1			; Minute
		lsr.l	#6,d0
		and.l	d0,d2			; Stunde
		lsr.l	#5,d0
		and.l	d0,d3			; Tag
		lsr.l	#5,d0
		and.l	d0,d4			; Monat
		lsr.l	#4,d0
		and.l	d0,d5			; Jahr
		;
		lea.l 	stunde(pc),a0
		move.l	d2,d7
		bsr 	dezasc
		lea.l 	minute(pc),a0
		move.l	d1,d7
		bsr 	dezasc
		lea.l 	tag(pc),a0
		move.l	d3,d7
		bsr 	dezasc
		lea.l 	monat(pc),a0
		move.l	d4,d7
		bsr 	dezasc
		lea.l 	jahr(pc),a0
		move.l	d5,d7
		add.l	#1980,d7
		bsr 	dezasc
		;
		lea.l 	jmt(pc),a0
		moveq.l	#2,d7			; der 1.1.1980 war Dienstag
		move.l	d5,d0			; Jahre nach d0 (seit 1980 minus 1)
		mulu	#365,d0			; mal 365 Tage
		add.w	d0,d7
		move.l	d5,d0			; Jahre nach d0
		lsr		#2,d0			; Anzahl der Schaltjahre bestimmen
		add.w	d0,d7
		swap	d0			
		tst.w	d0				; ist aktuelles Jahr ein Schaltjahr
		bne.s	loop6
		cmp.b	#3,d4			; und der Monat Januar oder Februar
		bpl.s	loop6
		subq.l 	#1,d7			; Schalttag wieder subtrahieren
loop6:
		moveq.l	#1,d0
		moveq.l #0,d6
loop2:
		cmp.b	d0,d4			; Monat schon erreicht?
		beq.s 	loop3			; wenn Nein
		addq.l	#1,d0			
		move.b	(a0)+,d6
		add.l	d6,d7			; Tage des Monats addieren
		bra.s	loop2
loop3:
		add.l	d3,d7			; aktuellen Tag addieren
loop4:
		subq.l	#7,d7			; solange 7 subtrahieren, bis
		cmp.l	#7,d7			; Tag kleiner 7 ist
		bpl.s	loop4
		mulu	#10,d7			; mit Offset der Namen multipliez.
		lea.l 	tagt(pc),a0
		lea.l	tags(pc),a1
		add.l	d7,a1
		moveq.l	#9,d0			; Offset-1
loop5:	move.b	(a1)+,(a0)+		; und in Boottext eintragen
		dbf		d0,loop5
		;
		pea 	boottext(pc)
        move.w  #cconws,-(sp)	; Print
        trap    #gemdos
        addq.l  #6,sp
loop1:
		move.l 	_hz_200,d7		; warten bis 8,5s abgelaufen sind
		cmp.l 	#wartezeit,d7
		ble.s	loop1
		;
		pea 	button(pc)		; automatischen Button-Abfragemodus
		move.w	#0,-(sp)		; setzen, um Tastendruck zu
		move.w	#ikbdws,-(sp)	; simulieren
		trap 	#xbios
		addq.l 	#8,sp
		pea 	buttoff(pc)		; automatische Abfrage deaktivieren
		move.w	#0,-(sp)		; setzen, um Tastendruck zu
		move.w	#ikbdws,-(sp)	; simulieren
		trap 	#xbios
		addq.l 	#8,sp
		;
        rts     
        ;
        ;
        ;
        ;
dezasc:
        divu    #10,D7 			; D7 in ASC-String wandeln
        swap    D7
        ori.b   #$30,D7
        move.b  D7,-(A0)
        clr.w   D7
        swap    D7
        bne.s   dezasc
		rts
        ;
boottext:       
        .DC.b "   Booting EXTRA      by Toto",$0d,$0a,$0a,$0a
		.DC.b "   "
tagt:   .dc.b "           der 00"
tag:	.DC.b ".00"
monat:	.DC.b "  0000"
jahr:	.DC.b $0d,$0a,$0a
		.DC.b "   00"
stunde: .DC.b ".00"
minute:	.DC.b " Uhr",$0d,$0a,$0a,0
		;
button:		
		.DC.b $18	
buttoff:
		.DC.b $15	
tags:
		.dc.b "Sonntag   "  
		.dc.b "Montag    "
		.dc.b "Dienstag  "
		.dc.b "Mittwoch  "
		.dc.b "Donnerstag"
		.dc.b "Freitag   "
		.dc.b "Sonnabend "
		.EVEN 
jmt:	.dc.b 31,28,31,30,31,30,31,31,30,31,30,31
bootend:        
        .DC.w 0
        ;
        ;
        ; ------------------------------------
        ;
        ;
clrscr: 
        .DC.b $1b,$45
        .DC.b "  Bootsektorgenerierung nur fr Atari TT         geschrieben von T.Thiel",$0d,$0a,$0a
        .DC.b "  Es kann nun ein Bootsektor auf der Diskette erzeugt werden,",$0d,$0a
        .DC.b "  der vor dem Booten von der Festplatte den 68030-Cache ein-",$0d,$0a
		.DC.b "  schaltet, das Datum mit dem Wochentag anzeigt und nach",$0d,$0a
        .DC.b "  einer bestimmte Zeit einen Tastendruck simuliert.",$0d,$0a,$0a,$0a
        .DC.b "  [ Abbruch mit 'ESC' ]",$0d,$0a,$00
insert: 
        .DC.b $0d,$0a,$0a,$0a
        .DC.b "  Diskette in Laufwerk 'A:' einlegen "
        .DC.b "und 'RETURN' drcken !",$00
        ;
        ;
        .BSS 
        ;
buffer: .DS.b 512
        .END 
