pouët.net

256 zooming circles by Defence Force [web]

; --------------------------------------
;  256 bytes moving backgound mini demo
; --------------------------------------
; (c) 2006 Mickael Pointier

Just a small prod I made in 2006 for a Club Europe Oric magazine's article on size coding using the OSDK.
Nothing fabulous, that was my first attempt at doing a 256 bytes anything on the Oric :)

What it does is basically to trick the ROM in believing we are in High resolution mode (so we can use graphic primitives as lines and circles) while staying in Text mode. Then a small section (24x24 pixels) of the (non visible) Hires screen that contains the animation is copied to the charmap. Since the same block of 4x3 characters is repeated all over the screen it gives this mirroring illusion.

	Dbug


--------------------------------
;
; ROM & RAM system defines
; (Works only on ROM 1.1)
;
#define _rom_hires		$ec33
#define _rom_curset		$f0c8
#define _rom_circle		$f37f

#define ROM_PARAMS		$2e0
#define ROM_PATTERN		$213
#define ROM_CURX		$219
#define ROM_CURY		$21a

#define INK_BLUE		4

#define FB_DRAW			1

#define SCREEN_HIRES	$a000
#define CHARSET_TEXT	$b400+8*"@"
#define SCREEN_TEXT		$bb80
#define SCREEN_LAST		$bfdf

#define SCREEN_SRC_OFFSET	(-40*24)+1

	.zero

	*= $50

circle_ray			.dsb 1

tmp0				.dsb 1
tmp1				.dsb 1

ptr_src				.dsb 2
ptr_src2			.dsb 2

ptr_dst				.dsb 2

	.text

_main
	; Switch to hires
	jsr _rom_hires

	; Erase the parameter area
	lda #0
	ldx #7
loop
	sta ROM_PARAMS-1,x
	dex 
	bne loop
		
	; Force "manualy" the text mode by setting a 50hz TEXT switch attribute 
	lda #26
	sta SCREEN_LAST
	
	; More CPU time, and no more blinking cursor !
	sei
	
	.(
	;
	; Let's fill screen with a pattern of characters, for example that:
	;
	; @CFI
	; ADGJ
	; BEHK
	;
	lda #0
	sta tmp0
	sta tmp1
	
	lda #<SCREEN_TEXT
	sta ptr_src+0
	lda #>SCREEN_TEXT
	sta ptr_src+1
	
	ldx #28
loop_y	
	ldy #39
loop_x	

	.(
	lda tmp0
	bne skip
	lda #12
skip	
	sec
	sbc #3
	sta tmp0
	.)
	
	clc
	lda #"@"
	adc tmp0
	adc tmp1

	; Write character in video memory
	sta (ptr_src),y

	dey
	bne loop_x

	sty tmp0
	
	; End of line, we write the color attribute at the begining,
	; and update line pointers...
	lda #INK_BLUE
	sta (ptr_src),y
	
	.(
	clc
	lda tmp1
	adc #1
	cmp #3
	bne skip
	lda #0
skip	
	sta tmp1
	.)

	jsr IncPtrSrc
			
	dex
	bne loop_y
	.)
	
	lda #FB_DRAW
    sta ROM_PARAMS+3			; Set the FB parameter to "draw"    
BigLoop		
	.(
	; Draw a first animated circle
	ldx circle_ray
	inx
	txa
	and #15
	sta circle_ray
	
	; Draw two circles
	ldx #2
loop_circle
	stx tmp0
	
	lda CircleData-1,x
	sta ROM_CURX
	sta ROM_CURY
	
	ldx circle_ray
	inx
    stx ROM_PARAMS+1
        
	jsr _rom_circle
	
	ldx tmp0
	dex
	bne loop_circle
	
	.)
	
	; Pattern register
	inc ROM_PATTERN
			
	.(
	;
	; Let's dump a 24x24 pixels area of the HIRES screen to the redefined characters area :D
	;
	lda #<SCREEN_HIRES
	sta ptr_src+0
	lda #>SCREEN_HIRES
	sta ptr_src+1
	
	lda #<CHARSET_TEXT
	sta ptr_dst+0
	lda #>CHARSET_TEXT
	sta ptr_dst+1

	ldx #4
loop_x
	stx tmp0
	
	ldx #24
loop_y
	; Compute the secondary pointer to create the mirror picture
	clc
	lda ptr_src+0
	adc #<40*24
	sta ptr_src2+0
	lda ptr_src+1
	adc #>40*24
	sta ptr_src2+1
		
	ldy #4
	lda (ptr_src),y		; Top right
	ora (ptr_src2),y	; Bottom right
	ldy #0
	ora (ptr_src),y		; Top left
	ora (ptr_src2),y	; Bottom left
	
	; Update the char map
	sta (ptr_dst),y

	; Clean the HIRES buffer	
	lda #64
	sta (ptr_src),y
	sta (ptr_src2),y
	ldy #4
	sta (ptr_src),y
	sta (ptr_src2),y

	jsr IncPtrSrc
	
	.(
	inc ptr_dst+0
	bne skip
	inc ptr_dst+1
skip
	.)	

	dex
	bne loop_y

	clc
	lda ptr_src+0
	adc #<SCREEN_SRC_OFFSET
	sta ptr_src+0
	lda ptr_src+1
	adc #>SCREEN_SRC_OFFSET
	sta ptr_src+1
		
	ldx tmp0
	dex
	bne loop_x
	.)
	jmp BigLoop
	
	
IncPtrSrc	
	.(
	clc
	lda ptr_src+0
	adc #40
	sta ptr_src+0
	bcc skip
	inc ptr_src+1
skip	
	.)
	rts

CircleData	
	.byt 12,24
	.byt "-DBUG-"