zaterdag 28 oktober 2023

C64: Smoothscroller in an interrupt!

//use kickassembler to assemble
:BasicUpstart2(Main)	
.pc = * "Code Segment"
	
Main:
	sei
	lda $d011
	and #%01111111
	sta $d011	// clear top bit of raster register
	lda #$7f
	sta $d012	// raster register
	
	lda #<Interrupt
	sta $0314
	lda #>Interrupt
	sta $0315
	
	lda #$01	// current raster count = wanted position. We handle the interrupt.
	sta $d019	// interrupt status byte
	sta $d01a	// interrupt enable byte
	
	lda #$7f 
	sta $dc0d	// disable cia 1
	sta $dd0d   // disable cia 2
	
	ldx #39
!loop:
	lda #' '
	sta $400+$190-40, x	// regel erboven vullen met spaties
	sta $400+$190, x	// scrollregel zelf vullen met spaties
	sta $400+$190+40, x  	// regel eronder vullen met spaties
	lda #1
	sta $d800+$190,x	// kleuren zetten in de scrollregel
	dex
	bpl !loop-
	
	lda $d020
	sta old_colors
	lda $d021
	sta old_colors+1
	
	lda $dc0d	// acknowledge pending interrupts from CIA-1
	lda $dd0d	// acknowledge pending interrupts from CIA-2
	
	cli
	rts
	
	
Interrupt:
	ldx #3		// vertraging om de zwarte kleur niet midden in je scherm te krijgen
!loop:
	dex
	bne !loop-
	
	lda #0
	sta $d020
	sta $d021
	lda scrollposition
	sta $d016
	
!loop:
	lda $d012
	cmp #$8c	// wacht totdat het raster een aantal regels verder is.
	bne !loop-
	
	lda #$08	// scrolling weer uitzetten
	sta $d016
	
	ldx	#8	// vertraging om de zwarte kleur niet midden in je scherm te krijgen
!loop:
	dex
	bne !loop-
	
	lda old_colors
	sta $d020
	lda old_colors+1
	sta $d021
	
	dec scrollposition
	bpl no_scrollposition_reset
	
	lda #7		// de volgende scrollpositie wordt weer ver naar rechts
	sta scrollposition
	
	ldx #0
!loop:
	lda $591, x	// copy line to the left
	sta $590, x
	inx
	cpx #39
	bne !loop-	
	
	ldx scrolltext_needle	// scrolltext resetten?
	lda scrolltext, x
	cmp #0
	bne no_scrolltext_reset
	lda #0
	sta scrolltext_needle
	lda scrolltext
no_scrolltext_reset:
	sta $400+$190+39
	inc scrolltext_needle	
	
no_scrollposition_reset:
	lda #$01    	// current raster count = wanted position. We handle the interrupt.
	sta $d019	// interrupt status byte.  asl $d019 werkt ook, maar waarom weet ik niet.
	jmp $ea31


scrollposition:
	.byte 0
	
scrolltext:
	.text "jawel ouwe, een smoothscroller op de commodore 64 in een interrupt!                     "
	.byte 0

scrolltext_needle:
	.byte 0

old_colors:
	.byte 0,0

Geen opmerkingen:

Een reactie posten