Building a new AY player.

This forum is about audio tools, including samplers, sound trackers, sound chip editors, how to do sound effects, etc...
JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Building a new AY player.

Post by JamesD » Fri Nov 17, 2006 7:35 pm

I'm working on a new AY music/sound player. I'm not currently planning on writing a sound tracker. I think a current tracker could be used and the music could be extracted from it's output.

The music trackers I've looked at have one or more limitations that I feal make them unsuitable for use in a game program.

Some are very fast because they just dump data out to the AY registers but this requires a lot of data any you have little if any control over the playback besides start and stop.

Others offer excellent music playback with repeats and many other features but don't have any way of integrating sound effects unless you leave a channel unused just for the main game to use. They rarely offer really advanced manipulation of AY registers.

One thing that has been a problem on all these players is portability of music files. Many depend on inclusion of z80 or 68000 code in the file itself. While this may work well on a PC it's not exactly practical on all legacy hardware.

I plan on writing a player where you have small music files, advanced control over the music/sound and interaction with the parent program or game.


Warning, the following information gets pretty deep!

The idea behind this player is to give you more advanced sound and music control by integration of simple instructions with music data. The advanced comtrol is actually accomplished through a very simple virtual cpu where the opcodes can be easily emulated on any real cpu including a 6502.

(This info is subject to change)

The virtual cpu consists of 1 accumulator and a a block of memory locations for temporary storage. (I may add a 2nd accumulator)

There are a set of easy to emulate opcodes that the virtual cpu can execute. All addition, subtraction, etc... must take place in the accumulator and you load and store values in memory. (kinda like a 6502 without X and Y registers)
The size of the memory block can be varied to suit your needs and can be 0 to 255 bytes. Code for emulation of unused instructions could also be eliminated to save space for a program that doesn't use them.

The cpu is easy to emulate because opcodes are only even values. This way they can be used as a pointer into a jump table without manipulation of the opcode. The actual emulation is very similar to how a speccy emulator for the Amiga emulated the Z80.
The jump table is made up of pointers to stub routines that emulate each opcode. The music could also be compiled to native code to save a few clock cycles.

See the discussion below for a little more info.


