Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
  You are not logged in - nap
Eppur Si Muove   [2022]

Eppur Si Muove Released by :
The Apace Software

Release Date :
1 February 2022

Type :
C64 One-File Demo

User rating:*********_  9.3/10 (29 votes)   See votestatistics
**********  9.8/10 (9 votes) - Public votes only.

Credits :
Code .... zscs of Excess, The Apace Software
Music .... Vincenzo of Lethargy, Molecoola, Rebels, SIDRIP Alliance, Singular, STARZ
Graphics .... zscs of Excess, The Apace Software
Idea .... zscs of Excess, The Apace Software
Text .... zscs of Excess, The Apace Software
Charset .... zscs of Excess, The Apace Software


SIDs used in this release :
Wives Unchained(/MUSICIANS/V/Vincenzo/Wives_Unchained.sid)

Download :

Look for downloads on external sites:
 Pokefinder.org


Production Info
Submitted by zscs on 16 August 2023
As mentioned, 100% coded in S-MON $c000. Here you can find my notes - if you would like to see the details in e.g. a monitor. :)
ln# d012 badl*:  scr:   col:     *$d011=$1b /badline
-----------------------------------------------------
 00  $31   $33   $0400  $d800
 01  $39   $3b   $0428  $d828
 02  $41   $43   $0450  $d850
 03  $49   $4b   $0478  $d878
 04  $51   $53   $04a0  $d8a0   * 1 logo: upper part
 05  $59   $5b   $04c8  $d8c8   * 2
 06  $61   $63   $04f0  $d8f0   * 3
 07  $69   $6b   $0518  $d918   * 4 + $d020 rasters
 08  $71   $73   $0540  $d940   * 5 + $d020 rasters
 09  $79   $7b   $0568  $d968    - empty line/placeholder-
 10  $81   $83   $0590  $d990   + 3x4 scroll line 1
 11  $89   $8b   $05b8  $d9b8   + 3x4 scroll line 2
 12  $91   $93   $05e0  $d9e0   + 3x4 scroll line 3
 13  $99   $9b   $0608  $da08   + 3x4 scroll line 4
 14  $a1   $a3   $0630  $da30    - empty line/placeholder-
 15  $a9   $ab   $0658  $da58   * 1 logo: mirrored + $d020 rasters
 16  $b1   $b3   $0680  $da80   * 2 logo: mirrored + $d020 rasters
 17  $b9   $bb   $06a8  $daa8   * 3 logo: mirrored
 18  $c1   $c3   $06d0  $dad0   * 4 logo: mirrored
 19  $c9   $cb   $06f8  $daf8   * 5 logo: mirrored
 20  $d1   $d3   $0720  $db20    - empty line/placeholder-
 21  $d9   $db   $0748  $db48    - empty line/placeholder-
 22  $e1   $e3   $0770  $db70   + 8x5pixel charset + sprites background?
 23  $e9   $eb   $0798  $db98   + 8x5pixel charset + sprites background?
 24  $f1   $f3   $07c0  $dbc0    - empty line/placeholder-
----------------------

