Retrojen Forum
Dijital Sanat => Kodlama => Konuyu başlatan: wizofwor - 04 Ocak 2019, 00:44:23
-
Ekranı raster interrupt kullanarak üçe ayırmaya çalışıyorum. İlk denediğim yöntemde başarılı olamadım. Başka bir yöntem deneyeceğim ancak bunun neden başarısız olduğunu anlayamadım. 66'ncı satırdan itibaren verdiğim raster satırlarının değerine göre irq01'i ya atlıyor ya da bütün ekranı anlık olarak kırmızı yapıyor.
Kodum aşağıda.
.const SCREEN_RAM = $0400
.const COLOR_RAM = $d800
.const flag = $02
// --- main --------------------------------------------------------
BasicUpstart2(start)
* = $3000 "program"
start: jsr initialize
jsr irq_setup
main_loop: lda flag
beq main_loop
//inc $d020
lda #$00
sta flag
jmp main_loop
// --- Subroutines -------------------------------------------------
// Clear Screen
initialize: ldx #0
lda #$0
!: sta SCREEN_RAM+$000,x
sta SCREEN_RAM+$0ff,x
sta SCREEN_RAM+$1ff,x
sta SCREEN_RAM+$2ff,x
dex
bne !-
lda #00
sta $d020
sta $d021
// Initialize varibles
lda #$00
sta flag
rts
// --- irq routines ------------------------------------------------
.macro set_irq(addr, row_lo, row_hi){
.if (!row_hi) {
lda $d011 // high bit of raster line
and $7f
sta $d011
}
else {
lda $d011
ora #$80
sta $d011
}
lda row_lo // low byte of raster line
sta $d012
lda #<addr
sta 788
lda #>addr
sta 789
}
.const raster_row1 = 100
.const raster_row2 = 150
.const raster_row3 = 200
irq_setup: sei
lda #$7f
sta $dc0d
sta $dd0d
lda #$00
sta $dc02
lda #$01
sta $d01a
set_irq(irq01, raster_row1, false)
cli
rts
/* IRQ01 - Logo */
irq01: lda #$01
sta $d020
sta $d021
set_irq(irq02, raster_row2, false)
!out: asl $d019
jmp $ea81
/* IRQ02 - Cloud */
irq02: lda #$02
sta $d020
sta $d021
set_irq(irq03, raster_row3, false)
!out: asl $d019
jmp $ea81
/* IRQ03 - Scroll */
irq03: lda #$03
sta $d020
sta $d021
set_irq(irq01, raster_row1, false)
lda #$00
sta flag
!out: asl $d019
jmp $ea81
https://gist.github.com/wizofwor/14d8ae4aeffdf1abdc674ffca5ec4ba4
-
Son dakikada gelen ilhamla makronun içindeki adresleme hatasını düzelterek hallettim.
lda #row_lo // low byte of raster line
sta $d012
57'nci satırda immediate yerine absolute addressing kullanmışım.