Jump to content


  • Content Count

  • Joined

  • Last visited

Community Reputation

51 Excellent

About Arnauld

  • Rank
    Space Invader

Contact / Social Media

Profile Information

  • Gender
  • Location
    Paris / France
  1. That's correct. This is the MiniGame Compo version which was released in a rush. It doesn't perform any initialization of the STIC registers, so jzIntv cannot be blame for that. I believe that the state of the STIC after reset is pretty much random on the real hardware as well when the full EXEC boot sequence is bypassed.
  2. For what it's worth, below is the scheme I'm using in a few projects. Each command is 8-bit wide, so each word contains 2 commands. Note that this version assumes FG/BG mode and doesn't support GROM cards apart from the blank one. It also relies on the assumption that the order of appearance of new GRAM cards is sorted. It would definitely require some tuning to support any background scene. nnnnn001 -> draw N+1 blank cards, using the background color nnnnn101 -> draw N+1 blank cards, using the foreground color nnnnnn00 -> draw GRAM card #N nnnnn010 -> draw the next N+1 GRAM cards (e.g. if the GRAM index is currently set to 7 and N = 2, this will draw cards #7, #8 and #9 and update the GRAM index to 10) nnnnn110 -> repeat the last GRAM card N+1 times (NB: blank cards may have been inserted in-between) -nnnn011 -> set the background color to N 1----111 -> end of image 0-nnn111 -> set the foreground color to N
  3. Yes, it does require extra RAM. I don't think that 20 kB is much of an issue for modern boards. If you were to store the uncompressed raw data in ROM, it would be about 285 kB for Chambers of Shaolin -- which would probably be more problematic. That said, I fully agree with you: tracker based music is the way to go. This YM project was more of a fun hack and a way to demonstrate the capabilities of the Intellivision PSG when pushed to its limits. And incidentally, the vast majority of tunes available today in YM format were originally generated with trackers (like these ones).
  4. Quite a lot, actually. As described above, the sliding windows require 10 x 1K-word (20,480 bytes). The space occupied by other variables is negligible.
  5. Just a few more words about the player. You can mute/unmute channels by pressing [1], [2] and [3] on the keypad. "E" is the current hardware envelope. The first nibble is the envelope type and the next 4 nibbles represent the envelope period. "NP" is the noise period. "MX" is the mixer register. Below each channel, the 3-nibble value is the tone period and the 2-nibble value is the volume. It's worth noting that the volume is stored as a 5-bit quantity and that we systematically expand it to 0x30 when bit #4 is set (IIRC, this is required for some versions of the PSG that make a difference between 0x10 and 0x30 for hardware envelope amplitudes and would not sound loud enough if we were using 0x10).
  6. This is actually using some kind of Lempel-Ziv compression, but with variable bit-width depending on the stream that's being processed. Namely, there are 6 different kind of streams for a total of 10 distinct streams: tone periods (x3) : 12 bits volumes (x3) : 5 bits envelop period : 16 bits envelop type : 4 bits noise period : 5 bits mixer : 6 bits Each stream maintains its own sliding window for backward references. Each window is 1024 words long. They're stored at $9000-$B7FF. Conveniently, this range ends just before the GRAM write-sensitive aliases at $B800-$BFFF. The decompression algorithm works as follows. For each stream: read one bit if it's a one, the next block is a backward reference: read 10 bits to get the distance of the reference read 8 bits to get the size of the reference, multiply it by the bit-width of the stream and copy the corresponding number of bits from the sliding window if it's a zero, the next block is unpacked data:read 5 bits to get the size of the block, multiply it by the bit-width of the stream and read the corresponding number of bits directly from the stream
  7. Some years ago, I wrote some PHP code to convert YM files originally created for the Atari ST to an Intellivision format, along with a CP-1610 assembly player. I was recently asked to share this code, so I thought it would be better to make a public release here, in case other people are interested. The PHP code is pretty bad and not especially fast, but it gets the job done. A YM file basically consists of a large dump of the AY-3-8910 registers, compressed with the LHA algorithm. I'm using this program to unpack the data (the Windows built is included in the archive). The PHP script processes the raw data and re-compress it into the final Intellivision format. The output of this process is a .asm data file which is compatible with the player. If the 5th argument of the ymToIntv::process() method is set to true, it will also attempt to generate the player ROM file, provided that as1600 is available in the path. Again, a Windows environment is assumed, but it should be very easy to have it running in another OS (see ymToIntv::generateRom()). Some YM files include information about special PSG effects. Most of them rely on high-frequency interrupts. These effects are ignored, as the Intellivision would not be able to render them anyway. Consequently, not all YM files can be properly converted. YM files sometimes come in several versions. If possible, choose a version without Digidrums and without SID Voice. The following tunes are included as examples: Best part of the Creation by Gunnar Gaubatz Chambers of Shaolin by Jochen Hippel Crapman Anthems by Joe Maarten de Man Cuddly Demos / Big Sprite by Jochen Hippel Custodian by David Whittaker Decade Demo / Giga-Dist by Nic Alderton Ghouls'n Ghosts Theme by Tim Follin Hystanders 2 by Doclands Leaving Teramis by Jochen Hippel Line of Fire by Tao Primus by Scavenger Rectangular Waves by Nils Feske R-Type Intro by Wally Beben Sharpness Buzztone by Jean-Sébastien Gerard Virtual Escape by Furax Zynaps #1 by Dave Rogers ymToIntv.zip
  8. Just for the record, examples/library/memset.asm in Joe's SDK is doing exactly that, except it's unrolled 8 times. ;; ======================================================================== ;; ;; MEMSET Fill array with value ;; ;; MEMSET.1 Alternate entry point ;; ;; ;; ;; AUTHOR ;; ;; Joseph Zbiciak <intvnut AT gmail.com> ;; ;; ;; ;; REVISION HISTORY ;; ;; 08-Sep-2001 Initial Revision ;; ;; ;; ;; INPUTS for MEMSET ;; ;; R5 Pointer to invocation record, followed by return address. ;; ;; Pointer to destination 1 DECLE ;; ;; Value to fill with 1 DECLE ;; ;; Length 1 DECLE ;; ;; ;; ;; INPUTS for MEMSET.1 ;; ;; R5 Return address ;; ;; R4 Pointer to destination ;; ;; R1 Value to fill with ;; ;; R0 Length ;; ;; ;; ;; OUTPUTS ;; ;; R0 Zeroed ;; ;; R1 Fill value (unmodified) ;; ;; R4 Points one element beyond destination array ;; ;; R5 Zeroed ;; ;; ;; ;; TECHNIQUES ;; ;; Unrolled 8x for speed. ;; ;; Not-unrolled loop handles length % 8 != 0. ;; ;; ;; ;; CODESIZE ;; ;; 29 words ;; ;; ;; ;; CYCLES ;; ;; Not yet characterized. ;; ;; ======================================================================== ;; MEMSET PROC [email protected] R5, R4 ; 8 Destination array [email protected] R5, R1 ; 8 Fill value [email protected] R5, R0 ; 8 Length @@1: PSHR R5 ; 9 Alternate entry point MOVR R0, R5 ; 6 \ ANDI #7, R5 ; 8 |-- Handle length % 8 iters, BEQ @@l8_init ; 7/9 / if there are any. ;---- ; 54 Fallthru case ; 56 Branch taken @@loop_1: [email protected] R1, R4 ; 9 \ DECR R5 ; 6 |-- Store one value at a time. BNEQ @@loop_1 ; 9/7 / ;---- ; 24*k - 2 @@l8_init: SLR R0, 2 ; 8 \ SLR R0, 1 ; 6 |-- Divide trip count by 8. BEQ @@done ; 7/9 / Abort if it goes to 0. ;---- ; 21 Fallthru case @@loop_8: [email protected] R1, R4 ; 9 \ [email protected] R1, R4 ; 9 |__ Store four elements [email protected] R1, R4 ; 9 | [email protected] R1, R4 ; 9 / DECR R0 ; 6 (Interruptible) [email protected] R1, R4 ; 9 \ [email protected] R1, R4 ; 9 |__ Store four more elements [email protected] R1, R4 ; 9 | [email protected] R1, R4 ; 9 / BNEQ @@loop_8 ; 9/7 Iterate length/8 times ;---- ; 87*k - 2 @@done: PULR PC ; 11 Return ENDP
  9. What you're looking for, I think, is bank switching also known as page flipping. You're not really going to 'swap' the content of a ROM region with the content of another ROM region. Rather, you will make a given page appear at a given memory range, and this is a very fast operation. JLP supports ECS-style page flipping, which allows you to address up to ~120 K-words. However, I don't know if/how this is implemented in IntyBasic, so I'll let the experts explain that.
  10. The so-called 'SID voice' was (is) quite popular on the Atari ST, which also includes a clone of the PSG. It implements it by setting up a high frequency timer to change the volume register many times per second. At some point, I did some SID voice experiments on the Intellivision, but without much success. We are of course lacking a programmable timer and the CP-1610 is too slow to emulate one anyway.
  11. And by the way: can someone please explain me how to add spacing before/after code snippets in AtariAge? I just can't figure it out. ^^
  12. You can also do that in a browser console, using either FireBug or the built-in debugging tools which are usually accessible by pressing F12. [ 604, 570, 570, 570, 570, 570, 538, 538, 508, 339 ].map(function(n) { return '$' + n.toString(16); }).join(', ') (list shortened for readability) In recent versions of Firefox, the content of an alert box can be selected and copied to the clipboard (that may be true for other browsers but I don't know for sure). Therefore, you can also put that directly in the address bar of a non-blank page: javascript:alert([ 604, 570, 570, 570, 570, 570, 538, 538, 508, 339 ].map(function(n) { return '$' + n.toString(16); }).join(', ')) (You may have to add 'javascript:' manually. It gets automagically truncated after a copy/paste of the whole string, at least in my version of Firefox.)
  13. Ahahah! C'est vrai que ça sonne plutôt bien "Docteur Scalpel" ^^ Félicitations, Pascal!
  14. I don't think Bliss provides support for the .ROM format at all.
  15. Unfortunately, it's not quite so easy to run such a ROM on Bliss. It has a built-in ROM database and simply ignores ROM files that are not included in there. At least, it was working this way the last time I checked. (A long, long time ago.) That means you have to edit 'intellivision/cartridge/IntellivisionRecognitionDatabase.cpp' and re-build it. Either that or apply a patch that would make it accept all ROM files.
  • Create New...