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

  1.  
  2. ; Lezione11l6.s        Routine di gestione del modo interlacciato (640x512)
  3. ;            che legge il bit 15 (LOF) del VPOSR ($dff004).
  4. ;            Premendo il tasto destro non si esegue tale routine,
  5. ;            e si nota come rimangano alle volte le linee pari o
  6. ;            le dispari in "pseudo-non lace".
  7.  
  8.     SECTION    Interlace,CODE
  9.  
  10. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  11.  
  12. *****************************************************************************
  13.     include    "startup2.s"    ; Salva Copperlist Etc.
  14. *****************************************************************************
  15.  
  16.         ;5432109876543210
  17. DMASET    EQU    %1000001110000000    ; solo copper e bitplane DMA
  18.  
  19. WaitDisk    EQU    30
  20.  
  21. scr_bytes    = 80    ; Numero di bytes per ogni linea orizzontale.
  22.             ; Da questa si calcola la larghezza dello schermo,
  23.             ; moltiplicando i bytes per 8: schermo norm. 320/8=40
  24.             ; Es. per uno schermo largo 336 pixel, 336/8=42
  25.             ; larghezze esempio:
  26.             ; 264 pixel = 33 / 272 pixel = 34 / 280 pixel = 35
  27.             ; 360 pixel = 45 / 368 pixel = 46 / 376 pixel = 47
  28.             ; ... 640 pixel = 80 / 648 pixel = 81 ...
  29.  
  30. scr_h        = 256    ; Altezza dello schermo in linee
  31. scr_x        = $81    ; Inizio schermo, posizione XX (normale $xx81) (129)
  32. scr_y        = $2c    ; Inizio schermo, posizione YY (normale $2cxx) (44)
  33. scr_res        = 2    ; 2 = HighRes (640*xxx) / 1 = LowRes (320*xxx)
  34. scr_lace    = 1    ; 0 = non interlace (xxx*256) / 1 = interlace (xxx*512)
  35. ham        = 0    ; 0 = non ham / 1 = ham
  36. scr_bpl        = 1    ; Numero Bitplanes
  37.  
  38. ; parametri calcolati automaticamente
  39.  
  40. scr_w        = scr_bytes*8        ; larghezza dello schermo
  41. scr_size    = scr_bytes*scr_h    ; dimensione in bytes dello schermo
  42. BPLC0    = ((scr_res&2)<<14)+(scr_bpl<<12)+$200+(scr_lace<<2)+(ham<<11)
  43. DIWS    = (scr_y<<8)+scr_x
  44. DIWSt    = ((scr_y+scr_h/(scr_lace+1))&255)<<8+(scr_x+scr_w/scr_res)&255
  45. DDFS    = (scr_x-(16/scr_res+1))/2
  46. DDFSt    = DDFS+(8/scr_res)*(scr_bytes/2-scr_res)
  47.  
  48.  
  49. START:
  50.  
  51. ;    Puntiamo i bitplanes in copperlist
  52.  
  53.     MOVE.L    #BITPLANE,d0    ; in d0 mettiamo l'indirizzo del bitplane
  54.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  55.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  56.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  57.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  58.  
  59.  
  60.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  61.                     ; e sprites.
  62.  
  63.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  64.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  65.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  66.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  67.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  68.  
  69. mouse:
  70.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  71.     MOVE.L    #$01000,d2    ; linea da aspettare = $010
  72. Waity1:
  73.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  74.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  75.     CMPI.L    D2,D0        ; aspetta la linea $010
  76.     BNE.S    Waity1
  77. Waity2:
  78.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  79.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  80.     CMPI.L    D2,D0        ; aspetta la linea $010
  81.     Beq.S    Waity2
  82.  
  83.     btst    #2,$16(A5)    ; Tasto destro premuto?
  84.     beq.s    NonLaceint
  85.  
  86.     bsr.s    laceint        ; Routine che punta linee pari o dispari
  87.                 ; ogni frame a seconda del bit LOF per
  88.                 ; l'interlace
  89. NonLaceint:
  90.     bsr.w    PrintCarattere    ; Stampa un carattere alla volta
  91.  
  92.     btst    #6,$bfe001    ; mouse premuto?
  93.     bne.s    mouse
  94.  
  95.     rts
  96.  
  97. ******************************************************************************
  98. ; INTERLACE ROUTINE - Testa il bit LOF (Long Frame) per sapere se si devono
  99. ; visualizzare le linee pari o quelle dispari, e punta di conseguenza.
  100. ******************************************************************************
  101.  
  102. LACEINT:
  103.     MOVE.L    #BITPLANE,D0    ; Indirizzo bitplane
  104.     btst.b    #15-8,4(A5)    ; VPOSR LOF bit?
  105.     Beq.S    Faidispari    ; Se si, tocca alle linee dispari
  106.     ADD.L    #scr_bytes,D0        ; Oppure aggiungi la lunghezza di una linea,
  107.                 ; facendo partire la visualizzazione dalla
  108.                 ; seconda: visualizzate linee pari!
  109. FaiDispari:
  110.     LEA    BPLPOINTERS,A1    ; PLANE POINTERS IN COPLIST
  111.     MOVE.W    D0,6(A1)    ; Punta la figura
  112.     SWAP    D0
  113.     MOVE.W    D0,2(A1)
  114.     RTS
  115.  
  116. *****************************************************************************
  117. ;            Routine di Print
  118. *****************************************************************************
  119.  
  120. PRINTcarattere:
  121.     MOVE.L    PuntaTESTO(PC),A0 ; Indirizzo del testo da stampare in a0
  122.     MOVEQ    #0,D2        ; Pulisci d2
  123.     MOVE.B    (A0)+,D2    ; Prossimo carattere in d2
  124.     CMP.B    #$ff,d2        ; Segnale di fine testo? ($FF)
  125.     beq.s    FineTesto    ; Se si, esci senza stampare
  126.     TST.B    d2        ; Segnale di fine riga? ($00)
  127.     bne.s    NonFineRiga    ; Se no, non andare a capo
  128.  
  129.     ADD.L    #scr_bytes*7,PuntaBITPLANE    ; ANDIAMO A CAPO
  130.     ADDQ.L    #1,PuntaTesto        ; primo carattere riga dopo
  131.                     ; (saltiamo lo ZERO)
  132.     move.b    (a0)+,d2        ; primo carattere della riga dopo
  133.                     ; (saltiamo lo ZERO)
  134.  
  135. NonFineRiga:
  136.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
  137.                 ; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
  138.                 ; DELLO SPAZIO (che e' $20), in $00, quello
  139.                 ; DELL'ASTERISCO ($21), in $01...
  140.     LSL.W    #3,D2        ; MOLTIPLICA PER 8 IL NUMERO PRECEDENTE,
  141.                 ; essendo i caratteri alti 8 pixel
  142.     MOVE.L    D2,A2
  143.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  144.  
  145.     MOVE.L    PuntaBITPLANE(PC),A3 ; Indir. del bitplane destinazione in a3
  146.  
  147.                 ; STAMPIAMO IL CARATTERE LINEA PER LINEA
  148.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  149.     MOVE.B    (A2)+,scr_bytes(A3)    ; stampa LA LINEA 2  " "
  150.     MOVE.B    (A2)+,scr_bytes*2(A3)    ; stampa LA LINEA 3  " "
  151.     MOVE.B    (A2)+,scr_bytes*3(A3)    ; stampa LA LINEA 4  " "
  152.     MOVE.B    (A2)+,scr_bytes*4(A3)    ; stampa LA LINEA 5  " "
  153.     MOVE.B    (A2)+,scr_bytes*5(A3)    ; stampa LA LINEA 6  " "
  154.     MOVE.B    (A2)+,scr_bytes*6(A3)    ; stampa LA LINEA 7  " "
  155.     MOVE.B    (A2)+,scr_bytes*7(A3)    ; stampa LA LINEA 8  " "
  156.  
  157.     ADDQ.L    #1,PuntaBitplane ; avanziamo di 8 bit (PROSSIMO CARATTERE)
  158.     ADDQ.L    #1,PuntaTesto    ; prossimo carattere da stampare
  159.  
  160. FineTesto:
  161.     RTS
  162.  
  163. PuntaTesto:
  164.     dc.l    TESTO
  165.  
  166. PuntaBitplane:
  167.     dc.l    BITPLANE
  168.  
  169. ;    $00 per "fine linea" - $FF per "fine testo"
  170.  
  171.         ; numero caratteri per linea: 40
  172. TESTO:         ;          1111111111222222222233333333334
  173.              ;   1234567890123456789012345678901234567890
  174.     dc.b    ' Che scritte piccole! Non si leggono nem'   ; 1
  175.     dc.b    'meno... ma sono in 640x512!             ',0 ; 1b
  176. ;
  177.     dc.b    'Provate a premere il tasto destro e potr'   ; 2
  178.     dc.b    'ete verificare cosa vedono i coder che  ',0 ; 2b
  179. ;
  180.     dc.b    "non sanno come funziona l'interlace, hah"   ; 3
  181.     dc.b    "aha! In fondo e' semplice, no?          ",0 ; 3b
  182. ;
  183.     dc.b    'Programmate, fate qualche demo o qualche'   ; 4
  184.     dc.b    " gioco, e' la cosa piu' creativa che si ",0 ; 4b
  185. ;
  186.     dc.b    'possa fare nel mondo contemporaneo.     '   ; 5
  187.     dc.b    '                                        ',$FF ; 5b - FINE
  188.  
  189.     EVEN
  190.  
  191.  
  192. ;    Il FONT caratteri 8x8.
  193.  
  194. FONT:
  195.     incbin    "assembler2:sorgenti4/nice.fnt"
  196.  
  197. ******************************************************************************
  198.  
  199.     SECTION    GRAPHIC,DATA_C
  200.  
  201. COPPERLIST:
  202.     dc.w    $8e,DIWS    ; DiwStrt
  203.     dc.w    $90,DIWSt    ; DiwStop
  204.     dc.w    $92,DDFS    ; DdfStart
  205.     dc.w    $94,DDFSt    ; DdfStop
  206.  
  207.     dc.w    $102,0        ; BplCon1
  208.     dc.w    $104,0        ; BplCon2
  209.     dc.w    $108,80        ; Bpl1Mod \ INTERLACE: modulo = lungh. linea!
  210.     dc.w    $10a,80        ; Bpl2Mod / per saltarle (le pari o le disp.)
  211.  
  212.             ; 5432109876543210
  213. ;    dc.w    $100,%1001001000000100    ; 1 bitplan, HIRES LACE 640x512
  214. ;                    ; notare il bit 2 settato per LACE!!
  215.  
  216.     dc.w    $100,BPLC0    ; BplCon0 -> facciamo calcolare automatico!
  217.  
  218.  
  219. BPLPOINTERS:
  220.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  221.  
  222.     dc.w    $180,$226    ; color0 - SFONDO
  223.     dc.w    $182,$0b0    ; color1 - plane 1 posizione normale, e'
  224.                 ; la parte che "sporge" in alto.
  225.  
  226.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  227.  
  228. ******************************************************************************
  229.  
  230.     SECTION    MIOPLANE,BSS_C
  231.  
  232. BITPLANE:
  233.     ds.b    scr_bytes*scr_h    ; 80*512 un bitplane Hires int. 640x512
  234.  
  235.     end
  236.  
  237. Da notare che e' stato utilizzato il sistema del calcolo automatico dei
  238. diwstart/stop eccetera. Comunque per l'interlace occorre ricordarsi di
  239. mettere il modulo a "scr_bytes", in questo caso 80.
  240.  
  241.