c $4000 -        start
c $4200 -        main routine / raster interrupts
c $4300 -        scroll fade-out sprite#0 init / $07f8, + sprite init for all 8 sprites
c $4400 -        3x4 scroller routine
c $4600 -        upper logo d020 rasters routine
d $46e0 - 46ea   raster colours (upper)
c $4700 -        scroller part init on the screen
c $4760 -        background sprite init (scroll, hires layer), sprite#1-7 colours: $4758-475e
c $4800 -        lower logo d020 rasters routine
d $48e0 - 48f2   raster colours (lower)
c $4900 -        all sprites OFF, sprite Y-positions to $00 (cmp $d012 = $a4)
c $4940 -        cmp $d012=$8c: sprite Y-pos: $99
c $4980 -        scroll hires background layer colours: cycle colours high (from $5a00)
c $49a0 -        scroll hires background layer colours: cycle colours low (from $5e00)
c $4a00 -        scroll sprite bg layer 1 char left (16 bit, because X-expanded!)
c $4c00 -        8-pixel movement for logos (logo swing)
c $4d00 -        DYCP routine: draw
d $5000 -        3x4 charset tiles (12 byte / char, linear order)
c $5280 - 52be   ( two routines to generate temporary data. Used once only )
d $52c0 - 52ff   ( chars, 0-63, not used, temporary data )
d $5300 - 533f   3x4 charset vector: ascii absolute -> relative 0-46
d $5340 - 536c   ( available chars in the 3x4 charset. temporary/not used )
d $5380 -        3x4 charset tile vector: low  byte ($5000-)
d $53c0 -        3x4 charset tile vector: high byte ($5000-)
d $5400 -        3x4 charset colour attributes / char (refers from tile vector data!)
d $5480 - 54a0   3x4 charset: tile width (1, 2 or 3 chars)
d $5500 -        3x4 scrolltext ($ff - end, $1e-speed, next byte is and#07. if spd=0, delay#40)
d $5a00 -        7-sprite background colour cycle (colours), 3x4 scroll upper char
d $5b00 -        sprite bg layer bits (left/right 4-bit as well, must be masked when paste!)
d $5c00 -        sprite bg layer vector: $5b00 + [value] at Y, where Y is pos of char
d $5d00 -        logo colour conversion table, $00: original, +$20: darker, +$40: darkest
d $5e00 -        7-sprite background colour cycle (colours), 3x4 scroll lower char

d $2000 -        3x4 charset char data
d $2500 - 4000   bitmap logo data (chars + colours in empty areas, inside this)
d $2300 - 23c8   chars - upper logo
d $2400 - 24c8   chars - lower logo
d $2c00 - 2cc8   colours - upper logo
d $2d00 - 2dc8   colours - lower logo
d $3000 - 3200   8x5-pixel complete charset
d $2e00 - 2320   colour transition: black -> white (red variants)
d $2e20 - 2e40   colour transition: white -> black (red variants)
d $2e40 - 2e60   colour transition: black -> grey (grey colours)
d $2e60 - 2e80   colour transition: grey -> black (grey colours)
d $3200 - 3240   8-pixel wide sinus (0-7 values), 64/$40 values
c $3240 - 3280   upper/lower logo swing move + delay logic
c $3900 -        logo colour draw 1 char / frame main logic (under constr.!!!)
...del! c $3980 -        logo colour draw upper: 1 char / frame (original logic)
...del! c $39c0 -        logo colour draw lower: 1 char / frame (original logic)
d $39c0 - 39e8   mask, where the logo colour data can be changed (0-off, 1-change)
c $3a00          d8xx colour map table conversion
c $3a10          04xx char coloup table conversion, low 4-bit, high 4-bit as well
c $3b00          upper logo part: colour draw, where Y=$00,$20,$40,$80 (see below)
c $3b80          lower logo part: colour draw, where Y=$00,$20,$40,$80 (see below)
c $3d00          [ temporary/one-time code: convert logo colour tables-> $6000)
c $3e00          logo upper / lower colour cycling, main routine
c $3f00          upper logo colour transition: speed optimized code (2nd version)
c $3f80          lower logo colour transition: speed optimized code (2nd version)
d $6000 -6800    logo colour tables for speed code (see below for more info)

v $2d            3x4 scroller delay (0: no delay, otherwise $curr_val - 1 / frame)
v $2e            3x4 scroller shift (0-7)
v $2f   - $30    3x4 scroll text pointer (default: $5500)
v $31   - $32    3x4 scroll: current char's tile data address
v $33   - $34    logo move, 8-pixel, left-right
v $35   - $36    ?? scroller pointers
v $37   - $40    colour convert buffer
v $45   - $46    temporary, DYCP char data copy
v $47   - $48    DYCP text pointers
v $39fe - 39ff   upper/lower logo colour transitions' positions
v $43ff          scroller: leftmost char tile X-pos (1-3)
v $43fe          scroller: char tile width (1-3)
v $43f8          (value taken from $5300 - not used yet - )
v $4aff          sprite background, 2nd 8-bit scroll. 0: 0f82 low 4-bit, 1: 0f82 high 4-bit
v $4afe		 scroll background layer: X-position offset


charset:
@abcdefghijklmnopqrstuvwxyz.,!?:;()0123456789+-
sprites: d010        1   1
18  48  78  a8  d8  08  38
cols: 0a   red		j
      0f   grey      	o
      07   yellow	g
      0f   		o
      0a		j
      08		h
      02		b
      09		i
      02		b
      08		h
      0a		j
      0f		o
      07		g
      0f		o
      0a		j
sprite background:
0123456789012345678901234567890123456789
0000000000111111111122222222223333333333
111111222222333333444444555555666666777777  <-- 0f82, put new chars to 2nd 4-bit (bits#3-0)
Chars: from $5b00 (8 bytes, bits #3-0 / 00-0f values)
white bg (lower part)
bck00 5b00:	$07	$09	(left, squared)
bck01 5b08:	$0e		(left, curved, 'o', etc.)
bck02 5b10:	$1b		(left, curved#2, 's', 'y')
bck03 5b18:	$2c		(left, 'W')
bck04 5b20:	$35		(left, 'V')
bck05 5b28:	$3d	$3e	(. and , - maybe same bckgrnd)
bck06 5b30:	$4c		(bottom/middle of '1')
bck0e 5b38:	$45		( '(' bottom-right)
red bg (upper part):
bck07 5b40:	$05	$0f	(top-right, C, d, e etc.)
bck08 5b48:	$11		(top-left, B, D)
bck09 5b50:	$1a		(top-right, V, W, X, Y etc)
bck0a 5b58:	$1d		(top-right, M)
bck0b 5b60:	$2b		(top-middle of 'T')
bck0c 5b68:	$3c		(top-right, Z, 2)
bck0d 5b70:	$4a		(middle-top, '1')
bck0f 5b78:	$29		(left of 'T')

colours:
0 - @ - black
1 - a - white
2 - b - red
3 - c - cyan
4 - d - purple
5 - e - green
6 - f - blue
7 - g - yellow
8 - h - orange
9 - i - brown
a - j - light red
b - k - dark grey
c - l - grey
d - m - light green
e - n - light blue
f - o - light grey
transition, from black to white:	@ibhjoga

PLANS:
-----
fade-in sequence:
 1. 24-char dycp in the middle of the screen. Screen is black. Welcome text shown, e.g.
    "012345678901234567890123"
    "     eppur si muove     "
---
Logo colour effect: after $d016 move is finalized, scroll left to right (upper), right to left (lower logo) the colours.
 1) for 2300 and 2400 data ($xy is used)
    for 2c00 and 2d00 data ($0z is used), introduce a colour table.
 2) 7-char width colour cycle, like '3210123' for each row (5 rows we have, both logos)
    where:
     3 - original colour from 2300/2400 and 2c00/2d00
     2 - 1 step  darker color variant for x, y and z (use table#1 for that!)
     1 - 2 steps darker color variant for x, y and z (use table#2 for that!)
     0 - x, y and z = $0 (black)
 3)  3: original colour: @abcdefghijklmno
     2: darker:        : @o@nkf@oi@h@kedl
     1: darkest:       : @l@d@@@h@@b@ikfk
     
     stored from >> $5d00 <<: ...in code, call subroutine with y=$00, $20, $40 or $60
   real-time logic: 		precalculated / as data (up char, lw c, up col, lw col):
     0 : 3 (original scale)    	2300, 2400, 2c00, 2d00
     20: 2			6000, 6100, 6200, 6300
     40: 1			6400, 6500, 6600, 6700
     60: 0 (full black scale)	6800, 6800, 6800, 6800

DYCP:
-----
 - raster logic: $429f, charset from $0800 ($d018=$12). Only first 48x8 bites used.
 - ................$4d00: main routine: draw (SLOW!!!)
 - ................$4d60: clear v1 at old positions (old, SLOW!)
 - ................$4e00: clear v2 (fast, speedcode, NEW!)
 - $5900: 11-pixel height sinus, ~24x2 bytes width? ($30, value range: $00-$0b)
*- $5dc0: 24-byte copy from $5900 (DYCP sinus)
 - $6900: DYCP chars, 24-char, stored as bitmap (for faster copy-paste)
 - $6a00: DYCP draw, copy from $6900, speed code (NEW, FAST!)
*- $6e00: sinus 28-byte write to: $5dc0 - $5dd7
 - $6e80: change 1 char at $6900 (1 char / frame)
 - $6f00: 1: draw char (based on X register), 0: do nothing
 - $0a00: DYCP background layer, sprite 0,1,2,3
 - $0b00: DYCP background layer, sprite 4,5,6,7
 - $47 - $48: DYCP text pointer, start: $2e80 (main), $1b00 (intro/fade-in)
 - ............$6e60: DYCP background colour (OLD, not used anymore! too slow)
 - $7100: DYCP background colour set (new, speed code, fast!)
*- $7200: DYCP clear v3 (fast, speedcode, NEW, superfast - only 1st and 5th byte cleared!)

REJECTED:
---------
main part:
 - logo upper/lower: switch colours, left to right and other way around, as soon as the
   logo swing starts (or stops?) <-- declined due to MC logo bitmap colour issues...

FADE-IN ROUTINES:
-----------------
1) raster logic: $1800 (copy from $4200)
   DYCP with text: 'eppur si muove', at the middle  of the screen
   raster logic: $1800 (copy from $4200)
   when DYCP text reaches 'ff', sets $19 to $FFFF. (from $1c30 )
   goto logic to 2nd fade-in:
     - from $1c43 ($fffe set here e.g., + JSR $1D20, lda $19 to $18eb, $1a41=$00, $1a46=$18
     - $1c58: lda $ad to $1c08 (here, JSR $1c80 is placed normally, draw char from $6900)
     - $1a40: last DYCP fade-out (24 frames long only), then initiate 2nd (logo) fade-in
     - $1d20: additional value inits, like $1e01=$00, $1e0a=$27
     - $19bc = $20, $19bf = $ad (JSR logo upper , LDA logo lower)

    

2) logos fade-in:
   raster logic: $1900 (copy from $1800)
   $1912:  jsr 1ce0    : clear DYCP (middle of screen)
   $39c0-39e7: logo colour mask. 1:draw, 0:skip column
   $     : (copy from 3e00??)
   IDEA: use a different logic: 3 state, darkest, darker, original colours / frame
     Sequence:
     a) 1st logo draw, then, change JSR $1e00 to LDA $1e00 ($19bc-n)
     b) delay synced to music
     c) 2nd logo draw, JSR $1e80, at the end JSR/LDA change 
     d) delay synced to, then FFFF=$42 --> set $19eb = $73 (yes, raster fade-in!:-)
                      (   when timing ends, sets $42 to $FFFF   )
                      ...this happens at $1fd8 (ldA $73, STA $19eb)
     draw DYCP lower position: copy from $4117 - $412a
   
   --> after fade, call $1a00, which draws the DYCP chars and colours before $4200 runs??

