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