open       =  -30
close      =  -30  -6
read       =  -30  -12
openlibrary   =  -30  -378
closelibrary = -414
output     =  -30  -30
write      =  -30  -18
execbase   =  4
Open_old   = 1005
Maxsnd     = $130161
SndBuffer  = $35000
start:
move.l execbase,a6
lea.l dosname,a1
jsr openlibrary(a6)
move.l d0,dos_base
move.l d0,a6
move.l #filename,d1
move.l #1005,d2
jsr open(a6)
beq prg_end
move.l d0,disk
weiter:
move.l #disk_buf,d2
move.l #8,d3
;
move.l disk,d1
jsr read(a6)
;
beq.l prg_end
jsr output(a6)
move.l d0,d1
move.l #disk_buf,d2
moveq #$08,d3
jsr write(a6)
bne.l weiter
move.l disk,d1
jsr close(a6)
prg_end:
;
; ---- Program Entry Point !
Load_Sound:
  move.l sp,initialSP
  move.l dos_base,a6
;---- Load Digitized Data in ram
    move.l #SoundName,d1
  move.l #OPEN_OLD,d2
  jsr    Open(a6)
  move.l d0,d7
  move.l d0,d1
  move.l #SndBuffer,d2
  move.l #MaxSnd,d3
  jsr    Read(a6)
  lsr.l  #1,d0
  move.w d0,SndLen  ; len in words 
  move.l d7,d1
  jsr    Close(a6)
  move.l dos_base,a1
  move.l ExecBase,a6
  jsr    CloseLibrary(a6)
  Start_Sound:
; ---- setup system interrupts
  move.l $70,OldVector
  move.l #SndHandler,$70
  move.w #$0080,$dff09c
  move.w #$8080,$dff09a
; ---- setup sound registers
  move.w #497,$dff0a6
  move.w #1,timer
; ---- main sound loop
  lea $dff000,a0
loop:
    move.l d0,$0180(a0)
    move.l #$0555,$0180(a0)
nop  
andi.b #$40,$bfe001 
  beq stopsnd
  jsr fire
  move.l d0,$0180(a0)  
jmp loop
; --- start sound
fire:
  move.l #SndBuffer,$dff0a0  ; location register
  move.w SndLen,$dff0a4
  move.w #64,$dff0a8 ; volume
  move.w #$8001,$dff096
  move.l #10,d1
  rts
; --- end of sound
stopsnd:
  move.w #$0001,$dff096
  move.w #$0080,$dff09a
  move.l OldVector,$70
  move.l initialSP,sp
ILLEGAL
;ENDE
rts
; --- Wait one scan line
waitlin:
  move.w $dff006,d0
  lsr.w #8,d0
wi1:
  move.w $dff006,d1
  lsr.w #8,d1
  cmp.w d0,d1
  beq.s wi1
  rts
; --- Interrupt Sound Handler
SndHandler:
  move SR,-(sp)
  move.l d0,-(sp)
  btst  #7,$dff01f
  beq.s weg
  move.w #$0080,$dff09c
; -- play sound
  subq.w #1,timer
  bpl.s weg
  move.w #$0001,$dff096
  move.w #1,timer
 weg:
  bchg  #1,$bfe001
  move.l (sp)+,d0
  move (sp)+,SR
  rte
; --- Data area
SoundName: DC.B 'df1:ATOM/Futu',0
  even
DosName: DC.B 'dos.library',0
  even
Filename: dc.b 'Atom-Text',0
  even
SndLen: blk.w 1,0
OldVector: blk.l 1,0
initialSP: blk.l 1,0
dos_base: blk.l 1,0
timer: blk.w 1,0
disk: dc.l 0
disk_buf: blk.b 10,0

