Gönderen Konu: C64 Çoklu interrupt  (Okunma sayısı 942 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 377
C64 Çoklu interrupt
« : 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.

Kod: [Seç]
.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

Gosub ile gidilen yerden goto ile dönen adam

Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 377
Ynt: C64 Çoklu interrupt
« Yanıtla #1 : 04 Ocak 2019, 01:32:22 »
Son dakikada gelen ilhamla makronun içindeki adresleme hatasını düzelterek hallettim.

Kod: [Seç]
lda #row_lo // low byte of raster line
sta $d012

57'nci satırda  immediate yerine absolute addressing kullanmışım. 
Gosub ile gidilen yerden goto ile dönen adam