home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti8 / startup2.s < prev   
Text File  |  1995-09-29  |  19KB  |  591 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. ; Salviamo il color0
  28.  
  29.     MOVE.L    IntuiBase(PC),A6
  30.     move.l    $3c(a6),a0    ; Ib_FirstScreen (Schermo in "primo piano!")
  31.     LEA    $2c(A0),A0    ;  vp  =  A pointer to a ViewPort structure.
  32.     move.l    a0,VPfirstScreen
  33.     move.l    4(a0),a0    ;  colormap = la colormap di questo viewport
  34.     MOVEQ    #0,D0        ; entry - vogliamo avere il color0! (sfondo)
  35.     MOVE.L    GfxBase(PC),A6
  36.     JSR    -$246(A6)    ; GetRGB4 - prendi il valore del color0
  37.                 ; dalla ColorMap dello schermo (-1 se error!)
  38.     move.w    d0,SavedColor0
  39.  
  40. ; E anneriamolo!
  41.  
  42.     move.l    VPfirstScreen(PC),a0
  43.     LEA    colore0(PC),A1    ; colore $0RGB
  44.     MOVEQ    #1,D0        ; count - solo il colore di sfondo da cambiare
  45.     JSR    -$C0(A6)    ; LoadRGB4
  46.  
  47. ; Resettiamo lo schermo (con colore di sfondo annerito!)
  48.  
  49.     MOVE.L    $22(A6),WBVIEW    ; Salva il WBView attuale di sistema
  50.     SUB.L    A1,A1        ; View nullo per azzerare il modo video
  51.     JSR    -$DE(A6)    ; LoadView nullo - modo video azzerato
  52.     SUB.L    A1,A1        ; View nullo
  53.     JSR    -$DE(A6)    ; LoadView (due volte per sicurezza...)
  54.     JSR    -$10E(A6)    ; WaitOf ( Queste due chiamate a WaitOf    )
  55.     JSR    -$10E(A6)    ; WaitOf ( servono a resettare l'interlace )
  56.     JSR    -$10E(A6)    ; Altre due, vah!
  57.     JSR    -$10E(A6)
  58.  
  59.     bsr.w    InputOff    ; Disabilita l'input di intuition (ossia non
  60.                 ; legge piu' il mouse e la tastiera)
  61.  
  62.     MOVE.L    4.w,A6
  63.     SUB.L    A1,A1        ; NULL task - trova questo task
  64.     JSR    -$126(A6)    ; findtask (Task(name) in a1, -> d0=task)
  65.     MOVE.L    D0,A1        ; Task in a1
  66.     move.l    d0,ThisTask
  67.     MOVE.L    $B8(A1),pr_Win    ; A questo offset è presente l' address
  68.                 ; della window dalla quale è stato
  69.                 ; caricato il programma e che serve al
  70.                 ; DOS per sapere dove aprire i Reqs.
  71.     MOVE.L    #-1,$B8(A1)    ; Settandolo a -1 il DOS non apre Reqs
  72.                 ; Infatti se ci fossero errori nell'apertura
  73.                 ; di files con la dos.lib, il sistema
  74.                 ; proverebbe ad aprire un requester, ma con
  75.                 ; il blitter disabilitato (OwnBlit), non lo
  76.                 ; potrebbe disegnare, bloccando tutto!
  77.     MOVEQ    #-1,D0        ; Priorita' in d0 (-128, +127) - in attesa
  78.     JSR    -$12C(A6)    ; LVOSetTaskPri (d0=priorita', a1=task)
  79.  
  80.     LEA    $DFF006,A5    ; VhPosr
  81.     lea    $bfe001,a4
  82.     moveq    #6,d2
  83.     MOVE.w    #$dd,D0        ; Linea da attendere
  84.     MOVE.w    #WaitDisk,D1    ; Quanto attendere... (Per essere sicuri che
  85. WaitaLoop:            ; disk drives o Hard Disk abbiano finito).
  86.     btst.b    d2,(a4)        ; btst #6,$bfe001 -> aspetta il left mouse
  87.     beq.s    SkippaWait
  88.     CMP.B    (A5),D0
  89.     BNE.S    WaitaLoop
  90. Wait2:
  91.     CMP.B    (A5),D0
  92.     Beq.s    Wait2
  93.     dbra    D1,WaitaLoop
  94. SkippaWait:
  95.     btst.b    d2,(a4)        ; btst #6,$bfe001 -> lasciamo il left mouse!
  96.     beq.s    SkippaWait
  97.  
  98.  
  99.     MOVE.L    4.w,A6
  100.     move.l    thistask(PC),a1    ; Task in a1
  101.     MOVEQ    #127,D0        ; Priorita' in d0 (-128, +127) - MASSIMA!
  102.     JSR    -$12C(A6)    ; LVOSetTaskPri (d0=priorita', a1=task)
  103.  
  104.     MOVE.L    GfxBase(PC),A6
  105.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  106.                 ; impedendone l'uso al sistema operativo.
  107.     jsr    -$E4(A6)    ; WaitBlit - Attende la fine di ogni blittata
  108.     JSR    -$E4(A6)    ; WaitBlit
  109.  
  110.     move.l    4.w,a6        ; ExecBase in A6
  111.     JSR    -$84(a6)    ; FORBID - Disabilita il Multitasking
  112.     JSR    -$78(A6)    ; DISABLE - Disabilita anche gli interrupt
  113.                 ;        del sistema operativo
  114.  
  115.     bsr.w    HEAVYINIT    ; Ora puoi eseguire la parte che opera
  116.                 ; sui registri hardware
  117.  
  118.     move.l    4.w,a6        ; ExecBase in A6
  119.     JSR    -$7E(A6)    ; ENABLE - Abilita System Interrupts
  120.     JSR    -$8A(A6)    ; PERMIT - Abilita il multitasking
  121.  
  122.     move.l    thistask(PC),a1    ; Task in a1
  123.     MOVE.L    pr_Win(PC),$B8(A1) ; ripristina l'address della window
  124.     MOVEQ    #0,D0           ; Priorita' in d0 (-128, +127) - NORMALE
  125.     JSR    -$12C(A6)       ; LVOSetTaskPri (d0=priorita', a1=task)
  126.  
  127.     MOVE.L    GfxBase(PC),A6    ; GfxBase in A6
  128.     jsr    -$E4(A6)    ; Aspetta la fine di eventuali blittate
  129.     JSR    -$E4(A6)    ; WaitBlit
  130.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  131.                 ; puo' nuovamente usare il blitter
  132.  
  133.     MOVE.L    IntuiBase(PC),A0
  134.     CMP.W    #39,$14(A0)    ; V39+?
  135.     BLT.s    Vecchissima
  136.     BSR.w    RimettiSprites
  137. Vecchissima:
  138.  
  139. ; RiPristina il Color0
  140.  
  141.     MOVE.L    GfxBase(PC),A6    ; GfxBase in A6
  142.     move.l    VPfirstScreen(PC),a0
  143.     LEA    Savedcolor0(PC),A1 ; colore0 originale
  144.     MOVEQ    #1,D0        ; count - solo il colore di sfondo da cambiare
  145.     MOVE.L    GfxBase(PC),A6
  146.     JSR    -$C0(a6)    ; LoadRGB4 - vecchio color0
  147.  
  148.     MOVE.L    WBVIEW(PC),A1    ; Vecchio WBVIEW in A1
  149.     JSR    -$DE(A6)    ; loadview - rimetti il vecchio View
  150.     JSR    -$10E(A6)    ; WaitOf ( Risistema l'eventuale interlace)
  151.     JSR    -$10E(A6)    ; WaitOf
  152.     MOVE.W    #$11,$DFF10C    ; Questo non lo ripristina da solo..!
  153.     MOVE.L    $26(a6),$dff080    ; COP1LC - Punta la vecchia copper1 di sistema
  154.     MOVE.L    $32(a6),$dff084    ; COP2LC - Punta la vecchia copper2 di sistema
  155.  
  156.     bsr.w    InputOn        ; Rispristina l'input di intuition
  157.  
  158.     MOVE.L    IntuiBase(PC),A6
  159.     JSR    -$186(A6)    ; _LVORethinkDisplay - Ridisegna tutto il
  160.                 ; display, comprese ViewPorts e eventuali
  161.                 ; modi interlace o multisync.
  162.     MOVE.L    A6,A1        ; IntuiBase in a1 per chiudere la libreria
  163.     move.l    4.w,a6        ; ExecBase in A6
  164.     jsr    -$19E(a6)    ; CloseLibrary - intuition.library CHIUSA
  165. EXIT1:
  166.     MOVE.L    GfxBase(PC),A1    ; GfxBase in A1 per chiudere la libreria
  167.     jsr    -$19E(a6)    ; CloseLibrary - graphics.library CHIUSA
  168. EXIT2:
  169.     MOVE.L    DosBase(PC),A1    ; DosBase in A1 per chiudere la libreria
  170.     jsr    -$19E(a6)    ; CloseLibrary - dos.library CHIUSA
  171. EXIT3:
  172.     movem.l    (SP)+,d0-d7/a0-a6 ; Riprendi i vecchi valori dei registri
  173.     RTS              ; Torna all'ASMONE o al Dos/WorkBench
  174.  
  175. pr_Win:
  176.     dc.l    0
  177. colore0:
  178.     dc.w    $012
  179. SavedColor0:
  180.     dc.w    0
  181. VPfirstScreen:
  182.     dc.l    0
  183. ThisTask:
  184.     dc.l    0
  185. *******************************************************************************
  186. ;    Resetta la risoluzione degli sprite "legalmente"
  187. *******************************************************************************
  188.  
  189. ResettaSpritesV39:
  190.     MOVE.L    IntuiBase(PC),A6
  191.     LEA    Workbench(PC),A0 ; Nome schermo del Workbench (per lock) in a0
  192.     JSR    -$1FE(A6)    ; _LVOLockPubScreen - "blocchiamo" lo schermo
  193.                 ; (il cui nome e' in a0).
  194.     MOVE.L    D0,SchermoWBLocckato
  195.     BEQ.s    ErroreSchermo
  196.     MOVE.L    D0,A0        ; Struttura Screen in a0
  197.     MOVE.L    $30(A0),A0    ; sc_ViewPort+vp_ColorMap: in a0 ora abbiamo
  198.                 ; la struttura ColorMap dell schermo, che ci
  199.                 ; serve (in a0) per eseguire un "video_control"
  200.                 ; della graphics.library.
  201.     LEA    GETVidCtrlTags(PC),A1    ; In a1 la TagList per la routine
  202.                     ; "Video_control" - la richiesta che
  203.                     ; facciamo a questa routine e' di
  204.                     ; VTAG_SPRITERESN_GET, ossia di sapere
  205.                     ; la risoluzione attuale degli sprite.
  206.     MOVE.L    GfxBase(PC),A6
  207.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  208.                 ; riporta nella taglist, nella long
  209.                 ; "risoluzione", la risoluzione attuale degli
  210.                 ; sprite in quello schermo.
  211.  
  212. ; Ora salviamo la risoluzione anche dell'eventuale schermo "in primo piano",
  213. ; ad esempio la schermata dell'assemblatore:
  214.  
  215.     MOVE.L    IntuiBase(PC),A6
  216.     move.l    $3c(a6),a0    ; Ib_FirstScreen (Schermo in "primo piano!")
  217.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  218.     LEA    GETVidCtrlTags2(PC),A1    ; In a1 la TagList GET
  219.     MOVE.L    GfxBase(PC),A6
  220.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  221.  
  222. ; Ora chiediamo alla routine VideoControl di settare la risoluzione.
  223. ; SPRITERESN_140NS -> ossia lowres!
  224.  
  225.     MOVE.L    SchermoWBLocckato(PC),A0
  226.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  227.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  228.     MOVE.L    GfxBase(PC),A6
  229.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  230.  
  231.     move.L    IntuiBase(PC),A6
  232.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  233.                 ; primo piano (ad es. ASMONE)
  234.     move.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  235.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  236.     move.L    GfxBase(PC),A6
  237.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  238.  
  239.     move.L    SchermoWBLocckato(PC),A0
  240.     move.L    IntuiBase(PC),A6
  241.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  242.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  243.                 ; primo piano (ad es. ASMONE)
  244.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  245.                 ; per essere sicuri del reset: ossia occorre
  246.                 ; chiamare MakeScreen, seguito da...
  247.     JSR    -$186(A6)    ; _LVORethinkDisplay - che ridisegna tutto il
  248.                 ; display, comprese ViewPorts e eventuali
  249. ErroreSchermo:            ; modi interlace o multisync.
  250.     RTS
  251.  
  252. ; Ora dobbiamo risettare gli sprites alla risoluzione di partenza.
  253.  
  254. RimettiSprites:
  255.     MOVE.L    SchermoWBLocckato(PC),D0 ; Indirizzo strutt. Screen
  256.     BEQ.S    NonAvevaFunzionato     ; Se = 0, allora peccato...
  257.     MOVE.L    D0,A0
  258.     MOVE.L    OldRisoluzione(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  259.     LEA    SETOldVidCtrlTags(PC),A1
  260.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  261.     MOVE.L    GfxBase(PC),A6
  262.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  263.  
  264. ; Ora dello schermo in primo piano (eventuale)...
  265.  
  266.     MOVE.L    IntuiBase(PC),A6
  267.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  268.                 ; primo piano (ad es. ASMONE)
  269.     MOVE.L    OldRisoluzioneP(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  270.     LEA    SETOldVidCtrlTags(PC),A1
  271.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  272.     MOVE.L    GfxBase(PC),A6
  273.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  274.  
  275.     move.L    IntuiBase(PC),A6
  276.     move.L    SchermoWBLocckato(PC),A0
  277.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  278.     move.l    $3c(a6),a0    ; Ib_FirstScreen - schermo in primo piano
  279.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  280.     MOVE.L    SchermoWBLocckato(PC),A1
  281.     SUB.L    A0,A0        ; null
  282.     move.L    IntuiBase(PC),A6
  283.     JSR    -$204(A6)    ; _LVOUnlockPubScreen - e "sblocchiamo" lo
  284. NonAvevaFunzionato:        ; screen del workbench.
  285.     RTS
  286.  
  287. SchermoWBLocckato:
  288.     dc.l    0
  289.  
  290. ; Questa e' la struttura per usare Video_Control. La prima long serve per
  291. ; CAMBIARE (SET) la risoluzione degli sprite o per sapere (GET) quella vecchia.
  292.  
  293. GETVidCtrlTags:
  294.     dc.l    $80000032    ; GET
  295. OldRisoluzione:
  296.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  297.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  298.  
  299. GETVidCtrlTags2:
  300.     dc.l    $80000032    ; GET
  301. OldRisoluzioneP:
  302.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  303.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  304.  
  305. SETVidCtrlTags:
  306.     dc.l    $80000031    ; SET
  307.     dc.l    1    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  308.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  309.  
  310. SETOldVidCtrlTags:
  311.     dc.l    $80000031    ; SET
  312. OldRisoluzione2:
  313.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  314.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  315.  
  316. ; Nome schermo del WorkBench
  317.  
  318. Workbench:
  319.     dc.b    'Workbench',0
  320.  
  321. ; *****************************************************************************
  322. ; QUESTA ROUTINE BLOCCA INTUITION CREANDO UNA MESSAGE-PORT AD UN LIVELLO
  323. ; DI PRIORITA' PIU' ALTO DI QUELLO DI INTUITION, COSICCHE' TUTTI I MESSAGGI
  324. ; RELATIVI AD INTUITION VENGONO INVIATI A QUESTA MESSAGE-PORT (NULLAFACENTE).
  325. ; *****************************************************************************
  326.  
  327. InputOFF:
  328.     LEA    INPUTMPORT(PC),A1    ; port da creare
  329.     BSR.w    CREATEPORT
  330.     CMP.L    #-1,D0
  331.     BEQ.w    INTUIERROR
  332.     MOVE.L    #INPUTMPORT,inputioST    ; MN_REPLYPORT+inputio
  333.     LEA    INPUTDEVICE(PC),A0    ; DevName: input.device
  334.     MOVEQ    #0,D0            ; Unit Number
  335.     LEA    INPUTIO(PC),A1        ; iORequest block da inizializzare
  336.     MOVEQ    #0,D1            ; flags: nessuno
  337.     MOVE.L    4.w,A6
  338.     JSR    -$1BC(A6)        ; OpenDevice - inizializza inputio
  339.     TST.L    D0            ; Se d0=0 nessun errore
  340.     BNE.S    INTUITIONON1        ; Altrimenti esci disperato
  341.  
  342. ; Ora occorre che il nostro input handler abbia priorita' maggiore di
  343. ; intuition, che ha priorita' 50. Basta mettere priorita' 51!
  344.  
  345.     MOVE.B    #51,LN_PRI       ; Priorita' nostro inputhandler = 51
  346.     CLR.L    IS_DATA           ; IS_DATA dell'inputhandler = 0
  347.     MOVE.L    #READINPUT,IS_CODE ; Come codice solo moveq #0,d0 & rts.
  348.     MOVE.W    #9,IO_COMMAND       ; comando: ND_ADDHANDLER
  349.     MOVE.L    #INPUTHANDLER,IO_DATA
  350.     LEA    INPUTIO(PC),A1    ; iOrequest
  351.     MOVE.L    4.w,A6
  352.     JSR    -$1C8(A6)    ; DoIo
  353.     RTS
  354.  
  355. ; Routine che mettiamo nel nostro input handler... non fa molto, eh!?
  356.  
  357. READINPUT:
  358.     MOVEQ    #0,D0        ; non passiamo input a Intuition
  359.     RTS
  360.  
  361. ; *****************************************************************************
  362. ; Routine che ripristina l'input/output di intuition
  363. ; *****************************************************************************
  364.  
  365. InputON:
  366.     TST.B    InputErrFlag    ; errore in InputOFF?
  367.     BNE.S    EsciInputON    ; se si, niente da fare qua
  368.     MOVE.W    #10,IO_COMMAND    ; comando: IND_REMHANDLER (rimuovi handler)
  369.     MOVE.L    #INPUTHANDLER,IO_DATA
  370.     LEA    INPUTIO(PC),A1    ; iORequest
  371.     MOVE.L    4.w,A6
  372.     JSR    -$1C8(A6)    ; DoIo
  373.     LEA    INPUTIO(PC),A1    ; iORequest
  374.     MOVE.L    4.w,A6
  375.     JSR    -$1C2(A6)    ; CloseDevice
  376. INTUITIONON1:
  377.     LEA    INPUTMPORT(PC),A1
  378.     BSR.s    FREEUPPORT
  379. INTUIERROR:
  380.     MOVE.B    #$FF,InputErrFlag    ; segna l'errore
  381. EsciInputON:
  382.     RTS
  383.  
  384. InputErrFlag:
  385.     dc.w    0
  386.  
  387. ; a1=address of port. In uscita se d0=-1 allora c'e' un errore
  388.  
  389. CREATEPORT:
  390.     MOVE.L    A1,-(SP)
  391.     MOVEQ    #-1,D0        ; SignalNum -1 (uno qualsiasi)
  392.     MOVE.L    4.w,A6
  393.     JSR    -$14A(A6)    ; AllocSignal
  394.     MOVEQ    #-1,D1
  395.     CMP.L    D1,D0        ; Errore?
  396.     BEQ.S    FREEUPPORT1
  397.     MOVE.L    (SP),A0        ; Port in a0
  398.     MOVE.B    #0,9(A0)    ; LN_PRI
  399.     MOVE.B    #4,8(A0)    ; NT_MSGPORT, LN_TYPE
  400.     MOVE.B    #0,14(A0)    ; PA_SIGNAL, MP_FLAGS
  401.     MOVE.B    D0,15(A0)    ; MP_SIGBIT
  402.     SUBA.L    A1,A1
  403.     MOVE.L    4.w,A6
  404.     JSR    -$126(A6)    ; FindTask (trova questo task)
  405.     MOVE.L    (SP),A1
  406.     MOVE.L    D0,$10(A1)    ; d0,MP_SIGTASK
  407.     LEA    $14(A1),A0    ; MP_MSGLIST,a0
  408.     MOVE.L    A0,(A0)        ; NEWLIST a0
  409.     ADDQ.L    #4,(A0)        ; 
  410.     CLR.L    4(A0)        ; 
  411.     MOVE.L    A0,8(A0)    ;
  412. CREATEPORTEXIT:
  413.     MOVE.L    (SP)+,D0
  414.     RTS
  415.  
  416. ; a1=address of port
  417.  
  418. FREEUPPORT:
  419.     MOVE.L    A1,-(SP)
  420.     MOVE.B    15(A1),D0    ; MP_SIGBIT,d0 (SignalNum)
  421.     MOVE.L    4.w,A6
  422.     JSR    -$150(A6)    ; FreeSignal
  423. FREEUPPORT1:
  424.     MOVE.L    (SP)+,A1
  425.     RTS
  426.  
  427. INPUTMPORT:
  428.     ds.b    34    ; MP_SIZE
  429.  
  430. INPUTIO:
  431.     ds.b    14
  432. inputioST:
  433.     ds.b    14
  434. IO_COMMAND:
  435.     ds.b    12
  436. IO_DATA:
  437.     ds.b    8
  438.  
  439. INPUTHANDLER:
  440.     ds.b    9
  441. LN_PRI:
  442.     ds.b    5
  443. IS_DATA:
  444.     dc.l    0
  445. IS_CODE:
  446.     dc.l    0
  447.  
  448. INPUTDEVICE:
  449.     dc.b    'input.device',0,0
  450.  
  451. ******************************************************************************
  452. ;    Da qua in avanti si puo' operare sull'hardware in modo diretto
  453. ******************************************************************************
  454.  
  455. HEAVYINIT:
  456.     LEA    $DFF000,A5        ; Base dei registri CUSTOM per Offsets
  457.     MOVE.W    $2(A5),OLDDMA        ; Salva il vecchio status di DMACON
  458.     MOVE.W    $1C(A5),OLDINTENA    ; Salva il vecchio status di INTENA
  459.     MOVE.W    $10(A5),OLDADKCON    ; Salva il vecchio status di ADKCON
  460.     MOVE.W    $1E(A5),OLDINTREQ    ; Salva il vecchio status di INTREQ
  461.     MOVE.L    #$80008000,d0        ; Prepara la maschera dei bit alti
  462.                     ; da settare nelle word dove sono
  463.                     ; stati salvati i registri
  464.     OR.L    d0,OLDDMA    ; Setta il bit 15 di tutti i valori salvati
  465.     OR.L    d0,OLDADKCON    ; dei registri hardware, indispensabile per
  466.                 ; rimettere tali valori nei registri.
  467.  
  468.     MOVE.L    #$7FFF7FFF,$9A(a5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  469.     MOVE.L    #0,$144(A5)        ; SPR0DAT - ammazza il puntatore!
  470.     MOVE.W    #$7FFF,$96(a5)        ; DISABILITA I DMA
  471.     MOVE.L    #0,$144(A5)
  472.  
  473.     move.l    4.w,a6        ; ExecBase in a6
  474.     btst.b    #0,$129(a6)    ; Testa se siamo su un 68010 o superiore
  475.     beq.s    IntOK        ; E' un 68000! Allora la base e' sempre zero.
  476.     lea    SuperCode(PC),a5 ; Routine da eseguire in supervisor
  477.     jsr    -$1e(a6)    ; LvoSupervisor - esegui la routine
  478.     bra.s    IntOK        ; Abbiamo il valore del VBR, continuiamo...
  479.  
  480. ;**********************CODICE IN SUPERVISORE per 68010+ **********************
  481. SuperCode:
  482.     dc.l      $4e7a9801    ; Movec Vbr,A1 (istruzione 68010+).
  483.                 ; E' in esadecimale perche' non tutti gli
  484.                 ; assemblatori assemblano il movec.
  485.     move.l    a1,BaseVBR    ; Label dove salvare il valore del VBR
  486.     RTE            ; Ritorna dalla eccezione
  487. ;*****************************************************************************
  488.  
  489. BaseVBR:        ; Se non modificato, rimane zero! (per 68000).
  490.     dc.l    0
  491.  
  492. IntOK:
  493.     move.l    BaseVBR(PC),a0     ; In a0 il valore del VBR
  494.     move.l    $64(a0),OldInt64 ; Sys int liv 1 salvato (softint,dskblk)
  495.     move.l    $68(a0),OldInt68 ; Sys int liv 2 salvato (I/O,ciaa,int2)
  496.     move.l    $6c(a0),OldInt6c ; Sys int liv 3 salvato (coper,vblanc,blit)
  497.     move.l    $70(a0),OldInt70 ; Sys int liv 4 salvato (audio)
  498.     move.l    $74(a0),OldInt74 ; Sys int liv 5 salvato (rbf,dsksync)
  499.     move.l    $78(a0),OldInt78 ; Sys int liv 6 salvato (exter,ciab,inten)
  500.  
  501.     bsr.w    ClearMyCache
  502.  
  503.     lea    $dff000,a5    ; Custom register in a5
  504.     bsr.w    START        ; Esegui il programma.
  505.  
  506.     bsr.w    ClearMyCache
  507.  
  508.     LEA    $dff000,a5    ; Custom base per offsets
  509.     MOVE.W    #$8240,$96(a5)    ; dmacon - abilita blit
  510.     BTST.b    #6,2(a5)    ; WaitBlit via hardware...
  511. Wblittez:
  512.     BTST.b    #6,2(a5)
  513.     BNE.S    Wblittez
  514.  
  515.     MOVE.W    #$7FFF,$96(A5)        ; DISABILITA TUTTI I DMA
  516.     MOVE.L    #$7FFF7FFF,$9A(A5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  517.     MOVE.W    #$7fff,$9E(a5)        ; Disabilita i bit di ADKCON
  518.  
  519.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  520.     move.l    OldInt64(PC),$64(a0) ; Sys int liv1 salvato (softint,dskblk)
  521.     move.l    OldInt68(PC),$68(a0) ; Sys int liv2 salvato (I/O,ciaa,int2)
  522.     move.l    OldInt6c(PC),$6c(a0) ; Sys int liv3 salvato (coper,vblanc,blit)
  523.     move.l    OldInt70(PC),$70(a0) ; Sys int liv4 salvato (audio)
  524.     move.l    OldInt74(PC),$74(a0) ; Sys int liv5 salvato (rbf,dsksync)
  525.     move.l    OldInt78(PC),$78(a0) ; Sys int liv6 salvato (exter,ciab,inten)
  526.  
  527.     MOVE.W    OLDADKCON(PC),$9E(A5)    ; ADKCON
  528.     MOVE.W    OLDDMA(PC),$96(A5)    ; Rimetti il vecchio status DMA
  529.     MOVE.W    OLDINTENA(PC),$9A(A5)    ; INTENA STATUS
  530.     MOVE.W    OLDINTREQ(PC),$9C(A5)    ; INTREQ
  531.     RTS
  532.  
  533. ;    Dati salvati dalla startup
  534.  
  535. WBVIEW:            ; Indirizzo del View del WorkBench
  536.     DC.L    0
  537. GfxName:
  538.     dc.b    'graphics.library',0,0
  539. IntuiName:
  540.     dc.b    'intuition.library',0
  541. DosName:
  542.     dc.b    "dos.library",0
  543. GfxBase:        ; Puntatore alla Base della Graphics Library
  544.     dc.l    0
  545. IntuiBase:        ; Puntatore alla Base della Intuition Library
  546.     dc.l    0
  547. DosBase:        ; Puntatore alla Base della Dos Library
  548.     dc.l    0
  549. OLDDMA:            ; Vecchio status DMACON
  550.     dc.w    0
  551. OLDINTENA:        ; Vecchio status INTENA
  552.     dc.w    0
  553. OLDADKCON:        ; Vecchio status ADKCON
  554.     DC.W    0
  555. OLDINTREQ:        ; Vecchio status INTREQ
  556.     DC.W    0
  557.  
  558. ; Vecchi interrupt di sistema
  559.  
  560. OldInt64:
  561.     dc.l    0
  562. OldInt68:
  563.     dc.l    0
  564. OldInt6c:
  565.     dc.l    0
  566. OldInt70:
  567.     dc.l    0
  568. OldInt74:
  569.     dc.l    0
  570. OldInt78:
  571.     dc.l    0
  572.  
  573. ; Routine da chiamare in caso di codice automodificante, modifica di tabelle
  574. ; in fast ram, caricamento da disco, ecc.
  575.  
  576. ClearMyCache:
  577.     movem.l    d0-d7/a0-a6,-(SP)
  578.     move.l    4.w,a6
  579.     MOVE.W    $14(A6),D0    ; lib version
  580.     CMP.W    #37,D0        ; e' V37+? (kick 2.0+)
  581.     blo.s    nocaches    ; Se kick1.3, il problema e' che non puo'
  582.                 ; nemmeno sapere se e' un 68040, per cui
  583.                 ; e' rischioso.. e si spera che uno
  584.                 ; stupido che ha un 68020+ su un kick1.3
  585.                 ; abbia anche le caches disabilitate!
  586.     jsr    -$27c(a6)    ; cache cleaR U (per load, modifiche ecc.)
  587. nocaches:
  588.     movem.l    (sp)+,d0-d7/a0-a6
  589.     rts
  590.  
  591.