; FastMemChange - gezieltes Belegen von 32-Bit-FastMem oder 16-Bit-FastMem
; ------------------------------------------------------------------------
; Pius Nippgen, Bergstr.12, D-6657 Gersheim 8, West-Germany

start:
 move.l  $4.w,a6
 btst    #1,297(a6)
 beq     meldungout       ; kein 68020,30 -> auch kein 32-Bit-FastMem möglich
 jsr     -132(a6)
 lea     322(a6),a0       ; MemListStruktur
 move.l  (a0),a1
searchlist:
 cmp.w   #5,14(a1)        ; FastMem(4)+Public(1)
 bne.s   nofast
 addq.b  #1,card
nofast:
 move.l  (a1),d0
 move.l  (a1),a1
 bne.s   searchlist
 jsr     -138(a6)
 cmp.b   #1,card
 bls.s   meldungout       ; wenn keine oder nur eine FastMem-Karte Ende

; Die im Moment in Liste vorne stehende Fast-Mem-Karte nicht mehr bevorzugen,
; indem ich sie aus Speicherliste entferne und am Ende wieder anhänge
 jsr     -120(a6)         ; Disable()
 move.l  (a0),a1
searchlist1:
 cmp.w   #5,14(a1)        ; FastMem(4)+Public(1)
 beq.s   firstfound
 move.l  (a1),d0
 move.l  (a1),a1
 bne.s   searchlist1
 beq.s   nochip           ; keine FastMem-Karte vorhanden
firstfound:
 move.l  a1,-(sp)         ; Zeiger auf Nodestruktur der ersten FastMemKarte
 bsr     speedtest
 move.b  d7,oldspeed
 move.l  (sp),a1
 jsr     -252(a6)         ; RemoveNode
 move.l  (sp)+,a1
 lea     322(a6),a0
 jsr     -246(a6)         ; AddTail("expansion ram",0)
 bsr     speedtest
 move.b  d7,newspeed

; nachdem FastMem an Schluß der Liste gehängt wurde, ChipMem an Schluß hängen,
; damit, wenn nur allgemein Speicher angefordert wird, Fastmem belegt wird.
 lea     322(a6),a0       ; MemListStruktur
 move.l  (a0),a1
searchlist2:
 cmp.w   #3,14(a1)        ; ChipMem(2)+Public(1)
 beq.s   chipfound
 move.l  (a1),d0
 move.l  (a1),a1
 bne.s   searchlist2
 beq.s   nochip
chipfound:
 move.l  a1,-(sp)
 jsr     -252(a6)         ; RemoveChipNode
 move.l  (sp)+,a1
 lea     322(a6),a0
 jsr     -246(a6)         ; AddTailChipNode
nochip:
 jsr     -126(a6)         ; Enable()

meldungout:
 lea     dosname(pc),a1
 jsr     -408(a6)
 move.l  d0,a6
 jsr     -60(a6)          ; outputhandle
 move.l  d0,d1
 beq.s   NoOutput
 move.l  #Text,d2
 move.l  #errortext-Text,d3
 move.b  newspeed,d0      ; wenn ich nach Change schnelleres FastMem erhalte,
 cmp.b   oldspeed,d0      ; also weniger Rasterzeilen, dann habe ich von 16-Bit
 bne.s   noerror          ; auf 32-Bit gewechselt, bzw. wenn nun mehr Zeilen ->
 move.l  #errortext,d2    ; auf 16-Bit gewechselt
 moveq   #dosname-errortext,d3
 move.l  d1,-(sp)
 jsr     -48(a6)
 move.l  (sp)+,d1
 move.l  #person,d2
 moveq   #errortext-person,d3
 bra.s   write
noerror:
 bhi.s   write
 move.w  #"32",modify
write:
 jsr     -48(a6)          ; Write
NoOutput:
 move.l  a6,a1
 move.l  $4.w,a6
 jsr     -414(a6)         ; CloseLibrary('dos.library',0)
 moveq   #0,d0
rrttss:                   ; und Ende
 rts

speedtest:
 moveq   #8,d0
 moveq   #5,d1            ; etwas FastMem für speedtest anfordern
 jsr     -198(a6)         ; muß vor speedtest Disable() machen, andernfalls
 move.l  d0,a1            ; stören die Interrupts und ich messe falsch
 tst.l   d0
 beq.s   rrttss
synchro:
 tst.b   $dff006          ; warten auf Rasterzeile 0 = Beginn Vertikal Blank,
 bne.s   synchro          ; kein WaitTOF(), da hierbei noch andere tasks usw.
synchro1:                 ; zuerst bedient werden, wodurch meine Zeitmessung
 tst.b   $dff005          ; durcheinanderkommen kann.
 bne.s   synchro1
 move.w  #2000,d0
loop:                     ; auf 68000 132 Rasterzeilen
 addq.l  #1,(a1)          ; auf 68030 mit beiden Caches 12, ohne 36
 dbra    d0,loop          ; egal ob Caches gesetzt sind, da ich
 move.b  $dff006,d7       ; oldspeed mit newspeed vergleiche
 moveq   #8,d0
 jmp     -210(a6)

oldspeed: dc.b 0
newspeed: dc.b 0
card:     dc.b 0
frei:     dc.b 0
Text:     dc.b "FastMemChange -> ab jetzt wird bevorzugt ",$9b,"33m"
 even
modify:   dc.b "16",$9b,"31m-Bit-FastMem belegt !",10
 even
person:
 dc.b "von Pius Nippgen, Bergstr.12, D-6657 Gersheim 8,  Tel.06843/1522",10
 even
errortext:
 dc.b "kein  16-Bit + 32-Bit-FastMem   ->  kein FastMemChange möglich !",10
 even
dosname:  dc.b "dos.library",0
 even
 end
