home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti7 / lezione11o3.s < prev    next >
Text File  |  1995-11-05  |  25KB  |  779 lines

  1.  
  2. ; Lezione11o3.s   Caricamento di un file dati usando la dos.library
  3. ;          nota: non occorre sapere la lunghezza del file!
  4. ;          Premere il tasto sinistro per caricare, destro per uscire
  5.  
  6.     Section DosLoad,code
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  12. *****************************************************************************
  13.  
  14. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  15.  
  16.         ;5432109876543210
  17. DMASET    EQU    %1000001110000000    ; copper,bitplane DMA abilitati
  18.  
  19. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  20.  
  21. START:
  22.  
  23. ; Puntiamo la PIC
  24.  
  25.     MOVE.L    #PICTURE2,d0
  26.     LEA    BPLPOINTERS2,A1
  27.     MOVEQ    #5-1,D1            ; num di bitplanes
  28. POINTBT2:
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.     swap    d0
  33.     add.l    #34*40,d0        ; lunghezza del bitplane
  34.     addq.w    #8,a1
  35.     dbra    d1,POINTBT2    ; Rifai D1 volte (D1=num do bitplanes)
  36.  
  37. ; Puntiamo ad un buffer vuoto, che rimarra' sempre vuoto...
  38.  
  39.     LEA    bplpointers,A0
  40.     MOVE.L    #LOGO+40*40,d0    ; indirizzo logo (un po' ribassato)
  41.     MOVEQ    #6-1,D7        ; 6 bitplanes HAM.
  42. pointloop:
  43.     MOVE.W    D0,6(A0)
  44.     SWAP    D0
  45.     MOVE.W    D0,2(A0)
  46.     SWAP    D0
  47.     ADDQ.w    #8,A0
  48.     ADD.L    #176*40,D0    ; lunghezza plane
  49.     DBRA    D7,pointloop
  50.  
  51.  
  52. ; Puntiamo il nostro int di livello 3
  53.  
  54.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  55.     move.l    oldint6c(PC),crappyint    ; Per DOS LOAD - salteremo all'oldint
  56.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  57.  
  58.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  59.                     ; e sprites.
  60.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  61.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  62.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  63.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  64.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  65.  
  66.     movem.l    d0-d7/a0-a6,-(SP)
  67.     bsr.w    mt_init        ; inizializza la routine musicale
  68.     movem.l    (SP)+,d0-d7/a0-a6
  69.  
  70.     move.w    #$c020,$9a(a5)    ; INTENA - abilito interrupt "VERTB"
  71.                 ; del livello 3 ($6c)
  72.  
  73. mouse:
  74.     btst    #6,$bfe001    ; Mouse premuto? (il processore esegue questo
  75.     bne.s    mouse        ; loop in modo utente, e ogni vertical blank
  76.                 ; nonche' ogni WAIT della linea raster $a0
  77.                 ; lo interrompe per suonare la musica!).
  78.  
  79.  
  80.     lea    FileName1(PC),a0     ; Nome del file da caricare
  81.     lea    Buffile1(PC),a1        ; In che label salvo l'indirizzo
  82.                     ; del file caricato in mem
  83.     lea    Grandezz1(PC),a2    ; In che label salvo la grandezza
  84.     moveq    #2,d0            ; Tipo di mem. destinaz.: CHIP RAM!
  85.  
  86.     bsr.w    DosLoad2    ; Carica un file legalmente con la dos.lib
  87.                 ; mentre stiamo visualizzando una nostra
  88.                 ; copperlist e eseguendo un nostro interrupt.
  89.                 ; Definire prima "TypeOfMem", con "2" per CHIP
  90.                 ; o "1" per PUBLIC, e gli altri parametri.
  91.     TST.B    d1        ; Abbiamo Allocato memoria da liberare?
  92.     beq.s    NonFreeMemare    ; d1=0, allora non allocato
  93.     st.b    FreeMema1    ; Se si, setta FreeMema1
  94. NonFreeMemare
  95.     TST.L    d0        ; Controlla se ci sono stati errori...
  96.     bne.s    ErroreLoad    ; File non caricato?? Non usiamolo allora!
  97.                 ; d0=0, allora va tutto bene
  98.  
  99. ; Ora puntiamo alla figura caricata:
  100.  
  101.     LEA    bplpointers,A0
  102.     move.l    Buffile1(PC),d0 ; indirizzo del file caricato
  103.     ADD.L    #40*40,d0    ; logo un po' ribassato (centriamolo...)
  104.     MOVEQ    #6-1,D7        ; 6 bitplanes HAM.
  105. pointloop2:
  106.     MOVE.W    D0,6(A0)
  107.     SWAP    D0
  108.     MOVE.W    D0,2(A0)
  109.     SWAP    D0
  110.     ADDQ.w    #8,A0
  111.     ADD.L    #176*40,D0    ; lunghezza plane
  112.     DBRA    D7,pointloop2
  113.  
  114. ErroreLoad:
  115. mouse2:
  116.     btst    #2,$dff016    ; Mouse premuto? (il processore esegue questo
  117.     bne.s    mouse2        ; loop in modo utente, e ogni vertical blank
  118.  
  119.     bsr.w    mt_end        ; fine del replay!
  120.  
  121. ; RICORDATEVI SEMPRE DI LIBERARE TUTTA LA MEMORIA ALLOCATA!
  122. ; Ma anche di non chiamare il FreeMem se non abbiamo veramente allocato
  123. ; la memoria, pena super guru meditation - software failure - casini vari.
  124.  
  125.     tst.b    FreeMema1    ; c'e' stato un errore prima dell'AllocMem?
  126.     beq.s    NonEraAllocata1    ; se si, non fare il FreeMem!
  127.  
  128.     move.l    Grandezz1(PC),d0 ; Grandezza del blocco in bytes
  129.     move.l    Buffile1(PC),a1 ; Indirizzo del blocco di mem. allocata
  130.     move.l    4.w,a6
  131.     jsr    -$d2(a6)    ; FreeMem
  132. NonEraAllocata1:
  133.     rts            ; esci
  134.  
  135.  
  136. ; Variabili che abbiamo usato per salvare grandezza e indirizzo del file da
  137. ; usare e deallocare alla fine
  138.  
  139. Buffile1:
  140.     dc.l    0
  141. Grandezz1:
  142.     dc.l    0
  143. FreeMema1:
  144.     dc.l    0
  145.  
  146. *****************************************************************************
  147. *    ROUTINE IN INTERRUPT $6c (livello 3) - usato il VERTB e COPER.
  148. *****************************************************************************
  149.  
  150. MioInt6c:
  151.     btst.b    #5,$dff01f    ; INTREQR - il bit 5, VERTB, e' azzerato?
  152.     beq.s    NointVERTB        ; Se si, non e' un "vero" int VERTB!
  153.     movem.l    d0-d7/a0-a6,-(SP)    ; salvo i registri nello stack
  154.     bsr.w    mt_music        ; suono la musica
  155.     bsr.w    ColorCicla        ; Cicla i colori della pic
  156.     movem.l    (SP)+,d0-d7/a0-a6    ; riprendo i reg. dallo stack
  157. NointVERTB:
  158.     move.w    #$70,$dff09c    ; INTREQ - int eseguito, cancello la richiesta
  159.                 ; dato che il 680x0 non la cancella da solo!!!
  160.     rte            ; Uscita dall'int VERTB
  161.  
  162. *****************************************************************************
  163. *    Routine che "cicla" i colori di tutta la palette.            *
  164. *    Questa routine cicla i primi 15 colori separatamente dal secondo    *
  165. *    secondo blocco di colori. Funziona come i "RANGE" del Dpaint.       *
  166. *****************************************************************************
  167.  
  168. ;    Il contatore "cont" serve a far aspettare 3 fotogrammi prima di
  169. ;    eseguire la routine cont. In pratica a "rallentare" l'esecuzione
  170.  
  171. cont:
  172.     dc.w    0
  173.  
  174. ColorCicla:
  175.     addq.b    #1,cont
  176.     cmp.b    #3,cont        ; Agisci 1 volta ogni 3 fotogrammi solamente
  177.     bne.s    NonAncora    ; Non siamo ancora al terzo? Esci!
  178.     clr.b    cont        ; Siamo al terzo, azzera il contatore
  179.  
  180. ; Roteazione all'indietro dei primi 15 colori
  181.  
  182.     lea    cols+2,a0    ; Indirizzo primo colore del primo gruppo
  183.     move.w    (a0),d0        ; Salva il primo colore in d0
  184.     moveq    #15-1,d7    ; 15 colori da "roteare" nel primo gruppo
  185. cloop1:
  186.     move.w    4(a0),(a0)    ; Copia il colore avanti in quello prima
  187.     addq.w    #4,a0        ; salta alla prossimo col. da "indietreggiare"
  188.     dbra    d7,cloop1    ; ripeti d7 volte
  189.     move.w    d0,(a0)        ; Sistema il primo colore salvato come ultimo.
  190.  
  191. ; Roteazione in avanti dei secondi 15 colori
  192.  
  193.     lea    cole-2,a0    ; Indirizzo ultimo colore del secondo gruppo
  194.     move.w    (a0),d0        ; Salva l'ultimo colore in d0
  195.     moveq    #15-1,d7    ; Altri 15 colori da "roteare" separatamente
  196. cloop2:    
  197.     move.w    -4(a0),(a0)    ; Copia il colore indietro in quello dopo
  198.     subq.w    #4,a0        ; salta al precedente col. da "avanzare"
  199.     dbra    d7,cloop2    ; ripeti d7 volte
  200.     move.w    d0,(a0)        ; Sistema l'ultimo colore salvato come primo
  201. NonAncora:
  202.     rts
  203.  
  204.  
  205. *****************************************************************************
  206. ; Routine che carica un file mentre stiamo battendo nel metallo.
  207. ;
  208. ; Parametri in entrata:
  209. ;
  210. ; a0    = Indirizzo della stringa col nome del file da caricare
  211. ; a1    = Indirizzo della label (.L) dove salvare l'indirizzo del file
  212. ; a2    = Indirizzo della label (.L) dove salvare la lunghezza del file
  213. ;
  214. ; Parametri in uscita:
  215. ;
  216. ; d0.l    = Se = 0, non ci sono problemi, se = -1 c'e' stato qualche errore
  217. ; d1.b    = Se = 0 non abbiamo eseguito AllocMem, se = 1 dobbiamo fare FreeMem!
  218. ;
  219. *****************************************************************************
  220.  
  221. DosLoad2:
  222.     movem.l    d2-d7/a3-a6,-(SP)
  223.     move.l    a0,FileName     ; Nome del file da caricare
  224.     move.l    a1,DestinazLoad    ; In che label salvo l'indirizzo
  225.     move.l    a2,SalvGrandezz    ; In che label salvo la grandezza file
  226.     move.l    d0,TypeOfMem    ; Tipo di mem. destinaz.: CHIP RAM!
  227.  
  228.     bsr.w    PreparaLoad    ; Rispristina multitask e setta interrupt load
  229.  
  230.     moveq    #5,d1        ; num. di frames da aspettare
  231.     bsr.w    AspettaBlanks    ; aspetta 5 frames
  232.  
  233.     bsr.s    CaricaFile2    ; Carica il file con la dos.library, di
  234.                 ; qualunque lunghezza "sconosciuta".
  235.     move.l    d0,ErrorFlag    ; Salva lo stato di successo o di errore
  236.  
  237. ; nota: ora dobbiamo attendere che il motore del disk drive, o la spia del
  238. ; povero Hard Disk o CD-ROM si spenga, prima di bloccare tutto, o causiamo
  239. ; un crash del sistema spettacolare.
  240.  
  241.     move.w    #150,d1        ; num. di frames da aspettare
  242.     bsr.w    AspettaBlanks    ; aspetta 150 frames
  243.  
  244.     bsr.w    DopoLoad    ; Disabilita multitask e rimetti interrupt
  245.     move.l    ErrorFlag(PC),d0 ; metti il segnalatore di errore/successo
  246.     moveq    #0,d1
  247.     move.b    FreeMemFlag(PC),d1 ; metti il segnalatore di freemem da fare
  248.     clr.b    FreeMemFlag       ; azzeralo (non allocated) per la prossima
  249.     movem.l    (SP)+,d2-d7/a3-a6
  250.     rts
  251.  
  252. ErrorFlag:
  253.     dc.l    0
  254.  
  255. *****************************************************************************
  256. ; Routine che carica un file di lunghezza "sconosciuta" qualsiasi in un
  257. ; buffer di memoria CHIP o PUBLIC, allocato con AllocMem.
  258. ; Definire prima "TypeOfMem", con "2" per CHIP RAM o "1" per PUBLIC.
  259. ; In uscita, d0=0 se ha avuto successo, oppure -1 se ci sono stati problemi
  260. *****************************************************************************
  261.  
  262. ;        ''~``
  263. ;       ( o o )
  264. ;+-.oooO--(_)--Oooo.---------------------------------------------------------+
  265. ;|                                         |
  266. ;|   Oooo               SCUSATE SE LA ROUTINE E' UN PO' TROPPO INCASINATA    |
  267. ;|   (   )   Oooo.                                              |
  268. ;+----\ (----(   )-----------------------------------------------------------+
  269. ;      \_)    ) /
  270. ;            (_/
  271.  
  272. CaricaFile2:
  273.     move.l    filename(PC),d1    ; indirizzo con stringa "file name + path"
  274.     MOVE.L    #$3ED,D2    ; AccessMode: MODE_OLDFILE - File che esiste
  275.                 ; gia', e che quindi potremo leggere.
  276.     MOVE.L    DosBase(PC),A6
  277.     JSR    -$1E(A6)    ; LVOOpen - "Apri" il file
  278.     MOVE.L    D0,FileHandle    ; Salva il suo handle
  279.     BEQ.W    ErrorOpen    ; Se d0 = 0 allora c'e' un errore!
  280.  
  281. ; Ora Facciamo il lock del file, per poterci poi fare l'examine
  282.  
  283.     move.l    filename(pc),d1    ; nome del file
  284.     moveq    #-2,d2        ; AccessMode = ACCESS_READ
  285.     jsr    -$54(a6)    ; lock del file
  286.     move.l    d0,filelock    ; Salviamo il puntatore al lock del file
  287.     beq.w    ErroreLock    ; d0 = 0? Allora errore!
  288.  
  289. ; Allochiamo memoria per il FileInfoBlock di Examine()
  290.  
  291.     move.l    #$104,d0    ; Grandezza del blocco in bytes
  292.     move.l    #1,d1        ; Tipo di Memoria: public
  293.     move.l    4.w,a6
  294.     jsr    -$c6(a6)    ; Allocmem
  295.     move.l    d0,FibAdr    ; Indirizzo inizio del blocco di mem. allocata
  296.     beq.s    ErroreAlFib    ; d0=0? Allora errore!
  297.  
  298. ; Ora eseguiamo l'Examine del file, per sapere la sua lunghezza
  299.  
  300.     move.l    FileLock(PC),d1    ; lock ptr in d1 per examine
  301.     move.l    FibAdr(PC),d2    ; File Info Block per examine
  302.     MOVE.L    DosBase(PC),A6
  303.     jsr    -$66(a6)    ; examine che riempie il buffer fib ($104 byte)
  304.                 ; di infos sul file(nome, dir/file, size, date)
  305.     tst.l    d0        ; Problemi con Examine?
  306.     beq.s    ErroreExamine
  307.     move.l    FibAdr(pc),a0
  308.     move.l    $7c(a0),d3    ; offset del size (lunghezza)
  309.     move.l    d3,SizeFile
  310.  
  311. ; Ora possiamo anche liberare la memoria usata per il FileInfoBlock
  312.  
  313.     bsr.w    LiberaFib
  314.  
  315. ; Allochiamo la memoria per il file
  316.  
  317.     move.l    SizeFile(PC),d0     ; Grandezza del blocco in bytes
  318.     move.l    TypeOfMem(PC),d1 ; Tipo di Memoria
  319.     move.l    4.w,a6
  320.     jsr    -$c6(a6)    ; Allocmem
  321.     move.l    d0,FileAdr    ; Indirizzo inizio del blocco di mem. allocata
  322.     beq.s    ErroreAllFile    ; d0=0? Allora errore!
  323.  
  324. ; Facciamo una copia dell'indirizzo del file per noi e il freemem
  325.  
  326.     move.l    DestinazLoad(PC),a0
  327.     move.l    d0,(a0)
  328.     move.l    SalvGrandezz(PC),a0    ; e salviamo anche la lunghezza
  329.     move.l    SizeFile(PC),(a0)
  330.  
  331.     st.b    FreeMemFlag    ; Ricordiamoci di fare il freemem
  332.  
  333. ; Carichiamo il file nel blocco di memoria allocato:
  334.  
  335.     MOVE.L    FileHandle(PC),D1 ; FileHandle in d1 per il Read
  336.     MOVE.L    FileAdr(PC),D2    ; Indirizzo Destinazione in d2
  337.     MOVE.L    SizeFile(PC),D3    ; Lunghezza del file (ESATTA!)
  338.     MOVE.L    DosBase(PC),A6
  339.     JSR    -$2A(A6)    ; LVORead - leggi il file e copialo nel buffer
  340.     cmp.l    #-1,d0        ; Errore? (qua e' indicato con -1)
  341.     beq.s    ErroreRead
  342.  
  343. ; Unlockiamo il file
  344.  
  345.     bsr.s    UnlockFile
  346.  
  347. ; E chiudiamolo
  348.  
  349.     bsr.s    CloseFile
  350.  
  351. ; Attenzione al fatto che se non CHIUDETE il file, gli altri programmi non
  352. ; potranno accedere a tale file (non potrete ne' cancellarlo, ne' spostarlo).
  353.  
  354.     moveq    #0,d0    ; segnala il successo totale!
  355.     rts
  356.  
  357.  
  358. ; Ecco la compilation degli errori possibili:
  359.  
  360.  
  361. ErroreExamine:
  362.     bsr.s    LiberaFib
  363. ErroreAllFile:
  364. ErroreAlFib:
  365.     bsr.s    UnlockFile
  366. ErroreLock:
  367.     bsr.s    CloseFile
  368. ErrorOpen:
  369.     moveq    #-1,d0        ; segnala l'errore
  370.     rts
  371.  
  372. ErroreRead:
  373.     bsr.s    UnlockFile
  374.     bsr.s    CloseFile
  375.     st.b    FreeMemFlag    ; Ricordiamoci di fare il freemem
  376.     moveq    #-1,d0        ; Segnala l'errore
  377.     rts
  378.  
  379. ; Routines chiamate da piu' parti:
  380.  
  381. CloseFile:
  382.     MOVE.L    DosBase(PC),A6
  383.     MOVE.L    FileHandle(pc),D1 ; FileHandle in d1
  384.     JSR    -$24(A6)    ; LVOClose - chiudi il file.
  385.     rts
  386.  
  387. UnlockFile:
  388.     MOVE.L    DosBase(PC),A6
  389.     move.l    FileLock(PC),d1    ; lock ptr in d1 per unlock
  390.     jsr    -$5a(a6)    ; Unlock del file
  391.     rts
  392.  
  393. LiberaFib:
  394.     move.l    4.w,a6
  395.     move.l    #$104,d0    ; Grandezza del blocco in bytes
  396.     move.l    FibAdr(PC),a1    ; Indirizzo del blocco di mem. allocata
  397.     jsr    -$d2(a6)    ; FreeMem
  398.     rts
  399.  
  400. SalvGrandezz:
  401.     dc.l    0
  402. DestinazLoad:
  403.     dc.l    0
  404. FileHandle:
  405.     dc.l    0
  406. TypeOfMem:
  407.     dc.l    0
  408. FileName:
  409.     dc.l    0
  410. FileLock:
  411.     dc.l    0
  412. FibAdr:
  413.     dc.l    0
  414. SizeFile:
  415.     dc.l    0
  416. FileAdr
  417.     dc.l    0
  418. FreeMemFlag:
  419.     dc.l    0
  420.  
  421. ; Stringa di testo, da terminare con uno 0, a cui dovra' puntare d1 prima di
  422. ; fare l'OPEN della dos.lib. Conviene mettere l'intero path.
  423.  
  424.  
  425. Filename1:
  426.     dc.b    "assembler3:sorgenti7/amiet.raw",0    ; path+nomefile
  427.     even
  428.  
  429. *****************************************************************************
  430. ; Routine di interrupt da mettere durante il caricamento. Le routines che
  431. ; saranno messe in questo interrupt saranno eseguite anche durante il
  432. ; caricamento, sia che avvenga da floppy disk, da Hard Disk, o CD ROM.
  433. ; DA NOTARE CHE STIAMO USANDO L'INTERRUPT COPER, E NON QUELLO VBLANK,
  434. ; QUESTO PERCHE' DURANTE IL CARICAMENTO DA DISCO, SPECIALMENTE SOTTO KICK 1.3,
  435. ; L'INTERRUPT VERTB NON E' STABILE, tanto che la musica avrebbe dei sobbalzi.
  436. ; Invece, se mettiamo un "$9c,$8010" nella nostra copperlist, siamo sicuri
  437. ; che questa routine sara' eseguita una volta sola per fotogramma.
  438. *****************************************************************************
  439.  
  440. myint6cLoad:
  441.     btst.b    #4,$dff01f    ; INTREQR - il bit 4, COPER, e' azzerato?
  442.     beq.s    nointL        ; Se si, non e' un "vero" int COPER!
  443.     move.w    #%10000,$dff09c    ; Se no, e' la volta buona, togliamo il req!
  444.     movem.l    d0-d7/a0-a6,-(SP)
  445.     bsr.w    mt_music    ; Suona la musica
  446.     movem.l    (SP)+,d0-d7/a0-a6
  447. nointL:
  448.     dc.w    $4ef9        ; val esadecimale di JMP
  449. Crappyint:
  450.     dc.l    0        ; Indirizzo dove Jumpare, da AUTOMODIFICARE...
  451.                 ; ATTENZIONE: il codice automodificante non
  452.                 ; andrebbe usato. Comunque se si chiama un
  453.                 ; ClearMyCache prima e dopo, funziona!
  454.  
  455. *****************************************************************************
  456. ; Routine che ripristina il sistema operativo, tranne la copperlist, e in
  457. ; piu' setta un interrupt $6c nostro, che poi salta a quello di sistema.
  458. ; Da notare che durante il load l'interrupt e' gestito dall'int "COPER"
  459. *****************************************************************************
  460.  
  461. PreparaLoad:
  462.     LEA    $DFF000,A5        ; Base dei registri CUSTOM per Offsets
  463.     MOVE.W    $2(A5),OLDDMAL        ; Salva il vecchio status di DMACON
  464.     MOVE.W    $1C(A5),OLDINTENAL    ; Salva il vecchio status di INTENA
  465.     MOVE.W    $1E(A5),OLDINTREQL    ; Salva il vecchio status di INTREQ
  466.     MOVE.L    #$80008000,d0        ; Prepara la maschera dei bit alti
  467.     OR.L    d0,OLDDMAL        ; Setta il bit 15 dei valori salvati
  468.     OR.W    d0,OLDINTREQL        ; dei registri, per poterli rimettere.
  469.  
  470.     bsr.w    ClearMyCache
  471.  
  472.     MOVE.L    #$7FFF7FFF,$9A(a5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  473.  
  474.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  475.     move.l    OldInt64(PC),$64(a0) ; Sys int liv1 salvato (softint,dskblk)
  476.     move.l    OldInt68(PC),$68(a0) ; Sys int liv2 salvato (I/O,ciaa,int2)
  477.     move.l    #myint6cLoad,$6c(a0) ; Int che poi salta a quello di sys. 
  478.     move.l    OldInt70(PC),$70(a0) ; Sys int liv4 salvato (audio)
  479.     move.l    OldInt74(PC),$74(a0) ; Sys int liv5 salvato (rbf,dsksync)
  480.     move.l    OldInt78(PC),$78(a0) ; Sys int liv6 salvato (exter,ciab,inten)
  481.  
  482.     MOVE.W    #%1000001001010000,$96(A5) ; Abilita blit e disk per sicurezza
  483.     MOVE.W    OLDINTENA(PC),$9A(A5)    ; INTENA STATUS
  484.     MOVE.W    OLDINTREQ(PC),$9C(A5)    ; INTREQ
  485.     move.w    #$c010,$9a(a5)        ; dobbiamo essere sicuri che COPER
  486.                     ; (interrupt via copperlist) sia ON!
  487.  
  488.     move.l    4.w,a6
  489.     JSR    -$7e(A6)    ; Enable
  490.     JSR    -$8a(a6)    ; Permit
  491.  
  492.     MOVE.L    GfxBase(PC),A6
  493.     jsr    -$E4(A6)    ; Aspetta la fine di eventuali blittate
  494.     JSR    -$E4(A6)    ; WaitBlit
  495.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  496.                 ; puo' nuovamente usare il blitter
  497.                 ; (nel kick 1.3 serve per caricare da disk)
  498.     MOVE.L    4.w,A6
  499.     SUBA.L    A1,A1        ; NULL task - trova questo task
  500.     JSR    -$126(A6)    ; findtask (Task(name) in a1, -> d0=task)
  501.     MOVE.L    D0,A1        ; Task in a1
  502.     MOVEQ    #0,D0        ; Priorita' in d0 (-128, +127) - NORMALE
  503.                 ; (Per permettere ai drives di respirare)
  504.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  505.     rts
  506.  
  507. OLDDMAL:
  508.     dc.w    0
  509. OLDINTENAL:        ; Vecchio status INTENA
  510.     dc.w    0
  511. OLDINTREQL:        ; Vecchio status INTREQ
  512.     DC.W    0
  513.  
  514. *****************************************************************************
  515. ; Routine che richiude il sistema operativo e rimette il nostro interrupt
  516. *****************************************************************************
  517.  
  518. DopoLoad:
  519.     MOVE.L    4.w,A6
  520.     SUBA.L    A1,A1        ; NULL task - trova questo task
  521.     JSR    -$126(A6)    ; findtask (Task(name) in a1, -> d0=task)
  522.     MOVE.L    D0,A1        ; Task in a1
  523.     MOVEQ    #127,D0        ; Priorita' in d0 (-128, +127) - MASSIMA
  524.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  525.  
  526.     JSR    -$84(a6)    ; Forbid
  527.     JSR    -$78(A6)    ; Disable
  528.  
  529.     MOVE.L    GfxBase(PC),A6
  530.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  531.                 ; impedendone l'uso al sistema operativo.
  532.     jsr    -$E4(A6)    ; WaitBlit - Attende la fine di ogni blittata
  533.     JSR    -$E4(A6)    ; WaitBlit
  534.  
  535.     bsr.w    ClearMyCache
  536.  
  537.     LEA    $dff000,a5        ; Custom base per offsets
  538. AspettaF:
  539.     MOVE.L    4(a5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  540.     AND.L    #$1ff00,D0    ; Seleziona solo i bit della pos. verticale
  541.     CMP.L    #$12d00,D0    ; aspetta la linea $12d per evitare che
  542.     BEQ.S    AspettaF    ; spegnendo i DMA si abbiano sfarfallamenti
  543.  
  544.     MOVE.L    #$7FFF7FFF,$9A(A5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  545.  
  546.         ; 5432109876543210
  547.     MOVE.W    #%0000010101110000,d0    ; DISABILITA DMA
  548.  
  549.     btst    #8-8,olddmal    ; test bitplane
  550.     beq.s    NoPlanesA
  551.     bclr.l    #8,d0        ; non spengere planes
  552. NoPlanesA:
  553.     btst    #5,olddmal+2    ; test sprite
  554.     beq.s    NoSpritez
  555.     bclr.l    #5,d0        ; non spengere sprite
  556. NoSpritez:
  557.     MOVE.W    d0,$96(A5) ; DISABILITA DMA
  558.  
  559.     move.l    BaseVBR(PC),a0        ; In a0 il valore del VBR
  560.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  561.     MOVE.W    OLDDMAL(PC),$96(A5)    ; Rimetti il vecchio status DMA
  562.     MOVE.W    OLDINTENAL(PC),$9A(A5)    ; INTENA STATUS
  563.     MOVE.W    OLDINTREQL(PC),$9C(A5)    ; INTREQ
  564.     rts
  565.  
  566. *****************************************************************************
  567. ; Questa routine aspetta D1 fotogrammi. Ogni 50 fotogrammi passa 1 secondo.
  568. ;
  569. ; d1 = numero di fotogrammi da attendere
  570. ;
  571. *****************************************************************************
  572.  
  573. AspettaBlanks:
  574.     LEA    $DFF000,A5    ; CUSTOM REG per OFFSETS
  575. WBLAN1xb:
  576.     MOVE.w    #$80,D0
  577. WBLAN1bxb:
  578.     CMP.B    6(A5),D0    ; vhposr
  579.     BNE.S    WBLAN1bxb
  580. WBLAN2xb:
  581.     CMP.B    6(A5),D0    ; vhposr
  582.     Beq.S    WBLAN2xb
  583.     DBRA    D1,WBLAN1xb
  584.     rts
  585.  
  586. *****************************************************************************
  587. ;    Routine di replay del protracker/soundtracker/noisetracker
  588. ;
  589.     include    "assembler3:sorgenti4/music.s"
  590. *****************************************************************************
  591.  
  592.     SECTION    GRAPHIC,DATA_C
  593.  
  594. COPPERLIST:
  595.     dc.w    $8E,$2c81    ; DiwStrt
  596.     dc.w    $90,$2cc1    ; DiwStop
  597.     dc.w    $92,$0038    ; DdfStart
  598.     dc.w    $94,$00d0    ; DdfStop
  599.     dc.w    $102,0        ; BplCon1
  600.     dc.w    $104,0        ; BplCon2
  601.     dc.w    $108,0        ; Bpl1Mod
  602.     dc.w    $10a,0        ; Bpl2Mod
  603.  
  604. BPLPOINTERS:
  605.     dc.w $e0,0,$e2,0        ;primo      bitplane
  606.     dc.w $e4,0,$e6,0        ;secondo    "
  607.     dc.w $e8,0,$ea,0        ;terzo      "
  608.     dc.w $ec,0,$ee,0        ;quarto     "
  609.     dc.w $f0,0,$f2,0        ;quinto     "
  610.     dc.w $f4,0,$f6,0        ;sesto      "
  611.  
  612.     dc.w    $180,0    ; Color0 nero
  613.  
  614.  
  615.              ;5432109876543210
  616.     dc.w    $100,%0110101000000000    ; bplcon0 - 320*256 HAM!
  617.  
  618.     dc.w $180,$0000,$182,$134,$184,$531,$186,$443
  619.     dc.w $188,$0455,$18a,$664,$18c,$466,$18e,$973
  620.     dc.w $190,$0677,$192,$886,$194,$898,$196,$a96
  621.     dc.w $198,$0ca6,$19a,$9a9,$19c,$bb9,$19e,$dc9
  622.     dc.w $1a0,$0666
  623.  
  624.     dc.w    $9707,$FFFE    ; wait linea $97
  625.  
  626.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  627.     dc.w    $180,$00e    ; color0 BLU
  628.  
  629.     dc.w    $b907,$fffe    ; WAIT - attendi linea $b9
  630. BPLPOINTERS2:
  631.     dc.w $e0,0,$e2,0        ;primo      bitplane
  632.     dc.w $e4,0,$e6,0        ;secondo    "
  633.     dc.w $e8,0,$ea,0        ;terzo        "
  634.     dc.w $ec,0,$ee,0        ;quarto        "
  635.     dc.w $f0,0,$f2,0        ;quinto        "
  636.  
  637.     dc.w    $100,%0101001000000000    ; BPLCON0 - 5 bitplanes LOWRES
  638.  
  639. ; La palette, che sara' "ruotata" in 2 gruppi di 16 colori.
  640.  
  641. cols:
  642.     dc.w $180,$040,$182,$050,$184,$060,$186,$080    ; tono verde
  643.     dc.w $188,$090,$18a,$0b0,$18c,$0c0,$18e,$0e0
  644.     dc.w $190,$0f0,$192,$0d0,$194,$0c0,$196,$0a0
  645.     dc.w $198,$090,$19a,$070,$19c,$060,$19e,$040
  646.  
  647.     dc.w $1a0,$029,$1a2,$02a,$1a4,$13b,$1a6,$24b    ; tono blu
  648.     dc.w $1a8,$35c,$1aa,$36d,$1ac,$57e,$1ae,$68f
  649.     dc.w $1b0,$79f,$1b2,$68f,$1b4,$58e,$1b6,$37e
  650.     dc.w $1b8,$26d,$1ba,$15d,$1bc,$04c,$1be,$04c
  651. cole:
  652.  
  653.     dc.w    $da07,$fffe    ; WAIT - attendi la linea $da
  654.     dc.w    $100,$200    ; BPLCON0 - disabilita i bitplanes
  655.     dc.w    $180,$00e    ; color0 BLU
  656.  
  657.     dc.w    $ff07,$fffe    ; WAIT - attendi la linea $ff
  658.     dc.w    $9c,$8010    ; INTREQ - Richiedo un interrupt COPER, per
  659.                 ; suonare la musica (anche mentre stiamo
  660.                 ; caricando con la dos.library).
  661.  
  662.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  663.  
  664.  
  665. *****************************************************************************
  666. ;         DISEGNO 320*34 a 5 bitplanes (32 colori)
  667. *****************************************************************************
  668.  
  669. PICTURE2:
  670.     INCBIN    "pic320*34*5.raw"
  671.  
  672. *****************************************************************************
  673. ;                MUSICA
  674. *****************************************************************************
  675.  
  676. mt_data:
  677.     dc.l    mt_data1
  678.  
  679. mt_data1:
  680.     incbin    "assembler3:sorgenti7/Mod.Prova"
  681.  
  682. ******************************************************************************
  683. ; Buffer che rimane vuoto, qua serve solo come "nero" prima del caricamento.
  684. ; Avremmo potuto anche semplicemente disabilitare i bitplanes, ed attivarli
  685. ; solo a figura caricata, per risparmiare questo spazio azzerato!
  686. ******************************************************************************
  687.  
  688.     section    mioplanaccio,bss_C
  689.  
  690. buffer:
  691. LOGO:
  692.     ds.b    6*40*176    ; 6 bitplanes * 176 lines * 40 bytes (HAM)
  693.  
  694.  
  695.     end
  696.  
  697. Questo listato locka il file, lo EXAMINA per averne la lunghezza, alloca la
  698. memoria con AllocMem, lo carica, e alla fine libera il blocco di memoria
  699. con FreeMem. Vi prego di notare l'attenzione posta alle varie possibilita'
  700. di errore, per non eseguire FreeMem quando non si e' allocato niente, e
  701. per non usare il file quando non lo si e' caricato bene. Occorre SEMPRE
  702. controllare tutto, e preparare le routine ad eventuali insuccessi.
  703. La routine e' stata resa piu' parametrica, infatti si puo' specificare ogni
  704. volta il nome del file e il tipo di memoria richiesto. Basta che in caso
  705. voleste caricare piu' files, non vi confondiate con i vari FreeMem alla fine!
  706. Ecco un esempio in cui carichiamo 2 files:
  707.  
  708. ; Primo file:
  709.  
  710.     lea    FileName1(PC),a0     ; Nome del file da caricare
  711.     lea    Buffile1(PC),a1        ; In che label salvo l'indirizzo
  712.                     ; del file caricato in mem
  713.     lea    Grandezz1(PC),a2    ; In che label salvo la grandezza
  714.     moveq    #2,d0            ; Tipo di mem. destinaz.: CHIP RAM!
  715.  
  716.     bsr.w    DosLoad2    ; Carica un file legalmente con la dos.lib
  717.                 ; mentre stiamo visualizzando una nostra
  718.                 ; copperlist e eseguendo un nostro interrupt
  719.                 ; Definire prima "TypeOfMem", con "2" per CHIP
  720.                 ; o "1" per PUBLIC, e gli altri parametri.
  721.     TST.B    d1        ; Abbiamo Allocato memoria da liberare?
  722.     beq.s    NonFreeMemare    ; d1=0, allora non allocato
  723.     st.b    FreeMema1    ; Se si, setta FreeMema1
  724. NonFreeMemare
  725.     TST.L    d0        ; Controlla se ci sono stati errori...
  726.     bne.s    ErroreLoad    ; File non caricato?? Non usiamolo allora!
  727.                 ; d0=0, allora va tutto bene
  728.     ....
  729.  
  730. ; Secondo file:
  731.  
  732.     lea    FileName2(PC),a0     ; Nome del file da caricare
  733.     lea    Buffile2(PC),a1        ; In che label salvo l'indirizzo
  734.                     ; del file caricato in mem
  735.     lea    Grandezz2(PC),a2    ; In che label salvo la grandezza
  736.     moveq    #2,d0            ; Tipo di mem. destinaz.: CHIP RAM!
  737.  
  738.     bsr.w    DosLoad2    ; Carica un file legalmente con la dos.lib
  739.                 ; mentre stiamo visualizzando una nostra
  740.                 ; copperlist e eseguendo un nostro interrupt
  741.                 ; Definire prima "TypeOfMem", con "2" per CHIP
  742.                 ; o "1" per PUBLIC, e gli altri parametri.
  743.     TST.B    d1        ; Abbiamo Allocato memoria da liberare?
  744.     beq.s    NonFreeMemare2    ; d1=0, allora non allocato
  745.     st.b    FreeMema2    ; Se si, setta FreeMema1
  746. NonFreeMemare2
  747.     TST.L    d0        ; Controlla se ci sono stati errori...
  748.     bne.s    ErroreLoad2    ; File non caricato?? Non usiamolo allora!
  749.     ...            ; d0=0, allora va tutto bene
  750.  
  751.  
  752. E alla fine, dovremo fare 2 FreeMem:
  753.  
  754.     tst.b    FreeMema1    ; c'e' stato un errore prima dell'AllocMem?
  755.     beq.s    NonEraAllocata1    ; se si, non fare il FreeMem!
  756.  
  757.     move.l    Grandezz1(PC),d0 ; Grandezza del blocco in bytes
  758.     move.l    Buffile1(PC),a1 ; Indirizzo del blocco di mem. allocata
  759.     move.l    4.w,a6
  760.     jsr    -$d2(a6)    ; FreeMem
  761. NonEraAllocata1:
  762.  
  763.     tst.b    FreeMema2    ; c'e' stato un errore prima dell'AllocMem?
  764.     beq.s    NonEraAllocata2    ; se si, non fare il FreeMem!
  765.  
  766.     move.l    Grandezz2(PC),d0 ; Grandezza del blocco in bytes
  767.     move.l    Buffile2(PC),a1 ; Indirizzo del blocco di mem. allocata
  768.     move.l    4.w,a6
  769.     jsr    -$d2(a6)    ; FreeMem
  770. NonEraAllocata2:
  771.  
  772.     rts            ; esci
  773.  
  774.  
  775. Naturalmente potete cambiare la routine come volete, o rendere parametrica
  776. quella che carica files con lunghezza specificata... fate come vi pare, ma
  777. controllate bene di non fare errori!
  778.  
  779.