home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti9 / startup2.s < prev   
Text File  |  1995-04-26  |  15KB  |  420 lines

  1. ******************************************************************************
  2. ;    680X0 & AGA STARTUP BY FABIO CIUCCI - Livello di complessita' 2
  3. ******************************************************************************
  4.  
  5. MAINCODE:
  6.     movem.l    d0-d7/a0-a6,-(SP)    ; Salva i registri nello stack
  7.     move.l    4.w,a6            ; ExecBase in a6
  8.     LEA    DosName(PC),A1        ; Dos.library
  9.     JSR    -$198(A6)        ; OldOpenlib
  10.     MOVE.L    D0,DosBase
  11.     BEQ.w    EXIT3            ; Se zero, esci! Errore!
  12.     LEA    GfxName(PC),A1        ; Nome libreria da aprire
  13.     JSR    -$198(A6)        ; OldOpenLibrary - apri la lib
  14.     MOVE.L    d0,GfxBase
  15.     BEQ.w    EXIT2            ; Se si, esci! Errore!
  16.     LEA    IntuiName(PC),A1    ; Intuition.library
  17.     JSR    -$198(A6)        ; OldOpenlib
  18.     MOVE.L    D0,IntuiBase
  19.     BEQ.w    EXIT1            ; Se zero, esci! Errore!
  20.  
  21.     MOVE.L    d0,A0
  22.     CMP.W    #39,$14(A0)      ; Versione 39 o maggiore? (kick3.0+)
  23.     BLT.s    VecchiaIntui
  24.     BSR.w    ResettaSpritesV39 ; se kick3.0+ allora resetta sprites
  25. VecchiaIntui:
  26.  
  27.     MOVE.L    GfxBase(PC),A6
  28.     MOVE.L    $22(A6),WBVIEW    ; Salva il WBView attuale di sistema
  29.     SUB.L    A1,A1        ; View nullo per azzerare il modo video
  30.     JSR    -$DE(A6)    ; LoadView nullo - modo video azzerato
  31.     SUB.L    A1,A1        ; View nullo
  32.     JSR    -$DE(A6)    ; LoadView (due volte per sicurezza...)
  33.     JSR    -$10E(A6)    ; WaitOf ( Queste due chiamate a WaitOf    )
  34.     JSR    -$10E(A6)    ; WaitOf ( servono a resettare l'interlace )
  35.     JSR    -$10E(A6)    ; Altre due, vah!
  36.     JSR    -$10E(A6)
  37.  
  38.     LEA    $DFF006,A5    ; VhPosr
  39.     MOVE.w    #$dd,D0        ; Linea da attendere
  40.     MOVE.w    #WaitDisk,D1    ; Quanto attendere... (Per essere sicuri che
  41. WaitaLoop:            ; disk drives o Hard Disk abbiano finito).
  42.     CMP.B    (A5),D0
  43.     BNE.S    WaitaLoop
  44. Wait2:
  45.     CMP.B    (A5),D0
  46.     Beq.s    Wait2
  47.     dbra    D1,WaitaLoop
  48.  
  49.     MOVE.L    4.w,A6
  50.     SUB.L    A1,A1        ; NULL task - trova questo task
  51.     JSR    -$126(A6)    ; findtask (Task(name) in a1, -> d0=task)
  52.     MOVE.L    D0,A1        ; Task in a1
  53.     MOVE.L    $B8(A1),pr_Win    ; A questo offset è presente l' address
  54.                 ; della window dalla quale è stato
  55.                 ; caricato il programma e che serve al
  56.                 ; DOS per sapere dove aprire i Reqs.
  57.     MOVE.L    #-1,$B8(A1)    ; Settandolo a -1 il DOS non apre Reqs
  58.                 ; Infatti se ci fossero errori nell'apertura
  59.                 ; di files con la dos.lib, il sistema
  60.                 ; proverebbe ad aprire un requester, ma con
  61.                 ; il blitter disabilitato (OwnBlit), non lo
  62.                 ; potrebbe disegnare, bloccando tutto!
  63.     MOVEQ    #127,D0        ; Priorita' in d0 (-128, +127) - MASSIMA!
  64.     JSR    -$12C(A6)    ; LVOSetTaskPri (d0=priorita', a1=task)
  65.  
  66.     MOVE.L    GfxBase(PC),A6
  67.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  68.                 ; impedendone l'uso al sistema operativo.
  69.     jsr    -$E4(A6)    ; WaitBlit - Attende la fine di ogni blittata
  70.     JSR    -$E4(A6)    ; WaitBlit
  71.  
  72.     move.l    4.w,a6        ; ExecBase in A6
  73.     JSR    -$84(a6)    ; FORBID - Disabilita il Multitasking
  74.     JSR    -$78(A6)    ; DISABLE - Disabilita anche gli interrupt
  75.                 ;        del sistema operativo
  76.  
  77.     bsr.w    HEAVYINIT    ; Ora puoi eseguire la parte che opera
  78.                 ; sui registri hardware
  79.  
  80.     move.l    4.w,a6        ; ExecBase in A6
  81.     JSR    -$7E(A6)    ; ENABLE - Abilita System Interrupts
  82.     JSR    -$8A(A6)    ; PERMIT - Abilita il multitasking
  83.  
  84.     SUB.L    A1,A1           ; NULL task - trova questo task
  85.     JSR    -$126(A6)       ; findtask (Task(name) in a1, -> d0=task)
  86.     MOVE.L    D0,A1           ; Task in a1
  87.     MOVE.L    pr_Win(PC),$B8(A1) ; ripristina l'address della window
  88.     MOVEQ    #0,D0           ; Priorita' in d0 (-128, +127) - NORMALE
  89.     JSR    -$12C(A6)       ; LVOSetTaskPri (d0=priorita', a1=task)
  90.  
  91.     MOVE.W    #$8040,$DFF096    ; abilita blit
  92.     BTST.b    #6,$dff002    ; WaitBlit via hardware...
  93. Wblittez:
  94.     BTST.b    #6,$dff002
  95.     BNE.S    Wblittez
  96.  
  97.     MOVE.L    GfxBase(PC),A6    ; GfxBase in A6
  98.     jsr    -$E4(A6)    ; Aspetta la fine di eventuali blittate
  99.     JSR    -$E4(A6)    ; WaitBlit
  100.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  101.                 ; puo' nuovamente usare il blitter
  102.  
  103.     MOVE.L    IntuiBase(PC),A0
  104.     CMP.W    #39,$14(A0)    ; V39+?
  105.     BLT.s    Vecchissima
  106.     BSR.w    RimettiSprites
  107. Vecchissima:
  108.  
  109.     MOVE.L    GfxBase(PC),A6    ; GfxBase in A6
  110.     MOVE.L    $26(a6),$dff080    ; COP1LC - Punta la vecchia copper1 di sistema
  111.     MOVE.L    $32(a6),$dff084    ; COP2LC - Punta la vecchia copper2 di sistema
  112.     JSR    -$10E(A6)    ; WaitOf ( Risistema l'eventuale interlace)
  113.     JSR    -$10E(A6)    ; WaitOf
  114.     MOVE.L    WBVIEW(PC),A1    ; Vecchio WBVIEW in A1
  115.     JSR    -$DE(A6)    ; loadview - rimetti il vecchio View
  116.     JSR    -$10E(A6)    ; WaitOf ( Risistema l'eventuale interlace)
  117.     JSR    -$10E(A6)    ; WaitOf
  118.     MOVE.W    #$11,$DFF10C    ; Questo non lo ripristina da solo..!
  119.     MOVE.L    $26(a6),$dff080    ; COP1LC - Punta la vecchia copper1 di sistema
  120.     MOVE.L    $32(a6),$dff084    ; COP2LC - Punta la vecchia copper2 di sistema
  121.     moveq    #100,d7
  122. RipuntLoop:
  123.     MOVE.L    $26(a6),$dff080    ; COP1LC - Punta la vecchia copper1 di sistema
  124.     move.w    d0,$dff088
  125.     dbra    d7,RipuntLoop    ; Per sicurezza...
  126.  
  127.     MOVE.L    IntuiBase(PC),A6
  128.     JSR    -$186(A6)    ; _LVORethinkDisplay - Ridisegna tutto il
  129.                 ; display, comprese ViewPorts e eventuali
  130.                 ; modi interlace o multisync.
  131.     MOVE.L    A6,A1        ; IntuiBase in a1 per chiudere la libreria
  132.     move.l    4.w,a6        ; ExecBase in A6
  133.     jsr    -$19E(a6)    ; CloseLibrary - intuition.library CHIUSA
  134. EXIT1:
  135.     MOVE.L    GfxBase(PC),A1    ; GfxBase in A1 per chiudere la libreria
  136.     move.l    4.w,a6        ; ExecBase in A6
  137.     jsr    -$19E(a6)    ; CloseLibrary - graphics.library CHIUSA
  138. EXIT2:
  139.     MOVE.L    DosBase(PC),A6    ; DosBase in A1 per chiudere la libreria
  140.     move.l    4.w,a6        ; ExecBase in A6
  141.     jsr    -$19E(a6)    ; CloseLibrary - dos.library CHIUSA
  142. EXIT3:
  143.     movem.l    (SP)+,d0-d7/a0-a6 ; Riprendi i vecchi valori dei registri
  144.     RTS              ; Torna all'ASMONE o al Dos/WorkBench
  145.  
  146. pr_Win:
  147.     dc.l    0
  148.  
  149. *******************************************************************************
  150. ;    Resetta la risoluzione degli sprite "legalmente"
  151. *******************************************************************************
  152.  
  153. ResettaSpritesV39:
  154.     LEA    Workbench(PC),A0 ; Nome schermo del Workbench in a0
  155.     MOVE.L    IntuiBase(PC),A6
  156.     JSR    -$1FE(A6)    ; _LVOLockPubScreen - "blocchiamo" lo schermo
  157.                 ; (il cui nome e' in a0).
  158.     MOVE.L    D0,SchermoWBLocckato
  159.     BEQ.s    ErroreSchermo
  160.     MOVE.L    D0,A0        ; Struttura Screen in a0
  161.     MOVE.L    $30(A0),A0    ; sc_ViewPort+vp_ColorMap: in a0 ora abbiamo
  162.                 ; la struttura ColorMap dell schermo, che ci
  163.                 ; serve (in a0) per eseguire un "video_control"
  164.                 ; della graphics.library.
  165.     LEA    GETVidCtrlTags(PC),A1    ; In a1 la TagList per la routine
  166.                     ; "Video_control" - la richiesta che
  167.                     ; facciamo a questa routine e' di
  168.                     ; VTAG_SPRITERESN_GET, ossia di sapere
  169.                     ; la risoluzione attuale degli sprite.
  170.     MOVE.L    GfxBase(PC),A6
  171.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  172.                 ; riporta nella taglist, nella long
  173.                 ; "risoluzione", la risoluzione attuale degli
  174.                 ; sprite in quello schermo.
  175.  
  176. ; Ora chiediamo alla routine VideoControl di settare la risoluzione.
  177. ; SPRITERESN_140NS -> ossia lowres!
  178.  
  179.     MOVE.L    SchermoWBLocckato(PC),A0
  180.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  181.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  182.     MOVE.L    GfxBase(PC),A6
  183.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  184.  
  185. ; Ora resettiamo anche l'eventuale schermo "in primo piano", ad esempio la
  186. ; schermata dell'assemblatore:
  187.  
  188.     MOVE.L    IntuiBase(PC),A6
  189.     move.l    $3c(a6),a0    ; Ib_FirstScreen (Schermo in "primo piano!")
  190.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  191.     LEA    GETVidCtrlTags2(PC),A1    ; In a1 la TagList GET
  192.     MOVE.L    GfxBase(PC),A6
  193.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  194.  
  195.     MOVEA.L    IntuiBase(PC),A6
  196.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  197.                 ; primo piano (ad es. ASMONE)
  198.     MOVEA.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  199.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  200.     MOVEA.L    GfxBase(PC),A6
  201.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  202.  
  203.     MOVEA.L    SchermoWBLocckato(PC),A0
  204.     MOVEA.L    IntuiBase(PC),A6
  205.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  206.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  207.                 ; primo piano (ad es. ASMONE)
  208.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  209.                 ; per essere sicuri del reset: ossia occorre
  210.                 ; chiamare MakeScreen, seguito da...
  211.     JSR    -$186(A6)    ; _LVORethinkDisplay - che ridisegna tutto il
  212.                 ; display, comprese ViewPorts e eventuali
  213. ErroreSchermo:            ; modi interlace o multisync.
  214.     RTS
  215.  
  216. ; Ora dobbiamo risettare gli sprites alla risoluzione di partenza.
  217.  
  218. RimettiSprites:
  219.     MOVE.L    SchermoWBLocckato(PC),D0 ; Indirizzo strutt. Screen
  220.     BEQ.S    NonAvevaFunzionato     ; Se = 0, allora peccato...
  221.     MOVE.L    D0,A0
  222.     MOVE.L    OldRisoluzione(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  223.     LEA    SETOldVidCtrlTags(PC),A1
  224.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  225.     MOVE.L    GfxBase(PC),A6
  226.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  227.  
  228. ; Ora dello schermo in primo piano (eventuale)...
  229.  
  230.     MOVE.L    IntuiBase(PC),A6
  231.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  232.                 ; primo piano (ad es. ASMONE)
  233.     MOVE.L    OldRisoluzioneP(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  234.     LEA    SETOldVidCtrlTags(PC),A1
  235.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  236.     MOVE.L    GfxBase(PC),A6
  237.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  238.  
  239.     MOVEA.L    SchermoWBLocckato(PC),A0
  240.     MOVEA.L    IntuiBase(PC),A6
  241.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  242.     move.l    $3c(a6),a0    ; Ib_FirstScreen - schermo in primo piano
  243.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  244.     MOVE.L    SchermoWBLocckato(PC),A1
  245.     SUB.L    A0,A0        ; null
  246.     MOVEA.L    IntuiBase(PC),A6
  247.     JSR    -$204(A6)    ; _LVOUnlockPubScreen - e "sblocchiamo" lo
  248. NonAvevaFunzionato:        ; screen del workbench.
  249.     RTS
  250.  
  251. SchermoWBLocckato:
  252.     dc.l    0
  253.  
  254. ; Questa e' la struttura per usare Video_Control. La prima long serve per
  255. ; CAMBIARE (SET) la risoluzione degli sprite o per sapere (GET) quella vecchia.
  256.  
  257. GETVidCtrlTags:
  258.     dc.l    $80000032    ; GET
  259. OldRisoluzione:
  260.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  261.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  262.  
  263. GETVidCtrlTags2:
  264.     dc.l    $80000032    ; GET
  265. OldRisoluzioneP:
  266.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  267.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  268.  
  269. SETVidCtrlTags:
  270.     dc.l    $80000031    ; SET
  271.     dc.l    1    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  272.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  273.  
  274. SETOldVidCtrlTags:
  275.     dc.l    $80000031    ; SET
  276. OldRisoluzione2:
  277.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  278.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  279.  
  280. ; Nome schermo del WorkBench
  281.  
  282. Workbench:
  283.     dc.b    'Workbench',0
  284.  
  285. ******************************************************************************
  286. ;    Da qua in avanti si puo' operare sull'hardware in modo diretto
  287. ******************************************************************************
  288.  
  289. HEAVYINIT:
  290.     LEA    $DFF000,A5        ; Base dei registri CUSTOM per Offsets
  291.     MOVE.W    $2(A5),OLDDMA        ; Salva il vecchio status di DMACON
  292.     MOVE.W    $1C(A5),OLDINTENA    ; Salva il vecchio status di INTENA
  293.     MOVE.W    $10(A5),OLDADKCON    ; Salva il vecchio status di ADKCON
  294.     MOVE.W    $1E(A5),OLDINTREQ    ; Salva il vecchio status di INTREQ
  295.     MOVE.L    #$80008000,d0        ; Prepara la maschera dei bit alti
  296.                     ; da settare nelle word dove sono
  297.                     ; stati salvati i registri
  298.     OR.L    d0,OLDDMA    ; Setta il bit 15 di tutti i valori salvati
  299.     OR.L    d0,OLDADKCON    ; dei registri hardware, indispensabile per
  300.                 ; rimettere tali valori nei registri.
  301.  
  302.     MOVE.L    #$7FFF7FFF,$9A(a5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  303.     MOVE.L    #0,$144(A5)        ; SPR0DAT - ammazza il puntatore!
  304.     MOVE.W    #$7FFF,$96(a5)        ; DISABILITA I DMA
  305.  
  306.     move.l    4.w,a6        ; ExecBase in a6
  307.     btst.b    #0,$129(a6)    ; Testa se siamo su un 68010 o superiore
  308.     beq.s    IntOK        ; E' un 68000! Allora la base e' sempre zero.
  309.     lea    SuperCode(PC),a5 ; Routine da eseguire in supervisor
  310.     jsr    -$1e(a6)    ; LvoSupervisor - esegui la routine
  311.     bra.s    IntOK        ; Abbiamo il valore del VBR, continuiamo...
  312.  
  313. ;**********************CODICE IN SUPERVISORE per 68010+ **********************
  314. SuperCode:
  315.     dc.l      $4e7a9801    ; Movec Vbr,A1 (istruzione 68010+).
  316.                 ; E' in esadecimale perche' non tutti gli
  317.                 ; assemblatori assemblano il movec.
  318.     move.l    a1,BaseVBR    ; Label dove salvare il valore del VBR
  319.     RTE            ; Ritorna dalla eccezione
  320. ;*****************************************************************************
  321.  
  322. BaseVBR:        ; Se non modificato, rimane zero! (per 68000).
  323.     dc.l    0
  324.  
  325. IntOK:
  326.     move.l    BaseVBR(PC),a0     ; In a0 il valore del VBR
  327.     move.l    $64(a0),OldInt64 ; Sys int liv 1 salvato (softint,dskblk)
  328.     move.l    $68(a0),OldInt68 ; Sys int liv 2 salvato (I/O,ciaa,int2)
  329.     move.l    $6c(a0),OldInt6c ; Sys int liv 3 salvato (coper,vblanc,blit)
  330.     move.l    $70(a0),OldInt70 ; Sys int liv 4 salvato (audio)
  331.     move.l    $74(a0),OldInt74 ; Sys int liv 5 salvato (rbf,dsksync)
  332.     move.l    $78(a0),OldInt78 ; Sys int liv 6 salvato (exter,ciab,inten)
  333.  
  334.     bsr.w    ClearMyCache
  335.  
  336.     lea    $dff000,a5    ; Custom register in a5
  337.     bsr.w    START        ; Esegui il programma.
  338.  
  339.     bsr.w    ClearMyCache
  340.  
  341.     LEA    $dff000,a5        ; Custom base per offsets
  342.     MOVE.W    #$7FFF,$96(A5)        ; DISABILITA TUTTI I DMA
  343.     MOVE.L    #$7FFF7FFF,$9A(A5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  344.     MOVE.W    #$7fff,$9E(a5)        ; Disabilita i bit di ADKCON
  345.  
  346.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  347.     move.l    OldInt64(PC),$64(a0) ; Sys int liv1 salvato (softint,dskblk)
  348.     move.l    OldInt68(PC),$68(a0) ; Sys int liv2 salvato (I/O,ciaa,int2)
  349.     move.l    OldInt6c(PC),$6c(a0) ; Sys int liv3 salvato (coper,vblanc,blit)
  350.     move.l    OldInt70(PC),$70(a0) ; Sys int liv4 salvato (audio)
  351.     move.l    OldInt74(PC),$74(a0) ; Sys int liv5 salvato (rbf,dsksync)
  352.     move.l    OldInt78(PC),$78(a0) ; Sys int liv6 salvato (exter,ciab,inten)
  353.  
  354.     MOVE.W    OLDADKCON(PC),$9E(A5)    ; ADKCON 
  355.     MOVE.W    OLDDMA(PC),$96(A5)    ; Rimetti il vecchio status DMA
  356.     MOVE.W    OLDINTENA(PC),$9A(A5)    ; INTENA STATUS
  357.     MOVE.W    OLDINTREQ(PC),$9C(A5)    ; INTREQ
  358.     RTS
  359.  
  360. ;    Dati salvati dalla startup
  361.  
  362. WBVIEW:            ; Indirizzo del View del WorkBench
  363.     DC.L    0
  364. GfxName:
  365.     dc.b    'graphics.library',0,0
  366. IntuiName:
  367.     dc.b    'intuition.library',0
  368. DosName:
  369.     dc.b    "dos.library",0
  370. GfxBase:        ; Puntatore alla Base della Graphics Library
  371.     dc.l    0
  372. IntuiBase:        ; Puntatore alla Base della Intuition Library
  373.     dc.l    0
  374. DosBase:        ; Puntatore alla Base della Dos Library
  375.     dc.l    0
  376. OLDDMA:            ; Vecchio status DMACON
  377.     dc.w    0
  378. OLDINTENA:        ; Vecchio status INTENA
  379.     dc.w    0
  380. OLDADKCON:        ; Vecchio status ADKCON
  381.     DC.W    0
  382. OLDINTREQ:        ; Vecchio status INTREQ
  383.     DC.W    0
  384.  
  385. ; Vecchi interrupt di sistema
  386.  
  387. OldInt64:
  388.     dc.l    0
  389. OldInt68:
  390.     dc.l    0
  391. OldInt6c:
  392.     dc.l    0
  393. OldInt70:
  394.     dc.l    0
  395. OldInt74:
  396.     dc.l    0
  397. OldInt78:
  398.     dc.l    0
  399.  
  400. ; Routine da chiamare in caso di codice automodificante, modifica di tabelle
  401. ; in fast ram, caricamento da disco, ecc.
  402.  
  403. ClearMyCache:
  404.     movem.l    d0-d7/a0-a6,-(SP)
  405.     move.l    4.w,a6
  406.     btst.b    #1,$129(a6)    ; Testa per un 68020 o superiore
  407.     beq.s    nocaches
  408.     MOVE.W    $14(A6),D0    ; lib version
  409.     CMPI.W    #37,D0        ; e' V37+? (kick 2.0+)
  410.     blo.s    nocaches    ; Se kick1.3, il problema e' che non puo'
  411.                 ; nemmeno sapere se e' un 68040, per cui
  412.                 ; e' rischioso.. e si spera che uno
  413.                 ; stupido che ha un 68020+ su un kick1.3
  414.                 ; abbia anche le caches disabilitate!
  415.     jsr    -$27c(a6)    ; cache cleaR U (per load, modifiche ecc.)
  416. nocaches:
  417.     movem.l    (sp)+,d0-d7/a0-a6
  418.     rts
  419.  
  420.