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-"
[ back to the prod ]