# Ami_Square_Wave.py
#
# DEMO to generate an audio tone from one of the classic AMIGA audio
# channels, in this case a square wave. Almost any waveform is possible
# and the Left Mouse Button is used to STOP this DEMO.
#
# MINIMUM Requirements Are:-
# 68EC020 CPU and 2MB RAM total, example, a standard A1200(HD),
# WinUAE and E-UAE. Standard AMIGA OS3.0x install or better.
# Full Python 1.4.0, minimum, installed, can be found on AMINET.
# (Python 1.5.2 to 2.0.x are also available on AMINET.)
# (Now Python 2.4.6 is available for advanced 68K machines.)
#
# To install just download the file and drag this file into an Assign(ed)
# PYTHON: volume...
# From an AMIGA A1200(HD), E-UAE or WinUAE Python 1.4.0 prompt:-
#
# >>> execfile("PYTHON:Ami_Square_Wave.py")
#
# And away you go...
# ==========================================================================
# The DEMO assembly code that will be compiled and converted.
# Call the code beep.asm...
# From a CLI and using the a68k and blink from AMINET:-
#
# Prompt> a68k beep.asm
# Some reports here...
# Prompt> blink beep.o
# Some reports here...
#
# This code is TOTALLY, even address, position independent.
# ==========================================================================
# start:
# ;"beep.asm" test code...
# movem.l d0-d7/a0-a6,-(sp) ;Save all registers just in case.
# movea.l $4,a6 ;Set ~execbase~.
# moveq #16,d0 ;Length of square wave data.
# moveq #2,d1 ;Set to chip ram.
# jsr -198(a6) ;Allocate memory for the task.
# beq.s getout ;On error, Quit.
# move.l d0,a0 ;Set address in chip ram.
# move.l #$3f3f3f3f,(a0) ;Set first four bytes of sixteen.
# addq.l #4,a0 ;Move addres by four.
# move.l #$3f3f3f3f,(a0) ;Set next four bytes of sixteen.
# addq.l #4,a0 ;Move addres by four.
# move.l #$80808080,(a0) ;Set next four bytes of sixteen.
# addq.l #4,a0 ;Move addres by four.
# move.l #$80808080,(a0) ;Set last four bytes of sixteen.
# ;This ensures absolute position
# ;independence.
# lea $dff000,a5 ;Set HW register base.
# move.w #$000f,$96(a5) ;Disable audio DMA.
# move.l d0,$a0(a5) ;Set address of audio data.
# move.w #8,$a4(a5) ;Set length in words.
# move.w #64,$a8(a5) ;Set volume to maximum.
# move.w #220,$a6(a5) ;Set the period.
# move.w #$00ff,$9e(a5) ;Disable any modulation.
# move.w #$8201,$96(a5) ;Enable audio DMA, 1 channel only.
# wait:
# btst #6,$bfe001 ;If LMB pressed then Quit.
# beq.s closeme ;Do it.
# bne.s wait ;Play the tone until LMB pressed...
# closeme:
# move.w #$000f,$96(a5) ;Disable audio DMA.
# move.l d0,a0 ;Address of the square wave data.
# moveq #16,d0 ;The data length to recover.
# jsr -210(a6) ;Free assigned memory.
# getout:
# movem.l (sp)+,d0-d7/a0-a6 ;Restore all registers.
# clr.l d0 ;Set returm code OK.
# rts
# nop
# even
# end
# ==========================================================================
# The text HEX file to be edited for the Python code:-
#
# Prompt> Type HEX beep > beep.hex
#
# Gives a text file "beep.hex" that has the contents:-
# ==========================================================================
# 0000: 000003F3 00000000 00000001 00000000 ...ó............
# 0010: 00000000 00000021 000003E9 00000021 .......!...é...!
# 0020: 48E7FFFE 2C780004 70107202 4EAEFF3A Hç.þ,x..p.r.N®.:
# 0030: 67682040 20BC3F3F 3F3F5888 20BC3F3F gZ @ Å’????X. Å’??
# 0040: 3F3F5888 20BC8080 80805888 20BC8080 ??X. Å’....X. Å’..
# 0050: 80804BF9 00DFF000 3B7C000F 00962B40 ..Kù.ßð.;|....+@
# 0060: 00A03B7C 000800A4 3B7C0040 00A83B7C . ;|...€;|.@.š;|
# 0070: 00DC00A6 3B7C00FF 009E3B7C 82010096 .Ü.Š;|....;|....
# 0080: 08390006 00BFE001 670266F4 3B7C000F .9...¿à .g.fô;|..
# 0090: 00962040 70104EAE FF2E4CDF 7FFF4280 .. @p.N®..Lß..B.
# 00A0: 4E754E71 000003F2 NuNq...ò
# ==========================================================================
# With careful manipulation of the Python code you could have control of the
# audio levels, channels, frequency, etc, using this method...
#
# Enjoy finding simple solutions to often very difficult problems...
#
# $VER: Ami_Square_Wave.py_Version_0.00.30_(C)2007-2011_B.Walker_G0LCU.
#
# Original copyright, (C)2007-2011, B.Walker, G0LCU. Now finally issued as Public Domain.
import os
# Manually place the executable code into practical binary string lengths.
one="\x00\x00\x03\xF3\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00"
two="\x03\xE9\x00\x00\x00\x21\x48\xE7\xFF\xFE\x2C\x78\x00\x04\x70\x10\x72\x02\x4E\xAE\xFF\x3A\x67\x68\x20\x40\x20\xBC"
wave="\x3F\x3F\x3F\x3F\x58\x88\x20\xBC\x3F\x3F\x3F\x3F\x58\x88\x20\xBC\x80\x80\x80\x80\x58\x88\x20\xBC\x80\x80\x80\x80"
three="\x4B\xF9\x00\xDF\xF0\x00\x3B\x7C\x00\x0F\x00\x96\x2B\x40\x00\xA0\x3B\x7C\x00\x08\x00\xA4\x3B\x7C\x00"
volume="\x40"
four="\x00\xA8\x3B\x7C\x00\xDC\x00\xA6\x3B\x7C\x00\xFF\x00\x9E\x3B\x7C\x82\x01\x00\x96\x08\x39\x00\x06\x00\xBF"
five="\xE0\x01\x67\x02\x66\xF4\x3B\x7C\x00\x0F\x00\x96\x20\x40\x70\x10\x4E\xAE\xFF\x2E\x4C\xDF\x7F\xFF\x42\x80"
six="\x4E\x75\x4E\x71\x00\x00\x03\xF2"
# Clear the screen the standard AMIGA way... ;o)
print "\f"
# A simple user screen...
print "1 KHz Square Wave Generator for the classic AMIGA A1200."
print "Using standard text mode Python 1.4.0 to 2.0.1.\n"
print "(C)2007-2011, B.Walker, GOLCU. Issued as Public Domain...\n"
# Show how to change output, (volume), level...
vol=raw_input("Set output level, 0 to 64:- ")
# Don't allow any errors...
if vol=="": vol="64"
if len(vol)>=3: vol="64"
count=0
while count<=(len(vol)-1):
if vol[count]>=chr(48) and vol[count]<=chr(57): count=count+1
else: vol="64"
if eval(vol)>=64: vol="64"
if eval(vol)<=0: vol="0"
volume=chr(eval(vol))
# Put them all together as a single binary string.
amiga_exe_file=one+two+wave+three+volume+four+five+six
# Generate a file called SquareWave inside the S: VOLUME and write to the disk.
amigafile=open("S:SquareWave","wb+")
amigafile.write(amiga_exe_file)
amigafile.close()
# Give a short delay to allow system to settle.
os.system("C:Wait 1")
print "\nPress Left Mouse Button to stop...\n"
# Ensure the file SquareWave can be executed.
os.system("C:Protect S:SquareWave rwed")
# Now run it.
os.system("S:SquareWave")
print "This DEMO has now stopped..."
# Ami_Square_Wave.py end...
# Enjoy finding simple solutions to often very difficult problems.