home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti7 / lezione11o2b2.s < prev    next >
Text File  |  1996-08-16  |  17KB  |  520 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.  
  185.     MOVE.L    DosBase(PC),A6
  186.     MOVE.L    #filename,d1    ; Salva il suo handle
  187.     MOVE.L    #1,d2    ; Salva il suo handle
  188.     MOVE.L    #81158,d3    ; Salva il suo handle
  189.     JSR    -$42(A6)    ; SEEK - "Seeka" il file
  190.  
  191.     move.l    #filename,d1    ; indirizzo con stringa "file name + path"
  192.     MOVE.L    #$3ED,D2    ; AccessMode: MODE_OLDFILE - File che esiste
  193.                 ; gia', e che quindi potremo leggere.
  194.     MOVE.L    DosBase(PC),A6
  195.     JSR    -$1E(A6)    ; LVOOpen - "Apri" il file
  196.     MOVE.L    D0,FileHandle    ; Salva il suo handle
  197.     BEQ.S    ErrorOpen    ; Se d0 = 0 allora c'e' un errore!
  198.  
  199. ; Carichiamo il file
  200.  
  201.     MOVE.L    D0,D1        ; FileHandle in d1 per il Read
  202.     MOVE.L    #buffer,D2    ; Indirizzo Destinazione in d2
  203.     MOVE.L    #42240,D3    ; Lunghezza del file (ESATTA!)
  204.     MOVE.L    DosBase(PC),A6
  205.     JSR    -$2A(A6)    ; LVORead - leggi il file e copialo nel buffer
  206.     cmp.l    #-1,d0        ; Errore? (qua e' indicato con -1)
  207.     beq.s    ErroreRead
  208.  
  209. ; Chiudiamolo
  210.  
  211.     MOVE.L    FileHandle(pc),D1 ; FileHandle in d1
  212.     MOVE.L    DosBase(PC),A6
  213.     JSR    -$24(A6)    ; LVOClose - chiudi il file.
  214.  
  215. ; Attenzione al fatto che se non CHIUDETE il file, gli altri programmi non
  216. ; potranno accedere a tale file (non potrete ne' cancellarlo, ne' spostarlo).
  217.  
  218.     moveq    #0,d0    ; Segnaliamo il successo
  219.     rts
  220.  
  221. ; Qua ci son le dolenti note, in caso di errore:
  222.  
  223. ErroreRead:
  224.     MOVE.L    FileHandle(pc),D1 ; FileHandle in d1
  225.     MOVE.L    DosBase(PC),A6
  226.     JSR    -$24(A6)    ; LVOClose - chiudi il file.
  227. ErrorOpen:
  228.     moveq    #-1,d0    ; segnaliamo l'insuccesso
  229.     rts
  230.  
  231.  
  232. FileHandle:
  233.     dc.l    0
  234.  
  235. ; Stringa di testo, da terminare con uno 0, a cui dovra' puntare d1 prima di
  236. ; fare l'OPEN della dos.lib. Conviene mettere l'intero path.
  237.  
  238. Filename:
  239.     dc.b    "assembler2:sorgenti7/amiet.raw",0    ; path+nomefile
  240.     even
  241.  
  242. *****************************************************************************
  243. ; Routine di interrupt da mettere durante il caricamento. Le routines che
  244. ; saranno messe in questo interrupt saranno eseguite anche durante il
  245. ; caricamento, sia che avvenga da floppy disk, da Hard Disk, o CD ROM.
  246. ; DA NOTARE CHE STIAMO USANDO L'INTERRUPT COPER, E NON QUELLO VBLANK,
  247. ; QUESTO PERCHE' DURANTE IL CARICAMENTO DA DISCO, SPECIALMENTE SOTTO KICK 1.3,
  248. ; L'INTERRUPT VERTB NON E' STABILE, tanto che la musica avrebbe dei sobbalzi.
  249. ; Invece, se mettiamo un "$9c,$8010" nella nostra copperlist, siamo sicuri
  250. ; che questa routine sara' eseguita una volta sola per fotogramma.
  251. *****************************************************************************
  252.  
  253. myint6cLoad:
  254.     btst.b    #4,$dff01f    ; INTREQR - il bit 4, COPER, e' azzerato?
  255.     beq.s    nointL        ; Se si, non e' un "vero" int COPER!
  256.     move.w    #%10000,$dff09c    ; Se no, e' la volta buona, togliamo il req!
  257.     movem.l    d0-d7/a0-a6,-(SP)
  258.     bsr.w    mt_music    ; Suona la musica
  259.     movem.l    (SP)+,d0-d7/a0-a6
  260. nointL:
  261.     dc.w    $4ef9        ; val esadecimale di JMP
  262. Crappyint:
  263.     dc.l    0        ; Indirizzo dove Jumpare, da AUTOMODIFICARE...
  264.                 ; ATTENZIONE: il codice automodificante non
  265.                 ; andrebbe usato. Comunque se si chiama un
  266.                 ; ClearMyCache prima e dopo, funziona!
  267.  
  268. *****************************************************************************
  269. ; Routine che ripristina il sistema operativo, tranne la copperlist, e in
  270. ; piu' setta un interrupt $6c nostro, che poi salta a quello di sistema.
  271. ; Da notare che durante il load l'interrupt e' gestito dall'int "COPER"
  272. *****************************************************************************
  273.  
  274. PreparaLoad:
  275.     LEA    $DFF000,A5        ; Base dei registri CUSTOM per Offsets
  276.     MOVE.W    $2(A5),OLDDMAL        ; Salva il vecchio status di DMACON
  277.     MOVE.W    $1C(A5),OLDINTENAL    ; Salva il vecchio status di INTENA
  278.     MOVE.W    $1E(A5),OLDINTREQL    ; Salva il vecchio status di INTREQ
  279.     MOVE.L    #$80008000,d0        ; Prepara la maschera dei bit alti
  280.     OR.L    d0,OLDDMAL        ; Setta il bit 15 dei valori salvati
  281.     OR.W    d0,OLDINTREQL        ; dei registri, per poterli rimettere.
  282.  
  283.     bsr.w    ClearMyCache
  284.  
  285.     MOVE.L    #$7FFF7FFF,$9A(a5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  286.  
  287.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  288.     move.l    OldInt64(PC),$64(a0) ; Sys int liv1 salvato (softint,dskblk)
  289.     move.l    OldInt68(PC),$68(a0) ; Sys int liv2 salvato (I/O,ciaa,int2)
  290.     move.l    #myint6cLoad,$6c(a0) ; Int che poi salta a quello di sys. 
  291.     move.l    OldInt70(PC),$70(a0) ; Sys int liv4 salvato (audio)
  292.     move.l    OldInt74(PC),$74(a0) ; Sys int liv5 salvato (rbf,dsksync)
  293.     move.l    OldInt78(PC),$78(a0) ; Sys int liv6 salvato (exter,ciab,inten)
  294.  
  295.     MOVE.W    #%1000001001010000,$96(A5) ; Abilita blit e disk per sicurezza
  296.     MOVE.W    OLDINTENA(PC),$9A(A5)    ; INTENA STATUS
  297.     MOVE.W    OLDINTREQ(PC),$9C(A5)    ; INTREQ
  298.     move.w    #$c010,$9a(a5)        ; dobbiamo essere sicuri che COPER
  299.                     ; (interrupt via copperlist) sia ON!
  300.  
  301.     move.l    4.w,a6
  302.     JSR    -$7e(A6)    ; Enable
  303.     JSR    -$8a(a6)    ; Permit
  304.  
  305.     MOVE.L    GfxBase(PC),A6
  306.     jsr    -$E4(A6)    ; Aspetta la fine di eventuali blittate
  307.     JSR    -$E4(A6)    ; WaitBlit
  308.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  309.                 ; puo' nuovamente usare il blitter
  310.                 ; (nel kick 1.3 serve per caricare da disk)
  311.     MOVE.L    4.w,A6
  312.     SUBA.L    A1,A1        ; NULL task - trova questo task
  313.     JSR    -$126(A6)    ; findtask (Task(name) in a1, -> d0=task)
  314.     MOVE.L    D0,A1        ; Task in a1
  315.     MOVEQ    #0,D0        ; Priorita' in d0 (-128, +127) - NORMALE
  316.                 ; (Per permettere ai drives di respirare)
  317.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  318.     rts
  319.  
  320. OLDDMAL:
  321.     dc.w    0
  322. OLDINTENAL:        ; Vecchio status INTENA
  323.     dc.w    0
  324. OLDINTREQL:        ; Vecchio status INTREQ
  325.     DC.W    0
  326.  
  327. *****************************************************************************
  328. ; Routine che richiude il sistema operativo e rimette il nostro interrupt
  329. *****************************************************************************
  330.  
  331. DopoLoad:
  332.     MOVE.L    4.w,A6
  333.     SUBA.L    A1,A1        ; NULL task - trova questo task
  334.     JSR    -$126(A6)    ; findtask (Task(name) in a1, -> d0=task)
  335.     MOVE.L    D0,A1        ; Task in a1
  336.     MOVEQ    #127,D0        ; Priorita' in d0 (-128, +127) - MASSIMA
  337.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  338.  
  339.     JSR    -$84(a6)    ; Forbid
  340.     JSR    -$78(A6)    ; Disable
  341.  
  342.     MOVE.L    GfxBase(PC),A6
  343.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  344.                 ; impedendone l'uso al sistema operativo.
  345.     jsr    -$E4(A6)    ; WaitBlit - Attende la fine di ogni blittata
  346.     JSR    -$E4(A6)    ; WaitBlit
  347.  
  348.     bsr.w    ClearMyCache
  349.  
  350.     LEA    $dff000,a5        ; Custom base per offsets
  351. AspettaF:
  352.     MOVE.L    4(a5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  353.     AND.L    #$1ff00,D0    ; Seleziona solo i bit della pos. verticale
  354.     CMP.L    #$12d00,D0    ; aspetta la linea $12d per evitare che
  355.     BEQ.S    AspettaF    ; spegnendo i DMA si abbiano sfarfallamenti
  356.  
  357.     MOVE.L    #$7FFF7FFF,$9A(A5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  358.  
  359.         ; 5432109876543210
  360.     MOVE.W    #%0000010101110000,d0    ; DISABILITA DMA
  361.  
  362.     btst    #8-8,olddmal    ; test bitplane
  363.     beq.s    NoPlanesA
  364.     bclr.l    #8,d0        ; non spengere planes
  365. NoPlanesA:
  366.     btst    #5,olddmal+2    ; test sprite
  367.     beq.s    NoSpritez
  368.     bclr.l    #5,d0        ; non spengere sprite
  369. NoSpritez:
  370.     MOVE.W    d0,$96(A5) ; DISABILITA DMA
  371.  
  372.     move.l    BaseVBR(PC),a0        ; In a0 il valore del VBR
  373.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  374.     MOVE.W    OLDDMAL(PC),$96(A5)    ; Rimetti il vecchio status DMA
  375.     MOVE.W    OLDINTENAL(PC),$9A(A5)    ; INTENA STATUS
  376.     MOVE.W    OLDINTREQL(PC),$9C(A5)    ; INTREQ
  377.     rts
  378.  
  379. *****************************************************************************
  380. ; Questa routine aspetta D1 fotogrammi. Ogni 50 fotogrammi passa 1 secondo.
  381. ;
  382. ; d1 = numero di fotogrammi da attendere
  383. ;
  384. *****************************************************************************
  385.  
  386. AspettaBlanks:
  387.     LEA    $DFF000,A5    ; CUSTOM REG per OFFSETS
  388. WBLAN1xb:
  389.     MOVE.w    #$80,D0
  390. WBLAN1bxb:
  391.     CMP.B    6(A5),D0    ; vhposr
  392.     BNE.S    WBLAN1bxb
  393. WBLAN2xb:
  394.     CMP.B    6(A5),D0    ; vhposr
  395.     Beq.S    WBLAN2xb
  396.     DBRA    D1,WBLAN1xb
  397.     rts
  398.  
  399. *****************************************************************************
  400. ;    Routine di replay del protracker/soundtracker/noisetracker
  401. ;
  402.     include    "assembler2:sorgenti4/music.s"
  403. *****************************************************************************
  404.  
  405.     SECTION    GRAPHIC,DATA_C
  406.  
  407. COPPERLIST:
  408.     dc.w    $8E,$2c81    ; DiwStrt
  409.     dc.w    $90,$2cc1    ; DiwStop
  410.     dc.w    $92,$0038    ; DdfStart
  411.     dc.w    $94,$00d0    ; DdfStop
  412.     dc.w    $102,0        ; BplCon1
  413.     dc.w    $104,0        ; BplCon2
  414.     dc.w    $108,0        ; Bpl1Mod
  415.     dc.w    $10a,0        ; Bpl2Mod
  416.  
  417. BPLPOINTERS:
  418.     dc.w $e0,0,$e2,0        ;primo      bitplane
  419.     dc.w $e4,0,$e6,0        ;secondo    "
  420.     dc.w $e8,0,$ea,0        ;terzo      "
  421.     dc.w $ec,0,$ee,0        ;quarto     "
  422.     dc.w $f0,0,$f2,0        ;quinto     "
  423.     dc.w $f4,0,$f6,0        ;sesto      "
  424.  
  425.     dc.w    $180,0    ; Color0 nero
  426.  
  427.  
  428.              ;5432109876543210
  429.     dc.w    $100,%0110101000000000    ; bplcon0 - 320*256 HAM!
  430.  
  431.     dc.w $180,$0000,$182,$134,$184,$531,$186,$443
  432.     dc.w $188,$0455,$18a,$664,$18c,$466,$18e,$973
  433.     dc.w $190,$0677,$192,$886,$194,$898,$196,$a96
  434.     dc.w $198,$0ca6,$19a,$9a9,$19c,$bb9,$19e,$dc9
  435.     dc.w $1a0,$0666
  436.  
  437.     dc.w    $9707,$FFFE    ; wait linea $97
  438.  
  439.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  440.     dc.w    $180,$00e    ; color0 BLU
  441.  
  442.     dc.w    $b907,$fffe    ; WAIT - attendi linea $b9
  443. BPLPOINTERS2:
  444.     dc.w $e0,0,$e2,0        ;primo      bitplane
  445.     dc.w $e4,0,$e6,0        ;secondo    "
  446.     dc.w $e8,0,$ea,0        ;terzo        "
  447.     dc.w $ec,0,$ee,0        ;quarto        "
  448.     dc.w $f0,0,$f2,0        ;quinto        "
  449.  
  450.     dc.w    $100,%0101001000000000    ; BPLCON0 - 5 bitplanes LOWRES
  451.  
  452. ; La palette, che sara' "ruotata" in 2 gruppi di 16 colori.
  453.  
  454. cols:
  455.     dc.w $180,$040,$182,$050,$184,$060,$186,$080    ; tono verde
  456.     dc.w $188,$090,$18a,$0b0,$18c,$0c0,$18e,$0e0
  457.     dc.w $190,$0f0,$192,$0d0,$194,$0c0,$196,$0a0
  458.     dc.w $198,$090,$19a,$070,$19c,$060,$19e,$040
  459.  
  460.     dc.w $1a0,$029,$1a2,$02a,$1a4,$13b,$1a6,$24b    ; tono blu
  461.     dc.w $1a8,$35c,$1aa,$36d,$1ac,$57e,$1ae,$68f
  462.     dc.w $1b0,$79f,$1b2,$68f,$1b4,$58e,$1b6,$37e
  463.     dc.w $1b8,$26d,$1ba,$15d,$1bc,$04c,$1be,$04c
  464. cole:
  465.  
  466.     dc.w    $da07,$fffe    ; WAIT - attendi la linea $da
  467.     dc.w    $100,$200    ; BPLCON0 - disabilita i bitplanes
  468.     dc.w    $180,$00e    ; color0 BLU
  469.  
  470.     dc.w    $ff07,$fffe    ; WAIT - attendi la linea $ff
  471.     dc.w    $9c,$8010    ; INTREQ - Richiedo un interrupt COPER, per
  472.                 ; suonare la musica (anche mentre stiamo
  473.                 ; caricando con la dos.library).
  474.  
  475.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  476.  
  477.  
  478. *****************************************************************************
  479. ;         DISEGNO 320*34 a 5 bitplanes (32 colori)
  480. *****************************************************************************
  481.  
  482. PICTURE2:
  483.     INCBIN    "pic320*34*5.raw"
  484.  
  485. *****************************************************************************
  486. ;                MUSICA
  487. *****************************************************************************
  488.  
  489. mt_data:
  490.     dc.l    mt_data1
  491.  
  492. mt_data1:
  493.     incbin    "assembler2:sorgenti4/mod.fairlight"
  494.  
  495. ******************************************************************************
  496. ; Buffer dove viene caricata l'immagine da disco (o hard disk) tramite doslib
  497. ******************************************************************************
  498.  
  499.     section    mioplanaccio,bss_C
  500.  
  501. buffer:
  502. LOGO:
  503.     ds.b    6*40*176    ; 6 bitplanes * 176 lines * 40 bytes (HAM)
  504.  
  505.  
  506.     end
  507.  
  508. In questo esempio carichiamo il logo, che appare subito sopra. Se lo caricate
  509. da dischetto noterete che appare plane per plane, a pezzi, infatti carica
  510. un po' alla volta! Sarebbe meglio caricarlo in un buffer a parte, poi farlo
  511. visualizzare tutto insieme a caricamento avvenuto.
  512. La cosa fondamentale del caricamento e' che li tempo atteso dopo il load,
  513. prima di richiudere tutto, sia sufficiente. Altrimenti e' la fine!
  514. In Interrupt non viene eseguita la routine dei colori, ma solo quella della
  515. musica, almeno si nota il tempo che si attende "per sicurezza".
  516. Dato che questo tempo va atteso comunque, sarebbe intelligente fare un
  517. fade o qualche routine che perde tempo facendo qualcosa di carino, prima di
  518. richiudere tutto, almeno si e' atteso il tempo, ma non senza usarlo!
  519.  
  520.