Moved from the Space99 thread in the games section.
Twilighte wrote:
I'll write up a spec for the format. It's really a simple idea and shouldn't be tough to code. Music is part virtual machine instructions that can be used for loops, add, subtract, output to register on the AY, dump a block of data to the AY, wait, test, etc.
Now that sounds very interesting, i did a little of that idea in a tracker i had last been working on but never finished.
Based on an accumulative method, whereby the effects would not only sound but would also build a sort of data-dictionary or set of macros that could be linked at a later stage to create more complex sounds without losing memory efficiency.
A very simple example is the setting of note C. I would set the low and high values and also assign a value to these (Sort of a macro tag). This would then be referred to later instead of having to send the low and high bytes again.
Well... what I had in mind was part risk processor and part tracker data.
I figured a block of 16 bytes of RAM for storage and you can do something like this (notice there's 1 internal register and the notation is subject to change):

Code: Select all

start:
 clr      ; clear accumulator
 clr r1  ; clear ram 1
 clr r2  ; clear ram 2
 ld #255  ; load #1 into accumulator. 
loop1:
 out 1     ; output accumulator on port 1
 wait     ; wait until next interrupt
 dec        ; decrement accumulator
 bge loop1  ; branch if >=
 st r1      ;store accumulator in r1
 outb 3,00,00,01,00,02,00  ;output 3 pairs of bytes in register,value format

etc...

Instructions can be variable length with the first byte or opcode actually being the table offset to the address of the routine to process the opcode.
00 = clear accumulator
02 00 = clear r0
04 FF = load accumulator with 255
06 00 = load accumulator from r0
08 01 = load accumulator from r1

Or something along those lines. That leaves up to 128 opcodes minimum if we decode the opcodes something like this:
ldy (program_counter)
jmp (opcode_table),y

(yes, I had the limitations of the 6502 in mind when I came up with that)

then each routine carries out the opcode's functionality, advances the program counter and jumps back to decode the next instruction.

By forcing all operations to take place in the accumulator we only need to save the status bits when dealing with it.

Branches just change the program counter and jump back to process the next instruction.

Execution continues until instructed to wait for an interrupt or you encounter an end instruction. I have to work out the wait timing issues so it can wait for an interrupt of a time period.


The memory registers are globally visible you can modify them from the main program. For example, create an endless loop to keep repeating the music until a register = 0. Then the main program sets it to 0 to continue the next part of the song program. By using multiple tests and jumps you can have multiple songs in 1 program and just set the song number to gracefully finish one and start the next.
You could also include sound effects for background noise such as wind, machinery or whatever.

Since you can calculate AY register values or just dump out values it's very flexible.

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Fri Nov 17, 2006 9:07 pm

This is going to appear to ramble since I'm posting some of the info here before I put it in a complete document. I'll be editing and adding to the info as I go.


Data format.

I haven't even thought of file format, file headers or any of that so this will just deal with the music/virtual cpu instructions as they would appear linked directly to a program.

The format is actually the binary form of a program. Being a program it must start with instructions but how simple or complex is up to the programmer. The program/music file just appears as a block of data bytes that the player reads.

Each instruction is a single byte to make decoding as simple as the jump from the copied portion of the message above. Additional data required by that instruction follows as bytes of data. The number of bytes depends on the instruction. Loading the accumulator with a number would consist of a load accumulator instruction followed by a byte with the value to load for a total of 2 bytes. Outputting a block of data to the AY chip could be as simple as 4 bytes (opcode, # of bytes (1), register #, byte) or could be several K in size if you embed AY register dump music/sound data.


One added advantage of this type of play routine is that it could be used to play music on other types of sound hardware just by modification of the output routines. The virtual CPU doesn't care if you use an AY chip or OPL chip. If you keep chip specific data out of the code you could just change the music blocks to be dumped to the chip and the code would play them back under the same logic control.
So, modify a handfull of routines and the 6502 code works on any 6502 machine. The same would go for Z80, 6809, 680x0, etc...
That's the theory anyway.


Interaction with the parent program.

Since the block of RAM used by the virtual cpu uses is visible to the parent program you can modify that RAM. You could use different memory locations for different flags. The virtual cpu could test those memory locations for specific values to perform special audio tasks. Turn off one channel of music so the game can use that channel for sound effects, adjust the volume or tempo of the music, play a different block of music, play a sound effect on an audio channel or fade in/out the music.

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Sat May 23, 2009 1:28 am

In case anyone wonders what happened to this, the machine I was developing it on died from a power surge.
When I started to look back at the design to start over I felt the player took too many clock cycles to be interrupt driven.
It would make a very powerful stand alone music player with portable files but for games it wasn't practical. I should have posted an update sooner.

User avatar
Dbug
Site Admin
Posts: 2314
Joined: Fri Jan 06, 2006 10:00 pm
Location: Oslo, Norway
Contact:

Post by Dbug » Sat May 23, 2009 1:17 pm

JamesD wrote:In case anyone wonders what happened to this, the machine I was developing it on died from a power surge.
Arg, I feel the pain.

If it can help, you can use the Defence-Force SVN repository to store your source data.

It will not be anonymous, but at least it should be safe because people will replicate the code on their own machine when they update :)

The repository is located here: http://miniserve.defence-force.org/svn/

Send me a mail or private message with the login and password you wish to use for the server (ideally the login should be something like "jamesd" or similar so I can remember who's who when administering).

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Sun May 24, 2009 11:11 pm

I'll eventually have to take you up on that.

For now I'll just post what I wrote this morning right here.
The assembler syntax isn't 100% correct so don't yell because it doesn't assemble yet. Shouldn't take much work to get it going though. No promise all the address modes are right either, it's been ages since I've used the 6502.

It's a music player I ported from a Z80 program for the Aquarius (it may have originated somewhere else), to the 6803 on the MC-10. I did it for a sound upgrade I'm working on. I also ported it to the 6809 & Speech & Sound Pak. I figured while I was at it I'd hit the 6502 and Oric.
(I think I removed all the 6803 code)

Since the player originated somewhere else I wouldn't be surprised if it already exists for the Oric. But hey, it's well documented and a work in process but not bad for a few hours work.

It includes the song data from the Aquarius version. The original file was named "FOREST.asm" or something similar.

I use tabs with a size of 8 in my editor.

Known issues:
Uses equ and I couldn't find support for that in XA
Needs an address defined for the song pointer on page zero
Needs an org address
Doesn't save/restore current VIA settings yet
Might be optimised
May include illegal opcodes or addressing modes
Never been assembled or tested.
I've never written an Oric program before, for all I know I could be programming a VCR.
<edit> _reglop was in the wrong place when I first posted the code
<edit> the code doesn't use labels for VIA registers in the section that talks to the AY sound chip. I'll fix that later.

<edit> I fixed syntax issues, changed remaining VIA accesses to defined labels, and fixed an address mode issue. The code assembles but I still need to locate the main body of code somewhere and properly locate the page zero song pointer. At this point I could use some input and it's about ready to test.

<edit> Commented out 65C02 instructions and added 6502 code. Oops.

<edit> Final syntax fixes, builds to tape file with OSDK

<edit> fully working, added header, added some ifdef logic

<edit> Changed how interrupt is installed/removed. BASIC now works properly on exit. Bumped the date in the header.

<edit> Just realized the non-Oric AY registers are still reversed like the 6803 code. That would be accomplished on real hardware by inverting the A0 line. It makes sense on the 6803 since it has a 16 bit register D which can load/store the register number and data with 1 instruction each, but it makes no sense on the 6502 so I changed it back.

Code: Select all

;*************************************************************
;* FILE: Forest.s
;*************************************************************
;* Description:
;*  Simple music player for the ORIC 1 & Oric Atmos.
;*  Based on a Z80 program I found with the Virtual Aquarius emulator (I think)
;*  Uses VIA timer to trigger the interrupt,
;*  other machines may use the vertical blank interrupt.
;*  Designed for the General Instruments AY sound chip but will work
;*  with any sound chip with an internal address register and a data register.
;*  This software is in the public domain.
;*
;* Song Data Format:
;*	;wait, number of registers to change,
;*	;	register number, new value
;*	;	register number, new value
;*	;	etc.
;*	; ends when number of registers to change is 0.
;*
;* Author: J D
;* Date: May 29, 2009
;* Version:
;************************************************************* 

; set build conditions here
;#define USE_C02	1	; define to use 65C02 instructions
#define USENTSC		1	; define to use NTSC VIA Timer settings
#define ORICAY		1	; Use Oric VIA mapped AY chip, otherwise memory mapped AY

;*
#ifndef ORICAY
#define AYBase	$0000		; Put base address of memory mapped AY Chip here
#endif

#ifndef	USENTSC
#define	VBLVIA	$4E00		; VIA Timer Latch, settings matching PAL 50Hz
#else
#define	VBLVIA	$4100		; VIA Timer Latch, settings matching NTSC 60Hz
#endif

#define	IRQloc	$024A		; IRQ handler address

; VIA register definitions
#define	VIA_T1C	$0304		; Read/Write Counter Low-High T1
#define	VIA_T1L	$0306		; Read/Write Latch Low-High T1
#define	VIA_PCR	$030C		; Peripheral Control Register
#define	VIAIORA	$030F		; Printer/Sound/Joystick (No Handshake)


	.zero			; page zero variables
	*=	$007C		; start at $7C, right after OSDK reserved space
song	.dsb	2,$00		; page zero song pointer

	.text			; start of code segment
	*=	$0600		; start address of code
START				; just so we have the start address in the list file
_main
;==================
; playsong,
;	play a song located at songstart
;	based on Z80 Aquarius version by James the Animal Tamer
;	ORIC 6502 XA source port by J D
; NOTE- uses timer interrupt rather than TOF interrupt despite code comments

playsong
	; save registers
	pha
#ifdef	USE_C02
	phx			;65c02
	phy			;65c02
#else
	txa
	pha
	tya
	pha
#endif	

;save VIA settings?


; clear the interrupt counter
	lda	#0		; clear the interrupt handler counter
	sta	_VblCounter

	; set the start address of the song
	lda	#<songstart
	sta	song
	lda	#>songstart
	sta	song+1

; set up a VIA timer for our interrupt
	sei			; disable interrupts

	lda	VIA_T1L		; get contents of VIA_T1 and save for exit
	sta	VIASAVE
	lda	VIA_T1L+1
	sta	VIASAVE+1

	lda	#<VBLVIA	; Set our own VIA_T1 value for 50Hz or 60Hz
	sta	VIA_T1L
	lda	#>VBLVIA
	sta	VIA_T1L+1

	;add our interrupt handler in place of rti on 6502 mem page 2
	lda	#$4C		; JMP instruction
	sta	IRQloc
	lda	#<_VBLIrq	; address of our interrupt handler
	sta	IRQloc+1
	lda	#>_VBLIrq
	sta	IRQloc+2
	cli			; enable interrupts

	;start of player
playline
	ldy	#1		; offset from song pointer, Y must be used for this addressing mode
	lda	(song),y	; get number of registers to modify
	beq	playsongend	; check for end of song
#ifdef	USE_C02
	lda	(song)		; get wait in A (65c02)
#else
	dey
	lda	(song),y	; get wait in A
	iny
#endif
	tax			; move the counter to X
	jsr	waittof		; wait top of frame, A times

;6502 ORIC AY Control using the VIA 6522 makes this slower than memory mapped AY chip
	lda	(song),y	; get number of registers to modify in A
	tax			; put it in X
	iny			; next byte in song

_reglop
	lda	(song),y	; get the register number to modify
#ifdef	ORICAY
	sta	VIAIORA		; set the AY data register number
	lda	#$FF		; $FF = VIAIORA holds a register number
	sta	VIA_PCR		; Set the VIA 6522 control line Register(PCR)
	lda	#$DD		; $DD = VIAIORA is inactive 
	sta	VIA_PCR		; Set the VIA 6522 control line Register(PCR)
#else
	sta	AYBase+1		; set the AY data register number
#endif
	iny			; point to next byte in song
	lda	(song),y	; get the Value for the AY register
#ifdef	ORICAY
	sta	VIAIORA		; load the data register value
	lda	#$FD		; $FD = VIAIORA holds data for a preset register 
	sta	VIA_PCR		; Set the VIA 6522 control line Register(PCR)
	lda	#$DD		; $DD = VIAIORA is inactive
	sta	VIA_PCR		; Set the VIA 6522 control line Register(PCR)
#else
	sta	AYBase	; load the data register value
#endif
	iny			; point to next byte in song
	dex			; decrement the register count
	bne	_reglop		; keep looping if not done setting registers


; update the pointer (16 bit song pointer + 8 bit addition)
; (songLSB + y, songMSB + carry)
	clc			; clear the carry for out 16 bit addition
	tya			; put pointer offset in A
	adc	song		; add low byte (LSB)
	sta	song		; update low byte
	lda	#0		; clear A
	adc	song+1		; add carry to high byte (MSB)
	sta	song+1		; update the song pointer
#ifdef	USE_C02
	bra	playline	; continue playing (65c02)
#else
	clc
	bcc	playline	; continue playing
#endif
	;---

playsongend
	;stop sound?
	sei			; disable interrupts

	;restore previous VIA timer
	lda	VIASAVE
	sta	VIA_T1L
	lda	VIASAVE+1
	sta	VIA_T1L+1

	; remove our interrupt handler
	lda	#$40		; RTI instruction
	sta	IRQloc
	cli			; enable interrupts

	; restore registers we saved
#ifdef	USE_C02
	ply			; 65c02
	plx			; 65c02
#else
	pla
	tay
	pla
	tax
#endif
	pla

	rts			; return 


;==================
; waittof,
;	wait top of frame, a times
;	preserve registers
waittof
loop_wait
	lda	_VblCounter
	beq	loop_wait
	lda	#0
	sta	_VblCounter
	dex			; decrement the counter
	bne	loop_wait
	rts


;==================
; our interrupt handler
_VBLIrq
	bit	VIA_T1C
	inc	_VblCounter
	rti
;SVect	jmp	$0000		; rti by calling old interrupt handler

codeend
	
;	.bss			; start of the bss data segment
;==================
; variables we change
_VblCounter	.byt	0	; TOF flag variable
;SVect	.byt	00,00		; to save old interrupt vector info
VIASAVE	.byt	00,00
;	.data			; start of data segment
;==================
songstart
	; rem  song
	; rem wait, number of registers to change,
	;	register number, new value
	;	register number, new value
	;	etc.
	; ends when number of registers to change is 0.
	.byt	1,4,8,0,9,0,10,0,7,56
	;-- snip
	.byt	1,3,0,221,1,1,8,15
	.byt	14,1,8,0
	.byt	1,3,0,250,1,1,8,15
	.byt	14,1,8,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	 14,1,9,0
	.byt	1,7,8,0,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	29,2,8,0,9,0
	.byt	1,6,0,251,1,4,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	29,2,8,0,9,0
	.byt	1,6,0,251,1,4,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,236,3,5,9,15
	.byt	14,1,8,0
	.byt	1,3,0,89,1,2,8,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	29,2,8,0,9,0
	.byt	1,3,0,246,1,2,8,15
	.byt	29,1,8,0
	.byt	1,3,0,236,1,5,8,15
	.byt	29,1,8,0
	.byt	1,3,0,221,1,1,8,15
	.byt	14,1,8,0
	.byt	1,3,0,250,1,1,8,15
	.byt	14,1,8,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	13,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	13,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,123,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,251,1,4,8,15,2,62,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,83,1,3,8,15,2,123,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,187,1,3,8,15,2,221,3,1,9,15
	.byt	29,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,112,3,4,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,246,3,2,9,15
	.byt	14,1,8,0
	.byt	1,3,0,250,1,1,8,15
	.byt	14,1,8,0
	.byt	1,7,0,221,1,1,8,15,9,0,2,151,3,5,9,15
	.byt	14,1,8,0
	.byt	1,3,0,169,1,1,8,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,251,1,4,8,15,2,62,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,83,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,187,1,3,8,15,2,123,3,1,9,15
	.byt	29,1,8,0
	.byt	1,7,0,221,1,1,8,15,9,0,2,244,3,3,9,15
	.byt	14,1,8,0
	.byt	1,3,0,250,1,1,8,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,251,1,4,8,15,2,62,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,83,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,187,1,3,8,15,2,221,3,1,9,15
	.byt	29,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,112,3,4,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,246,3,2,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	14,1,8,0
	.byt	1,7,0,89,1,2,8,15,9,0,2,236,3,5,9,15
	.byt	14,1,8,0
	.byt	1,3,0,250,1,1,8,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,236,3,5,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	29,2,8,0,9,0
	.byt	1,3,0,221,1,1,8,15
	.byt	14,1,8,0
	.byt	1,3,0,250,1,1,8,15
	.byt	14,1,8,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,251,1,4,8,15,2,62,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,83,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,187,1,3,8,15,2,221,3,1,9,15
	.byt	28,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,221,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	13,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,123,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,251,1,4,8,15,2,62,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,83,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,187,1,3,8,15,2,123,3,1,9,15
	.byt	28,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,221,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,251,1,4,8,15,2,62,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,83,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,187,1,3,8,15,2,221,3,1,9,15
	.byt	29,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,236,1,5,8,15,2,89,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,236,3,5,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,112,3,4,9,15
	.byt	29,2,8,0,9,0
	.byt	30,6,0,83,1,3,8,15,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,123,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,56,1,2,8,15,2,169,3,1,9,15
	.byt	14,1,8,0
	.byt	1,4,9,0,2,125,3,2,9,15
	.byt	15,6,0,251,1,4,8,15,4,62,5,1,10,15
	.byt	14,1,10,0
	.byt	1,4,9,0,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,244,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,1,8,0
	.byt	1,7,0,123,1,1,8,15,9,0,2,187,3,3,9,15
	.byt	14,1,8,0
	.byt	1,3,0,169,1,1,8,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,187,1,3,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,62,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,83,1,3,8,15,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,123,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,56,1,2,8,15,2,169,3,1,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	14,1,9,0
	.byt	1,6,2,236,3,5,9,15,4,123,5,1,10,15
	.byt	14,2,8,0,10,0
	.byt	1,3,0,169,1,1,8,15
	.byt	13,2,8,0,9,0
	.byt	1,9,0,179,1,4,8,15,2,246,3,2,9,15,4,221,5,1
	.byt	10,15
	.byt	13,1,10,0
	.byt	1,3,4,250,5,1,10,15
	.byt	13,3,8,0,9,0,10,0
	.byt	1,6,0,112,1,4,8,15,2,221,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,56,1,2,8,15,2,246,3,2,9,15
	.byt	13,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	28,2,8,0,9,0
	.byt	1,3,0,123,1,1,8,15
	.byt	13,1,8,0
	.byt	1,3,0,62,1,1,8,15
	.byt	13,1,8,0
	.byt	1,6,0,83,1,3,8,15,2,101,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,123,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,56,1,2,8,15,2,169,3,1,9,15
	.byt	13,1,8,0
	.byt	1,4,9,0,2,125,3,2,9,15
	.byt	14,6,0,251,1,4,8,15,4,62,5,1,10,15
	.byt	13,2,9,0,10,0
	.byt	1,3,2,101,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,123,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,187,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,123,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,169,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,221,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,151,1,5,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,203,1,2,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,236,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,89,3,2,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	30,2,8,0,9,0
	.byt	32,6,0,83,1,3,8,15,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,123,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,56,1,2,8,15,2,169,3,1,9,15
	.byt	14,1,8,0
	.byt	1,4,9,0,2,125,3,2,9,15
	.byt	15,6,0,251,1,4,8,15,4,62,5,1,10,15
	.byt	14,1,10,0
	.byt	1,4,9,0,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,244,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,1,8,0
	.byt	1,7,0,123,1,1,8,15,9,0,2,187,3,3,9,15
	.byt	14,1,8,0
	.byt	1,3,0,169,1,1,8,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,187,1,3,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,62,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,83,1,3,8,15,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,123,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,56,1,2,8,15,2,169,3,1,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	14,1,9,0
	.byt	1,6,2,236,3,5,9,15,4,123,5,1,10,15
	.byt	14,2,8,0,10,0
	.byt	1,3,0,169,1,1,8,15
	.byt	13,2,8,0,9,0
	.byt	1,9,0,179,1,4,8,15,2,246,3,2,9,15,4,221,5,1
	.byt	10,15
	.byt	13,1,10,0
	.byt	1,3,4,250,5,1,10,15
	.byt	13,3,8,0,9,0,10,0
	.byt	1,6,0,112,1,4,8,15,2,221,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,56,1,2,8,15,2,246,3,2,9,15
	.byt	13,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	29,2,8,0,9,0
	.byt	1,3,0,123,1,1,8,15
	.byt	13,1,8,0
	.byt	1,3,0,62,1,1,8,15
	.byt	13,1,8,0
	.byt	1,6,0,83,1,3,8,15,2,101,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,123,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,56,1,2,8,15,2,169,3,1,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	14,1,9,0
	.byt	1,6,2,251,3,4,9,15,4,62,5,1,10,15
	.byt	13,2,8,0,10,0
	.byt	1,3,0,101,1,1,8,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,187,1,3,8,15,2,123,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,123,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,123,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,169,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,221,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,151,1,5,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,236,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,89,3,2,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	30,2,8,0,9,0
	.byt	32,3,0,221,1,1,8,15
	.byt	14,1,8,0
	.byt	1,3,0,250,1,1,8,15
	.byt	14,1,8,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,251,1,4,8,15,2,62,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,83,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,1,9,0
	.byt	1,7,8,0,0,187,1,3,8,15,2,221,3,1,9,15
	.byt	28,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,112,3,4,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,251,1,4,8,15,2,62,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,83,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,187,1,3,8,15,2,123,3,1,9,15
	.byt	28,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,221,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	13,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	14,2,8,0,9,0
	.byt	1,6,0,203,1,2,8,15,2,123,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,251,1,4,8,15,2,62,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,101,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,83,1,3,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,187,1,3,8,15,2,221,3,1,9,15
	.byt	28,2,8,0,9,0
	.byt	1,6,0,244,1,3,8,15,2,221,3,1,9,15
	.byt	13,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,112,1,4,8,15,2,56,3,2,9,15
	.byt	13,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,56,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,125,3,2,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,236,1,5,8,15,2,89,3,2,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,246,1,2,8,15,2,123,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,169,3,1,9,15
	.byt	13,2,8,0,9,0
	.byt	1,6,0,151,1,5,8,15,2,221,3,1,9,15
	.byt	14,1,9,0
	.byt	1,3,2,250,3,1,9,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,236,3,5,9,15
	.byt	14,1,8,0
	.byt	1,3,0,125,1,2,8,15
	.byt	14,1,8,0
	.byt	1,7,0,56,1,2,8,15,9,0,2,112,3,4,9,15
	.byt	30,2,8,0,9,0
	;--	unsnip
	.byt	1,3,8,0,9,0,10,0
	.byt	0,0
;===	end	of	song

dataend				; so we have the end of the data in the list file
	
	;.end
Last edited by JamesD on Sun Jan 12, 2014 1:09 am, edited 13 times in total.

jede
Pilot Officer
Posts: 119
Joined: Tue Mar 14, 2006 11:53 am
Location: France

Post by jede » Sun May 24, 2009 11:37 pm

Hello,

for your problem with XA and equ

You can use that :

#define TOTO $80

lda #$10
sta TOTO
rts

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Sun May 24, 2009 11:52 pm

Ok, switched to #define and used defined labels for the other VIA registers.
I'll need to know what is safe to use on page 0 and what address to use for the ORG address before I do more than assemble it... which I still haven't done.

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Sun May 24, 2009 11:59 pm

Oh yeah, waittof doesn't wait for a top of frame interrupt. It waits for the timer interrupt. One advantage to the timer is it could be adjusted to match the source machine of the music. In this case I'm guessing it was NTSC so it would need to be set to match the 60Hz rate.

Perhaps the rate could be added to the front of the song data so machines with timers could match the song being played.

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Mon May 25, 2009 5:10 am

The code should be ready to test, I just need to adjust the page 0 and code start addresses. I updated the listing above.
The only change I know I need to make is saving/restoring the VIA settings.

<groan>
I spent more time learning XA syntax, setting up tools, etc... than I did writing the actual program. It's only had a few bugfixes since the first post earlier today. 1 logic (misplaced label) and 1 an illegal 6502 instruction. Each only took a few seconds to fix. The rest was all assembler syntax, label changes and comments.

Have I mentioned XA crashes way too easily?
Ok, I'm done complaining... for now. :)

Feel free to play with it... fix it... break it... insult the programmer...

User avatar
Dbug
Site Admin
Posts: 2314
Joined: Fri Jan 06, 2006 10:00 pm
Location: Oslo, Norway
Contact:

Post by Dbug » Mon May 25, 2009 6:08 pm

JamesD wrote:Have I mentioned XA crashes way too easily?
Actually, if you can send me minimal 100% reproducable cases of XA crashing, I would be very happy !

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Mon May 25, 2009 6:42 pm

Dbug wrote:
JamesD wrote:Have I mentioned XA crashes way too easily?
Actually, if you can send me minimal 100% reproducable cases of XA crashing, I would be very happy !
Oh... NOW you tell me! LOL

I think I had an .org statement in the code that was causing the crash. I'm guessing unknown assembler directives.

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Wed May 27, 2009 7:46 pm

I haven't had time to test the code yet but I realized I used a 65C02 instructions/addressing modes in several places.
I learned 6502 on a Apple IIe with a 65c02. What a difference a handful of instructions makes. I commented out the c02 stuff but left it inline with the fixes.

It can be assembled with the following command:
xa -C forest.a65

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Wed May 27, 2009 8:55 pm

OSDK issues...

"errors durink link"
"You should have a OSDK environment variable setted to the location of the SDK"


Durink? Setted?

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Wed May 27, 2009 9:53 pm

The first sound is output and then it seems to go to never never land. I'm messing up the song pointer or the via settings. I'll fix it later.

JamesD
Flight Lieutenant
Posts: 352
Joined: Tue Nov 07, 2006 7:38 am

Post by JamesD » Wed May 27, 2009 10:34 pm

commenting out the .bss and .data segment labels fixed it. The song data wasn't being included in the tap file.
The code above works now.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest