Sprite-Multiplexer

Материал из C64 WIKI по русски.
Перейти к: навигация, поиск

Пример

     !to "multiplexer.prg",cbm
     
    ;---------------------------------------------------------------------------
    ;
    ; Маленький пример Sprite Multiplexer с Sprite 1 
    ;
    ; В этом примере Sprite 1 выводится 4 раза на экран Multiplexer-процедурой.
    ;
    ; Основы : Растровое прерывание
    ; @L       Ожидаем нужную Y-позицию (растровую линию)
    ;          ставим (новую) Y-позицию
    ;          и (новый) указатель спрайта при необходимости.
    ;          Цвета и следующие регистры обновляются
    ;          минимум через 21+1 (высота спрайта+1) линию растра 
    ;          дальше снова @L
    ;
    ; На растровой линии могут быть выведены одновременно 8 спрайтов.
    ;
    ;
    ; Компилятор : ACME  
    ;
    ; Michael Sachse, 20. Maerz 2007 
    ;
    ;---------------------------------------------------------------------------
     
    
    ;-- Basicstart
    
    *= $0800
    !byte $00,$0c,$08,$0a,$00,$9e,$32,$30,$36,$34,$00,$00,$00,$00
         
     *= $0810
      
    ;--------------------------------------------------   
             
             lda #00
             sta $d020
             sta $d021        ; Бордюр и экран черного цвета
             lda #147
             jsr $ffd2        ; Очистка экрана
             jsr setup_sprite ; Инициализация Sprite 1 

    ;--------------------------------------------------
    ;  Новый растровый IRQ
    ;--------------------------------------------------
             
             sei  
             lda #<int
             sta $0314
             lda #>int
             sta $0315        ; новый IRQ
             lda #$00
             sta $d012        ; задаем линию растра
             lda #$7f
             sta $dc0d        ; включаем таймер
             lda #$01
             sta $d019
             sta $d01a        ; включаем IRQ на линию растра
             cli
             jmp *
    
    ;--------------------------------------------------
    
    int      lda $d019
             and #$01
             sta $d019        ; IRQ произошел?
             bne irq
             jmp $ea81
              
    ;--------------------------------------------------           
    
    irq      lda #$00
             sta $d012
    
             jsr animate      ; Двигаем по оси X 
    
    
    l0       lda $d012
             cmp #78          ; y = 78
             bne l0     
             sta $d001
             lda #$28         ; Указатель на  Sprite 1 установлен
             sta $07f8        ; $0a00 = $28*$40
    
    l1       lda $d012
             cmp #100         ; y = 100
             bne l1
             sta $d001          
             lda #$29         ; Указатель на следующий спрайт
             sta $07f8
             lda #6           ; и новый цвет
             sta $d026
    
    l2       lda $d012
             cmp #122         ; y = 122      
             bne l2
             sta $d001          
             lda #$28         ; Устанавливаем указатель спрайта
             sta $07f8
             lda #3
             sta $d026
    
    l3       lda $d012
             cmp #144          ; y =144     
             bne l3
             sta $d001            
             lda #$29          ; Устанавливаем указатель спрайта
             sta $07f8
             lda #2
             sta $d026         ; и новый цвет
    
    le       lda $d012
             cmp #255
             bne le        
             jmp $ea81
             
    ;--------------------------------------------------
    ;   Sprite(s) перемещаются по оси X  
    ;--------------------------------------------------    
    
    animate   inc $d000
              lda $d000
              bne ex
              lda #50
              sta $d000        
    ex        rts
    
    ;--------------------------------------------------
    ;   Sprite 1 инициализация
    ;--------------------------------------------------
    
    setup_sprite
    
              lda #1           ; Цвет
              sta $d025
              lda #11
              sta $d026
              lda #15
              sta $d027        ; устанавливаем
              lda #64
              sta $d000        ; X-позиция
              lda #$01         ;
              sta $d015        ; Sprite 1 в режиме
              sta $d01c        ; Multicolor
              rts
    
    ;--------------------------------------------------
    ;   2 Sprites 
    ;--------------------------------------------------
    
    *=$0a00
     
    !byte $ff,$ff,$ff,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f0 
    !byte $00,$00,$b0,$00,$00,$A0,$00,$00,$AC,$00,$00,$F8,$00,$00,$FE,$0E 
    !byte $f0,$aa,$a9,$7c,$aa,$aa,$5b,$ab,$ea,$aa,$eb,$fa,$ab,$03,$f0,$00 
    !byte $03,$f0,$00,$03,$c0,$00,$03,$00,$00,$00,$00,$00,$ff,$ff,$ff,$ff 
    
    ; $0a40
     
    !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
    !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF  
    !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF  
    !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF

Ссылки

Оригинал статьи на С64-WIKI.DE