home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti5 / startup1.s < prev   
Text File  |  1995-10-23  |  11KB  |  299 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.     move.w    d0,$dff088
  86.  
  87.     move.L    IntuiBase(PC),A6
  88.     JSR    -$186(A6)    ; _LVORethinkDisplay - Ridisegna tutto il
  89.                 ; display, comprese ViewPorts e eventuali
  90.                 ; modi interlace o multisync.
  91.     MOVE.L    a6,A1        ; IntuiBase in a1 per chiudere la libreria
  92.     move.l    4.w,a6        ; ExecBase in A6
  93.     jsr    -$19E(a6)    ; CloseLibrary - intuition.library CHIUSA
  94. Exit1:
  95.     MOVE.L    GfxBase(PC),A1    ; GfxBase in a1 per chiudere la libreria
  96.     jsr    -$19E(a6)    ; CloseLibrary - graphics.library CHIUSA
  97. Exit2:
  98.     movem.l    (SP)+,d0-d7/a0-a6 ; Riprendi i vecchi valori dei registri
  99.     RTS              ; Torna all'ASMONE o al Dos/WorkBench
  100.  
  101. *******************************************************************************
  102. ;    Resetta la risoluzione degli sprite "legalmente"
  103. *******************************************************************************
  104.  
  105. ResettaSpritesV39:
  106.     MOVE.L    IntuiBase(PC),A6
  107.     LEA    Workbench(PC),A0 ; Nome schermo del Workbench (per lock) in a0
  108.     JSR    -$1FE(A6)    ; _LVOLockPubScreen - "blocchiamo" lo schermo
  109.                 ; (il cui nome e' in a0).
  110.     MOVE.L    D0,SchermoWBLocckato
  111.     BEQ.s    ErroreSchermo
  112.     MOVE.L    D0,A0        ; Struttura Screen in a0
  113.     MOVE.L    $30(A0),A0    ; sc_ViewPort+vp_ColorMap: in a0 ora abbiamo
  114.                 ; la struttura ColorMap dell schermo, che ci
  115.                 ; serve (in a0) per eseguire un "video_control"
  116.                 ; della graphics.library.
  117.     LEA    GETVidCtrlTags(PC),A1    ; In a1 la TagList per la routine
  118.                     ; "Video_control" - la richiesta che
  119.                     ; facciamo a questa routine e' di
  120.                     ; VTAG_SPRITERESN_GET, ossia di sapere
  121.                     ; la risoluzione attuale degli sprite.
  122.     MOVE.L    GfxBase(PC),A6
  123.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  124.                 ; riporta nella taglist, nella long
  125.                 ; "risoluzione", la risoluzione attuale degli
  126.                 ; sprite in quello schermo.
  127.  
  128. ; Ora salviamo la risoluzione anche dell'eventuale schermo "in primo piano",
  129. ; ad esempio la schermata dell'assemblatore:
  130.  
  131.     MOVE.L    IntuiBase(PC),A6
  132.     move.l    $3c(a6),a0    ; Ib_FirstScreen (Schermo in "primo piano!")
  133.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  134.     LEA    GETVidCtrlTags2(PC),A1    ; In a1 la TagList GET
  135.     MOVE.L    GfxBase(PC),A6
  136.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  137.  
  138. ; Ora chiediamo alla routine VideoControl di settare la risoluzione.
  139. ; SPRITERESN_140NS -> ossia lowres!
  140.  
  141.     MOVE.L    SchermoWBLocckato(PC),A0
  142.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  143.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  144.     MOVE.L    GfxBase(PC),A6
  145.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  146.  
  147.     move.L    IntuiBase(PC),A6
  148.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  149.                 ; primo piano (ad es. ASMONE)
  150.     move.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  151.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  152.     move.L    GfxBase(PC),A6
  153.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  154.  
  155.     move.L    SchermoWBLocckato(PC),A0
  156.     move.L    IntuiBase(PC),A6
  157.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  158.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  159.                 ; primo piano (ad es. ASMONE)
  160.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  161.                 ; per essere sicuri del reset: ossia occorre
  162.                 ; chiamare MakeScreen, seguito da...
  163.     JSR    -$186(A6)    ; _LVORethinkDisplay - che ridisegna tutto il
  164.                 ; display, comprese ViewPorts e eventuali
  165. ErroreSchermo:            ; modi interlace o multisync.
  166.     RTS
  167.  
  168. ; Ora dobbiamo risettare gli sprites alla risoluzione di partenza.
  169.  
  170. RimettiSprites:
  171.     MOVE.L    SchermoWBLocckato(PC),D0 ; Indirizzo strutt. Screen
  172.     BEQ.S    NonAvevaFunzionato     ; Se = 0, allora peccato...
  173.     MOVE.L    D0,A0
  174.     MOVE.L    OldRisoluzione(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  175.     LEA    SETOldVidCtrlTags(PC),A1
  176.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  177.     MOVE.L    GfxBase(PC),A6
  178.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  179.  
  180. ; Ora dello schermo in primo piano (eventuale)...
  181.  
  182.     MOVE.L    IntuiBase(PC),A6
  183.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  184.                 ; primo piano (ad es. ASMONE)
  185.     MOVE.L    OldRisoluzioneP(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  186.     LEA    SETOldVidCtrlTags(PC),A1
  187.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  188.     MOVE.L    GfxBase(PC),A6
  189.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  190.  
  191.     move.L    IntuiBase(PC),A6
  192.     move.L    SchermoWBLocckato(PC),A0
  193.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  194.     move.l    $3c(a6),a0    ; Ib_FirstScreen - schermo in primo piano
  195.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  196.     MOVE.L    SchermoWBLocckato(PC),A1
  197.     SUB.L    A0,A0        ; null
  198.     move.L    IntuiBase(PC),A6
  199.     JSR    -$204(A6)    ; _LVOUnlockPubScreen - e "sblocchiamo" lo
  200. NonAvevaFunzionato:        ; screen del workbench.
  201.     RTS
  202.  
  203. SchermoWBLocckato:
  204.     dc.l    0
  205.  
  206. ; Questa e' la struttura per usare Video_Control. La prima long serve per
  207. ; CAMBIARE (SET) la risoluzione degli sprite o per sapere (GET) quella vecchia.
  208.  
  209. GETVidCtrlTags:
  210.     dc.l    $80000032    ; GET
  211. OldRisoluzione:
  212.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  213.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  214.  
  215. GETVidCtrlTags2:
  216.     dc.l    $80000032    ; GET
  217. OldRisoluzioneP:
  218.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  219.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  220.  
  221. SETVidCtrlTags:
  222.     dc.l    $80000031    ; SET
  223.     dc.l    1    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  224.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  225.  
  226. SETOldVidCtrlTags:
  227.     dc.l    $80000031    ; SET
  228. OldRisoluzione2:
  229.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  230.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  231.  
  232. ; Nome schermo del WorkBench
  233.  
  234. Workbench:
  235.     dc.b    'Workbench',0
  236.  
  237. ******************************************************************************
  238. ;    Da qua in avanti si puo' operare sull'hardware in modo diretto
  239. ******************************************************************************
  240.  
  241. HEAVYINIT:
  242.     LEA    $DFF000,A5        ; Base dei registri CUSTOM per Offsets
  243.     MOVE.W    $2(A5),OLDDMA        ; Salva il vecchio status di DMACON
  244.     MOVE.W    $1C(A5),OLDINTENA    ; Salva il vecchio status di INTENA
  245.     MOVE.W    $10(A5),OLDADKCON    ; Salva il vecchio status di ADKCON
  246.     MOVE.W    $1E(A5),OLDINTREQ    ; Salva il vecchio status di INTREQ
  247.     MOVE.L    #$80008000,d0        ; Prepara la maschera dei bit alti
  248.                     ; da settare nelle word dove sono
  249.                     ; stati salvati i registri
  250.     OR.L    d0,OLDDMA    ; Setta il bit 15 di tutti i valori salvati
  251.     OR.L    d0,OLDADKCON    ; dei registri hardware, indispensabile per
  252.                 ; rimettere tali valori nei registri.
  253.  
  254.     MOVE.L    #$7FFF7FFF,$9A(a5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  255.     MOVE.L    #0,$144(A5)        ; SPR0DAT - ammazza il puntatore!
  256.     MOVE.W    #$7FFF,$96(a5)        ; DISABILITA I DMA
  257.     MOVE.L    #0,$144(A5)
  258.  
  259.     bsr.w    START            ; Esegui il programma.
  260.  
  261.     LEA    $dff000,a5    ; Custom base per offsets
  262.     MOVE.W    #$8240,$96(a5)    ; dmacon - abilita blit
  263.     BTST.b    #6,2(a5)    ; WaitBlit via hardware...
  264. Wblittez:
  265.     BTST.b    #6,2(a5)
  266.     BNE.S    Wblittez
  267.  
  268.     MOVE.W    #$7FFF,$96(A5)        ; DISABILITA TUTTI I DMA
  269.     MOVE.L    #$7FFF7FFF,$9A(A5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  270.     MOVE.W    #$7fff,$9E(a5)        ; Disabilita i bit di ADKCON
  271.     MOVE.W    OLDADKCON(PC),$9E(A5)    ; ADKCON
  272.     MOVE.W    OLDDMA(PC),$96(A5)    ; Rimetti il vecchio status DMA
  273.     MOVE.W    OLDINTENA(PC),$9A(A5)    ; INTENA STATUS
  274.     MOVE.W    OLDINTREQ(PC),$9C(A5)    ; INTREQ
  275.     RTS
  276.  
  277. ;    Dati salvati dalla startup
  278.  
  279. WBVIEW:            ; Indirizzo del View del WorkBench
  280.     DC.L    0
  281. GfxName:
  282.     dc.b    'graphics.library',0,0
  283. IntuiName:
  284.     dc.b    'intuition.library',0
  285.  
  286. GfxBase:        ; Puntatore alla Base della Graphics Library
  287.     dc.l    0
  288. IntuiBase:        ; Puntatore alla Base della Intuition Library
  289.     dc.l    0
  290. OLDDMA:            ; Vecchio status DMACON
  291.     dc.w    0
  292. OLDINTENA:        ; Vecchio status INTENA
  293.     dc.w    0
  294. OLDADKCON:        ; Vecchio status ADKCON
  295.     DC.W    0
  296. OLDINTREQ:        ; Vecchio status INTREQ
  297.     DC.W    0
  298.  
  299.