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

  1.  
  2. ; Lezione11f.s - Utilizzo di interrupts COPER e VERTB dell livello 3 ($6c).
  3. ;         In questo caso ridefiniamo tutti gli interrupt, giusto
  4. ;         per rendere l'idea di come si fa.
  5. ;         La differenza con Lezione11e.s e' "formale", infatti si usa
  6. ;         per gli interrupt lo standard della ROM Amiga. Se volete
  7. ;         seguire proprio l'etichetta, fate come in questo esempio.
  8.  
  9.     Section    Interrupt,CODE
  10.  
  11. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  12.  
  13. *****************************************************************************
  14.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  15. *****************************************************************************
  16.  
  17.  
  18. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  19.  
  20.         ;5432109876543210
  21. DMASET    EQU    %1000001010000000    ; copper DMA abilitato
  22.  
  23. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  24.  
  25. START:
  26.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  27.  
  28.     MOVE.L    #NOINT1,$64(A0)        ; Interrupt "vuoto"
  29.     MOVE.L    #NOINT2,$68(A0)        ; int vuoto
  30.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  31.     MOVE.L    #NOINT4,$70(A0)        ; int vuoto
  32.     MOVE.L    #NOINT5,$74(A0)        ; " "
  33.     MOVE.L    #NOINT6,$78(A0)        ; " "
  34.  
  35.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  36.                     ; e sprites.
  37.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  38.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  39.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  40.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  41.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  42.  
  43.     movem.l    d0-d7/a0-a6,-(SP)
  44.     bsr.w    mt_init        ; inizializza la routine musicale
  45.     movem.l    (SP)+,d0-d7/a0-a6
  46.  
  47.         ; 5432109876543210
  48.     move.w    #%1111111111111111,$9a(a5)    ; INTENA - abilito TUTTI gli
  49.                           ; interrupt!
  50.  
  51. mouse:
  52.     btst    #6,$bfe001    ; Mouse premuto? (il processore esegue questo
  53.     bne.s    mouse        ; loop in modo utente, e ogni vertical blank
  54.                 ; nonche' ogni WAIT della linea raster $a0
  55.                 ; lo interrompe per suonare la musica!).
  56.  
  57.     bsr.w    mt_end        ; fine del replay!
  58.  
  59.     rts            ; esci
  60.  
  61.  
  62. *****************************************************************************
  63. *    ROUTINE IN INTERRUPT $64 (livello 1)
  64. *****************************************************************************
  65.  
  66. ;    .-==-.
  67. ;    | __ |
  68. ;    C °° )
  69. ;    | C. |
  70. ;    | __ |
  71. ;    |(__)|xCz
  72. ;    `----'
  73.  
  74. ;02    SOFT    1 ($64)    Riservato agli interrupt inizializzati via software.
  75. ;01    DSKBLK    1 ($64)    Fine del trasferimento di un blocco dati dal disco.
  76. ;00    TBE    1 ($64)    Buffer UART di trasmissione della porta seriale VUOTO.
  77.  
  78. NOINT1:    ; $64
  79.     movem.l    d0-d7/a0-a6,-(SP)
  80.     LEA    $DFF000,A0    ; custom in A0
  81.     MOVE.W    $1C(A0),D1    ; INTENAR in d1
  82.     BTST.l    #14,D1        ; Bit Master di abilitazione azzerato?
  83.     BEQ.s    NoInts1        ; Se si, interrupt non attivi!
  84.     AND.W    $1E(A0),D1    ; INREQR - in d1 rimangono settati solo i bit
  85.                 ; che sono settati sia in INTENA che in INTREQ
  86.                 ; in modo da essere sicuri che l'interrupt
  87.                 ; avvenuto fosse abilitato.
  88.     btst.l    #0,d1        ; TBE?
  89.     beq.w    NoTBE
  90.     ; tbe routines
  91. NoTBE:
  92.     btst.l    #1,d1        ; DSKBLK?
  93.     beq.w    NoDSKBLK
  94.     ; DSKBLK routines
  95. NoDSKBLK:
  96.     btst.l    #2,d1        ; INTREQR - SOFT?
  97.     beq.w    NoSOFT
  98.     ; SOFT routines
  99. NoSOFT:
  100. NoInts1:    ; 210
  101.     move.w    #%111,$dff09c    ; INTREQ - soft,dskblk,serial port tbe
  102.     movem.l    (SP)+,d0-d7/a0-a6
  103.     rte
  104.  
  105. *****************************************************************************
  106. *    ROUTINE IN INTERRUPT $68 (livello 2)
  107. *****************************************************************************
  108.  
  109. ;                 ... 
  110. ;                 :  ·:
  111. ;                 :   :
  112. ;             ____¦,.,l____
  113. ;            /·.·.·   .·.·.\
  114. ;          _/ _____  _____  \_
  115. ;         C/_  (°  C  °)     \).
  116. ;          \ \_____________/ /-'
  117. ;           \  \___l_____/  /xCz
  118. ;       ____ \__`-------'__/ _____
  119. ;      /    ¯¯ `---------' ¯¯    ¬\
  120. ;     /                            ·
  121. ;    ·
  122.  
  123. ;03    PORTS    2 ($68)    Input/Output Porte e timers, connesso alla linea INT2
  124.  
  125. NOINT2:    ; $68
  126.     movem.l    d0-d7/a0-a6,-(SP)
  127.     LEA    $DFF000,A0    ; custom in A0
  128.     MOVE.W    $1C(A0),D1    ; INTENAR in d1
  129.     BTST.l    #14,D1        ; Bit Master di abilitazione azzerato?
  130.     BEQ.s    NoInts2        ; Se si, interrupt non attivi!
  131.     AND.W    $1E(A0),D1    ; INREQR - in d1 rimangono settati solo i bit
  132.                 ; che sono settati sia in INTENA che in INTREQ
  133.                 ; in modo da essere sicuri che l'interrupt
  134.                 ; avvenuto fosse abilitato.
  135.  
  136.     btst.l    #3,d1        ; INTREQR - PORTS?
  137.     beq.w    NoPORTS
  138.     ; routines PORTS
  139. NoPORTS:
  140.     move.l    d0,-(sp)    ; salva d0
  141.     move.b    $bfed01,d0    ; CIAA icr - e' un interrupt della tastiera?
  142.     and.b    #$8,d0
  143.     beq.w    NoTastiera
  144.     ; Routines per la lettura della tastiera
  145. NoTastiera:
  146.     move.l    (sp)+,d0    ; ripristina d0
  147. NoInts2:    ; 3210
  148.     move.w    #%1000,$dff09c    ; INTREQ - ports
  149.     movem.l    (SP)+,d0-d7/a0-a6
  150.     rte
  151.  
  152. *****************************************************************************
  153. *    ROUTINE IN INTERRUPT $6c (livello 3) - usato il VERTB e COPER.        *
  154. *****************************************************************************
  155.  
  156. ;     _.--._     _ 
  157. ;    |   _ .|   (_)
  158. ;    |   \__|   ||
  159. ;    |______|   ||
  160. ;    .-`--'-.   ||
  161. ;    | | |  |\__l|
  162. ;    |_| |__|__|_))
  163. ;     ||_| |    ||
  164. ;     |(_) |
  165. ;     |    |
  166. ;     |____|__
  167. ;     |______/g®m
  168.  
  169.  
  170. ;06    BLIT    3 ($6c)    Se il blitter ha finito una blittata si setta ad 1
  171. ;05    VERTB    3 ($6c)    Generato ogni volta che il pennello elettronico e'
  172. ;            alla linea 00, ossia ad ogni inizio di vertical blank.
  173. ;04    COPER    3 ($6c)    Si puo' settare col copper per generarlo ad una certa
  174. ;            linea video. Basta richiederlo dopo un certo WAIT.
  175.  
  176. MioInt6c:
  177.     movem.l    d0-d7/a0-a6,-(SP)
  178.     LEA    $DFF000,A0    ; custom in A0
  179.     MOVE.W    $1C(A0),D1    ; INTENAR in d1
  180.     BTST.l    #14,D1        ; Bit Master di abilitazione azzerato?
  181.     BEQ.s    NoInts3        ; Se si, interrupt non attivi!
  182.     AND.W    $1E(A0),D1    ; INREQR - in d1 rimangono settati solo i bit
  183.                 ; che sono settati sia in INTENA che in INTREQ
  184.                 ; in modo da essere sicuri che l'interrupt
  185.                 ; avvenuto fosse abilitato.
  186.     btst.l    #6,d1        ; INTREQR - BLIT?
  187.     beq.w    NoBLIT
  188.     ; routines BLIT
  189. NoBLIT:
  190.     btst.l    #5,d1        ; INTREQR - il bit 5, VERTB, e' azzerato?
  191.     beq.s    NointVERTB        ; Se si, non e' un "vero" int VERTB!
  192.     movem.l    d0-d7/a0-a6,-(SP)    ; salvo i registri nello stack
  193.     bsr.w    mt_music        ; suono la musica
  194.     movem.l    (SP)+,d0-d7/a0-a6    ; riprendo i reg. dallo stack
  195. nointVERTB:
  196.     btst.l    #4,d1        ; INTREQR - COPER azzerato?
  197.     beq.s    NointCOPER    ; se si, non e' un int COPER!
  198.     move.w    #$F00,$dff180    ; int COPER, allora COLOR0 = ROSSO
  199. NointCOPER:
  200. NoInts3:     ;6543210
  201.     move.w    #%1110000,$dff09c ; INTREQ - cancello rich. BLIT,VERTB,COPER
  202.     movem.l    (SP)+,d0-d7/a0-a6
  203.     rte    ; uscita dall'int COPER/BLIT
  204.  
  205. *****************************************************************************
  206. *    ROUTINE IN INTERRUPT $70 (livello 4)
  207. *****************************************************************************
  208.  
  209. ;      .:::::.
  210. ;     ¦:::·:::¦
  211. ;     |·     ·|
  212. ;    C| ¬   - l)
  213. ;     ¡_°(_)°_|
  214. ;     |\_____/|
  215. ;     l__`-'__!
  216. ;       `---'xCz
  217.  
  218. ;10    AUD3    4 ($70)    Lettura di un blocco di dati del can. audio 3 finita.
  219. ;09    AUD2    4 ($70)    Lettura di un blocco di dati del can. audio 2 finita.
  220. ;08    AUD1    4 ($70)    Lettura di un blocco di dati del can. audio 1 finita.
  221. ;07    AUD0    4 ($70)    Lettura di un blocco di dati del can. audio 0 finita.
  222.  
  223. NOINT4: ; $70
  224.     movem.l    d0-d7/a0-a6,-(SP)
  225.     LEA    $DFF000,A0    ; custom in A0
  226.     MOVE.W    $1C(A0),D1    ; INTENAR in d1
  227.     BTST.l    #14,D1        ; Bit Master di abilitazione azzerato?
  228.     BEQ.s    NoInts4        ; Se si, interrupt non attivi!
  229.     AND.W    $1E(A0),D1    ; INREQR - in d1 rimangono settati solo i bit
  230.                 ; che sono settati sia in INTENA che in INTREQ
  231.                 ; in modo da essere sicuri che l'interrupt
  232.                 ; avvenuto fosse abilitato.
  233.     BTST.l    #7,d1        ; INTREQR - AUD0?
  234.     BEQ.W    NoAUD0
  235.     ; routines aud0
  236. NoAUD0:
  237.     BTST.l    #8,d1        ; INTREQR - AUD1?
  238.     BEQ.W    NoAUD1
  239.     ; routines aud1
  240. NoAUD1:
  241.     BTST.l    #9,d1        ; INTREQR - AUD2?
  242.     Beq.W    NoAUD2
  243.     ; routines aud2
  244. NoAUD2:
  245.     BTST.l    #10,d1        ; INTREQR - AUD3?
  246.     Beq.W    NoAUD3
  247.     ; routines aud3
  248. NoAUD3:
  249. NoInts4:    ; 09876543210
  250.     MOVE.W    #%11110000000,$DFF09C    ; aud0,aud1,aud2,aud3
  251.     movem.l    (SP)+,d0-d7/a0-a6
  252.     RTE
  253.  
  254. *****************************************************************************
  255. *    ROUTINE IN INTERRUPT $74 (livello 5)
  256. *****************************************************************************
  257.  
  258. ;      .:::::.
  259. ;     ¦:::·:::¦
  260. ;     |· - - ·|
  261. ;    C|  q p  l)
  262. ;     |  (_)  |
  263. ;     |\_____/|
  264. ;     l__  ¬__!
  265. ;       `---'xCz
  266.  
  267. ;12    DSKSYN    5 ($74)    Generato se il registro DSKSYNC corrisponde ai dati
  268. ;            letti dal disco nel drive.Serve per i loader hardware.
  269. ;11    RBF    5 ($74)    Buffer UART di ricezione della porta seriale PIENO.
  270.  
  271.  
  272. NOINT5: ; $74
  273.     movem.l    d0-d7/a0-a6,-(SP)
  274.     LEA    $DFF000,A0    ; custom in A0
  275.     MOVE.W    $1C(A0),D1    ; INTENAR in d1
  276.     BTST.l    #14,D1        ; Bit Master di abilitazione azzerato?
  277.     BEQ.s    NoInts5        ; Se si, interrupt non attivi!
  278.     AND.W    $1E(A0),D1    ; INREQR - in d1 rimangono settati solo i bit
  279.                 ; che sono settati sia in INTENA che in INTREQ
  280.                 ; in modo da essere sicuri che l'interrupt
  281.                 ; avvenuto fosse abilitato.
  282.     BTST.l    #12,d1        ; INTREQR - DSKSYN?
  283.     BEQ.W    NoDSKSYN
  284.     ; routines dsksyn
  285. NoDSKSYN:
  286.     BTST.l    #11,d1        ; INTREQR - RBF?
  287.     BEQ.W    NoRBF
  288.     ; routines rbf
  289. NoRBF:
  290. NoInts5:    ; 2109876543210
  291.     MOVE.W    #%1100000000000,$DFF09C    ; serial port rbf, dsksyn
  292.     movem.l    (SP)+,d0-d7/a0-a6
  293.     rte
  294.  
  295. *****************************************************************************
  296. *    ROUTINE IN INTERRUPT $78 (livello 6)                    *
  297. *****************************************************************************
  298.  
  299. ;      .:::::.
  300. ;     ¦:::·:::¦
  301. ;     |· - - ·|
  302. ;    C|  O p  l)
  303. ;    / _ (_) _ \
  304. ;    \_\_____/_/
  305. ;     l_\___/_!
  306. ;      `-----'xCz
  307.  
  308. ;14    INTEN    6 ($78)
  309. ;13    EXTER    6 ($78)    Interrupt esterno, connesso alla linea INT6 + TOD CIAB
  310.  
  311. NOINT6: ; $78
  312.     movem.l    d0-d7/a0-a6,-(SP)
  313.     tst.b    $bfdd00        ; CIAB icr - resetta interrupt timer
  314.     LEA    $DFF000,A0    ; custom in A0
  315.     MOVE.W    $1C(A0),D1    ; INTENAR in d1
  316.     BTST.l    #14,D1        ; Bit Master di abilitazione azzerato?
  317.     BEQ.s    NoInts6        ; Se si, interrupt non attivi!
  318.     AND.W    $1E(A0),D1    ; INREQR - in d1 rimangono settati solo i bit
  319.                 ; che sono settati sia in INTENA che in INTREQ
  320.                 ; in modo da essere sicuri che l'interrupt
  321.                 ; avvenuto fosse abilitato.
  322.     BTST.l    #14,d1        ; INTREQR - INTEN?
  323.     BEQ.W    NoINTEN
  324.     ; routines inten
  325. NoINTEN:
  326.     BTST.l    #13,d1        ; INTREQR - EXTER?
  327.     BEQ.W    NoEXTER
  328.     ; routines exter
  329. NoEXTER:
  330. NoInts6:    ; 432109876543210
  331.     MOVE.W    #%110000000000000,$DFF09C ; INTREQ - external int + ciab
  332.     movem.l    (SP)+,d0-d7/a0-a6
  333.     rte
  334.  
  335. *****************************************************************************
  336. ;    Routine di replay del protracker/soundtracker/noisetracker
  337. ;
  338.     include    "assembler2:sorgenti4/music.s"
  339. *****************************************************************************
  340.  
  341.     SECTION    GRAPHIC,DATA_C
  342.  
  343. COPPERLIST:
  344.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  345.     dc.w    $180,$00e    ; color0 BLU
  346.     dc.w    $a007,$fffe    ; WAIT - attendi la linea $a0
  347.     dc.w    $9c,$8010    ; INTREQ - Richiedo un interrupt COPER, il
  348.                 ; quale fa agire sul color0 con un "MOVE.W".
  349.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  350.  
  351. *****************************************************************************
  352. ;                MUSICA
  353. *****************************************************************************
  354.  
  355. mt_data:
  356.     dc.l    mt_data1
  357.  
  358. mt_data1:
  359.     incbin    "assembler2:sorgenti4/mod.yellowcandy"
  360.  
  361.     end
  362.  
  363. COme potete notare, in questa "versione" si usano tutti gli accorgimenti che
  364. usano gli interrupt del sistema operativo:
  365.  
  366.     LEA    $DFF000,A0    ; custom in A0
  367.     MOVE.W    $1C(A0),D1    ; INTENAR in d1
  368.     BTST.l    #14,D1        ; Bit Master di abilitazione azzerato?
  369.     BEQ.s    NoInts1        ; Se si, interrupt non attivi!
  370.     AND.W    $1E(A0),D1    ; INREQR - in d1 rimangono settati solo i bit
  371.                 ; che sono settati sia in INTENA che in INTREQ
  372.                 ; in modo da essere sicuri che l'interrupt
  373.                 ; avvenuto fosse abilitato.
  374.     btst.l    #0,d1        ; TBE?
  375.     ...
  376.  
  377. In pratica si fa un'ulteriore verifica della validita' dell'interrupt,
  378. controllando se il bit settato in INTREQR e' settato anche in INTENAR, ossia
  379. se e' abilitato. In realta' se si disabilita un interrupt con il registro
  380. apposito, ossia INTENA ($dff09a), non dovrebbe continuare a funzionare.
  381. Comunque puo' essere che l'hardware non sia perfetto. Se trovate delle strane
  382. incompatibilita' nel vostro interrupt, fate anche questo controllo, chissa'
  383. che non vengano eseguiti interrupt "disabilitati"!
  384.  
  385.