3) logo D020 rasters fade-in (20-30 frames??):
   $7300: raster logic, exactly the same as $4200 but scroll & DYCP code disabled and
    --> raster fade-in logic added
   When fade-in ends:
    --> set $ffff to $42
   $7480: fade in rasters + at the end, continue at $4200 --> set $73eb=$42
      (init: 1fe0, sets $00 to $7480)
   colour data upper: $7400 - $7420 (additional $01 values until $743f)
   colour data lower: $7440 - $7460
   raster data: 46e0 (upper) 48e0 (lower)
Production Info
Submitted by zscs on 1 February 2022
About a year ago, St0rmfr0nt sent me an Amiga 500 logo and based on that, I got an idea. Took me months to figure out, how that idea could be feasible. 5 weeks ago, when I started to do asm coding again that has become clear, even if not a special hires logo but at least a small size hires scroll routine could be done which could have 3 different hires colours (e.g. black as background and 2 other colours). 2 weeks ago I started to code it and became obvious, why I would have sticked to an 1x1 scroller if bigger could be also done? :-) So here it is, a 3x4-char scroller routine with variable speeds, entirely coded by me from scratch - and as a proof of concept: 3 different hires colour pixels can be used in a 8x8 pixel matrix. At least in the 1st and the last char row. :-)

