home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti4 / startup1.s < prev    next >
Text File  |  1995-09-29  |  11KB  |  298 lines

  1. ******************************************************************************
  2. ;    680X0 & AGA STARTUP BY FABIO CIUCCI - Livello di complessita' 1
  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    GfxName(PC),A1        ; Nome libreria da aprire
  9.     JSR    -$198(A6)        ; OldOpenLibrary - apri la lib
  10.     MOVE.L    d0,GFXBASE        ; Salva il GfxBase in una label
  11.     BEQ.w    EXIT2            ; Se si, esci senza eseguire il codice
  12.     LEA    IntuiName(PC),A1    ; Intuition.lib
  13.     JSR    -$198(A6)        ; Openlib
  14.     MOVE.L    D0,IntuiBase
  15.     BEQ.w    EXIT1            ; Se zero, esci! Errore!
  16.  
  17.     MOVE.L    IntuiBase(PC),A0
  18.     CMP.W    #39,$14(A0)    ; versione 39 o maggiore? (kick3.0+)
  19.     BLT.s    VecchiaIntui
  20.     BSR.w    ResettaSpritesV39
  21. VecchiaIntui:
  22.  
  23.     MOVE.L    GfxBase(PC),A6
  24.     MOVE.L    $22(A6),WBVIEW    ; Salva il WBView attuale di sistema
  25.  
  26.     SUB.L    A1,A1        ; View nullo per azzerare il modo video
  27.     JSR    -$DE(A6)    ; LoadView nullo - modo video azzerato
  28.     SUB.L    A1,A1        ; View nullo
  29.     JSR    -$DE(A6)    ; LoadView (due volte per sicurezza...)
  30.     JSR    -$10E(A6)    ; WaitOf ( Queste due chiamate a WaitOf    )
  31.     JSR    -$10E(A6)    ; WaitOf ( servono a resettare l'interlace )
  32.     JSR    -$10E(A6)    ; Altre due, vah!
  33.     JSR    -$10E(A6)
  34.  
  35.     move.L    4.w,A6
  36.     SUBA.L    A1,A1        ; NULL task - trova questo task
  37.     JSR    -$126(A6)    ; findtask (d0=task, FindTask(name) in a1)
  38.     move.L    D0,A1        ; Task in a1
  39.     MOVEQ    #127,D0        ; Priorita' in d0 (-128, +127) - MASSIMA!
  40.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  41.  
  42.     MOVE.L    GfxBase(PC),A6
  43.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  44.                 ; impedendone l'uso al sistema operativo.
  45.     jsr    -$E4(A6)    ; WaitBlit - Attende la fine di ogni blittata
  46.     JSR    -$E4(A6)    ; WaitBlit
  47.  
  48.     move.l    4.w,a6        ; ExecBase in A6
  49.     JSR    -$84(a6)    ; FORBID - Disabilita il Multitasking
  50.     JSR    -$78(A6)    ; DISABLE - Disabilita anche gli interrupt
  51.                 ;        del sistema operativo
  52.  
  53.     bsr.w    HEAVYINIT    ; Ora puoi eseguire la parte che opera
  54.                 ; sui registri hardware
  55.  
  56.     move.l    4.w,a6        ; ExecBase in A6
  57.     JSR    -$7E(A6)    ; ENABLE - Abilita System Interrupts
  58.     JSR    -$8A(A6)    ; PERMIT - Abilita il multitasking
  59.  
  60.     SUBA.L    A1,A1        ; NULL task - trova questo task
  61.     JSR    -$126(A6)    ; findtask (d0=task, FindTask(name) in a1)
  62.     move.L    D0,A1        ; Task in a1
  63.     MOVEQ    #0,D0        ; Priorita' in d0 (-128, +127) - NORMALE
  64.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  65.  
  66.     MOVE.L    GFXBASE(PC),A6    ; GFXBASE in A6
  67.     jsr    -$E4(A6)    ; Aspetta la fine di eventuali blittate
  68.     JSR    -$E4(A6)    ; WaitBlit
  69.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  70.                 ; puo' nuovamente usare il blitter
  71.     MOVE.L    IntuiBase(PC),A0
  72.     CMP.W    #39,$14(A0)    ; V39+?
  73.     BLT.s    Vecchissima
  74.     BSR.w    RimettiSprites
  75. Vecchissima:
  76.  
  77.     MOVE.L    GFXBASE(PC),A6    ; GFXBASE in A6
  78.     MOVE.L    WBVIEW(PC),A1    ; Vecchio WBVIEW in A1
  79.     JSR    -$DE(A6)    ; loadview - rimetti il vecchio View
  80.     JSR    -$10E(A6)    ; WaitOf ( Risistema l'eventuale interlace)
  81.     JSR    -$10E(A6)    ; WaitOf
  82.     MOVE.W    #$11,$DFF10C    ; Questo non lo ripristina da solo..!
  83.     MOVE.L    $26(a6),$dff080    ; COP1LC - Punta la vecchia copper1 di sistema
  84.     MOVE.L    $32(a6),$dff084    ; COP2LC - Punta la vecchia copper2 di sistema
  85.  
  86.     move.L    IntuiBase(PC),A6
  87.     JSR    -$186(A6)    ; _LVORethinkDisplay - Ridisegna tutto il
  88.                 ; display, comprese ViewPorts e eventuali
  89.                 ; modi interlace o multisync.
  90.     MOVE.L    a6,A1        ; IntuiBase in a1 per chiudere la libreria
  91.     move.l    4.w,a6        ; ExecBase in A6
  92.     jsr    -$19E(a6)    ; CloseLibrary - intuition.library CHIUSA
  93. Exit1:
  94.     MOVE.L    GfxBase(PC),A1    ; GfxBase in a1 per chiudere la libreria
  95.     jsr    -$19E(a6)    ; CloseLibrary - graphics.library CHIUSA
  96. Exit2:
  97.     movem.l    (SP)+,d0-d7/a0-a6 ; Riprendi i vecchi valori dei registri
  98.     RTS              ; Torna all'ASMONE o al Dos/WorkBench
  99.  
  100. *******************************************************************************
  101. ;    Resetta la risoluzione degli sprite "legalmente"
  102. *******************************************************************************
  103.  
  104. ResettaSpritesV39:
  105.     MOVE.L    IntuiBase(PC),A6
  106.     LEA    Workbench(PC),A0 ; Nome schermo del Workbench (per lock) in a0
  107.     JSR    -$1FE(A6)    ; _LVOLockPubScreen - "blocchiamo" lo schermo
  108.                 ; (il cui nome e' in a0).
  109.     MOVE.L    D0,SchermoWBLocckato
  110.     BEQ.s    ErroreSchermo
  111.     MOVE.L    D0,A0        ; Struttura Screen in a0
  112.     MOVE.L    $30(A0),A0    ; sc_ViewPort+vp_ColorMap: in a0 ora abbiamo
  113.                 ; la struttura ColorMap dell schermo, che ci
  114.                 ; serve (in a0) per eseguire un "video_control"
  115.                 ; della graphics.library.
  116.     LEA    GETVidCtrlTags(PC),A1    ; In a1 la TagList per la routine
  117.                     ; "Video_control" - la richiesta che
  118.                     ; facciamo a questa routine e' di
  119.                     ; VTAG_SPRITERESN_GET, ossia di sapere
  120.                     ; la risoluzione attuale degli sprite.
  121.     MOVE.L    GfxBase(PC),A6
  122.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  123.                 ; riporta nella taglist, nella long
  124.                 ; "risoluzione", la risoluzione attuale degli
  125.                 ; sprite in quello schermo.
  126.  
  127. ; Ora salviamo la risoluzione anche dell'eventuale schermo "in primo piano",
  128. ; ad esempio la schermata dell'assemblatore:
  129.  
  130.     MOVE.L    IntuiBase(PC),A6
  131.     move.l    $3c(a6),a0    ; Ib_FirstScreen (Schermo in "primo piano!")
  132.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  133.     LEA    GETVidCtrlTags2(PC),A1    ; In a1 la TagList GET
  134.     MOVE.L    GfxBase(PC),A6
  135.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  136.  
  137. ; Ora chiediamo alla routine VideoControl di settare la risoluzione.
  138. ; SPRITERESN_140NS -> ossia lowres!
  139.  
  140.     MOVE.L    SchermoWBLocckato(PC),A0
  141.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  142.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  143.     MOVE.L    GfxBase(PC),A6
  144.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  145.  
  146.     move.L    IntuiBase(PC),A6
  147.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  148.                 ; primo piano (ad es. ASMONE)
  149.     move.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  150.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  151.     move.L    GfxBase(PC),A6
  152.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  153.  
  154.     move.L    SchermoWBLocckato(PC),A0
  155.     move.L    IntuiBase(PC),A6
  156.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  157.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  158.                 ; primo piano (ad es. ASMONE)
  159.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  160.                 ; per essere sicuri del reset: ossia occorre
  161.                 ; chiamare MakeScreen, seguito da...
  162.     JSR    -$186(A6)    ; _LVORethinkDisplay - che ridisegna tutto il
  163.                 ; display, comprese ViewPorts e eventuali
  164. ErroreSchermo:            ; modi interlace o multisync.
  165.     RTS
  166.  
  167. ; Ora dobbiamo risettare gli sprites alla risoluzione di partenza.
  168.  
  169. RimettiSprites:
  170.     MOVE.L    SchermoWBLocckato(PC),D0 ; Indirizzo strutt. Screen
  171.     BEQ.S    NonAvevaFunzionato     ; Se = 0, allora peccato...
  172.     MOVE.L    D0,A0
  173.     MOVE.L    OldRisoluzione(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  174.     LEA    SETOldVidCtrlTags(PC),A1
  175.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  176.     MOVE.L    GfxBase(PC),A6
  177.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  178.  
  179. ; Ora dello schermo in primo piano (eventuale)...
  180.  
  181.     MOVE.L    IntuiBase(PC),A6
  182.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  183.                 ; primo piano (ad es. ASMONE)
  184.     MOVE.L    OldRisoluzioneP(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  185.     LEA    SETOldVidCtrlTags(PC),A1
  186.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  187.     MOVE.L    GfxBase(PC),A6
  188.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  189.  
  190.     move.L    IntuiBase(PC),A6
  191.     move.L    SchermoWBLocckato(PC),A0
  192.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  193.     move.l    $3c(a6),a0    ; Ib_FirstScreen - schermo in primo piano
  194.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  195.     MOVE.L    SchermoWBLocckato(PC),A1
  196.     SUB.L    A0,A0        ; null
  197.     move.L    IntuiBase(PC),A6
  198.     JSR    -$204(A6)    ; _LVOUnlockPubScreen - e "sblocchiamo" lo
  199. NonAvevaFunzionato:        ; screen del workbench.
  200.     RTS
  201.  
  202. SchermoWBLocckato:
  203.     dc.l    0
  204.  
  205. ; Questa e' la struttura per usare Video_Control. La prima long serve per
  206. ; CAMBIARE (SET) la risoluzione degli sprite o per sapere (GET) quella vecchia.
  207.  
  208. GETVidCtrlTags:
  209.     dc.l    $80000032    ; GET
  210. OldRisoluzione:
  211.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  212.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  213.  
  214. GETVidCtrlTags2:
  215.     dc.l    $80000032    ; GET
  216. OldRisoluzioneP:
  217.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  218.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  219.  
  220. SETVidCtrlTags:
  221.     dc.l    $80000031    ; SET
  222.     dc.l    1    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  223.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  224.  
  225. SETOldVidCtrlTags:
  226.     dc.l    $80000031    ; SET
  227. OldRisoluzione2:
  228.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  229.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  230.  
  231. ; Nome schermo del WorkBench
  232.  
  233. Workbench:
  234.     dc.b    'Workbench',0
  235.  
  236. ******************************************************************************
  237. ;    Da qua in avanti si puo' operare sull'hardware in modo diretto
  238. ******************************************************************************
  239.  
  240. HEAVYINIT:
  241.     LEA    $DFF000,A5        ; Base dei registri CUSTOM per Offsets
  242.     MOVE.W    $2(A5),OLDDMA        ; Salva il vecchio status di DMACON
  243.     MOVE.W    $1C(A5),OLDINTENA    ; Salva il vecchio status di INTENA
  244.     MOVE.W    $10(A5),OLDADKCON    ; Salva il vecchio status di ADKCON
  245.     MOVE.W    $1E(A5),OLDINTREQ    ; Salva il vecchio status di INTREQ
  246.     MOVE.L    #$80008000,d0        ; Prepara la maschera dei bit alti
  247.                     ; da settare nelle word dove sono
  248.                     ; stati salvati i registri
  249.     OR.L    d0,OLDDMA    ; Setta il bit 15 di tutti i valori salvati
  250.     OR.L    d0,OLDADKCON    ; dei registri hardware, indispensabile per
  251.                 ; rimettere tali valori nei registri.
  252.  
  253.     MOVE.L    #$7FFF7FFF,$9A(a5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  254.     MOVE.L    #0,$144(A5)        ; SPR0DAT - ammazza il puntatore!
  255.     MOVE.W    #$7FFF,$96(a5)        ; DISABILITA I DMA
  256.     MOVE.L    #0,$144(A5)
  257.  
  258.     bsr.w    START            ; Esegui il programma.
  259.  
  260.     LEA    $dff000,a5    ; Custom base per offsets
  261.     MOVE.W    #$8240,$96(a5)    ; dmacon - abilita blit
  262.     BTST.b    #6,2(a5)    ; WaitBlit via hardware...
  263. Wblittez:
  264.     BTST.b    #6,2(a5)
  265.     BNE.S    Wblittez
  266.  
  267.     MOVE.W    #$7FFF,$96(A5)        ; DISABILITA TUTTI I DMA
  268.     MOVE.L    #$7FFF7FFF,$9A(A5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  269.     MOVE.W    #$7fff,$9E(a5)        ; Disabilita i bit di ADKCON
  270.     MOVE.W    OLDADKCON(PC),$9E(A5)    ; ADKCON
  271.     MOVE.W    OLDDMA(PC),$96(A5)    ; Rimetti il vecchio status DMA
  272.     MOVE.W    OLDINTENA(PC),$9A(A5)    ; INTENA STATUS
  273.     MOVE.W    OLDINTREQ(PC),$9C(A5)    ; INTREQ
  274.     RTS
  275.  
  276. ;    Dati salvati dalla startup
  277.  
  278. WBVIEW:            ; Indirizzo del View del WorkBench
  279.     DC.L    0
  280. GfxName:
  281.     dc.b    'graphics.library',0,0
  282. IntuiName:
  283.     dc.b    'intuition.library',0
  284.  
  285. GfxBase:        ; Puntatore alla Base della Graphics Library
  286.     dc.l    0
  287. IntuiBase:        ; Puntatore alla Base della Intuition Library
  288.     dc.l    0
  289. OLDDMA:            ; Vecchio status DMACON
  290.     dc.w    0
  291. OLDINTENA:        ; Vecchio status INTENA
  292.     dc.w    0
  293. OLDADKCON:        ; Vecchio status ADKCON
  294.     DC.W    0
  295. OLDINTREQ:        ; Vecchio status INTREQ
  296.     DC.W    0
  297.  
  298.