Programowanie: Przesuw poziomy z regulowaną prędkością

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 22:19, 5 sty 2015
Daniel Koźmiński (Dyskusja | wkład)

← Previous diff
Aktualna wersja
Daniel Koźmiński (Dyskusja | wkład)


Aktualna wersja

Poniższy kod źródłowy jest przykładem realizacji najpopularniejszego niegdyś "efektu" w programach demonstracyjnych, mianowicie poziomego przesuwu tekstu, zwanego popularnie scrollem.

Program wzbogacony jest o możliwość sterowania prędkością przepływu tekstu na ekranie, w zakresie 0 (najszybszy przesuw - pętla opóźniająca czeka jedną ramkę) do 7 (siedem ramek). Kod został przygotowany w makroasemblerze MADS.

                    opt  h+
                    
                    org  $80
                    
scroll_pos          .ds  1              ; wartość przesuwu delikatnego
scroll_speed        .ds  1              ; prędkość przesuwu
scroll_ptr          .ds  2              ; wskaźnik do tekstu
scroll_buf          .ds  2              ; wskaźnik do bufora na ekranie

                    org  $2000
                    
start               lda  #$0e
                    sta  COLOR1
                    lda  #$00
                    sta  COLOR2
                    
                    lda  #00
                    sta  scroll_speed
                    
                    lda  <display_list
                    sta  SDLSTL
                    lda  >display_list
                    sta  SDLSTH
                    
                    lda  <scroll_text
                    sta  scroll_ptr
                    lda  >scroll_text
                    sta  scroll_ptr+1
                    
                    lda  <scroll_screen
                    sta  scroll_buf
                    lda  >scroll_screen
                    sta  scroll_buf+1
                    
                    ldy  #47
@                   lda  (scroll_ptr),y
                    sta  (scroll_buf),y
                    dey
                    bne  @-
                    
                    lda  #04
                    sta  HSCROL
                    sta  scroll_pos
                    
loop                dec  scroll_pos
                    lda  scroll_pos
                    sta  HSCROL
                    jsr  wait
                    bne  loop
                    
                    lda  #04
                    sta  scroll_pos

                    ldy  #47
@                   lda  (scroll_ptr),y
                    bpl  @+
                    and  #$07
                    sta  scroll_speed
                    lda  #" "
@                   sta  (scroll_buf),y
                    dey
                    bne  @-1
                    
                    clc
                    inc  scroll_ptr
                    bne  @+
                    inc  scroll_ptr+1
                    
@                   lda  (scroll_ptr),y
                    cmp  #$ef
                    bne  loop
                    
                    jmp  (DOSVEC)
                                      
wait                pha
                    ldx  scroll_speed
@                   lda  RTCLOK+2
                    cmp  RTCLOK+2
                    beq  *-2
                    dex
                    bpl  @-
                    pla
                    rts
                    
                    .align $0400
                    
display_list        .he  70 70 70
                    .he  52 
                    .wo  scroll_screen
                    .he  41
                    .wo  display_list
                    
scroll_screen   :48 .he  00

                    ; prędkość regulowana w zakresie f0..f7
                    ; f0 - najszybszy przesuw, f7 - najwolniejszy
                    ; wskaźnik prędkości jest zamieniany na spację

scroll_text     :48 .he  00
                    .sb  'Stand up, damned of the Earth'
                    .he  f1
                    .sb  'Stand up, prisoners of starvation'
                    .he  f4
                    .sb  'Reason thunders in its volcano'
                    .he  f1
                    .sb  'This is the eruption of the end.'
                    .he  f6
                    .sb  'Of the past let us make a clean slate'
                    .he  f0
                    .sb  'Enslaved masses, stand up, stand up. '
                    .sb  'The world is about to change its foundation '
                    .sb  'We are nothing, let us be all. '
                    .sb  'This is the final struggle '
                    .sb  'Let us group together, and tomorrow '
                    .sb  'The Internationale '
                    .sb  'Will be the human race. '

                    .he  ef
                    
                    run  start
Personal tools