  .include "global.s"

  .title "Sound sample player"
  .module Sample


  .AUD3WAVERAM = 0xff30

_play_sample::
  push bc
  lda hl,4(sp)
  ld a,(hl+)
  ld d,(hl)
  ld e,a

  lda hl,6(sp)
  ld a,(hl+)
  ld b,(hl)
  ld c,a

  ld h,d
  ld l,e

  call .play_sample
  pop bc
  ret

; Playback raw sound sample with length BC from HL at 8192Hz rate.
; BC defines the length of the sample in samples/32 or bytes/16.
; The format of the data is unsigned 4-bit samples,
; 2 samples per byte, upper 4-bits played before lower 4 bits.
;
; Adaption for GBDK by Lars Malmborg.
; Original code by Jeff Frohwein.

.play_sample::
  ld  a,#0x84
  ldh (.NR52),a       ;enable sound 3

  ld a,#0
  ldh (.NR30),a
  ldh (.NR51),a

  ld a,#0x77
  ldh (.NR50),a       ;select speakers
  ld a,#0xff
  ldh (.NR51),a       ;enable sound 3

  ld a,#0x80
  ldh (.NR31),a       ;sound length
  ld a,#0x20
  ldh (.NR32),a       ;sound level high

  ld a,#0x00
  ldh (.NR33),a       ;sound freq low

.samp2:
  ld de,#.AUD3WAVERAM ;12
  push bc             ;16
  ld b,#16            ;16

  xor a
  ldh (.NR30),a
.samp3:
  ld a,(hl+)          ;8
  ld (de),a           ;8
  inc de              ;8
  dec b               ;4
  jr nz,.samp3        ;12

  ld a,#0x80
  ldh (.NR30),a

  ld a,#0x87          ; (256hz)
  ldh (.NR34),a

  ld bc,#558          ;delay routine
.samp4:
  dec bc              ;8
  ld a,b              ;4
  or c                ;4
  jr nz,.samp4        ;12

  ld a,#0             ;more delay
  ld a,#0
  ld a,#0

  pop bc              ;12
  dec bc              ;8
  ld a,b              ;4
  or c                ;4
  jr nz,.samp2        ;12

  ld a,#0xbb
  ldh (.NR51),a       ;disable sound 3
  ret
