.define PSG $7f .define PAGING_REGISTER $ffff .define BANK_START $8000 .define BANK_END $c000 .define LOOKUP_TABLE_BASE $3800 .define CONTROLLER_PORT_A $dc .define CONTROLLER_1_BUTTON_1 %00010000 .define CONTROLLER_1_BUTTON_2 %00100000 PlaySample: ; $36db ; Arguments: ; hl = data ; d = delay paramter (higher = lower sample rate) di ; Stop interrupts call SilencePSG ; Set tones to 0 ld a, %10000000 ; Channel 0 tone 0 out (PSG), a xor a out (PSG), a ld a, %10100000 ; Channel 1 tone 0 out (PSG), a xor a out (PSG), a ld a, %11000000 ; Channel 2 tone 0 out (PSG), a xor a out (PSG), a ; Transfer data pointer to hl' and pre-decrement it push hl exx pop hl dec hl exx ; Delay proportional to d ld e, d --: ld a, $ff -: dec a jr nz, - dec e jr nz, -- ; Set tones to %1111110001 = $3f1 = 110Hz ; This seems unnecessary... ld e, %00111111 ld a, %10000001 ; Channel 0 out (PSG), a ld a, e out (PSG), a ld a, %10100001 ; Channel 1 out (PSG), a ld a, e out (PSG), a ld a, %11000001 ; Channel 2 out (PSG), a ld a, e out (PSG), a -: ; Main sample loop ; Set tones to %0000000101 = $005 ld e, %00000000 ld a, %10000101 ; Channel 0 out (PSG), a ld a, e out (PSG), a ld a, %10100101 ; Channel 1 out (PSG), a ld a, e out (PSG), a ld a, %11100101 ; Channel 2 out (PSG), a ld a, e out (PSG), a exx inc hl ; Next sample ld a,