Browse Source

Update nascom.asm

Populate  the frequency table with duration
pull/49/head
b1ackmai1er 6 years ago
parent
commit
587a618400
  1. 139
      Source/HBIOS/nascom.asm

139
Source/HBIOS/nascom.asm

@ -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

Loading…
Cancel
Save