As soon as the first version of the scroller worked, I added a fastmade logo, a few effects and afterwards, an intro sequence, synchronized to the music. Special thanks to Vincenzo who has chosen the music for this little one-file demo and provided it to me. Also thanks to all Excess members who supported me and also many thanks for your patience (I was not that productive during the last 2 weeks). ;-)

Note: first I thought, starting this 'intro' in Intro Competition 2021 would be cool but after a few days that was clear, I've already run out of 16k. I had to use a few memory-eating speedcode routines due to rastertime shortage. E.g. the small colour transition effect on these logos were realtime, I used a small conversion matrix to it but it was extremely slow. So I had to precalculate and store it (only those tables with the related code take ~4k memory).
Search CSDb
Advanced
Navigate
Prev - Random - Next
Detailed Info
· Summaries
· User Comments (17)
· Production Notes (2)
Fun Stuff
· Goofs
· Hidden Parts
· Trivia
Forum
· Discuss this release
Support CSDb
Help keep CSDb running:



Funding status:




About this site:
CSDb (Commodore 64 Scene Database) is a website which goal is to gather as much information and material about the scene around the commodore 64 computer - the worlds most popular home computer throughout time. Here you can find almost anything which was ever made for the commodore 64, and more is being added every day. As this website is scene related, you can mostly find demos, music and graphics made by the people who made the scene (the sceners), but you can also find a lot of the old classic games here. Try out the search box in the top right corner, or check out the CSDb main page for the latest additions.
Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.09 sec.