|
|
|
@ -4430,7 +4430,7 @@ PLAY: CALL GETINT ; GET OCTAVE |
|
|
|
LD H,0 |
|
|
|
ADD HL,HL ; X2 |
|
|
|
ADD HL,HL ; X4 |
|
|
|
LD DE,SPK_TUNTBL ; POINT TO NOTE ENTRY |
|
|
|
LD DE,FRQDURTBL ; POINT TO NOTE ENTRY |
|
|
|
ADD HL,DE ; ITS IN HL |
|
|
|
|
|
|
|
EX (SP),HL ; RESTORE SYNTAX POINTER |
|
|
|
@ -4455,41 +4455,34 @@ PLAY: CALL GETINT ; GET OCTAVE |
|
|
|
SPK_BEEP: |
|
|
|
; PUSH AF ; SAVE DURATION |
|
|
|
|
|
|
|
CALL SET_DUR_TBL |
|
|
|
|
|
|
|
LD A,(HL) ; LOAD 1ST ARG |
|
|
|
INC HL ; IN DE |
|
|
|
LD E,A |
|
|
|
LD A,(HL) |
|
|
|
INC HL |
|
|
|
LD D,A |
|
|
|
; |
|
|
|
; SRL D ; DE / 8 |
|
|
|
; RRC E |
|
|
|
; SRL D |
|
|
|
; RRC E |
|
|
|
; SRL D ; DE IS FREQUECY OF |
|
|
|
; RRC E ; NOTE IN OCTAVE 7 |
|
|
|
|
|
|
|
LD A,7+3 |
|
|
|
SUB B |
|
|
|
LD C,A |
|
|
|
SPK_OCTDIV: |
|
|
|
LD E,A ; WHICH IS THE |
|
|
|
LD A,(HL) ; FREQUENCY FOR |
|
|
|
INC HL ; THE EIGTH |
|
|
|
LD D,A ; OCTAVE |
|
|
|
|
|
|
|
LD A,7 ; DIVIDE THE |
|
|
|
SUB B ; FREQENCY BASE |
|
|
|
LD C,A ; ON THE OCTAVE |
|
|
|
SPK_OCTDIV: ; REQUESTED |
|
|
|
SRL D |
|
|
|
RRC E |
|
|
|
DJNZ SPK_OCTDIV |
|
|
|
SPK_OCTOK: |
|
|
|
|
|
|
|
|
|
|
|
LD A,(HL) ; LOAD 2ND ARG |
|
|
|
INC HL ; IN BC |
|
|
|
LD C,A |
|
|
|
LD A,(HL) |
|
|
|
LD C,A ; WHICH IS THE |
|
|
|
LD A,(HL) ; DURATION |
|
|
|
INC HL |
|
|
|
LD B,A |
|
|
|
PUSH BC ; SETUP ARG IN HL |
|
|
|
POP HL |
|
|
|
|
|
|
|
CALL SPK_BEEPER ; PLAY |
|
|
|
CALL TEST_FRQ |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -4563,19 +4556,21 @@ BE_END: |
|
|
|
POP IX |
|
|
|
RET |
|
|
|
|
|
|
|
TEST_FRQ: |
|
|
|
PUSH HL |
|
|
|
PUSH DE |
|
|
|
LD BC,500 |
|
|
|
PUSH BC ; BC CONTAINS FREQUENCY |
|
|
|
; |
|
|
|
; ADJUST DURATION BASED ON PROCESSOR SPEED |
|
|
|
; SETUP THE ONE SECOND TONE DURATION TABLE BASED ON PROCESSOR SPEED AND TONE FREQUENCY |
|
|
|
; |
|
|
|
; DURATION = (CPUKHZ / 8) / FREQUENCY |
|
|
|
; DURATION = (CPUKHZ * 1000 / 8 ) / FREQUENCY |
|
|
|
; DURATION = (CPUKHZ * 125 ) / FREQUENCY |
|
|
|
; DURATION = (CPUKHZ * 256 / 2 - CPUKHZ - (2 * CPUKHZ) ) / FREQUENCY |
|
|
|
|
|
|
|
SET_DUR_TBL: |
|
|
|
PUSH IX |
|
|
|
PUSH IY |
|
|
|
PUSH HL |
|
|
|
PUSH DE |
|
|
|
PUSH BC |
|
|
|
|
|
|
|
LD B,BF_SYSGET ; GET CPU SPEED |
|
|
|
LD C,BF_SYSGET_CPUINFO ; FROM HBIOS |
|
|
|
RST 08 |
|
|
|
@ -4603,13 +4598,22 @@ FRQ_ADJ1: |
|
|
|
DEC DE |
|
|
|
FRQ_ADJ2: |
|
|
|
|
|
|
|
EX DE,HL ; SETUP REGISTERS FOR DIVIDE |
|
|
|
PUSH DE |
|
|
|
POP IX |
|
|
|
POP BC ; RESTORE FREQUENCY (DIVISOR) |
|
|
|
PUSH HL ; DEHL = CPUKHZ / 8) / FREQUENCY |
|
|
|
POP IX ; HLIX = DENOMINATOR |
|
|
|
EX DE,HL |
|
|
|
|
|
|
|
LD IY,FRQDURTBL ; POINT TO THE TABLE WE |
|
|
|
LD C,12 ; WANT TO READ AND UPDATE |
|
|
|
TBL_LP: PUSH BC |
|
|
|
|
|
|
|
LD C,(IY+0) ; READ THE FREQUENCY |
|
|
|
LD B,(IY+1) ; FROM THE TABLE IN BC |
|
|
|
|
|
|
|
PUSH IX ; STORE DENOMINATOR FOR NEXT LOOP |
|
|
|
PUSH HL |
|
|
|
|
|
|
|
DIV_3216: ; HLIX = HLIX / BC, DE = REMAINDER |
|
|
|
LD DE,0 |
|
|
|
LD DE,0 |
|
|
|
LD A,32 |
|
|
|
DIV_LP: ADD IX,IX |
|
|
|
ADC HL,HL |
|
|
|
@ -4624,20 +4628,42 @@ DIV_LP: ADD IX,IX |
|
|
|
DIV_CANSUB: |
|
|
|
EX DE,HL |
|
|
|
DEC A |
|
|
|
JR NZ, DIV_LP |
|
|
|
JR NZ, DIV_LP ; IX = RESULT |
|
|
|
|
|
|
|
PUSH IX ; SAVE RESULT IN TABLE |
|
|
|
POP DE |
|
|
|
LD (IY+2),E |
|
|
|
LD (IY+3),D |
|
|
|
|
|
|
|
LD DE,4 ; POINT TO NEXT TABLE |
|
|
|
ADD IY,DE ; ENTRY TO UPDATE |
|
|
|
|
|
|
|
; PUSH HL |
|
|
|
; POP BC |
|
|
|
; CALL PRTHEXWORD |
|
|
|
; PUSH IX |
|
|
|
; POP BC |
|
|
|
; CALL PRTHEXWORD |
|
|
|
POP HL ; RETREIVE THE DENOMINATOR |
|
|
|
POP IX ; FOR THE NEXT LOOP |
|
|
|
|
|
|
|
POP BC ; RETREIVE THE |
|
|
|
DJNZ TBL_LP ; LOOP COUNTER |
|
|
|
|
|
|
|
POP BC |
|
|
|
POP DE |
|
|
|
POP HL |
|
|
|
POP IY |
|
|
|
POP IX |
|
|
|
|
|
|
|
RET |
|
|
|
|
|
|
|
LD A,' ' |
|
|
|
CALL MONOUT |
|
|
|
|
|
|
|
LD HL,(FRQDURTBL+12) |
|
|
|
PUSH HL |
|
|
|
POP BC |
|
|
|
CALL PRTHEXWORD |
|
|
|
LD HL,(FRQDURTBL+14) |
|
|
|
PUSH HL |
|
|
|
POP BC |
|
|
|
CALL PRTHEXWORD |
|
|
|
|
|
|
|
PRTHEXBYTE: |
|
|
|
PUSH AF |
|
|
|
PUSH DE |
|
|
|
@ -4699,25 +4725,24 @@ HEXCONV: |
|
|
|
DAA |
|
|
|
RET |
|
|
|
; |
|
|
|
; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SPK_BEEPER, FIRST WORD LOADED INTO DE, SECOND INTO HL |
|
|
|
; EXCEL SPREADSHEET FOR CALCULATION CAN BE FOUND HERE: |
|
|
|
; https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=boards:sbc:sbc_v2:sbc_v2-004:spk_beep_tuntbl.xlsx |
|
|
|
; ONE OCTAVE TONE TABLE IN FREQUENCY, DURATION FORMAT. TO COMPENSATE FOR DIFFERENT |
|
|
|
; CPU FREQUENCIES THE DURATION IS CALCULATED AND POPULATED AT STARTUP. DIFFERENT OCTAVE |
|
|
|
; AND DURATIONS ARE CALCULATE BY MODIFYING THE VALUES READ FROM THIS TABLE. |
|
|
|
; |
|
|
|
; FIRST WORD = C8 * 8 |
|
|
|
; |
|
|
|
SPK_TUNTBL: |
|
|
|
.DW $82D0, $012A ; C |
|
|
|
.DW $8A97, $0111 ; C# |
|
|
|
.DW $92D5, $010A ; D |
|
|
|
.DW $9B90, $00FB ; D# |
|
|
|
.DW $A4D0, $00ED ; E |
|
|
|
.DW $AE9D, $00DF ; F |
|
|
|
.DW $B8FF, $00D3 ; F# |
|
|
|
.DW $C3FF, $00C7 ; G |
|
|
|
.DW $CFA7, $00BC ; G# |
|
|
|
.DW $DC00, $00B1 ; A |
|
|
|
.DW $E914, $00A7 ; A# |
|
|
|
.DW $F6F1, $009E ; B |
|
|
|
FRQDURTBL: |
|
|
|
.DW $105A, $0 ; C |
|
|
|
.DW $1152, $0 ; C# |
|
|
|
.DW $125A, $0 ; D |
|
|
|
.DW $1372, $0 ; D# |
|
|
|
.DW $149A, $0 ; E |
|
|
|
.DW $15D3, $0 ; F |
|
|
|
.DW $171F, $0 ; F# |
|
|
|
.DW $1875, $0 ; G |
|
|
|
.DW $19F4, $0 ; G# |
|
|
|
.DW $1B80, $0 ; A |
|
|
|
.DW $1D22, $0 ; A# |
|
|
|
.DW $1EDE, $0 ; B |
|
|
|
|
|
|
|
|
|
|
|
SLACK .EQU (BAS_END - $) |
|
|
|
.FILL SLACK,00H |
|
|
|
|