REM Original Copyright (C)2002 Barry Walker, G0LCU.
REM Compiled under ~ACE Basic Compiler~, (C) David Benn.
REM A simple pulse generator.
  WINDOW 1,"             A SIMPLE PULSE GENERATOR, (C) B.Walker, (G0LCU).              ",(0,0)-(640,200),12
  FONT "topaz.font",8
  COLOR 1,0
  CLS
  ON WINDOW GOTO cleanup:
  WINDOW ON


REM Set up variabes.
  LET addr&=ALLOC(1024,0)
  LET pulseaddr&=addr&
  LET n=0
  FOR n=0 TO 1023
  LET addr&=(pulseaddr&+n)
  POKE addr&,127
  NEXT n
  POKE pulseaddr&,-127
  LET a$="(C) B.Walker, (G0LCU)."
  LET freq=1000
  LET period=INT(3563220/(16*freq))
  POKE 12574721,254                       'Disable audio filter.

REM Set up the screen.
screen_setup:
  LOCATE 3,22
  PRINT "CONNECT TO THE LEFT AUDIO SOCKET."
  LOCATE 6,24
  PRINT "Press the letter in brackets:-"
  LOCATE 7,24
  PRINT "------------------------------"
  LOCATE 9,24
  PRINT "(i) Increase frequency (coarse)."
  LOCATE 10,24
  PRINT "(I) Increase frequency (fine)."
  LOCATE 11,24
  PRINT "(d) Decrease frequency (coarse)."
  LOCATE 12,24
  PRINT "(D) Decrease frequency (fine)."
  LOCATE 13,24
  PRINT "(q) or (Q) Quit the program." 
  LOCATE 16,24
  PRINT "PULSE OUTPUT FREQUENCY"
  LOCATE 21,3
  PRINT "Designed frequency range 5Hz to 5KHz, useful frequency range 1Hz to 6.5Khz."

REM Generate an audio tone.
  POKEW 14676118,15                       'Switch off audio dma.
  POKEL 14676128,pulseaddr&               'Set address to chip ram.
  POKEW 14676132,8                        'Number of words in data sample.
  POKEW 14676134,period                   'Period of sampling time.
  POKEW 14676136,64                       'Volume max 64, min 0.
  POKEW 14676126,255                      'Disable any other modulation.
  POKEW 14676118,33281                    'Enable sound on CH1.


key_hold:
  LET a$=INKEY$
  IF a$="q" THEN GOTO cleanup:
  IF a$="Q" THEN GOTO cleanup:
  IF a$="i" THEN LET freq=freq+50
  IF a$="I" THEN LET freq=freq+1
  IF a$="d" THEN LET freq=freq-50
  IF a$="D" THEN LET freq=freq-1
  IF freq<1 THEN LET freq=1
  IF freq>6500 THEN LET freq=6500
  LOCATE 16,46
  PRINT freq;"Hz.";" "
  IF freq>1760 THEN GOTO band0:
  IF freq>440 THEN GOTO band1:
  IF freq>110 THEN GOTO band2:
  GOTO band3:
  GOTO key_hold:
band0:
  LET period=INT(3563220/(4*freq))
  POKEL 14676128,pulseaddr&
  POKEW 14676132,2
  POKEW 14676134,period
  POKEW 14676136,64
  GOTO key_hold:
band1:
  LET period=INT(3563220/(16*freq))
  POKEL 14676128,pulseaddr&
  POKEW 14676132,8
  POKEW 14676134,period
  POKEW 14676136,64
  GOTO key_hold:
band2:
  LET period=INT(3563220/(64*freq))
  POKEL 14676128,pulseaddr&
  POKEW 14676132,32
  POKEW 14676134,period
  POKEW 14676136,64
  GOTO key_hold:
band3:
  LET period=INT(3563220/(256*freq))
  POKEL 14676128,pulseaddr&
  POKEW 14676132,128
  POKEW 14676134,period
  POKEW 14676136,64
  GOTO key_hold:


REM This turns off the audio.
cleanup:
  POKEW 14676118,15                       'Turn off audio DMA.
  POKE 12574721,252                       'Turn on filter.
  CLEAR ALLOC
  WINDOW CLOSE 1
  END
