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

  1.  
  2. ; Lezione11o2.s   Caricamento di un file dati usando la dos.library
  3. ;          Premere il tasto sinistro per caricare, destro per uscire
  4.  
  5.     Section DosLoad,code
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  11. *****************************************************************************
  12.  
  13. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  14.  
  15.         ;5432109876543210
  16. DMASET    EQU    %1000001110000000    ; copper,bitplane DMA abilitati
  17.  
  18. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  19.  
  20. START:
  21.  
  22. ; Puntiamo la PIC
  23.  
  24.     MOVE.L    #PICTURE2,d0
  25.     LEA    BPLPOINTERS2,A1
  26.     MOVEQ    #5-1,D1            ; num di bitplanes
  27. POINTBT2:
  28.     move.w    d0,6(a1)
  29.     swap    d0
  30.     move.w    d0,2(a1)
  31.     swap    d0
  32.     add.l    #34*40,d0        ; lunghezza del bitplane
  33.     addq.w    #8,a1
  34.     dbra    d1,POINTBT2    ; Rifai D1 volte (D1=num do bitplanes)
  35.  
  36. ; Puntiamo la PIC che sara' caricata (ora e' solo un buffer vuoto)
  37.  
  38.     LEA    bplpointers,A0
  39.     MOVE.L    #LOGO+40*40,d0    ; indirizzo logo (un po' ribassato)
  40.     MOVEQ    #6-1,D7        ; 6 bitplanes HAM.
  41. pointloop:
  42.     MOVE.W    D0,6(A0)
  43.     SWAP    D0
  44.     MOVE.W    D0,2(A0)
  45.     SWAP    D0
  46.     ADDQ.w    #8,A0
  47.     ADD.L    #176*40,D0    ; lunghezza plane
  48.     DBRA    D7,pointloop
  49.  
  50.  
  51. ; Puntiamo il nostro int di livello 3
  52.  
  53.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  54.     move.l    oldint6c(PC),crappyint    ; Per DOS LOAD - salteremo all'oldint
  55.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  56.  
  57.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  58.                     ; e sprites.
  59.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  60.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  61.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  62.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  63.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  64.  
  65.     movem.l    d0-d7/a0-a6,-(SP)
  66.     bsr.w    mt_init        ; inizializza la routine musicale
  67.     movem.l    (SP)+,d0-d7/a0-a6
  68.  
  69.     move.w    #$c020,$9a(a5)    ; INTENA - abilito interrupt "VERTB"
  70.                 ; del livello 3 ($6c)
  71.  
  72. mouse:
  73.     btst    #6,$bfe001    ; Mouse premuto? (il processore esegue questo
  74.     bne.s    mouse        ; loop in modo utente, e ogni vertical blank
  75.                 ; nonche' ogni WAIT della linea raster $a0
  76.                 ; lo interrompe per suonare la musica!).
  77.  
  78.     bsr.w    DosLoad        ; Carica un file legalmente con la dos.lib
  79.                 ; mentre stiamo visualizzando una nostra
  80.                 ; copperlist e eseguendo un nostro interrupt
  81.     TST.L    ErrorFlag
  82.     bne.s    ErroreLoad    ; File non caricato?? Non usiamolo allora!
  83.  
  84. mouse2:
  85.     btst    #2,$dff016    ; Mouse premuto? (il processore esegue questo
  86.     bne.s    mouse2        ; loop in modo utente, e ogni vertical blank
  87.  
  88. ErroreLoad:
  89.     bsr.w    mt_end        ; fine del replay!
  90.  
  91.     rts            ; esci
  92.  
  93. *****************************************************************************
  94. *    ROUTINE IN INTERRUPT $6c (livello 3) - usato il VERTB e COPER.
  95. *****************************************************************************
  96.  
  97. MioInt6c:
  98.     btst.b    #5,$dff01f    ; INTREQR - il bit 5, VERTB, e' azzerato?
  99.     beq.s    NointVERTB        ; Se si, non e' un "vero" int VERTB!
  100.     movem.l    d0-d7/a0-a6,-(SP)    ; salvo i registri nello stack
  101.     bsr.w    mt_music        ; suono la musica
  102.     bsr.w    ColorCicla        ; Cicla i colori della pic
  103.     movem.l    (SP)+,d0-d7/a0-a6    ; riprendo i reg. dallo stack
  104. NointVERTB:
  105.     move.w    #$70,$dff09c    ; INTREQ - int eseguito, cancello la richiesta
  106.                 ; dato che il 680x0 non la cancella da solo!!!
  107.     rte            ; Uscita dall'int VERTB
  108.  
  109. *****************************************************************************
  110. *    Routine che "cicla" i colori di tutta la palette.            *
  111. *    Questa routine cicla i primi 15 colori separatamente dal secondo    *
  112. *    secondo blocco di colori. Funziona come i "RANGE" del Dpaint.       *
  113. *****************************************************************************
  114.  
  115. ;    Il contatore "cont" serve a far aspettare 3 fotogrammi prima di
  116. ;    eseguire la routine cont. In pratica a "rallentare" l'esecuzione
  117.  
  118. cont:
  119.     dc.w    0
  120.  
  121. ColorCicla:
  122.     addq.b    #1,cont
  123.     cmp.b    #3,cont        ; Agisci 1 volta ogni 3 fotogrammi solamente
  124.     bne.s    NonAncora    ; Non siamo ancora al terzo? Esci!
  125.     clr.b    cont        ; Siamo al terzo, azzera il contatore
  126.  
  127. ; Roteazione all'indietro dei primi 15 colori
  128.  
  129.     lea    cols+2,a0    ; Indirizzo primo colore del primo gruppo
  130.     move.w    (a0),d0        ; Salva il primo colore in d0
  131.     moveq    #15-1,d7    ; 15 colori da "roteare" nel primo gruppo
  132. cloop1:
  133.     move.w    4(a0),(a0)    ; Copia il colore avanti in quello prima
  134.     addq.w    #4,a0        ; salta alla prossimo col. da "indietreggiare"
  135.     dbra    d7,cloop1    ; ripeti d7 volte
  136.     move.w    d0,(a0)        ; Sistema il primo colore salvato come ultimo.
  137.  
  138. ; Roteazione in avanti dei secondi 15 colori
  139.  
  140.     lea    cole-2,a0    ; Indirizzo ultimo colore del secondo gruppo
  141.     move.w    (a0),d0        ; Salva l'ultimo colore in d0
  142.     moveq    #15-1,d7    ; Altri 15 colori da "roteare" separatamente
  143. cloop2:    
  144.     move.w    -4(a0),(a0)    ; Copia il colore indietro in quello dopo
  145.     subq.w    #4,a0        ; salta al precedente col. da "avanzare"
  146.     dbra    d7,cloop2    ; ripeti d7 volte
  147.     move.w    d0,(a0)        ; Sistema l'ultimo colore salvato come primo
  148. NonAncora:
  149.     rts
  150.  
  151.  
  152. *****************************************************************************
  153. ; Routine che carica un file mentre stiamo battendo nel metallo.
  154. *****************************************************************************
  155.  
  156. DosLoad:
  157.     bsr.w    PreparaLoad    ; Rispristina multitask e setta interrupt load
  158.  
  159.     moveq    #5,d1        ; num. di frames da aspettare
  160.     bsr.w    AspettaBlanks    ; aspetta 5 frames
  161.  
  162.     bsr.s    CaricaFile    ; Carica il file con la dos.library
  163.     move.l    d0,ErrorFlag    ; Salva lo stato di successo o di errore
  164.  
  165. ; nota: ora dobbiamo attendere che il motore del disk drive, o la spia del
  166. ; povero Hard Disk o CD-ROM si spenga, prima di bloccare tutto, o causiamo
  167. ; un crash del sistema spettacolare.
  168.  
  169.     move.w    #150,d1        ; num. di frames da aspettare
  170.     bsr.w    AspettaBlanks    ; aspetta 150 frames
  171.  
  172.     bsr.w    DopoLoad    ; Disabilita multitask e rimetti interrupt
  173.     rts
  174.  
  175. ErrorFlag:
  176.     dc.l    0
  177.  
  178. *****************************************************************************
  179. ; Routine che carica un file di una lunghezza specificata e con un nome
  180. ; specificato. Occorre mettere l'intero path!
  181. *****************************************************************************
  182.  
  183. CaricaFile:
  184.     move.l    #filename,d1    ; indirizzo con stringa "file name + path"
  185.     MOVE.L    #$3ED,D2    ; AccessMode: MODE_OLDFILE - File che esiste
  186.                 ; gia', e che quindi potremo leggere.
  187.     MOVE.L    DosBase(PC),A6
  188.     JSR    -$1E(A6)    ; LVOOpen - "Apri" il file
  189.     MOVE.L    D0,FileHandle    ; Salva il suo handle
  190.     BEQ.S    ErrorOpen    ; Se d0 = 0 allora c'e' un errore!
  191.  
  192. ; Carichiamo il file
  193.  
  194.     MOVE.L    D0,D1        ; FileHandle in d1 per il Read
  195.     MOVE.L    #buffer,D2    ; Indirizzo Destinazione in d2
  196.     MOVE.L    #42240,D3    ; Lunghezza del file (ESATTA!)
  197.     MOVE.L    DosBase(PC),A6
  198.     JSR    -$2A(A6)    ; LVORead - leggi il file e copialo nel buffer
  199.     cmp.l    #-1,d0        ; Errore? (qua e' indicato con -1)
  200.     beq.s    ErroreRead
  201.  
  202. ; Chiudiamolo
  203.  
  204.     MOVE.L    FileHandle(pc),D1 ; FileHandle in d1
  205.     MOVE.L    DosBase(PC),A6
  206.     JSR    -$24(A6)    ; LVOClose - chiudi il file.
  207.  
  208. ; Attenzione al fatto che se non CHIUDETE il file, gli altri programmi non
  209. ; potranno accedere a tale file (non potrete ne' cancellarlo, ne' spostarlo).
  210.  
  211.     moveq    #0,d0    ; Segnaliamo il successo
  212.     rts
  213.  
  214. ; Qua ci son le dolenti note, in caso di errore:
  215.  
  216. ErroreRead:
  217.     MOVE.L    FileHandle(pc),D1 ; FileHandle in d1
  218.     MOVE.L    DosBase(PC),A6
  219.     JSR    -$24(A6)    ; LVOClose - chiudi il file.
  220. ErrorOpen:
  221.     moveq    #-1,d0    ; segnaliamo l'insuccesso
  222.     rts
  223.  
  224.  
  225. FileHandle:
  226.     dc.l    0
  227.  
  228. ; Stringa di testo, da terminare con uno 0, a cui dovra' puntare d1 prima di
  229. ; fare l'OPEN della dos.lib. Conviene mettere l'intero path.
  230.  
  231. Filename:
  232.     dc.b    "assembler2:sorgenti7/amiet.raw",0    ; path+nomefile
  233.     even
  234.  
  235. *****************************************************************************
  236. ; Routine di interrupt da mettere durante il caricamento. Le routines che
  237. ; saranno messe in questo interrupt saranno eseguite anche durante il
  238. ; caricamento, sia che avvenga da floppy disk, da Hard Disk, o CD ROM.
  239. ; DA NOTARE CHE STIAMO USANDO L'INTERRUPT COPER, E NON QUELLO VBLANK,
  240. ; QUESTO PERCHE' DURANTE IL CARICAMENTO DA DISCO, SPECIALMENTE SOTTO KICK 1.3,
  241. ; L'INTERRUPT VERTB NON E' STABILE, tanto che la musica avrebbe dei sobbalzi.
  242. ; Invece, se mettiamo un "$9c,$8010" nella nostra copperlist, siamo sicuri
  243. ; che questa routine sara' eseguita una volta sola per fotogramma.
  244. *****************************************************************************
  245.  
  246. myint6cLoad:
  247.     btst.b    #4,$dff01f    ; INTREQR - il bit 4, COPER, e' azzerato?
  248.     beq.s    nointL        ; Se si, non e' un "vero" int COPER!
  249.     move.w    #%10000,$dff09c    ; Se no, e' la volta buona, togliamo il req!
  250.     movem.l    d0-d7/a0-a6,-(SP)
  251.     bsr.w    mt_music    ; Suona la musica
  252.     movem.l    (SP)+,d0-d7/a0-a6
  253. nointL:
  254.     dc.w    $4ef9        ; val esadecimale di JMP
  255. Crappyint:
  256.     dc.l    0        ; Indirizzo dove Jumpare, da AUTOMODIFICARE...
  257.                 ; ATTENZIONE: il codice automodificante non
  258.                 ; andrebbe usato. Comunque se si chiama un
  259.                 ; ClearMyCache prima e dopo, funziona!
  260.  
  261. *****************************************************************************
  262. ; Routine che ripristina il sistema operativo, tranne la copperlist, e in
  263. ; piu' setta un interrupt $6c nostro, che poi salta a quello di sistema.
  264. ; Da notare che durante il load l'interrupt e' gestito dall'int "COPER"
  265. *****************************************************************************
  266.  
  267. PreparaLoad:
  268.     LEA    $DFF000,A5        ; Base dei registri CUSTOM per Offsets
  269.     MOVE.W    $2(A5),OLDDMAL        ; Salva il vecchio status di DMACON
  270.     MOVE.W    $1C(A5),OLDINTENAL    ; Salva il vecchio status di INTENA
  271.     MOVE.W    $1E(A5),OLDINTREQL    ; Salva il vecchio status di INTREQ
  272.     MOVE.L    #$80008000,d0        ; Prepara la maschera dei bit alti
  273.     OR.L    d0,OLDDMAL        ; Setta il bit 15 dei valori salvati
  274.     OR.W    d0,OLDINTREQL        ; dei registri, per poterli rimettere.
  275.  
  276.     bsr.w    ClearMyCache
  277.  
  278.     MOVE.L    #$7FFF7FFF,$9A(a5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  279.  
  280.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  281.     move.l    OldInt64(PC),$64(a0) ; Sys int liv1 salvato (softint,dskblk)
  282.     move.l    OldInt68(PC),$68(a0) ; Sys int liv2 salvato (I/O,ciaa,int2)
  283.     move.l    #myint6cLoad,$6c(a0) ; Int che poi salta a quello di sys. 
  284.     move.l    OldInt70(PC),$70(a0) ; Sys int liv4 salvato (audio)
  285.     move.l    OldInt74(PC),$74(a0) ; Sys int liv5 salvato (rbf,dsksync)
  286.     move.l    OldInt78(PC),$78(a0) ; Sys int liv6 salvato (exter,ciab,inten)
  287.  
  288.     MOVE.W    #%1000001001010000,$96(A5) ; Abilita blit e disk per sicurezza
  289.     MOVE.W    OLDINTENA(PC),$9A(A5)    ; INTENA STATUS
  290.     MOVE.W    OLDINTREQ(PC),$9C(A5)    ; INTREQ
  291.     move.w    #$c010,$9a(a5)        ; dobbiamo essere sicuri che COPER
  292.                     ; (interrupt via copperlist) sia ON!
  293.  
  294.     move.l    4.w,a6
  295.     JSR    -$7e(A6)    ; Enable
  296.     JSR    -$8a(a6)    ; Permit
  297.  
  298.     MOVE.L    GfxBase(PC),A6
  299.     jsr    -$E4(A6)    ; Aspetta la fine di eventuali blittate
  300.     JSR    -$E4(A6)    ; WaitBlit
  301.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  302.                 ; puo' nuovamente usare il blitter
  303.                 ; (nel kick 1.3 serve per caricare da disk)
  304.     MOVE.L    4.w,A6
  305.     SUBA.L    A1,A1        ; NULL task - trova questo task
  306.     JSR    -$126(A6)    ; findtask (Task(name) in a1, -> d0=task)
  307.     MOVE.L    D0,A1        ; Task in a1
  308.     MOVEQ    #0,D0        ; Priorita' in d0 (-128, +127) - NORMALE
  309.                 ; (Per permettere ai drives di respirare)
  310.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  311.     rts
  312.  
  313. OLDDMAL:
  314.     dc.w    0
  315. OLDINTENAL:        ; Vecchio status INTENA
  316.     dc.w    0
  317. OLDINTREQL:        ; Vecchio status INTREQ
  318.     DC.W    0
  319.  
  320. *****************************************************************************
  321. ; Routine che richiude il sistema operativo e rimette il nostro interrupt
  322. *****************************************************************************
  323.  
  324. DopoLoad:
  325.     MOVE.L    4.w,A6
  326.     SUBA.L    A1,A1        ; NULL task - trova questo task
  327.     JSR    -$126(A6)    ; findtask (Task(name) in a1, -> d0=task)
  328.     MOVE.L    D0,A1        ; Task in a1
  329.     MOVEQ    #127,D0        ; Priorita' in d0 (-128, +127) - MASSIMA
  330.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  331.  
  332.     JSR    -$84(a6)    ; Forbid
  333.     JSR    -$78(A6)    ; Disable
  334.  
  335.     MOVE.L    GfxBase(PC),A6
  336.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  337.                 ; impedendone l'uso al sistema operativo.
  338.     jsr    -$E4(A6)    ; WaitBlit - Attende la fine di ogni blittata
  339.     JSR    -$E4(A6)    ; WaitBlit
  340.  
  341.     bsr.w    ClearMyCache
  342.  
  343.     LEA    $dff000,a5        ; Custom base per offsets
  344. AspettaF:
  345.     MOVE.L    4(a5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  346.     AND.L    #$1ff00,D0    ; Seleziona solo i bit della pos. verticale
  347.     CMP.L    #$12d00,D0    ; aspetta la linea $12d per evitare che
  348.     BEQ.S    AspettaF    ; spegnendo i DMA si abbiano sfarfallamenti
  349.  
  350.     MOVE.L    #$7FFF7FFF,$9A(A5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  351.  
  352.         ; 5432109876543210
  353.     MOVE.W    #%0000010101110000,d0    ; DISABILITA DMA
  354.  
  355.     btst    #8-8,olddmal    ; test bitplane
  356.     beq.s    NoPlanesA
  357.     bclr.l    #8,d0        ; non spengere planes
  358. NoPlanesA:
  359.     btst    #5,olddmal+2    ; test sprite
  360.     beq.s    NoSpritez
  361.     bclr.l    #5,d0        ; non spengere sprite
  362. NoSpritez:
  363.     MOVE.W    d0,$96(A5) ; DISABILITA DMA
  364.  
  365.     move.l    BaseVBR(PC),a0        ; In a0 il valore del VBR
  366.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  367.     MOVE.W    OLDDMAL(PC),$96(A5)    ; Rimetti il vecchio status DMA
  368.     MOVE.W    OLDINTENAL(PC),$9A(A5)    ; INTENA STATUS
  369.     MOVE.W    OLDINTREQL(PC),$9C(A5)    ; INTREQ
  370.     rts
  371.  
  372. *****************************************************************************
  373. ; Questa routine aspetta D1 fotogrammi. Ogni 50 fotogrammi passa 1 secondo.
  374. ;
  375. ; d1 = numero di fotogrammi da attendere
  376. ;
  377. *****************************************************************************
  378.  
  379. AspettaBlanks:
  380.     LEA    $DFF000,A5    ; CUSTOM REG per OFFSETS
  381. WBLAN1xb:
  382.     MOVE.w    #$80,D0
  383. WBLAN1bxb:
  384.     CMP.B    6(A5),D0    ; vhposr
  385.     BNE.S    WBLAN1bxb
  386. WBLAN2xb:
  387.     CMP.B    6(A5),D0    ; vhposr
  388.     Beq.S    WBLAN2xb
  389.     DBRA    D1,WBLAN1xb
  390.     rts
  391.  
  392. *****************************************************************************
  393. ;    Routine di replay del protracker/soundtracker/noisetracker
  394. ;
  395.     include    "assembler2:sorgenti4/music.s"
  396. *****************************************************************************
  397.  
  398.     SECTION    GRAPHIC,DATA_C
  399.  
  400. COPPERLIST:
  401.     dc.w    $8E,$2c81    ; DiwStrt
  402.     dc.w    $90,$2cc1    ; DiwStop
  403.     dc.w    $92,$0038    ; DdfStart
  404.     dc.w    $94,$00d0    ; DdfStop
  405.     dc.w    $102,0        ; BplCon1
  406.     dc.w    $104,0        ; BplCon2
  407.     dc.w    $108,0        ; Bpl1Mod
  408.     dc.w    $10a,0        ; Bpl2Mod
  409.  
  410. BPLPOINTERS:
  411.     dc.w $e0,0,$e2,0        ;primo      bitplane
  412.     dc.w $e4,0,$e6,0        ;secondo    "
  413.     dc.w $e8,0,$ea,0        ;terzo      "
  414.     dc.w $ec,0,$ee,0        ;quarto     "
  415.     dc.w $f0,0,$f2,0        ;quinto     "
  416.     dc.w $f4,0,$f6,0        ;sesto      "
  417.  
  418.     dc.w    $180,0    ; Color0 nero
  419.  
  420.  
  421.              ;5432109876543210
  422.     dc.w    $100,%0110101000000000    ; bplcon0 - 320*256 HAM!
  423.  
  424.     dc.w $180,$0000,$182,$134,$184,$531,$186,$443
  425.     dc.w $188,$0455,$18a,$664,$18c,$466,$18e,$973
  426.     dc.w $190,$0677,$192,$886,$194,$898,$196,$a96
  427.     dc.w $198,$0ca6,$19a,$9a9,$19c,$bb9,$19e,$dc9
  428.     dc.w $1a0,$0666
  429.  
  430.     dc.w    $9707,$FFFE    ; wait linea $97
  431.  
  432.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  433.     dc.w    $180,$00e    ; color0 BLU
  434.  
  435.     dc.w    $b907,$fffe    ; WAIT - attendi linea $b9
  436. BPLPOINTERS2:
  437.     dc.w $e0,0,$e2,0        ;primo      bitplane
  438.     dc.w $e4,0,$e6,0        ;secondo    "
  439.     dc.w $e8,0,$ea,0        ;terzo        "
  440.     dc.w $ec,0,$ee,0        ;quarto        "
  441.     dc.w $f0,0,$f2,0        ;quinto        "
  442.  
  443.     dc.w    $100,%0101001000000000    ; BPLCON0 - 5 bitplanes LOWRES
  444.  
  445. ; La palette, che sara' "ruotata" in 2 gruppi di 16 colori.
  446.  
  447. cols:
  448.     dc.w $180,$040,$182,$050,$184,$060,$186,$080    ; tono verde
  449.     dc.w $188,$090,$18a,$0b0,$18c,$0c0,$18e,$0e0
  450.     dc.w $190,$0f0,$192,$0d0,$194,$0c0,$196,$0a0
  451.     dc.w $198,$090,$19a,$070,$19c,$060,$19e,$040
  452.  
  453.     dc.w $1a0,$029,$1a2,$02a,$1a4,$13b,$1a6,$24b    ; tono blu
  454.     dc.w $1a8,$35c,$1aa,$36d,$1ac,$57e,$1ae,$68f
  455.     dc.w $1b0,$79f,$1b2,$68f,$1b4,$58e,$1b6,$37e
  456.     dc.w $1b8,$26d,$1ba,$15d,$1bc,$04c,$1be,$04c
  457. cole:
  458.  
  459.     dc.w    $da07,$fffe    ; WAIT - attendi la linea $da
  460.     dc.w    $100,$200    ; BPLCON0 - disabilita i bitplanes
  461.     dc.w    $180,$00e    ; color0 BLU
  462.  
  463.     dc.w    $ff07,$fffe    ; WAIT - attendi la linea $ff
  464.     dc.w    $9c,$8010    ; INTREQ - Richiedo un interrupt COPER, per
  465.                 ; suonare la musica (anche mentre stiamo
  466.                 ; caricando con la dos.library).
  467.  
  468.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  469.  
  470.  
  471. *****************************************************************************
  472. ;         DISEGNO 320*34 a 5 bitplanes (32 colori)
  473. *****************************************************************************
  474.  
  475. PICTURE2:
  476.     INCBIN    "pic320*34*5.raw"
  477.  
  478. *****************************************************************************
  479. ;                MUSICA
  480. *****************************************************************************
  481.  
  482. mt_data:
  483.     dc.l    mt_data1
  484.  
  485. mt_data1:
  486.     incbin    "assembler2:sorgenti4/mod.fairlight"
  487.  
  488. ******************************************************************************
  489. ; Buffer dove viene caricata l'immagine da disco (o hard disk) tramite doslib
  490. ******************************************************************************
  491.  
  492.     section    mioplanaccio,bss_C
  493.  
  494. buffer:
  495. LOGO:
  496.     ds.b    6*40*176    ; 6 bitplanes * 176 lines * 40 bytes (HAM)
  497.  
  498.  
  499.     end
  500.  
  501. In questo esempio carichiamo il logo, che appare subito sopra. Se lo caricate
  502. da dischetto noterete che appare plane per plane, a pezzi, infatti carica
  503. un po' alla volta! Sarebbe meglio caricarlo in un buffer a parte, poi farlo
  504. visualizzare tutto insieme a caricamento avvenuto.
  505. La cosa fondamentale del caricamento e' che li tempo atteso dopo il load,
  506. prima di richiudere tutto, sia sufficiente. Altrimenti e' la fine!
  507. In Interrupt non viene eseguita la routine dei colori, ma solo quella della
  508. musica, almeno si nota il tempo che si attende "per sicurezza".
  509. Dato che questo tempo va atteso comunque, sarebbe intelligente fare un
  510. fade o qualche routine che perde tempo facendo qualcosa di carino, prima di
  511. richiudere tutto, almeno si e' atteso il tempo, ma non senza usarlo!
  512.  
  513.