From d6bccde06de3da8be63815a482ac8eef29163ba9 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 9 May 2020 23:05:24 +0800 Subject: [PATCH 01/27] Update spk.asm --- Source/HBIOS/spk.asm | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 443679f7..cd17c039 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -7,8 +7,8 @@ ; DRIVER FUNCTION TABLE AND INSTANCE DATA ; SP_FNTBL: - .DW SP_RESET - .DW SP_VOLUME + .DW SP_STUB ; SP_RESET + .DW SP_STUB ; SP_VOLUME .DW SP_PERIOD .DW SP_NOTE .DW SP_PLAY @@ -50,7 +50,7 @@ SP_INIT: ; SOUND DRIVER FUNCTION - RESET ;====================================================================== ; -SP_RESET: +;SP_RESET: ; XOR A ; SUCCESSFULL RESET ; RET ; @@ -58,9 +58,9 @@ SP_RESET: ; SOUND DRIVER FUNCTION - VOLUME ;====================================================================== ; -SP_VOLUME: - XOR A ; SIGNAL SUCCESS - RET +;SP_VOLUME: +; XOR A ; SIGNAL SUCCESS +; RET ; ;====================================================================== ; SOUND DRIVER FUNCTION - PERIOD @@ -68,6 +68,7 @@ SP_VOLUME: ; SP_PERIOD: LD (SP_PENDING_PERIOD), HL ; SAVE AND RETURN SUCCESSFUL +SP_STUB: XOR A RET ; @@ -80,7 +81,7 @@ SP_NOTE: PUSH DE ; ON ENTRY L IS A NOTE INDEX LD H,0 ; CONVERT THIS NOTE INDEX ADD HL,HL ; TO THE ASSOCIATED ENTRY - ADD HL,HL ; IN THE TUNE ABLE. + ADD HL,HL ; IN THE TUNE TABLE. LD DE,SP_TUNTBL ; SAVE THIS ADDRESS AS ADD HL,DE ; THE PERIOD LD (SP_PENDING_PERIOD),HL @@ -137,7 +138,7 @@ SP_QUERY_DEV: SP_SETTBL: LD A,(CB_CPUMHZ) ; GET CPU SPEED. LD C,A - +; LD B,SP_NOTCNT ; SET NUMBER OF NOTES TO LD HL,SP_TUNTBL+2 ; ADJUST AND START POINT ; @@ -191,9 +192,9 @@ SP_PLAY: PUSH BC ; SETUP ARG IN HL POP HL ; - CALL SP_BEEPER ; PLAY +; CALL SP_BEEPER ; PLAY ; - RET +; RET ; ; The following SP_BEEPER routine is a modification of code from ; "The Complete SPECTRUM ROM DISSASSEMBLY" by Dr Ian Logan & Dr Frank O’Hara @@ -376,5 +377,5 @@ SP_NOTE_C8: .DW $1D22, $10 ; A .DW $1EDE, $F ; B8 ; -SP_NOTCNT .EQU ($-SP_TUNTBL-1) / 4 +SP_NOTCNT .EQU ($-SP_TUNTBL) / 4 ; From 989ab9bf051e48e8b2ff1371fcc0786ae8dec291 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 10 May 2020 22:43:03 +0800 Subject: [PATCH 02/27] Sound devices in Device Summary --- Source/HBIOS/hbios.asm | 74 +++++++++++++++++++++++++++++++++++++++--- Source/HBIOS/hbios.inc | 6 ++++ Source/HBIOS/spk.asm | 4 +-- Source/HBIOS/util.asm | 8 +++++ 4 files changed, 85 insertions(+), 7 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index fe3303e0..7dba310b 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3541,10 +3541,15 @@ PRTSUM: LD C,BF_SYSGET_DIOCNT ; DISK DRIVES LD HL,PS_DISK CALL PRT_ALLD - +; LD C,BF_SYSGET_VDACNT ; VIDEO DEVICES LD HL,PS_VIDEO CALL PRT_ALLD + + LD C,BF_SYSGET_SNDCNT ; SOUND DEVICES + LD HL,PS_SOUND + CALL PRT_ALLD +; RET ; PRT_ALLD: @@ -3887,6 +3892,56 @@ PS_PRTVC: CALL PRTDECB RET ; +; PRINT SOUND CONFIG +; +PS_SOUND: + PUSH BC + + ; UNIT COLUMN + PRTS("Sound $") + LD A,C ; MOVE UNIT NUM TO A + CALL PRTDECB ; PRINT IT + CP 10 ; CHECK FOR MULTIPLE DIGITS + CALL C,PC_SPACE ; EXTRA SPACE IF NEEDED + PRTS(" $") ; PAD TO NEXT COLUMN + + ; DEVICE COLUMN + + PUSH BC ; + LD E,C + XOR A + LD DE,PS_SDSND ; POINT TO DEVICE TYPE NAME TABLE + CALL PRTIDXDEA ; PRINT DEVICE NMEMONIC PADDED TO FIELD WIDTH + LD A,C ; MOVE UNIT NUM TO A + CALL PRTDECB ; PRINT IT + CALL PC_COLON + CP 10 ; CHECK FOR MULTIPLE DIGITS + CALL C,PC_SPACE ; EXTRA SPACE IF NEEDED + LD A,(PRTIDXCNT) + SUB 9+1 + CPL + CALL PS_PAD + POP BC + + ; DEVICE TYPE +; + LD B,BF_SNDQUERY ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C + LD E,BF_SNDQ_DEV + RST 08 + LD A,B + DEC A + LD DE,PS_SDSN76489 + CALL PRTIDXDEA + LD A,(PRTIDXCNT) + SUB 18+1 + CPL + CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A) +; + CALL NEWLINE +; + POP BC + RET +; ; PRINT DEVICE NMEMONIC, DEVTYP/NUM SPECIFIED IN DE ; PS_PRTDEV: @@ -3895,6 +3950,7 @@ PS_PRTDEV: RRCA RRCA RRCA +PS_PRTDEV1: RLCA ; X2 FOR WORD OFFSET IN STRING TABLE CALL ADDHLA LD A,(HL) @@ -3916,10 +3972,9 @@ PS_PRTNUL: LD HL,PS_STRNUL ; FALL THRU TO PS_PRT ; -; +; PRINT STRING AT (HL), $ TERM, RETURN CHARS PRINTED IN C ; PS_PRT: - ; PRINT STRING AT (HL), $ TERM, RETURN CHARS PRINTED IN C LD C,0 ; INIT CHAR COUNT PS_PRT1: LD A,(HL) ; GET CHAR @@ -3930,10 +3985,9 @@ PS_PRT1: INC C ; BUMP COUNTER JR PS_PRT1 ; AND LOOP ; -; +; PAD N SPACES SPECIFIED IN A ; PS_PAD: - ; PAD N SPACES SPECIFIED IN A LD B,A LD A,' ' PS_PAD1: @@ -4042,6 +4096,16 @@ PS_VDVGA .TEXT "VGA$" ; PS_VTCRT .TEXT "CRT$" ; +; SOUND DEVICE STRINGS +; +PS_SDSND .TEXT "SND$" +; +; SOUND TYPE STRINGS +; +PS_SDSN76489 .TEXT "SN76489$" +PS_SDAY38910 .TEXT "AY-3-8910$" +PS_SDBITMODE .TEXT "BITMODE$" +; ; 0 1 2 3 4 5 6 7 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 PS_STRHDR .TEXT "Unit Device Type Capacity/Mode\r\n" diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 068114c3..45875dde 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -172,6 +172,12 @@ VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 +; +; SOUND DEVICE IDS +; +SNDDEV_SN .EQU $00 ; SN76489 +SNDDEV_AY .EQU $10 ; AY-3-8910 +SNDDEV_BM .EQU $20 ; BITMODE ;; ;; EMULATION TYPES - moved to std.asm ;; diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index cd17c039..74678e2c 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -206,7 +206,7 @@ SP_PLAY: ; SP_BEEPER: PUSH IX - DI ; Disable the interrupt for the duration of a 'beep'. + HB_DI ; Disable the interrupt for the duration of a 'beep'. LD A,L ; Save L temporarily. SRL L ; Each '1' in the L register is to count 4 T states, but take INT (L/4) and count 16 T states instead. SRL L @@ -259,7 +259,7 @@ BE_AGAIN: INC C ; Add 16 T states as this path is shorter. JP (IX) ; Jump back. BE_END: - EI + HB_EI POP IX RET ; diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 8dc066db..3c7b9a1a 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -343,6 +343,8 @@ PRTIDXDEA: PUSH BC LD C,A ; INDEX COUNT OR A + LD A,0 + LD (PRTIDXCNT),A ; RESET CHARACTER COUNT PRTIDXDEA1: JR Z,PRTIDXDEA3 PRTIDXDEA2: @@ -357,6 +359,9 @@ PRTIDXDEA3: ; CALL WRITESTR ; FALL THROUGH TO WRITESTR ; RET ; +PRTIDXCNT: + .DB 0 ; CHARACTER COUNT +; ; OUTPUT A '$' TERMINATED STRING AT DE ; WRITESTR: @@ -366,6 +371,9 @@ WRITESTR1: CP '$' ; TEST FOR STRING TERMINATOR JP Z,WRITESTR2 CALL COUT + LD A,(PRTIDXCNT) + INC A + LD (PRTIDXCNT),A INC DE JP WRITESTR1 WRITESTR2: From ae76ba82e1498f381d56b09ddfd2de180328d324 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 15 May 2020 20:12:25 +0800 Subject: [PATCH 03/27] Update audio.inc Commentry --- Source/HBIOS/audio.inc | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/Source/HBIOS/audio.inc b/Source/HBIOS/audio.inc index b6365494..dfd7f884 100644 --- a/Source/HBIOS/audio.inc +++ b/Source/HBIOS/audio.inc @@ -41,25 +41,25 @@ AUD_NOTE: AUDTRACE_CR AUDTRACE_DE AUDTRACE_CR +; + PUSH DE ; ON ENTRY HL IS THE NOTE TO PLAY + LD DE, 48 ; AND DE IS THE START OF NOTE TABLE + CALL DIV16 ; LOAD DE WITH NOTE TABLE SIZE + ; AND CALCULATE OCTAVE COUNT IN BC - push de - LD DE, 48 - CALL DIV16 - ; BC IS OCTAVE COUNT - ; HL is NOTE WITIN OCTAVE - ADD HL, HL - pop de - ADD HL, DE + ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE + POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE + ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY. - LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL - INC HL - LD H, (HL) + LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY + INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL + LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE LD L, A INC C -AUD_NOTE1: - DEC C - JR Z, AUD_NOTE2 +AUD_NOTE1: ; DIVIDE THE PERIOD + DEC C ; BY TWO + JR Z, AUD_NOTE2 ; FOR EACH OCTAVE SRL H RR L JR AUD_NOTE1 @@ -69,7 +69,8 @@ AUD_NOTE2: OR H RET NZ ; RETURN THE CALCULATED PERIOD - LD H, $FF ; OTHERWISE RETURN -1 PERIOD (ERROR) - LD L, $FF + CPL + LD H, A ; OTHERWISE RETURN -1 PERIOD (ERROR) + LD L, A RET #ENDIF From 67300cfe478b75a48f3bf3ad7292b8568ca69f6d Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 15 May 2020 20:27:25 +0800 Subject: [PATCH 04/27] Update audio.inc Optimization --- Source/HBIOS/audio.inc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Source/HBIOS/audio.inc b/Source/HBIOS/audio.inc index dfd7f884..41d6273c 100644 --- a/Source/HBIOS/audio.inc +++ b/Source/HBIOS/audio.inc @@ -59,18 +59,19 @@ AUD_NOTE: INC C AUD_NOTE1: ; DIVIDE THE PERIOD DEC C ; BY TWO - JR Z, AUD_NOTE2 ; FOR EACH OCTAVE +; JR Z, AUD_NOTE2 ; FOR EACH OCTAVE + RET Z SRL H RR L JR AUD_NOTE1 -AUD_NOTE2: - LD A, L ; IF NOT ZERO - OR H - RET NZ ; RETURN THE CALCULATED PERIOD - - CPL - LD H, A ; OTHERWISE RETURN -1 PERIOD (ERROR) - LD L, A - RET +;AUD_NOTE2: +; LD A, L ; IF NOT ZERO +; OR H +; RET NZ ; RETURN THE CALCULATED PERIOD +; +; CPL +; LD H, A ; OTHERWISE RETURN -1 PERIOD (ERROR) +; LD L, A +; RET #ENDIF From cfe9548b25d904ba4b44a599195e33099776e063 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 16 May 2020 09:11:05 +0800 Subject: [PATCH 05/27] Update hbios.asm Change order of sound initialization. Least common last. Most common/detectable first. --- Source/HBIOS/hbios.asm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d547c5de..3094c843 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1626,6 +1626,7 @@ HB_INIT_REC: #IF (PLATFORM == PLT_SBC) .DW UART_INIT .DW MD_INIT + .DW FD_INIT #ENDIF HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2) ; @@ -1668,14 +1669,14 @@ HB_INITTBL: #IF (CTCENABLE) .DW CTC_INIT #ENDIF -#IF (SPKENABLE) - .DW SP_INIT ; AUDIBLE INDICATOR OF BOOT START +#IF (AY38910ENABLE) + .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START #ENDIF #IF (SN76489ENABLE) .DW SN76489_INIT #ENDIF -#IF (AY38910ENABLE) - .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START +#IF (SPKENABLE) + .DW SP_INIT ; AUDIBLE INDICATOR OF BOOT START #ENDIF #IF (ASCIENABLE) .DW ASCI_INIT From 0a7eed3276f1cae45704778bc4097c783e4791bf Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 16 May 2020 10:25:55 +0800 Subject: [PATCH 06/27] Sound driver changes Add scaling to the tone table period to maintain maximum range and minimize error. --- Source/HBIOS/audio.inc | 40 --------------------- Source/HBIOS/ay38910.asm | 77 +++++++++++++++++++++++++--------------- Source/HBIOS/sn76489.asm | 40 +++++++++++++++++++-- 3 files changed, 86 insertions(+), 71 deletions(-) diff --git a/Source/HBIOS/audio.inc b/Source/HBIOS/audio.inc index 41d6273c..e02e7af4 100644 --- a/Source/HBIOS/audio.inc +++ b/Source/HBIOS/audio.inc @@ -34,44 +34,4 @@ #IFNDEF AUDIOUTILS #DEFINE AUDIOUTILS - -AUD_NOTE: - AUDDEBUG("AUDNOTE ") - AUDTRACE_HL - AUDTRACE_CR - AUDTRACE_DE - AUDTRACE_CR -; - PUSH DE ; ON ENTRY HL IS THE NOTE TO PLAY - LD DE, 48 ; AND DE IS THE START OF NOTE TABLE - CALL DIV16 ; LOAD DE WITH NOTE TABLE SIZE - ; AND CALCULATE OCTAVE COUNT IN BC - - ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE - POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE - ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY. - - LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY - INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL - LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE - LD L, A - - INC C -AUD_NOTE1: ; DIVIDE THE PERIOD - DEC C ; BY TWO -; JR Z, AUD_NOTE2 ; FOR EACH OCTAVE - RET Z - SRL H - RR L - JR AUD_NOTE1 - -;AUD_NOTE2: -; LD A, L ; IF NOT ZERO -; OR H -; RET NZ ; RETURN THE CALCULATED PERIOD -; -; CPL -; LD H, A ; OTHERWISE RETURN -1 PERIOD (ERROR) -; LD L, A -; RET #ENDIF diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index deec80d3..1cff70b3 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -4,10 +4,8 @@ ; ;====================================================================== ; - #include "cfg_state.inc" - - +; AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE ; #IF (AYMODE == AYMODE_SCG) @@ -15,6 +13,7 @@ AY_RSEL .EQU $9A AY_RDAT .EQU $9B AY_RIN .EQU AY_RSEL AY_ACR .EQU $9C +AY_CLK .SET 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 #ENDIF ; #IF (AYMODE == AYMODE_N8) @@ -73,10 +72,13 @@ SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS ; -AY_PHICLK .EQU 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 -;AY_PHICLK .EQU 3500000 ; ZX SPECTRUM 3.5MHZ -;AY_PHICLK .EQU 4000000 ; RETROBREW SCB-SCG -AY_RATIO .EQU AY_CLK * 100 / 16 +#IF (AY_CLK > 3579545) ; DEPENDING ON THE +AY_SCALE .EQU 2 ; INPUT CLOCK FREQUENCY +#ELSE ; PRESCALE THE TONE PERIOD +AY_SCALE .EQU 3 ; DATA TO MAINTAIN MAXIMUM +#ENDIF ; RANGE AND ACCURACY +; +AY_RATIO .EQU (AY_CLK * 100) / (16 >> AY_SCALE) ; #INCLUDE "audio.inc" ; @@ -127,54 +129,50 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD DE,(AY_R3CHBP*256)+$00 CALL AY_WRTPSG ; R03 = $00 = XXXX0000 ; - #IF SYSTIMEN LD A, TICKFREQ / 3 ; SCHEDULE IN 1/3 SECOND TO TURN OFF SOUND LD (AY_TIMTIK), A - +; LD HL, (VEC_TICK + 1) ; GET CUR TICKS VECTOR LD (AY_TIMHOOK), HL ; SAVE IT INTERNALLY LD HL, AY_TIMER ; INSTALL TIMER HOOK HANDLER LD (VEC_TICK + 1), HL - +; LD A, $02 ; NOT READY & IN INTERUPT HANDLER LD (AY_READY), A - #ELSE CALL LDELAY ; HALF SECOND DELAY LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS LD A, $01 ; READY & NOT IN INTERUPT HANDLER LD (AY_READY), A - #ENDIF ; XOR A ; SUCCESSFULL INIT RET - +; #IF SYSTIMEN AY_TIMER: LD A, (AY_TIMTIK) DEC A LD (AY_TIMTIK), A JR NZ, AY_TIMER1 - +; LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS LD A, $01 ; READY & NOT IN INTERUPT HANDLER LD (AY_READY), A - +; LD DE, AY_TIMER ; MAKE AY_TIMER A NO_OP HANDLER LD HL, AY_TIMER1 LD BC, 3 LDIR - +; AY_TIMER1: JP 0 ; OVERWRITTEN WITH NEXT HANDLER AY_TIMHOOK: .EQU $ - 2 AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP - #ENDIF ; ;====================================================================== @@ -184,7 +182,7 @@ AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP AY_INIT: LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000 JP AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE - +; AY_CHKREDY: LD A, (AY_READY) BIT 0, A @@ -218,7 +216,7 @@ AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS AY_RESET: AUDTRACE(AYT_INIT) CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY - +; PUSH DE PUSH HL CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION @@ -260,10 +258,34 @@ AY_NOTE: AUDTRACE(AYT_NOTE) AUDTRACE_HL AUDTRACE_CR - - LD DE, AY3NOTETBL - CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU - ; TO SET THIS PERIOD +; +; CALL PRTHEXWORDHL +; CALL PC_COLON +; + LD DE, AY3NOTETBL ; ON ENTRY HL IS THE NOTE TO PLAY + PUSH DE ; AND DE IS THE START OF NOTE TABLE + LD DE, 48 ; LOAD DE WITH NOTE TABLE SIZE + CALL DIV16 ; AND CALCULATE OCTAVE COUNT IN BC +; + ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE + POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE + ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY. +; + LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY + INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL + LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE + LD L, A +; + LD A,AY_SCALE ; THE NOTE TABLE PERIOD DATA HAS BEEN + ADD A,C ; PRESCALED TO MAINTAIN RANGE SO ALLOW + LD B,A ; FOR THIS WHEN CHANGING OCTAVE +AY_NOTE1: + SRL H ; ADJUST THE PERIOD DATA + RR L ; FOR THE DESIRED OCTAVE + DJNZ AY_NOTE1 ; FALL THROUGH TO SET PERIOD AND RANGE CHECK +; +; CALL PRTHEXWORDHL +; CALL NEWLINE ; ;====================================================================== ; SOUND DRIVER FUNCTION - PERIOD @@ -277,7 +299,7 @@ AY_PERIOD: LD A, H ; IF ZERO - ERROR OR L JR Z, AY_PERIOD1 - +; LD A, H ; MAXIMUM TONE PERIOD IS 12-BITS AND 11110000B ; ALLOWED RANGE IS 0001-0FFF (4095) JR NZ, AY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE @@ -425,7 +447,6 @@ AY_EI: RET NZ HB_EI RET - ; ;====================================================================== ; @@ -459,7 +480,6 @@ AY_WRTPSG: OUT (112),A ; NORMAL CLOCK SPEED #ENDIF JP AY_EI - ; ;====================================================================== ; @@ -509,13 +529,14 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $" #ENDIF ; ;====================================================================== -; BBC MICRO QUARTER TONE FREQUENCY TABLE +; QUARTER TONE FREQUENCY TABLE ;====================================================================== ; -; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCATVE 0 +; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCTAVE 0 ; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP) ; FIRST PLAYABLE NOTE WILL BE 0 ; ASSUMING A CLOCK OF 1843200 THIS MAPS TO A0# +; AY3NOTETBL: .DW AY_RATIO / 2913 .DW AY_RATIO / 2956 diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 220e07e3..d1b784cc 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -24,7 +24,8 @@ CHANNEL_1_SILENT .EQU $BF CHANNEL_2_SILENT .EQU $DF CHANNEL_3_SILENT .EQU $FF -SN7RATIO .EQU SN7CLK * 100 / 32 +SN7_SCALE .EQU 4 +SN7RATIO .EQU (SN7CLK * 100) / (32 >> SN7_SCALE) .ECHO "SN76489 CLOCK: " .ECHO SN7CLK @@ -104,9 +105,42 @@ SN7_VOLUME: RET SN7_NOTE: + +; CALL PRTHEXWORDHL +; CALL PC_COLON + + AUDDEBUG("AUDNOTE ") + AUDTRACE_HL + AUDTRACE_CR + AUDTRACE_DE + AUDTRACE_CR + LD DE, SN7NOTETBL - CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU - ; TO SET THIS PERIOD + PUSH DE ; ON ENTRY HL IS THE NOTE TO PLAY + LD DE, 48 ; AND DE IS THE START OF NOTE TABLE + CALL DIV16 ; LOAD DE WITH NOTE TABLE SIZE + ; AND CALCULATE OCTAVE COUNT IN BC + + ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE + POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE + ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY. + + LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY + INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL + LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE + LD L, A + + LD A,SN7_SCALE ; THE NOTE TABLE PERIOD DATA HAS BEEN + ADD A,C ; PRESCALED TO MAINTAIN RANGE SO ALLOW + LD B,A ; FOR THIS WHEN CHANGING OCTAVE +SN7_NOTE1: + SRL H ; ADJUST THE PERIOD DATA + RR L ; FOR THE DESIRED OCTAVE + DJNZ SN7_NOTE1 ; FALL THROUGH TO SET PERIOD AND RANGE CHECK + +; CALL PRTHEXWORDHL +; CALL NEWLINE + SN7_PERIOD: AUDTRACE(SNT_PERIOD) AUDTRACE_HL From 79ddc8d44de2840bdd6009eca79ee27cf679a0bf Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Fri, 22 May 2020 15:55:15 +0800 Subject: [PATCH 07/27] Update ay38910.asm --- Source/HBIOS/ay38910.asm | 84 +++++++++++++++------------------------- 1 file changed, 32 insertions(+), 52 deletions(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 1cff70b3..81c41223 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -4,8 +4,10 @@ ; ;====================================================================== ; -#include "cfg_state.inc" -; + +;#include "cfg_state.inc" + + AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE ; #IF (AYMODE == AYMODE_SCG) @@ -13,7 +15,6 @@ AY_RSEL .EQU $9A AY_RDAT .EQU $9B AY_RIN .EQU AY_RSEL AY_ACR .EQU $9C -AY_CLK .SET 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 #ENDIF ; #IF (AYMODE == AYMODE_N8) @@ -72,13 +73,10 @@ SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS ; -#IF (AY_CLK > 3579545) ; DEPENDING ON THE -AY_SCALE .EQU 2 ; INPUT CLOCK FREQUENCY -#ELSE ; PRESCALE THE TONE PERIOD -AY_SCALE .EQU 3 ; DATA TO MAINTAIN MAXIMUM -#ENDIF ; RANGE AND ACCURACY -; -AY_RATIO .EQU (AY_CLK * 100) / (16 >> AY_SCALE) +AY_PHICLK .EQU 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 +;AY_PHICLK .EQU 3500000 ; ZX SPECTRUM 3.5MHZ +;AY_PHICLK .EQU 4000000 ; RETROBREW SCB-SCG +AY_RATIO .EQU AY_CLK * 100 / 16 ; #INCLUDE "audio.inc" ; @@ -129,50 +127,55 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD DE,(AY_R3CHBP*256)+$00 CALL AY_WRTPSG ; R03 = $00 = XXXX0000 ; -#IF SYSTIMEN + +#IF (SYSTIM != TM_NONE) LD A, TICKFREQ / 3 ; SCHEDULE IN 1/3 SECOND TO TURN OFF SOUND LD (AY_TIMTIK), A -; + LD HL, (VEC_TICK + 1) ; GET CUR TICKS VECTOR LD (AY_TIMHOOK), HL ; SAVE IT INTERNALLY LD HL, AY_TIMER ; INSTALL TIMER HOOK HANDLER LD (VEC_TICK + 1), HL -; + LD A, $02 ; NOT READY & IN INTERUPT HANDLER LD (AY_READY), A + #ELSE CALL LDELAY ; HALF SECOND DELAY LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS LD A, $01 ; READY & NOT IN INTERUPT HANDLER LD (AY_READY), A + #ENDIF ; XOR A ; SUCCESSFULL INIT RET -; -#IF SYSTIMEN + +#IF (SYSTIM != TM_NONE) + AY_TIMER: LD A, (AY_TIMTIK) DEC A LD (AY_TIMTIK), A JR NZ, AY_TIMER1 -; + LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS LD A, $01 ; READY & NOT IN INTERUPT HANDLER LD (AY_READY), A -; + LD DE, AY_TIMER ; MAKE AY_TIMER A NO_OP HANDLER LD HL, AY_TIMER1 LD BC, 3 LDIR -; + AY_TIMER1: JP 0 ; OVERWRITTEN WITH NEXT HANDLER AY_TIMHOOK: .EQU $ - 2 AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP + #ENDIF ; ;====================================================================== @@ -182,7 +185,7 @@ AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP AY_INIT: LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000 JP AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE -; + AY_CHKREDY: LD A, (AY_READY) BIT 0, A @@ -216,7 +219,7 @@ AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS AY_RESET: AUDTRACE(AYT_INIT) CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY -; + PUSH DE PUSH HL CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION @@ -258,34 +261,10 @@ AY_NOTE: AUDTRACE(AYT_NOTE) AUDTRACE_HL AUDTRACE_CR -; -; CALL PRTHEXWORDHL -; CALL PC_COLON -; - LD DE, AY3NOTETBL ; ON ENTRY HL IS THE NOTE TO PLAY - PUSH DE ; AND DE IS THE START OF NOTE TABLE - LD DE, 48 ; LOAD DE WITH NOTE TABLE SIZE - CALL DIV16 ; AND CALCULATE OCTAVE COUNT IN BC -; - ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE - POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE - ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY. -; - LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY - INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL - LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE - LD L, A -; - LD A,AY_SCALE ; THE NOTE TABLE PERIOD DATA HAS BEEN - ADD A,C ; PRESCALED TO MAINTAIN RANGE SO ALLOW - LD B,A ; FOR THIS WHEN CHANGING OCTAVE -AY_NOTE1: - SRL H ; ADJUST THE PERIOD DATA - RR L ; FOR THE DESIRED OCTAVE - DJNZ AY_NOTE1 ; FALL THROUGH TO SET PERIOD AND RANGE CHECK -; -; CALL PRTHEXWORDHL -; CALL NEWLINE + + LD DE, AY3NOTETBL + CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU + ; TO SET THIS PERIOD ; ;====================================================================== ; SOUND DRIVER FUNCTION - PERIOD @@ -299,7 +278,7 @@ AY_PERIOD: LD A, H ; IF ZERO - ERROR OR L JR Z, AY_PERIOD1 -; + LD A, H ; MAXIMUM TONE PERIOD IS 12-BITS AND 11110000B ; ALLOWED RANGE IS 0001-0FFF (4095) JR NZ, AY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE @@ -447,6 +426,7 @@ AY_EI: RET NZ HB_EI RET + ; ;====================================================================== ; @@ -480,6 +460,7 @@ AY_WRTPSG: OUT (112),A ; NORMAL CLOCK SPEED #ENDIF JP AY_EI + ; ;====================================================================== ; @@ -529,14 +510,13 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $" #ENDIF ; ;====================================================================== -; QUARTER TONE FREQUENCY TABLE +; BBC MICRO QUARTER TONE FREQUENCY TABLE ;====================================================================== ; -; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCTAVE 0 +; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCATVE 0 ; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP) ; FIRST PLAYABLE NOTE WILL BE 0 ; ASSUMING A CLOCK OF 1843200 THIS MAPS TO A0# -; AY3NOTETBL: .DW AY_RATIO / 2913 .DW AY_RATIO / 2956 From 78c11124e2e1e8aec841884dc79693e2f7d4922d Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 22 May 2020 15:56:26 +0800 Subject: [PATCH 08/27] Update ay38910.asm --- Source/HBIOS/ay38910.asm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 1cff70b3..65c106e9 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -4,7 +4,7 @@ ; ;====================================================================== ; -#include "cfg_state.inc" +;#include "cfg_state.inc" ; AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE ; @@ -67,7 +67,7 @@ AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE ; ; DEVICE CAPABILITIES AND CONFIGURATION ; -SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER +SBCV2004 .EQU 1 ; USE SBC-V2-004 HALF CLOCK DIVIDER ; AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS @@ -129,7 +129,7 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD DE,(AY_R3CHBP*256)+$00 CALL AY_WRTPSG ; R03 = $00 = XXXX0000 ; -#IF SYSTIMEN +#IF (SYSTIM != TM_NONE) LD A, TICKFREQ / 3 ; SCHEDULE IN 1/3 SECOND TO TURN OFF SOUND LD (AY_TIMTIK), A ; @@ -151,7 +151,7 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE XOR A ; SUCCESSFULL INIT RET ; -#IF SYSTIMEN +#IF (SYSTIM != TM_NONE) AY_TIMER: LD A, (AY_TIMTIK) DEC A @@ -259,8 +259,8 @@ AY_NOTE: AUDTRACE_HL AUDTRACE_CR ; -; CALL PRTHEXWORDHL -; CALL PC_COLON + CALL PRTHEXWORDHL + CALL PC_COLON ; LD DE, AY3NOTETBL ; ON ENTRY HL IS THE NOTE TO PLAY PUSH DE ; AND DE IS THE START OF NOTE TABLE @@ -284,8 +284,8 @@ AY_NOTE1: RR L ; FOR THE DESIRED OCTAVE DJNZ AY_NOTE1 ; FALL THROUGH TO SET PERIOD AND RANGE CHECK ; -; CALL PRTHEXWORDHL -; CALL NEWLINE + CALL PRTHEXWORDHL + CALL NEWLINE ; ;====================================================================== ; SOUND DRIVER FUNCTION - PERIOD From 88b6c7c477ac905b07edb078bbbbecc1dcb61d89 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 23 May 2020 10:03:08 +0800 Subject: [PATCH 09/27] Update spk.asm Align note table to architrecture standard. Quarter notes not supported - returns error status. Round detected cpu frequency up --- Source/HBIOS/spk.asm | 66 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 74678e2c..3125b00c 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -24,6 +24,9 @@ SP_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE SP_TONECNT .EQU 1 ; COUNT NUMBER OF TONE CHANNELS SP_NOISECNT .EQU 0 ; COUNT NUMBER OF NOISE CHANNELS ; +; FOR OTHER DRIVERS, THE PERIOD VALUE FOR THE TONE IS STORED AT PENDING_PERIOD +; FOR THE SPK DRIVER THE ADDRESS IN THE TONE TABLE IS STORED IN PENDING_PERIOD +; SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS) SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS) ; @@ -77,17 +80,39 @@ SP_STUB: ;====================================================================== ; SP_NOTE: +; CALL PRTHEXWORDHL +; CALL PC_COLON PUSH HL - PUSH DE ; ON ENTRY L IS A NOTE INDEX - LD H,0 ; CONVERT THIS NOTE INDEX - ADD HL,HL ; TO THE ASSOCIATED ENTRY - ADD HL,HL ; IN THE TUNE TABLE. + PUSH DE ; ON ENTRY HL IS A NOTE INDEX + LD A,L + AND 00000011B + JR Z,SP_NOTE1 +; + LD HL,$FFFF ; QUARTER NOTES + JR SP_NOTE2 ; NOT SUPPORTED +; +; LD A,L +; AND 11111100B +; LD L,A +; +SP_NOTE1: +; LD H,0 ; CONVERT THIS NOTE INDEX +; ADD HL,HL ; TO THE ASSOCIATED ENTRY +; ADD HL,HL ; IN THE TUNE TABLE. +; SRL H +; RR L +; SRL H +; RR L LD DE,SP_TUNTBL ; SAVE THIS ADDRESS AS ADD HL,DE ; THE PERIOD +SP_NOTE2: +; CALL PRTHEXWORDHL +; CALL NEWLINE LD (SP_PENDING_PERIOD),HL POP DE POP HL RET + ; ;====================================================================== ; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS @@ -132,14 +157,24 @@ SP_QUERY_DEV: RET ; ;====================================================================== -; INITIALIZE THE TONE TABLE +; INITIALIZE THE TONE TABLE - ONLY ACCURATE FOR 1MHZ INCREMENTS ;====================================================================== ; SP_SETTBL: - LD A,(CB_CPUMHZ) ; GET CPU SPEED. - LD C,A -; - LD B,SP_NOTCNT ; SET NUMBER OF NOTES TO + LD HL,(CB_CPUKHZ) ; GET CPU SPEED. + LD DE,1000 ; CONVERT TO MHZ + CALL DIV16 +; + LD DE,900 ; IF MHZ IS WITHIN 10% OF + SBC HL,DE ; NEXT INTEGER INCREMENT + JP M,SP_SETTBL3 ; THEN BUMP UP. I.E. 9.928MHZ + INC C ; BECOMES 10MHZ +; +SP_SETTBL3: +; LD A,C +; CALL PRTHEXBYTE +; + LD B,SP_NOTCNT ; SET NUMBER OF NOTES TO LD HL,SP_TUNTBL+2 ; ADJUST AND START POINT ; SP_SETTBL2: @@ -179,6 +214,13 @@ SP_SETTBL1: ; 1MHZ NOTE SP_PLAY: LD HL,(SP_PENDING_PERIOD) ; SELECT NOTE ; + LD A,$FF ; EXIT WITH ERROR + CP H ; STATUS IF INVALID + JR NZ,SP_PLAY1 ; PERIOD ($FFFF) + CP L + RET Z +; +SP_PLAY1: LD E,(HL) ; LOAD 1ST ARG INC HL ; IN DE LD D,(HL) @@ -261,7 +303,7 @@ BE_AGAIN: BE_END: HB_EI POP IX - RET + RET ; ALWAYS EXITS WITH SUCCESS STATUS (A=0) ; ; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SP_BEEPER, FIRST WORD LOADED INTO DE, SECOND INTO HL ; @@ -269,6 +311,10 @@ BE_END: ; ; https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=boards:sbc:sbc_v2:sbc_v2-004:spk_beep_tuntbl.xlsx ; +SP_TUN: + .DW -$1, $FFFF ; C0 + .DW -$1, $FFFF ; C + .DW -$1, $FFFF ; D0 SP_TUNTBL: .DW $13, $191A ; D .DW $14, $17B3 ; E0 From 65202c946020a2bb3daf0f944acc5a663d769d1c Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 23 May 2020 18:09:33 +0800 Subject: [PATCH 10/27] Update spk.asm Calculate tone table at assembly from frequency --- Source/HBIOS/spk.asm | 160 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 141 insertions(+), 19 deletions(-) diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 3125b00c..7f27fa7f 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -80,8 +80,8 @@ SP_STUB: ;====================================================================== ; SP_NOTE: -; CALL PRTHEXWORDHL -; CALL PC_COLON + CALL PRTHEXWORDHL + CALL PC_COLON PUSH HL PUSH DE ; ON ENTRY HL IS A NOTE INDEX LD A,L @@ -106,13 +106,12 @@ SP_NOTE1: LD DE,SP_TUNTBL ; SAVE THIS ADDRESS AS ADD HL,DE ; THE PERIOD SP_NOTE2: -; CALL PRTHEXWORDHL -; CALL NEWLINE + CALL PRTHEXWORDHL + CALL NEWLINE LD (SP_PENDING_PERIOD),HL POP DE POP HL RET - ; ;====================================================================== ; SOUND DRIVER FUNCTION - QUERY AND SUBFUNCTIONS @@ -175,7 +174,7 @@ SP_SETTBL3: ; CALL PRTHEXBYTE ; LD B,SP_NOTCNT ; SET NUMBER OF NOTES TO - LD HL,SP_TUNTBL+2 ; ADJUST AND START POINT + LD HL,SP_TUNSTA+2 ; ADJUST AND START POINT ; SP_SETTBL2: PUSH HL @@ -185,10 +184,14 @@ SP_SETTBL2: ; PUSH BC LD B,C - LD HL,0 ; MULTIPLY -SP_SETTBL1: ; 1MHZ NOTE - ADD HL,DE ; VALUE BY - DJNZ SP_SETTBL1 ; SYSTEM MHZ + LD HL,0 ; MULTIPLY 1MHZ +SP_SETTBL1: ; NOTE VALUE BY + ADD HL,DE ; SYSTEM MHZ + JR NC,SP_SETBL4 + LD HL,$FFFF ; FOR CPU > 10MHz + LD B,1 ; HANDLE OVERFLOW +SP_SETBL4: + DJNZ SP_SETTBL1 POP BC ; LD DE,30 ; ADD OVERHEAD @@ -226,6 +229,13 @@ SP_PLAY1: LD D,(HL) INC HL +; LD A,$FF ; EXIT WITH ERROR + CP D ; STATUS IF INVALID + JR NZ,SP_PLAY2 ; NOTE ($FFFF) + CP E + RET Z +; +SP_PLAY2: LD C,(HL) ; LOAD 2ND ARG INC HL ; IN BC LD B,(HL) @@ -311,12 +321,126 @@ BE_END: ; ; https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=boards:sbc:sbc_v2:sbc_v2-004:spk_beep_tuntbl.xlsx ; -SP_TUN: - .DW -$1, $FFFF ; C0 - .DW -$1, $FFFF ; C - .DW -$1, $FFFF ; D0 +; +#DEFINE SP_TONESET(SP_FREQ) .DW SP_FREQ/100, 12500000/SP_FREQ +; SP_TUNTBL: - .DW $13, $191A ; D +SP_TUNSTA: + SP_TONESET(1635) ; C0 + SP_TONESET(1732) ; C + SP_TONESET(1835) ; D0 + SP_TONESET(1945) ; E0 + SP_TONESET(2060) ; F0 + SP_TONESET(2183) ; F + SP_TONESET(2312) ; G0 + SP_TONESET(2450) ; G + SP_TONESET(2596) ; A0 + SP_TONESET(2750) ; A + SP_TONESET(2914) ; + SP_TONESET(3087) ; B0 + SP_TONESET(3270) ; C1 + SP_TONESET(3465) ; C + SP_TONESET(3671) ; D1 + SP_TONESET(3889) ; D + SP_TONESET(4120) ; E1 + SP_TONESET(4365) ; F1 + SP_TONESET(4625) ; F + SP_TONESET(4900) ; G1 + SP_TONESET(5191) ; G + SP_TONESET(5500) ; A1 + SP_TONESET(5827) ; A + SP_TONESET(6174) ; B1 + SP_TONESET(6541) ; C2 + SP_TONESET(6930) ; C + SP_TONESET(7342) ; D2 + SP_TONESET(7778) ; D + SP_TONESET(8241) ; E2 + SP_TONESET(8731) ; F2 + SP_TONESET(9250) ; F + SP_TONESET(9800) ; G2 + SP_TONESET(10383) ; G + SP_TONESET(11000) ; A2 + SP_TONESET(11654) ; A + SP_TONESET(12347) ; B2 + SP_TONESET(13081) ; C3 + SP_TONESET(13859) ; C + SP_TONESET(14683) ; D3 + SP_TONESET(15556) ; D + SP_TONESET(16481) ; E3 + SP_TONESET(17461) ; F3 + SP_TONESET(18500) ; F + SP_TONESET(19600) ; G3 + SP_TONESET(20765) ; G + SP_TONESET(22000) ; A3 + SP_TONESET(23308) ; A + SP_TONESET(24694) ; B3 + SP_TONESET(26163) ; C4 + SP_TONESET(27718) ; C + SP_TONESET(29366) ; D4 + SP_TONESET(31113) ; D + SP_TONESET(32963) ; E4 + SP_TONESET(34923) ; F4 + SP_TONESET(36999) ; F + SP_TONESET(39200) ; G4 + SP_TONESET(41530) ; G + SP_TONESET(44000) ; A4 + SP_TONESET(46616) ; A + SP_TONESET(49388) ; B4 + SP_TONESET(52325) ; C5 + SP_TONESET(55437) ; C + SP_TONESET(58733) ; D5 + SP_TONESET(62225) ; D + SP_TONESET(65925) ; E5 + SP_TONESET(69846) ; F5 + SP_TONESET(73999) ; F + SP_TONESET(78399) ; G5 + SP_TONESET(83061) ; G + SP_TONESET(88000) ; A5 + SP_TONESET(93233) ; A + SP_TONESET(98777) ; B5 + SP_TONESET(104650) ; C6 + SP_TONESET(110873) ; C + SP_TONESET(117466) ; D6 + SP_TONESET(124451) ; D + SP_TONESET(131851) ; E6 + SP_TONESET(139691) ; F6 + SP_TONESET(147998) ; F + SP_TONESET(156798) ; G6 + SP_TONESET(166122) ; G + SP_TONESET(179000) ; A6 + SP_TONESET(186466) ; A + SP_TONESET(197553) ; B6 + SP_TONESET(209300) ; C7 + SP_TONESET(221746) ; C + SP_TONESET(234932) ; D7 + SP_TONESET(248902) ; D + SP_TONESET(263702) ; E7 + SP_TONESET(279383) ; F7 + SP_TONESET(295996) ; F + SP_TONESET(313596) ; G7 + SP_TONESET(332244) ; G + SP_TONESET(352000) ; A7 + SP_TONESET(372931) ; A + SP_TONESET(395107) ; B7 +SP_NOTE_C8: + SP_TONESET(418601) ; C8 + SP_TONESET(443492) ; C + SP_TONESET(469863) ; D8 + SP_TONESET(497803) ; D + SP_TONESET(527404) ; E8 + SP_TONESET(558765) ; F8 + SP_TONESET(591991) ; F + SP_TONESET(627193) ; G8 + SP_TONESET(664488) ; G + SP_TONESET(704000) ; A8 + SP_TONESET(745862) ; A + SP_TONESET(790213) ; B8 +; +SP_NOTCNT .EQU ($-SP_TUNSTA) / 4 +; + .DW $10, $FFFF ; C0 ; WILL OVERFLOW AT 10MHZ + .DW $11, $FFFF ; C ; WILL OVERFLOW AT 10MHZ + .DW $12, $FFFF ; D0 ; WILL OVERFLOW AT 10MHZ .DW $14, $17B3 ; E0 .DW $15, $165E ; F0 .DW $17, $151E ; F @@ -409,7 +533,7 @@ SP_TUNTBL: .DW $DC0, $23 ; A7 .DW $E91, $21 ; A .DW $F6F, $1F ; B7 -SP_NOTE_C8: +;SP_NOTE_C8: .DW $105A, $1D ; C8 .DW $1152, $1C ; C .DW $125A, $1A ; D8 @@ -422,6 +546,4 @@ SP_NOTE_C8: .DW $1B80, $11 ; A8 .DW $1D22, $10 ; A .DW $1EDE, $F ; B8 -; -SP_NOTCNT .EQU ($-SP_TUNTBL) / 4 -; + From c7b94163ee4a42f01a6afab4b4da327d019a7e4e Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 23 May 2020 19:21:45 +0800 Subject: [PATCH 11/27] Update spk.asm --- Source/HBIOS/spk.asm | 234 ++++++++++--------------------------------- 1 file changed, 53 insertions(+), 181 deletions(-) diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 7f27fa7f..6fe58a44 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -80,34 +80,23 @@ SP_STUB: ;====================================================================== ; SP_NOTE: - CALL PRTHEXWORDHL - CALL PC_COLON +; CALL PRTHEXWORDHL +; CALL PC_COLON PUSH HL PUSH DE ; ON ENTRY HL IS A NOTE INDEX - LD A,L - AND 00000011B - JR Z,SP_NOTE1 + LD A,L ; CONVERT THIS NOTE INDEX + AND 00000011B ; TO THE ASSOCIATED ENTRY + JR Z,SP_NOTE1 ; IN THE TUNE TABLE. ; LD HL,$FFFF ; QUARTER NOTES JR SP_NOTE2 ; NOT SUPPORTED ; -; LD A,L -; AND 11111100B -; LD L,A -; SP_NOTE1: -; LD H,0 ; CONVERT THIS NOTE INDEX -; ADD HL,HL ; TO THE ASSOCIATED ENTRY -; ADD HL,HL ; IN THE TUNE TABLE. -; SRL H -; RR L -; SRL H -; RR L LD DE,SP_TUNTBL ; SAVE THIS ADDRESS AS ADD HL,DE ; THE PERIOD SP_NOTE2: - CALL PRTHEXWORDHL - CALL NEWLINE +; CALL PRTHEXWORDHL +; CALL NEWLINE LD (SP_PENDING_PERIOD),HL POP DE POP HL @@ -170,11 +159,8 @@ SP_SETTBL: INC C ; BECOMES 10MHZ ; SP_SETTBL3: -; LD A,C -; CALL PRTHEXBYTE -; LD B,SP_NOTCNT ; SET NUMBER OF NOTES TO - LD HL,SP_TUNSTA+2 ; ADJUST AND START POINT + LD HL,SP_TUNTBL+2 ; ADJUST AND START POINT ; SP_SETTBL2: PUSH HL @@ -194,7 +180,7 @@ SP_SETBL4: DJNZ SP_SETTBL1 POP BC ; - LD DE,30 ; ADD OVERHEAD + LD DE,15 ; ADD OVERHEAD ADD HL,DE ; COMPENSATION ; POP DE ; RECALL NOTE @@ -222,25 +208,25 @@ SP_PLAY: JR NZ,SP_PLAY1 ; PERIOD ($FFFF) CP L RET Z -; + SP_PLAY1: LD E,(HL) ; LOAD 1ST ARG INC HL ; IN DE LD D,(HL) INC HL - -; LD A,$FF ; EXIT WITH ERROR - CP D ; STATUS IF INVALID - JR NZ,SP_PLAY2 ; NOTE ($FFFF) - CP E - RET Z ; -SP_PLAY2: LD C,(HL) ; LOAD 2ND ARG INC HL ; IN BC LD B,(HL) INC HL ; +; LD A,$FF ; EXIT WITH ERROR + CP B ; STATUS IF INVALID + JR NZ,SP_PLAY2 ; NOTE ($FFFF) + CP C + RET Z +; +SP_PLAY2: PUSH BC ; SETUP ARG IN HL POP HL ; @@ -315,28 +301,23 @@ BE_END: POP IX RET ; ALWAYS EXITS WITH SUCCESS STATUS (A=0) ; -; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SP_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 -; +; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). +; FOR SP_BEEPER ROUTINE, FIRST WORD LOADED INTO DE, SECOND INTO HL ; #DEFINE SP_TONESET(SP_FREQ) .DW SP_FREQ/100, 12500000/SP_FREQ ; SP_TUNTBL: -SP_TUNSTA: SP_TONESET(1635) ; C0 SP_TONESET(1732) ; C - SP_TONESET(1835) ; D0 - SP_TONESET(1945) ; E0 - SP_TONESET(2060) ; F0 - SP_TONESET(2183) ; F - SP_TONESET(2312) ; G0 - SP_TONESET(2450) ; G - SP_TONESET(2596) ; A0 - SP_TONESET(2750) ; A - SP_TONESET(2914) ; + SP_TONESET(1835) ; D0 + SP_TONESET(1945) ; D + SP_TONESET(2060) ; E0 + SP_TONESET(2183) ; F0 + SP_TONESET(2312) ; F + SP_TONESET(2450) ; G0 + SP_TONESET(2596) ; G + SP_TONESET(2750) ; A0 + SP_TONESET(2914) ; A SP_TONESET(3087) ; B0 SP_TONESET(3270) ; C1 SP_TONESET(3465) ; C @@ -347,7 +328,7 @@ SP_TUNSTA: SP_TONESET(4625) ; F SP_TONESET(4900) ; G1 SP_TONESET(5191) ; G - SP_TONESET(5500) ; A1 + SP_TONESET(5500) ; A1 SP_TONESET(5827) ; A SP_TONESET(6174) ; B1 SP_TONESET(6541) ; C2 @@ -374,17 +355,17 @@ SP_TUNSTA: SP_TONESET(22000) ; A3 SP_TONESET(23308) ; A SP_TONESET(24694) ; B3 - SP_TONESET(26163) ; C4 - SP_TONESET(27718) ; C - SP_TONESET(29366) ; D4 - SP_TONESET(31113) ; D - SP_TONESET(32963) ; E4 - SP_TONESET(34923) ; F4 - SP_TONESET(36999) ; F - SP_TONESET(39200) ; G4 - SP_TONESET(41530) ; G - SP_TONESET(44000) ; A4 - SP_TONESET(46616) ; A + SP_TONESET(26163) ; C4 + SP_TONESET(27718) ; C + SP_TONESET(29366) ; D4 + SP_TONESET(31113) ; D + SP_TONESET(32963) ; E4 + SP_TONESET(34923) ; F4 + SP_TONESET(36999) ; F + SP_TONESET(39200) ; G4 + SP_TONESET(41530) ; G + SP_TONESET(44000) ; A4 + SP_TONESET(46616) ; A SP_TONESET(49388) ; B4 SP_TONESET(52325) ; C5 SP_TONESET(55437) ; C @@ -423,127 +404,18 @@ SP_TUNSTA: SP_TONESET(372931) ; A SP_TONESET(395107) ; B7 SP_NOTE_C8: - SP_TONESET(418601) ; C8 - SP_TONESET(443492) ; C - SP_TONESET(469863) ; D8 - SP_TONESET(497803) ; D - SP_TONESET(527404) ; E8 - SP_TONESET(558765) ; F8 - SP_TONESET(591991) ; F - SP_TONESET(627193) ; G8 - SP_TONESET(664488) ; G - SP_TONESET(704000) ; A8 - SP_TONESET(745862) ; A + SP_TONESET(418601) ; C8 + SP_TONESET(443492) ; C + SP_TONESET(469863) ; D8 + SP_TONESET(497803) ; D + SP_TONESET(527404) ; E8 + SP_TONESET(558765) ; F8 + SP_TONESET(591991) ; F + SP_TONESET(627193) ; G8 + SP_TONESET(664488) ; G + SP_TONESET(704000) ; A8 + SP_TONESET(745862) ; A SP_TONESET(790213) ; B8 ; -SP_NOTCNT .EQU ($-SP_TUNSTA) / 4 -; - .DW $10, $FFFF ; C0 ; WILL OVERFLOW AT 10MHZ - .DW $11, $FFFF ; C ; WILL OVERFLOW AT 10MHZ - .DW $12, $FFFF ; D0 ; WILL OVERFLOW AT 10MHZ - .DW $14, $17B3 ; E0 - .DW $15, $165E ; F0 - .DW $17, $151E ; F - .DW $18, $13EE ; G0 - .DW $19, $12CF ; G - .DW $1B, $11C1 ; A0 - .DW $1D, $10C1 ; A - .DW $1E, $FD1 ; B0 - .DW $20, $EEE ; C1 - .DW $22, $E17 ; C - .DW $24, $D4D ; D1 - .DW $26, $C8E ; D - .DW $29, $BD9 ; E1 - .DW $2B, $B2F ; F1 - .DW $2E, $A8E ; F - .DW $31, $9F7 ; G1 - .DW $33, $968 ; G - .DW $37, $8E0 ; A1 - .DW $3A, $861 ; A - .DW $3D, $7E8 ; B1 - .DW $41, $777 ; C2 - .DW $45, $70B ; C - .DW $49, $6A6 ; D2 - .DW $4D, $647 ; D - .DW $52, $5EC ; E2 - .DW $57, $597 ; F2 - .DW $5C, $547 ; F - .DW $62, $4FB ; G2 - .DW $67, $4B3 ; G - .DW $6E, $470 ; A2 - .DW $74, $430 ; A - .DW $7B, $3F4 ; B2 - .DW $82, $3BB ; C3 - .DW $8A, $385 ; C - .DW $92, $353 ; D3 - .DW $9B, $323 ; D - .DW $A4, $2F6 ; E3 - .DW $AE, $2CB ; F3 - .DW $B9, $2A3 ; F - .DW $C4, $27D ; G3 - .DW $CF, $259 ; G - .DW $DC, $238 ; A3 - .DW $E9, $218 ; A - .DW $F6, $1FA ; B3 - .DW $105, $1DD ; C4 - .DW $115, $1C2 ; C - .DW $125, $1A9 ; D4 - .DW $137, $191 ; D - .DW $149, $17B ; E4 - .DW $15D, $165 ; F4 - .DW $171, $151 ; F - .DW $188, $13E ; G4 - .DW $19F, $12C ; G - .DW $1B8, $11C ; A4 - .DW $1D2, $10C ; A - .DW $1ED, $FD ; B4 - .DW $20B, $EE ; C5 - .DW $22A, $E1 ; C - .DW $24B, $D4 ; D5 - .DW $26E, $C8 ; D - .DW $293, $BD ; E5 - .DW $2BA, $B2 ; F5 - .DW $2E3, $A8 ; F - .DW $30F, $9F ; G5 - .DW $33E, $96 ; G - .DW $370, $8E ; A5 - .DW $3A4, $86 ; A - .DW $3DB, $7E ; B5 - .DW $416, $77 ; C6 - .DW $454, $70 ; C - .DW $496, $6A ; D6 - .DW $4DC, $64 ; D - .DW $526, $5E ; E6 - .DW $574, $59 ; F6 - .DW $5C7, $54 ; F - .DW $61F, $4F ; G6 - .DW $67D, $4B ; G - .DW $6E0, $47 ; A6 - .DW $748, $43 ; A - .DW $7B7, $3F ; B6 - .DW $82D, $3B ; C7 - .DW $8A9, $38 ; C - .DW $92D, $35 ; D7 - .DW $9B9, $32 ; D - .DW $A4D, $2F ; E7 - .DW $AE9, $2C ; F7 - .DW $B8F, $2A ; F - .DW $C3F, $27 ; G7 - .DW $CFA, $25 ; G - .DW $DC0, $23 ; A7 - .DW $E91, $21 ; A - .DW $F6F, $1F ; B7 -;SP_NOTE_C8: - .DW $105A, $1D ; C8 - .DW $1152, $1C ; C - .DW $125A, $1A ; D8 - .DW $1372, $19 ; D - .DW $149A, $17 ; E8 - .DW $15D3, $16 ; F8 - .DW $171F, $15 ; F - .DW $187F, $13 ; G8 - .DW $19F4, $12 ; G - .DW $1B80, $11 ; A8 - .DW $1D22, $10 ; A - .DW $1EDE, $F ; B8 - +SP_NOTCNT .EQU ($-SP_TUNTBL) / 4 +; From bd91cb1873a47bafd9cc107d18f20e4cdab93773 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sat, 23 May 2020 19:28:37 +0800 Subject: [PATCH 12/27] Update hbios.asm --- Source/HBIOS/hbios.asm | 101 +++++++++++------------------------------ 1 file changed, 26 insertions(+), 75 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index c86c361f..2e017e0f 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1628,7 +1628,6 @@ HB_INIT_REC: #IF (PLATFORM == PLT_SBC) .DW UART_INIT .DW MD_INIT - .DW FD_INIT #ENDIF HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2) ; @@ -1646,6 +1645,9 @@ HB_PCINITTBL: #IF (UARTENABLE) .DW UART_PREINIT #ENDIF +#IF (DUARTENABLE) + .DW DUART_PREINIT +#ENDIF #IF (SIOENABLE) .DW SIO_PREINIT #ENDIF @@ -1671,14 +1673,14 @@ HB_INITTBL: #IF (CTCENABLE) .DW CTC_INIT #ENDIF -#IF (AY38910ENABLE) - .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START +#IF (SPKENABLE) + .DW SP_INIT ; AUDIBLE INDICATOR OF BOOT START #ENDIF #IF (SN76489ENABLE) .DW SN76489_INIT #ENDIF -#IF (SPKENABLE) - .DW SP_INIT ; AUDIBLE INDICATOR OF BOOT START +#IF (AY38910ENABLE) + .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START #ENDIF #IF (ASCIENABLE) .DW ASCI_INIT @@ -1686,6 +1688,9 @@ HB_INITTBL: #IF (UARTENABLE) .DW UART_INIT #ENDIF +#IF (DUARTENABLE) + .DW DUART_INIT +#ENDIF #IF (SIOENABLE) .DW SIO_INIT #ENDIF @@ -3151,6 +3156,15 @@ SIZ_UART .EQU $ - ORG_UART .ECHO " bytes.\n" #ENDIF ; +#IF (DUARTENABLE) +ORG_DUART .EQU $ + #INCLUDE "duart.asm" +SIZ_DUART .EQU $ - ORG_DUART + .ECHO "DUART occupies " + .ECHO SIZ_DUART + .ECHO " bytes.\n" +#ENDIF +; #IF (SIOENABLE) ORG_SIO .EQU $ #INCLUDE "sio.asm" @@ -3666,15 +3680,10 @@ PRTSUM: LD C,BF_SYSGET_DIOCNT ; DISK DRIVES LD HL,PS_DISK CALL PRT_ALLD -; + LD C,BF_SYSGET_VDACNT ; VIDEO DEVICES LD HL,PS_VIDEO CALL PRT_ALLD - - LD C,BF_SYSGET_SNDCNT ; SOUND DEVICES - LD HL,PS_SOUND - CALL PRT_ALLD -; RET ; PRT_ALLD: @@ -4017,56 +4026,6 @@ PS_PRTVC: CALL PRTDECB RET ; -; PRINT SOUND CONFIG -; -PS_SOUND: - PUSH BC - - ; UNIT COLUMN - PRTS("Sound $") - LD A,C ; MOVE UNIT NUM TO A - CALL PRTDECB ; PRINT IT - CP 10 ; CHECK FOR MULTIPLE DIGITS - CALL C,PC_SPACE ; EXTRA SPACE IF NEEDED - PRTS(" $") ; PAD TO NEXT COLUMN - - ; DEVICE COLUMN - - PUSH BC ; - LD E,C - XOR A - LD DE,PS_SDSND ; POINT TO DEVICE TYPE NAME TABLE - CALL PRTIDXDEA ; PRINT DEVICE NMEMONIC PADDED TO FIELD WIDTH - LD A,C ; MOVE UNIT NUM TO A - CALL PRTDECB ; PRINT IT - CALL PC_COLON - CP 10 ; CHECK FOR MULTIPLE DIGITS - CALL C,PC_SPACE ; EXTRA SPACE IF NEEDED - LD A,(PRTIDXCNT) - SUB 9+1 - CPL - CALL PS_PAD - POP BC - - ; DEVICE TYPE -; - LD B,BF_SNDQUERY ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C - LD E,BF_SNDQ_DEV - RST 08 - LD A,B - DEC A - LD DE,PS_SDSN76489 - CALL PRTIDXDEA - LD A,(PRTIDXCNT) - SUB 18+1 - CPL - CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A) -; - CALL NEWLINE -; - POP BC - RET -; ; PRINT DEVICE NMEMONIC, DEVTYP/NUM SPECIFIED IN DE ; PS_PRTDEV: @@ -4075,7 +4034,6 @@ PS_PRTDEV: RRCA RRCA RRCA -PS_PRTDEV1: RLCA ; X2 FOR WORD OFFSET IN STRING TABLE CALL ADDHLA LD A,(HL) @@ -4097,9 +4055,10 @@ PS_PRTNUL: LD HL,PS_STRNUL ; FALL THRU TO PS_PRT ; -; PRINT STRING AT (HL), $ TERM, RETURN CHARS PRINTED IN C +; ; PS_PRT: + ; PRINT STRING AT (HL), $ TERM, RETURN CHARS PRINTED IN C LD C,0 ; INIT CHAR COUNT PS_PRT1: LD A,(HL) ; GET CHAR @@ -4110,9 +4069,10 @@ PS_PRT1: INC C ; BUMP COUNTER JR PS_PRT1 ; AND LOOP ; -; PAD N SPACES SPECIFIED IN A +; ; PS_PAD: + ; PAD N SPACES SPECIFIED IN A LD B,A LD A,' ' PS_PAD1: @@ -4179,7 +4139,7 @@ PS_FLP_DSTR: .TEXT "SD$" ; PS_FLPSD ; PS_SDSTRREF: .DW PS_SDUART, PS_SDASCI, PS_SDTERM - .DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO, PS_SDACIA, PS_SDPIO,PS_SDUF + .DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO, PS_SDACIA, PS_SDPIO,PS_SDUF,PS_SDDUART ; PS_SDUART .TEXT "UART$" PS_SDASCI .TEXT "ASCI$" @@ -4190,6 +4150,7 @@ PS_SDSIO .TEXT "SIO$" PS_SDACIA .TEXT "ACIA$" PS_SDPIO .TEXT "PORT$" PS_SDUF .TEXT "UF$" +PS_SDDUART .TEXT "DUART$" ; ; CHARACTER SUB TYPE STRINGS ; @@ -4221,16 +4182,6 @@ PS_VDVGA .TEXT "VGA$" ; PS_VTCRT .TEXT "CRT$" ; -; SOUND DEVICE STRINGS -; -PS_SDSND .TEXT "SND$" -; -; SOUND TYPE STRINGS -; -PS_SDSN76489 .TEXT "SN76489$" -PS_SDAY38910 .TEXT "AY-3-8910$" -PS_SDBITMODE .TEXT "BITMODE$" -; ; 0 1 2 3 4 5 6 7 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 PS_STRHDR .TEXT "Unit Device Type Capacity/Mode\r\n" From cc7d0246049ce911382cd9dcfad29b6598413c7e Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sat, 23 May 2020 19:32:56 +0800 Subject: [PATCH 13/27] Update RomList.txt --- Binary/RomList.txt | 56 +++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 35 deletions(-) diff --git a/Binary/RomList.txt b/Binary/RomList.txt index 128e400e..f507226f 100644 --- a/Binary/RomList.txt +++ b/Binary/RomList.txt @@ -34,7 +34,7 @@ image to use for each platform: RC2014 w/ Z80 RCZ80_std.rom RC2014 w/ Z180 RCZ180_nat.rom (native Z180 memory addressing) RC2014 w/ Z180 RCZ180_ext.rom (external 512K RAM/ROM module) - SC-series SC126, SC130 + SC-series SC126, SC130, SC131 Easy Z80 EZZ180_std.rom Dyno DYNO_std.rom @@ -52,11 +52,6 @@ ROM on-the-fly. It is an excellent way to test a ROM Image before actually burning it. Similarly, the .img files can be loaded using the UNA FAT loader for testing. -WARNING: In a few cases the .com file is too big to load. If you get -a message like "Full" or "BAD LOAD" when trying to load one of the -.com files, it is too big. In these cases, you will not be able to -test the ROM prior to programming it. - All of the standard ROM Images are configured for: - 512KB ROM Disk - 512KB RAM Disk @@ -66,10 +61,10 @@ All of the standard ROM Images are configured for: * RC2014 and Stephen Cousins' kits run at 115,200Kbps baud All hard disk type devices (IDE, PPIDE, CF Card, SD Card) will be -automatically assigned two drive letters per device. The drive -letters will refer to the first 2 slices of the device. The ASSIGN -command can be used to display and reassign drives to disk devices -and slices as desired. +automatically assigned at least two drive letters per device. The +drive letters will refer to the first 2 slices of the device. The +ASSIGN command can be used to display and reassign drives to disk +devices and slices as desired. Standard ROM Image Notes ------------------------ @@ -153,36 +148,32 @@ MK4 (MK4_std.rom): RCZ80 (RCZ80_std.rom): - Assumes CPU oscillator of 7.3728 MHz - Requires 512K RAM/ROM module - - Auto detects Serial I/O Module (ACIA) and Dual Serial - Module (SIO/2). Either one may be used. + - Auto detects Serial I/O Module (ACIA), Dual Serial + Module (SIO/2), and EP Dual UART. - Console on whichever serial module is installed, - but will use the SIO/2 if both are installed. Baud - rate is determined by hardware, but normally 115200. - - Includes support for RC2014 Compact Flash Module - - Support for RC2014 PPIDE Module may be enabled in config + order of priority is UART, SIO, then ACIA. + - Baud rate is determined by hardware, but normally 115200. + - Auto support for RC2014 Compact Flash Module + - Auto support for RC2014 PPIDE Module - Support for Scott Baker SIO board may be enabled in config - Support for Scott Baker floppy controllers (SMC & WDC) may be enabled in config + - Support for J.B. Lang TMS9918 video card may be enabled in config RCZ80 w/ KIO (RCZ80_kio.rom): - - Assumes CPU oscillator of 7.3728 MHz - - Requires 512K RAM/ROM module + - Save as RCZ80_std - Requires KIO module - - Console on KIO primary serial port at 115200 baud - - Includes support for RC2014 Compact Flash Module - - Includes support for RC2014 PPIDE Module - - Support for Scott Baker SIO board may be enabled in config - - Support for Scott Baker floppy controllers (SMC & WDC) may - be enabled in config + - SIO ports provided by KIO RCZ180 (RCZ180_nat.rom & RCZ180_ext.rom): - Assumes CPU oscillator of 18.432 MHz - Console on Z180 onboard primary ASCI serial port at 115200 baud - - Includes support for RC2014 Compact Flash Module - - Includes support for RC2014 PPIDE Module + - Auto support for RC2014 Compact Flash Module + - Auto support for RC2014 PPIDE Module - Support for alternative serial modules may be enabled in config - Support for Scott Baker floppy controllers (SMC & WDC) may be enabled in config + - Support for J.B. Lang TMS9918 video card may be enabled in config - You must pick the _nat or _ext variant depending on which memory module you are using: - RCZ180_nat.rom uses the built-in Z180 memory manager @@ -192,13 +183,8 @@ RCZ180 (RCZ180_nat.rom & RCZ180_ext.rom): memory, such as the 512K RAM/ROM module. SCZ180 (SCZ180_126.rom, SCZ180_130.rom, SCZ180_131.rom): - - Assumes CPU oscillator of 18.432 MHz - - Console on Z180 onboard primary ASCI serial port at 115200 baud - - Includes support for RC2014 Compact Flash Module - - Includes support for RC2014 PPIDE Module - - Support for alternative serial modules may be enabled in config - - Support for Scott Baker floppy controllers (SMC & WDC) may - be enabled in config + - Same as RCZ180 + - Adds auto support for SPI SD Card - The 3 different variants of SCZ180 are provided to match the 3 corresponding systems (SC126, SC130, and SC131) designed by Stephen Cousins. @@ -207,8 +193,8 @@ EZZ80 (EZZ80_std.rom): - Assumes CPU oscillator of 10.000 MHz - Console on primary SIO serial port at 115200 baud - Includes support for on-board SIO - - Includes support for RC2014 Compact Flash Module - - Includes support for RC2014 PPIDE Module + - Auto support for RC2014 Compact Flash Module + - Auto support for RC2014 PPIDE Module DYNO (DYNO_std.rom): - Assumes CPU oscillator of 18.432 MHz From 1c0bdfab69c59c760cd952a41a265e7261df47f1 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sat, 23 May 2020 19:35:59 +0800 Subject: [PATCH 14/27] Update ver.inc --- Source/ver.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/ver.inc b/Source/ver.inc index f8b3b588..262cdc2b 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.12" +#DEFINE BIOSVER "3.1.1-pre.14" From 4359d1ddef7a66f041e8f72525c186ab90c9b19a Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sat, 23 May 2020 19:37:01 +0800 Subject: [PATCH 15/27] Update ver.lib --- Source/ver.lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/ver.lib b/Source/ver.lib index ffca8b84..5faac7c5 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.12" + db "3.1.1-pre.14" endm From b015cecb2a36e164c32ccac382d3348ab55e285a Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 23 May 2020 23:23:45 +0800 Subject: [PATCH 16/27] Audio driver updates --- Source/Doc/Architecture.md | 42 ++++++++++-------- Source/HBIOS/ay38910.asm | 88 ++++++++++++++++++++++++-------------- Source/HBIOS/hbios.asm | 87 ++++++++++++++++++++++++++++++++++--- Source/HBIOS/spk.asm | 8 ++-- 4 files changed, 166 insertions(+), 59 deletions(-) diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 6260d673..f786448e 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1429,23 +1429,32 @@ Increase by steps of 48 to select the same note in next octave. If the driver is able to generate the requested note, a success (0) is returned, otherwise a non-zero error state will be returned. +The sound chip resolution and its oscillator limit the range and +accuracy of the notes played. The typically range of the AY-3-8910 +is six octaves, Bb2/A#2-A7, where each value is a unique tone. Values +above and below can still be played but each quarter tone step may not +result in a note change. + The following table shows the mapping of the input value in HL to the corresponding octave and note. -| Note | Octave 0 | Octave 1 | Octave 2 | Octave 3 | Octave 4 | Octave 5 | Octave 6 | -|-------|----------|----------|----------|----------|----------|----------|----------| -| Bb/A# | 0 | 48 | 96 | 144 | 192 | 240 | 288 | -| B | 4 | 52 | 100 | 148 | 196 | 244 | 292 | -| C | 8 | 56 | 104 | 152 | 200 | 248 | 296 | -| C#/Db | 12 | 60 | 108 | 156 | 204 | 252 | 300 | -| D | 16 | 64 | 112 | 160 | 208 | 256 | 304 | -| Eb/D# | 20 | 68 | 116 | 164 | 212 | 260 | 308 | -| E | 24 | 72 | 120 | 168 | 216 | 264 | 312 | -| F | 28 | 76 | 124 | 172 | 220 | 268 | 316 | -| F#/Gb | 32 | 80 | 128 | 176 | 224 | 272 | 320 | -| G | 36 | 84 | 132 | 180 | 228 | 276 | 324 | -| Ab/G# | 40 | 88 | 136 | 184 | 232 | 280 | 328 | -| A | 44 | 92 | 140 | 188 | 236 | 284 | 332 | ++-------------------------------------------------------+ +| | OCTAVE | +| Note |-----------------------------------------------+ +| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +|-------|-----|-----|-----|-----|-----|-----|-----|-----+ +| Bb/A# | 0 | 48 | 96 | 144 | 192 | 240 | 288 | 336 | +| B | 4 | 52 | 100 | 148 | 196 | 244 | 292 | 340 | +| C | 8 | 56 | 104 | 152 | 200 | 248 | 296 | 344 | +| C#/Db | 12 | 60 | 108 | 156 | 204 | 252 | 300 | 348 | +| D | 16 | 64 | 112 | 160 | 208 | 256 | 304 | 352 | +| Eb/D# | 20 | 68 | 116 | 164 | 212 | 260 | 308 | 356 | +| E | 24 | 72 | 120 | 168 | 216 | 264 | 312 | 360 | +| F | 28 | 76 | 124 | 172 | 220 | 268 | 316 | 364 | +| F#/Gb | 32 | 80 | 128 | 176 | 224 | 272 | 320 | 368 | +| G | 36 | 84 | 132 | 180 | 228 | 276 | 324 | 372 | +| Ab/G# | 40 | 88 | 136 | 184 | 232 | 280 | 328 | 376 | +| A | 44 | 92 | 140 | 188 | 236 | 284 | 332 | 380 | ### Function 0x54 -- Sound Play (SNDPLAY) @@ -1529,9 +1538,6 @@ key aspects of the specific Audio Device. Reports information about the audio device unit specified. -At this stage, only one driver type is supported (SN76489), but is -envisaged that more will be added in the future. - Register B reports the audio device type (see below). Registers HL and DE contain relevant port addresses for the hardware @@ -1543,7 +1549,7 @@ AUDIO ID | Value | Device | Returned registers -------------- | ----- | ---------- | -------------------------------------------- SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel port SND_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port - +SND_BITMODE | 0x03 | I/O PORT | D: Address port, E: Bit mask `\clearpage`{=latex} diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 81c41223..f0315f77 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -4,10 +4,11 @@ ; ;====================================================================== ; - +; @3.579545 OCTAVE RANGE IS 2 - 7 (Bb2/A#2 .. A7) +; @4.000000 OCTAVE RANGE IS 2 - 7 (B2 .. A7) +; ;#include "cfg_state.inc" - - +; AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE ; #IF (AYMODE == AYMODE_SCG) @@ -15,6 +16,7 @@ AY_RSEL .EQU $9A AY_RDAT .EQU $9B AY_RIN .EQU AY_RSEL AY_ACR .EQU $9C +AY_CLK .SET 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 #ENDIF ; #IF (AYMODE == AYMODE_N8) @@ -73,10 +75,13 @@ SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS ; -AY_PHICLK .EQU 3579545 ; MSX NTSC COLOUR BURST FREQ = 315/88 -;AY_PHICLK .EQU 3500000 ; ZX SPECTRUM 3.5MHZ -;AY_PHICLK .EQU 4000000 ; RETROBREW SCB-SCG -AY_RATIO .EQU AY_CLK * 100 / 16 +#IF (AY_CLK > 3579545) ; DEPENDING ON THE +AY_SCALE .EQU 2 ; INPUT CLOCK FREQUENCY +#ELSE ; PRESCALE THE TONE PERIOD +AY_SCALE .EQU 3 ; DATA TO MAINTAIN MAXIMUM +#ENDIF ; RANGE AND ACCURACY +; +AY_RATIO .EQU (AY_CLK * 100) / (16 >> AY_SCALE) ; #INCLUDE "audio.inc" ; @@ -96,7 +101,7 @@ AY38910_INIT: CALL PRTHEXBYTE ; #IF ((AYMODE == AYMODE_SCG) | (AYMODE == AYMODE_N8)) - LD A,$FF ; ACTIVATE DEVICEBIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED + LD A,$FF ; ACTIVATE DEVICE BIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED OUT (AY_ACR),A ; SET INIT AUX CONTROL REG #ENDIF ; @@ -127,55 +132,50 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD DE,(AY_R3CHBP*256)+$00 CALL AY_WRTPSG ; R03 = $00 = XXXX0000 ; - #IF (SYSTIM != TM_NONE) LD A, TICKFREQ / 3 ; SCHEDULE IN 1/3 SECOND TO TURN OFF SOUND LD (AY_TIMTIK), A - +; LD HL, (VEC_TICK + 1) ; GET CUR TICKS VECTOR LD (AY_TIMHOOK), HL ; SAVE IT INTERNALLY LD HL, AY_TIMER ; INSTALL TIMER HOOK HANDLER LD (VEC_TICK + 1), HL - +; LD A, $02 ; NOT READY & IN INTERUPT HANDLER LD (AY_READY), A - #ELSE CALL LDELAY ; HALF SECOND DELAY LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS LD A, $01 ; READY & NOT IN INTERUPT HANDLER LD (AY_READY), A - #ENDIF ; XOR A ; SUCCESSFULL INIT RET - +; #IF (SYSTIM != TM_NONE) - AY_TIMER: LD A, (AY_TIMTIK) DEC A LD (AY_TIMTIK), A JR NZ, AY_TIMER1 - +; LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS LD A, $01 ; READY & NOT IN INTERUPT HANDLER LD (AY_READY), A - +; LD DE, AY_TIMER ; MAKE AY_TIMER A NO_OP HANDLER LD HL, AY_TIMER1 LD BC, 3 LDIR - +; AY_TIMER1: JP 0 ; OVERWRITTEN WITH NEXT HANDLER AY_TIMHOOK: .EQU $ - 2 AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP - #ENDIF ; ;====================================================================== @@ -185,7 +185,7 @@ AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP AY_INIT: LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000 JP AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE - +; AY_CHKREDY: LD A, (AY_READY) BIT 0, A @@ -219,7 +219,7 @@ AY_SV: CALL AY_WRTPSG ; CYCLING THROUGH ALL CHANNELS AY_RESET: AUDTRACE(AYT_INIT) CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY - +; PUSH DE PUSH HL CALL AY_INIT ; SET DEFAULT CHIP CONFIGURATION @@ -261,10 +261,34 @@ AY_NOTE: AUDTRACE(AYT_NOTE) AUDTRACE_HL AUDTRACE_CR - - LD DE, AY3NOTETBL - CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU - ; TO SET THIS PERIOD +; +; CALL PRTHEXWORDHL +; CALL PC_COLON +; + LD DE, AY3NOTETBL ; ON ENTRY HL IS THE NOTE TO PLAY + PUSH DE ; AND DE IS THE START OF NOTE TABLE + LD DE, 48 ; LOAD DE WITH NOTE TABLE SIZE + CALL DIV16 ; AND CALCULATE OCTAVE COUNT IN BC +; + ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE + POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE + ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY. +; + LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY + INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL + LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE + LD L, A +; + LD A,AY_SCALE-1 ; THE NOTE TABLE PERIOD DATA HAS BEEN + ADD A,C ; PRESCALED TO MAINTAIN RANGE SO ALLOW + LD B,A ; FOR THIS WHEN CHANGING OCTAVE +AY_NOTE1: + SRL H ; ADJUST THE PERIOD DATA + RR L ; FOR THE DESIRED OCTAVE + DJNZ AY_NOTE1 ; FALL THROUGH TO SET PERIOD AND RANGE CHECK +; +; CALL PRTHEXWORDHL +; CALL NEWLINE ; ;====================================================================== ; SOUND DRIVER FUNCTION - PERIOD @@ -278,7 +302,7 @@ AY_PERIOD: LD A, H ; IF ZERO - ERROR OR L JR Z, AY_PERIOD1 - +; LD A, H ; MAXIMUM TONE PERIOD IS 12-BITS AND 11110000B ; ALLOWED RANGE IS 0001-0FFF (4095) JR NZ, AY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE @@ -304,7 +328,6 @@ AY_PLAY: AUDTRACE_D AUDTRACE_CR CALL AY_CHKREDY ; RETURNS TO OUR CALLER IF NOT READY - ; LD A, (AY_PENDING_PERIOD + 1) ; CHECK THE HIGH BYTE OF THE PERIOD INC A @@ -412,21 +435,20 @@ AY_QUERY_DEV: LD DE, (AY_RSEL*256)+AY_RDAT ; AND ADDRESS AND DATA PORT XOR A RET - +; AY_DI: LD A, (AY_READY) BIT 1, A RET NZ HB_DI RET - +; AY_EI: LD A, (AY_READY) BIT 1, A RET NZ HB_EI RET - ; ;====================================================================== ; @@ -460,7 +482,6 @@ AY_WRTPSG: OUT (112),A ; NORMAL CLOCK SPEED #ENDIF JP AY_EI - ; ;====================================================================== ; @@ -510,13 +531,14 @@ AYT_REGWR .DB "\r\nOUT AY-3-8910 $" #ENDIF ; ;====================================================================== -; BBC MICRO QUARTER TONE FREQUENCY TABLE +; QUARTER TONE FREQUENCY TABLE ;====================================================================== ; -; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCATVE 0 +; THE FREQUENCY BY QUARTER TONE STARTING AT A0# OCTAVE 0 ; USED TO MAP EACH OCTAVE (DIV BY 2 TO JUMP AN OCTAVE UP) ; FIRST PLAYABLE NOTE WILL BE 0 ; ASSUMING A CLOCK OF 1843200 THIS MAPS TO A0# +; AY3NOTETBL: .DW AY_RATIO / 2913 .DW AY_RATIO / 2956 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 2e017e0f..8b8c116e 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1628,6 +1628,7 @@ HB_INIT_REC: #IF (PLATFORM == PLT_SBC) .DW UART_INIT .DW MD_INIT + .DW PPIDE_INIT #ENDIF HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2) ; @@ -1673,14 +1674,14 @@ HB_INITTBL: #IF (CTCENABLE) .DW CTC_INIT #ENDIF -#IF (SPKENABLE) - .DW SP_INIT ; AUDIBLE INDICATOR OF BOOT START +#IF (AY38910ENABLE) + .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START #ENDIF #IF (SN76489ENABLE) .DW SN76489_INIT #ENDIF -#IF (AY38910ENABLE) - .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START +#IF (SPKENABLE) + .DW SP_INIT ; AUDIBLE INDICATOR OF BOOT START #ENDIF #IF (ASCIENABLE) .DW ASCI_INIT @@ -3680,10 +3681,14 @@ PRTSUM: LD C,BF_SYSGET_DIOCNT ; DISK DRIVES LD HL,PS_DISK CALL PRT_ALLD - +; LD C,BF_SYSGET_VDACNT ; VIDEO DEVICES LD HL,PS_VIDEO CALL PRT_ALLD +; + LD C,BF_SYSGET_SNDCNT ; SOUND DEVICES + LD HL,PS_SOUND + CALL PRT_ALLD RET ; PRT_ALLD: @@ -4026,6 +4031,68 @@ PS_PRTVC: CALL PRTDECB RET ; +; PRINT SOUND CONFIG +; +PS_SOUND: + PUSH BC + + ; UNIT COLUMN + PRTS("Sound $") + LD A,C ; MOVE UNIT NUM TO A + CALL PRTDECB ; PRINT IT + CP 10 ; CHECK FOR MULTIPLE DIGITS + CALL C,PC_SPACE ; EXTRA SPACE IF NEEDED + PRTS(" $") ; PAD TO NEXT COLUMN + + ; DEVICE COLUMN + + PUSH BC ; + LD E,C + XOR A + LD DE,PS_SDSND ; POINT TO DEVICE TYPE NAME TABLE + CALL PRTIDXDEA ; PRINT DEVICE NMEMONIC PADDED TO FIELD WIDTH + LD A,C ; MOVE UNIT NUM TO A + CALL PRTDECB ; PRINT IT + CALL PC_COLON + CP 10 ; CHECK FOR MULTIPLE DIGITS + CALL C,PC_SPACE ; EXTRA SPACE IF NEEDED + LD A,(PRTIDXCNT) + SUB 9+1 + CPL + CALL PS_PAD + POP BC + + ; DEVICE TYPE +; + LD B,BF_SNDQUERY ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C + LD E,BF_SNDQ_DEV + RST 08 + LD A,B + DEC A + LD DE,PS_SDSN76489 + CALL PRTIDXDEA + LD A,(PRTIDXCNT) + SUB 18+1 + CPL + CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A) + + ; DEVICE CHARACTERISTICS +; + LD B,BF_SNDQUERY ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C + LD E,BF_SNDQ_CHCNT + RST 08 + LD A,B + CALL PRTDECB + LD A,'+' + CALL COUT + LD A,C + CALL PRTDECB + PRTS(" CHANNELS$") + CALL NEWLINE +; + POP BC + RET +; ; PRINT DEVICE NMEMONIC, DEVTYP/NUM SPECIFIED IN DE ; PS_PRTDEV: @@ -4182,6 +4249,16 @@ PS_VDVGA .TEXT "VGA$" ; PS_VTCRT .TEXT "CRT$" ; +; SOUND DEVICE STRINGS +; +PS_SDSND .TEXT "SND$" +; +; SOUND TYPE STRINGS +; +PS_SDSN76489 .TEXT "SN76489$" +PS_SDAY38910 .TEXT "AY-3-8910$" +PS_SDBITMODE .TEXT "I/O PORT$" +; ; 0 1 2 3 4 5 6 7 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 PS_STRHDR .TEXT "Unit Device Type Capacity/Mode\r\n" diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 6fe58a44..168693ce 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -24,6 +24,8 @@ SP_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE SP_TONECNT .EQU 1 ; COUNT NUMBER OF TONE CHANNELS SP_NOISECNT .EQU 0 ; COUNT NUMBER OF NOISE CHANNELS ; +SP_RTCIOMSK .EQU 00000100B +; ; FOR OTHER DRIVERS, THE PERIOD VALUE FOR THE TONE IS STORED AT PENDING_PERIOD ; FOR THE SPK DRIVER THE ADDRESS IN THE TONE TABLE IS STORED IN PENDING_PERIOD ; @@ -139,8 +141,8 @@ SP_QUERY_VOLUME: RET ; SP_QUERY_DEV: - LD B, BF_SND_BITMODE ; RETURN DEVICE IDENTIFIER - LD DE, 0 ; AND ADDRESS AND DATA PORT + LD B, BF_SND_BITMODE ; RETURN DEVICE IDENTIFIER + LD DE, (RTCIO*256)+SP_RTCIOMSK ; AND ADDRESS AND DATA PORT XOR A RET ; @@ -273,7 +275,7 @@ BE_H_L_LP: ; ; The loudspeaker is now alternately activated and deactivated. ; - XOR %00000100 ; Flip bit 2. + XOR SP_RTCIOMSK ; Flip bit 2. OUT (RTCIO),A ; Perform the 'OUT' operation, leaving other bits unchanged. LD B,H ; Reset the B register. LD C,A ; Save the A register. From 3a020341cb983498fd43a6df0d7820de910be3d1 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sat, 23 May 2020 23:56:04 +0800 Subject: [PATCH 17/27] Update cbios.asm --- Source/CBIOS/cbios.asm | 68 ++++++++---------------------------------- 1 file changed, 13 insertions(+), 55 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 6d2c1a9b..162f7645 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -300,7 +300,8 @@ DPBCNT .EQU ($ - DPBMAP) / 2 ;__________________________________________________________________________________________________ BOOT: ; STANDARD BOOT INVOCATION - LD SP,STACK ; STACK FOR INITIALIZATION + ;LD SP,STACK ; STACK FOR INITIALIZATION + LD SP,CCP_LOC ; PUT STACK JUST BELOW CCP ; ; COPY INITIALIZATION CODE TO RUNNING LOCATION $8000 LD HL,BUFPOOL @@ -328,17 +329,17 @@ BOOT: ; ;__________________________________________________________________________________________________ REBOOT: - ; REBOOT FROM ROM, REPLACES BOOT AFTER INIT + ; RESTART, REPLACES BOOT AFTER INIT #IFDEF PLTUNA + ; FOR UNA, COLD BOOT DI ; NO INTERRUPTS LD BC,$01FB ; UNA FUNC = SET BANK LD DE,0 ; ROM BOOT BANK CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE) #ENDIF +; #IFDEF PLTWBW - ;DI ; NO INTERRUPTS - ;LD A,0 ; ROM BOOT BANK - ;CALL HB_BNKSEL ; SELECT IT INTO LOW MEMORY + ; WARM START LD B,BF_SYSRESET ; SYSTEM RESTART LD C,BF_SYSRES_WARM ; WARM START CALL $FFF0 ; CALL HBIOS @@ -401,23 +402,13 @@ RESCPM: LD HL,WBOOTE ; GET WARM BOOT ENTRY ADDRESS LD ($0001),HL ; AND PUT IT AT $0001 -; ; INT / RST 38 -> INVOKE MONITOR -; LD ($0038),A -; LD HL,GOMON -; LD ($0039),HL - -; ; INT / RST 38 -> PANIC -; LD ($0038),A -; LD HL,PANIC ; PANIC ROUTINE ADDRESS -; LD ($0039),HL ; POKE IT - ; CALL 5 -> INVOKE BDOS LD ($0005),A ; JP OPCODE AT $0005 LD HL,BDOS_LOC + 6 ; GET BDOS ENTRY ADDRESS LD ($0006),HL ; PUT IT AT $0006 ; ; INSTALL ROMWBW CBIOS PAGE ZERO STAMP AT $40 - LD HL,STPIMG ; FORM STAMP DATA IMAGE + LD HL,STPIMG ; FROM STAMP DATA IMAGE LD DE,STPLOC ; TO IT'S LOCATION IN PAGE ZERO LD BC,STPSIZ ; SIZE OF BLOCK TO COPY LDIR ; DO IT @@ -448,26 +439,6 @@ GOCCP: LD C,A ; SETUP C WITH CURRENT USER/DISK, ASSUME IT IS OK JP CCP_LOC ; JUMP TO COMMAND PROCESSOR ; -;__________________________________________________________________________________________________ -GOMON: - CALL PANIC -; -; DI -; IM 1 -; -; LD SP,STACK -; -; ; RELOAD MONITOR INTO RAM (IN CASE IT HAS BEEN OVERWRITTEN) -; CALL ROMPGZ -; LD HL,MON_IMG -; LD DE,MON_LOC -; LD BC,MON_SIZ -; LDIR -; CALL RAMPGZ - -; ; JUMP TO MONITOR WARM ENTRY -; JP MON_UART -; ; ;================================================================================================== ; CHARACTER BIOS FUNCTIONS @@ -1360,27 +1331,14 @@ DSK_MBR: DSK_MBR0: ; #IFDEF PLTWBW - ; SWITCH TO BIOS BANK TO ACCESS DISK BUFFER + ; ACTIVATE BIOS BANK TO ACCESS DISK BUFFER LD (STKSAV),SP ; SAVE CUR STACK - LD SP,XSTACK ; NEW STACK IN HI MEM - LD A,(HB_CURBNK) ; GET CUR BANK - PUSH AF ; SAVE CUR BANK - LD A,(BNKBIOS) ; BIOS BANK - CALL HB_BNKSEL ; DO IT - CALL DSK_MBR1 ; DO THE WORK - ; RESTORE BANK - PUSH AF ; SAVE RESULT - POP HL ; TO HL - EX (SP),HL ; RESULT TO TOS, PREV BANK TO H - LD A,H ; PREV BANK TO A - CALL HB_BNKSEL ; SELECT IT - POP AF ; ORIGINAL RESULT BACK + LD SP,STACK ; NEW STACK IN HI MEM + LD A,(BNKBIOS) ; ACTIVATE HBIOS BANK + LD HL,DSK_MBR1 ; ROUTINE TO RUN + CALL HB_BNKCALL ; DO IT LD SP,(STKSAV) ; RESTORE ORIGINAL STACK RET - - .FILL 32,0 -XSTACK .EQU $ - #ENDIF ; DSK_MBR1: @@ -3239,7 +3197,7 @@ CMD .DB CMDLEN - 2 CMDLEN .EQU $ - CMD ; FCB_SUB .DB '?' ; DRIVE CODE, 0 = CURRENT DRIVE - .DB "SUBMIT " ; FILE NAME, 8 CHARS + .DB "SUBMIT " ; FILE NAME, 8 CHARS .DB "COM" ; FILE TYPE, 3 CHARS .FILL 36-($-FCB_SUB),0 ; ZERO FILL REMAINDER OF FCB ; From 506a2a10327c1c5f18716cd212fbb6c5bdd16979 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 24 May 2020 00:01:36 +0800 Subject: [PATCH 18/27] Update biosldr.z80 --- Source/CPM3/biosldr.z80 | 55 +++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/Source/CPM3/biosldr.z80 b/Source/CPM3/biosldr.z80 index a414cf58..86083212 100644 --- a/Source/CPM3/biosldr.z80 +++ b/Source/CPM3/biosldr.z80 @@ -8,7 +8,8 @@ extrn phex16, phex8 extrn cin, cout extrn crlf, crlf2 - + + debug equ false ; BIOS Jump vector. @@ -301,16 +302,44 @@ setsec: ld (sect),bc ret setdma: - ;push hl - ;push bc - ;pop hl - ;call crlf - ;call phex16 - ;pop hl + + if debug + + push hl + push bc + pop hl + call crlf + call phex16 + pop hl + + endif + ld (dma),bc ret read: + if debug + + call crlf + ld a,(unit) + call phex8 + ld a,' ' + call cout + ld hl,(trk) + call phex16 + ld a,' ' + call cout + ld hl,(sect) + call phex16 + ld a,' ' + call cout + ld hl,(lba+2) + call phex16 + ld hl,(lba+0) + call phex16 + + endif + ; Check device type ld a,(unit) ; get unit ld c,a ; BIOS Disk Unit in C @@ -349,6 +378,18 @@ read2: set 7,d ; set lba access bit read3: + + if debug + + ld a,' ' + call cout + ex de,hl + call phex16 + ex de,hl + call phex16 + + endif + ; DE:HL has sector address to read (LBA or CHS) ld a,(unit) ; get disk unit ld c,a ; put in C From 55e8cb4a556da5691ba41bff4d213e946a95c628 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 24 May 2020 00:05:12 +0800 Subject: [PATCH 19/27] Update std.asm --- Source/HBIOS/std.asm | 47 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index b7459ce3..3c0452ff 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -349,6 +349,53 @@ CPUKHZ .SET CPUKHZ * 2 ; ADJUST FOR DOUBLE SPEED OPERATION ; CPUMHZ .EQU CPUKHZ / 1000 ; CPU FREQ IN MHZ ; +; SYSTEM PERIODIC TIMER MODE +; +#IF (BIOS == BIOS_WBW) +; +TM_NONE .EQU 0 +TM_CTC .EQU 1 +TM_TMS .EQU 2 +TM_SIMH .EQU 3 +TM_Z180 .EQU 4 +; + .ECHO "SYSTEM TIMER:" +SYSTIM .EQU TM_NONE +; + #IF (CTCENABLE & (INTMODE == 2)) + #IF (CTCTIMER) +SYSTIM .SET TM_CTC + .ECHO " CTC" + #ENDIF + #ENDIF +; + #IF (TMSENABLE & (INTMODE == 1)) + #IF (TMSTIMENABLE) +SYSTIM .SET TM_TMS + .ECHO " TMS9918" + #ENDIF + #ENDIF +; + #IF ((PLATFORM == PLT_SBC) & (INTMODE == 1)) + #IF (HTIMENABLE) +SYSTIM .SET TM_SIMH + .ECHO " SIMH" + #ENDIF + #ENDIF +; + #IF ((CPUFAM == CPU_Z180) & (INTMODE == 2)) +SYSTIM .SET TM_Z180 + .ECHO " Z180" + #ENDIF +; + #IF SYSTIM == TM_NONE + .ECHO " NONE" + #ENDIF +; + .ECHO "\n" +; +#ENDIF +; ; MEMORY BANK CONFIGURATION ; #IF (BIOS == BIOS_UNA) From b923f512712c71f10cb4452cceb330600d087e0d Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 24 May 2020 00:11:04 +0800 Subject: [PATCH 20/27] resync --- Source/HBIOS/Config/RCZ80_mt.asm | 5 ++++- Source/HBIOS/Config/SCZ180_126.asm | 2 ++ Source/HBIOS/Config/SCZ180_130.asm | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Source/HBIOS/Config/RCZ80_mt.asm b/Source/HBIOS/Config/RCZ80_mt.asm index 1e49c5d3..89237c28 100644 --- a/Source/HBIOS/Config/RCZ80_mt.asm +++ b/Source/HBIOS/Config/RCZ80_mt.asm @@ -27,6 +27,9 @@ #define PLATFORM_NAME "RC2014 (MT)" ; #include "Config/RCZ80_std.asm" +; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) + ; SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .SET SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/Config/SCZ180_126.asm b/Source/HBIOS/Config/SCZ180_126.asm index e7549ccc..f9a28c39 100644 --- a/Source/HBIOS/Config/SCZ180_126.asm +++ b/Source/HBIOS/Config/SCZ180_126.asm @@ -41,6 +41,8 @@ ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; diff --git a/Source/HBIOS/Config/SCZ180_130.asm b/Source/HBIOS/Config/SCZ180_130.asm index 45b0cae3..d249c418 100644 --- a/Source/HBIOS/Config/SCZ180_130.asm +++ b/Source/HBIOS/Config/SCZ180_130.asm @@ -48,6 +48,8 @@ ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +; FDENABLE .SET FALSE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; From 534fb67dc5b3e1f2b75222a39d1d69e56b1252a7 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 24 May 2020 00:14:22 +0800 Subject: [PATCH 21/27] resync --- Source/HBIOS/cfg_dyno.asm | 2 +- Source/HBIOS/cfg_ezz80.asm | 2 +- Source/HBIOS/cfg_master.asm | 2 +- Source/HBIOS/cfg_mk4.asm | 2 +- Source/HBIOS/cfg_n8.asm | 2 +- Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/cfg_rcz80.asm | 4 ++-- Source/HBIOS/cfg_sbc.asm | 2 +- Source/HBIOS/cfg_scz180.asm | 2 +- Source/HBIOS/cfg_zeta.asm | 2 +- Source/HBIOS/cfg_zeta2.asm | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 0c1ad6d8..5a996286 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -92,7 +92,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index 0b8cc610..00041a49 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -124,7 +124,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index de7241dd..4e0e3b6a 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -161,7 +161,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 7ca6c871..62dfd646 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -109,7 +109,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 70c0eec3..41add6c6 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -112,7 +112,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index bc2722e1..75c93b06 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -128,7 +128,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 58d0828b..4efdd960 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -134,7 +134,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) @@ -186,7 +186,7 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] +SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index a04def8f..2bb6d10a 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -113,7 +113,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] ; diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index eac68d87..547b3b50 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -123,7 +123,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 94d43677..6793d291 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -90,7 +90,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index a13f0225..eecac1ec 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -100,7 +100,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) From d6fa3621e889a08edda0160acd1017228d8e05e8 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Sun, 24 May 2020 00:22:47 +0800 Subject: [PATCH 22/27] Delete cfg_state.inc --- Source/HBIOS/cfg_state.inc | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 Source/HBIOS/cfg_state.inc diff --git a/Source/HBIOS/cfg_state.inc b/Source/HBIOS/cfg_state.inc deleted file mode 100644 index 007879b0..00000000 --- a/Source/HBIOS/cfg_state.inc +++ /dev/null @@ -1,29 +0,0 @@ -#IFNDEF CFG_STATE - #DEFINE CFG_STATE - -SYSTIMEN .EQU FALSE - - #IF (CTCENABLE & (INTMODE == 2) & (CTCTIMER)) -SYSTIMEN .SET TRUE - #ENDIF - - #IF (TMSENABLE & (INTMODE == 1) & TMSTIMENABLE) -SYSTIMEN .SET TRUE - #ENDIF - - #IF ((INTMODE == 1) & (PLATFORM == PLT_SBC) & HTIMENABLE) -SYSTIMEN .SET TRUE - #ENDIF - - #IF ((INTMODE == 2) & (CPUFAM == CPU_Z180)) -SYSTIMEN .SET TRUE - #ENDIF - - .ECHO "TIMER INTERRUPT " - #IF SYSTIMEN - .ECHO "ACTIVE\n" - #ELSE - .ECHO "NOT ACTIVE\n" - #ENDIF - -#ENDIF From 42b09856fd4c37cd521d7a5013df5e05c431b601 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 24 May 2020 00:23:34 +0800 Subject: [PATCH 23/27] resync --- Source/HBIOS/Config/RCZ180_ext.asm | 2 ++ Source/HBIOS/Config/RCZ180_nat.asm | 2 ++ Source/HBIOS/Config/RCZ80_std.asm | 3 +++ 3 files changed, 7 insertions(+) diff --git a/Source/HBIOS/Config/RCZ180_ext.asm b/Source/HBIOS/Config/RCZ180_ext.asm index dd2e4cda..db23bcfa 100644 --- a/Source/HBIOS/Config/RCZ180_ext.asm +++ b/Source/HBIOS/Config/RCZ180_ext.asm @@ -39,6 +39,8 @@ ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; diff --git a/Source/HBIOS/Config/RCZ180_nat.asm b/Source/HBIOS/Config/RCZ180_nat.asm index d211d16a..b3f9728c 100644 --- a/Source/HBIOS/Config/RCZ180_nat.asm +++ b/Source/HBIOS/Config/RCZ180_nat.asm @@ -39,6 +39,8 @@ ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index b0441884..f608cbf3 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -32,6 +32,9 @@ UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +; FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; From 5bdfcd07694ce3bac063be99203858a7f00323b1 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 24 May 2020 00:30:28 +0800 Subject: [PATCH 24/27] Update hbios.inc --- Source/HBIOS/hbios.inc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index f8e4acc6..6e25d5f4 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -195,12 +195,6 @@ VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 -; -; SOUND DEVICE IDS -; -SNDDEV_SN .EQU $00 ; SN76489 -SNDDEV_AY .EQU $10 ; AY-3-8910 -SNDDEV_BM .EQU $20 ; BITMODE ;; ;; EMULATION TYPES - moved to std.asm ;; From dc0b436e198623c40928e07e511bb07acebbf478 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 24 May 2020 09:16:02 +0800 Subject: [PATCH 25/27] revert sn76489 --- Source/HBIOS/audio.inc | 38 ++++++++++++++++++++++++++++++++++++++ Source/HBIOS/ay38910.asm | 12 ++++-------- Source/HBIOS/sn76489.asm | 40 +++------------------------------------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/Source/HBIOS/audio.inc b/Source/HBIOS/audio.inc index e02e7af4..b6365494 100644 --- a/Source/HBIOS/audio.inc +++ b/Source/HBIOS/audio.inc @@ -34,4 +34,42 @@ #IFNDEF AUDIOUTILS #DEFINE AUDIOUTILS + +AUD_NOTE: + AUDDEBUG("AUDNOTE ") + AUDTRACE_HL + AUDTRACE_CR + AUDTRACE_DE + AUDTRACE_CR + + push de + LD DE, 48 + CALL DIV16 + ; BC IS OCTAVE COUNT + ; HL is NOTE WITIN OCTAVE + ADD HL, HL + pop de + ADD HL, DE + + LD A, (HL) ; RETRIEVE PERIOD COUNT FROM SN7NOTETBL + INC HL + LD H, (HL) + LD L, A + + INC C +AUD_NOTE1: + DEC C + JR Z, AUD_NOTE2 + SRL H + RR L + JR AUD_NOTE1 + +AUD_NOTE2: + LD A, L ; IF NOT ZERO + OR H + RET NZ ; RETURN THE CALCULATED PERIOD + + LD H, $FF ; OTHERWISE RETURN -1 PERIOD (ERROR) + LD L, $FF + RET #ENDIF diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index f0315f77..debe3e08 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -7,8 +7,6 @@ ; @3.579545 OCTAVE RANGE IS 2 - 7 (Bb2/A#2 .. A7) ; @4.000000 OCTAVE RANGE IS 2 - 7 (B2 .. A7) ; -;#include "cfg_state.inc" -; AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE ; #IF (AYMODE == AYMODE_SCG) @@ -70,8 +68,6 @@ AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE ; ; DEVICE CAPABILITIES AND CONFIGURATION ; -SBCV2004 .EQU 0 ; USE SBC-V2-004 HALF CLOCK DIVIDER -; AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS ; @@ -459,7 +455,7 @@ AY_EI: ; AY_WRTPSG: CALL AY_DI -#IF (SBCV2004) +#IFDEF SBCV2004 LD A,8 ; SBC-V2-004 CHANGE OUT (112),A ; TO HALF CLOCK SPEED #ENDIF @@ -477,7 +473,7 @@ AY_WRTPSG: POP AF ; GET SAVED DCNTL VALUE OUT0 (Z180_DCNTL),A ; AND RESTORE IT #ENDIF -#IF (SBCV2004) +#IFDEF SBCV2004 LD A,0 ; SBC-V2-004 CHANGE TO OUT (112),A ; NORMAL CLOCK SPEED #ENDIF @@ -489,7 +485,7 @@ AY_WRTPSG: ; AY_RDPSG: CALL AY_DI -#IF (SBCV2004) +#IFDEF SBCV2004 LD A,8 ; SBC-V2-004 CHANGE OUT (112),A ; TO HALF CLOCK SPEED #ENDIF @@ -507,7 +503,7 @@ AY_RDPSG: POP AF ; GET SAVED DCNTL VALUE OUT0 (Z180_DCNTL),A ; AND RESTORE IT #ENDIF -#IF (SBCV2004) +#IFDEF SBCV2004 LD A,0 ; SBC-V2-004 CHANGE TO OUT (112),A ; NORMAL CLOCK SPEED #ENDIF diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index d1b784cc..220e07e3 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -24,8 +24,7 @@ CHANNEL_1_SILENT .EQU $BF CHANNEL_2_SILENT .EQU $DF CHANNEL_3_SILENT .EQU $FF -SN7_SCALE .EQU 4 -SN7RATIO .EQU (SN7CLK * 100) / (32 >> SN7_SCALE) +SN7RATIO .EQU SN7CLK * 100 / 32 .ECHO "SN76489 CLOCK: " .ECHO SN7CLK @@ -105,42 +104,9 @@ SN7_VOLUME: RET SN7_NOTE: - -; CALL PRTHEXWORDHL -; CALL PC_COLON - - AUDDEBUG("AUDNOTE ") - AUDTRACE_HL - AUDTRACE_CR - AUDTRACE_DE - AUDTRACE_CR - LD DE, SN7NOTETBL - PUSH DE ; ON ENTRY HL IS THE NOTE TO PLAY - LD DE, 48 ; AND DE IS THE START OF NOTE TABLE - CALL DIV16 ; LOAD DE WITH NOTE TABLE SIZE - ; AND CALCULATE OCTAVE COUNT IN BC - - ADD HL, HL ; HL IS THE REMAINDER FROM ABOVE DIVISION (0-47) AND THE NOTE - POP DE ; TO PLAY IN THE OCTAVE. ADD IT TO THE START OF THE NOTE TABLE - ADD HL, DE ; TO POINT TO THE PERIOD FOR THE NOTE WE WANT TO PLAY. - - LD A, (HL) ; HL POINT TO CURRENT PERIOD COUNT WE WANT TO PLAY - INC HL ; SO LOAD PERIOD COUNT FROM NOTE TABLE INTO HL - LD H, (HL) ; SO WE CAN UPDATE IT FOR THE REQUIRED OCTAVE - LD L, A - - LD A,SN7_SCALE ; THE NOTE TABLE PERIOD DATA HAS BEEN - ADD A,C ; PRESCALED TO MAINTAIN RANGE SO ALLOW - LD B,A ; FOR THIS WHEN CHANGING OCTAVE -SN7_NOTE1: - SRL H ; ADJUST THE PERIOD DATA - RR L ; FOR THE DESIRED OCTAVE - DJNZ SN7_NOTE1 ; FALL THROUGH TO SET PERIOD AND RANGE CHECK - -; CALL PRTHEXWORDHL -; CALL NEWLINE - + CALL AUD_NOTE ; RETURNS PERIOD IN HL, FALL THRU + ; TO SET THIS PERIOD SN7_PERIOD: AUDTRACE(SNT_PERIOD) AUDTRACE_HL From 0bf6caa4374fa278e1bd7a59758bb0fc11176b97 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 24 May 2020 18:21:16 +0800 Subject: [PATCH 26/27] Initial audio duration code --- Source/Doc/Architecture.md | 58 +++++++++++++++++++++++++------------- Source/HBIOS/ay38910.asm | 25 ++++++++++++---- Source/HBIOS/hbios.asm | 2 +- Source/HBIOS/hbios.inc | 1 + Source/HBIOS/sn76489.asm | 11 ++++++-- Source/HBIOS/spk.asm | 23 ++++++++++++++- 6 files changed, 92 insertions(+), 28 deletions(-) diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index f786448e..fe8f4284 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1438,25 +1438,25 @@ result in a note change. The following table shows the mapping of the input value in HL to the corresponding octave and note. -+-------------------------------------------------------+ -| | OCTAVE | -| Note |-----------------------------------------------+ -| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | -|-------|-----|-----|-----|-----|-----|-----|-----|-----+ -| Bb/A# | 0 | 48 | 96 | 144 | 192 | 240 | 288 | 336 | -| B | 4 | 52 | 100 | 148 | 196 | 244 | 292 | 340 | -| C | 8 | 56 | 104 | 152 | 200 | 248 | 296 | 344 | -| C#/Db | 12 | 60 | 108 | 156 | 204 | 252 | 300 | 348 | -| D | 16 | 64 | 112 | 160 | 208 | 256 | 304 | 352 | -| Eb/D# | 20 | 68 | 116 | 164 | 212 | 260 | 308 | 356 | -| E | 24 | 72 | 120 | 168 | 216 | 264 | 312 | 360 | -| F | 28 | 76 | 124 | 172 | 220 | 268 | 316 | 364 | -| F#/Gb | 32 | 80 | 128 | 176 | 224 | 272 | 320 | 368 | -| G | 36 | 84 | 132 | 180 | 228 | 276 | 324 | 372 | -| Ab/G# | 40 | 88 | 136 | 184 | 232 | 280 | 328 | 376 | -| A | 44 | 92 | 140 | 188 | 236 | 284 | 332 | 380 | - -### Function 0x54 -- Sound Play (SNDPLAY) ++-------+---------------------------------------------------------------+ +| | OCTAVE | +| Note +---------------------------------------------------------------+ +| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +|-------+-------|-------|-------|-------|-------|-------|-------|-------+ +| Bb/A# | 0 | 48 | 96 | 144 | 192 | 240 | 288 | 336 | +| B | 4 | 52 | 100 | 148 | 196 | 244 | 292 | 340 | +| C | 8 | 56 | 104 | 152 | 200 | 248 | 296 | 344 | +| C#/Db | 12 | 60 | 108 | 156 | 204 | 252 | 300 | 348 | +| D | 16 | 64 | 112 | 160 | 208 | 256 | 304 | 352 | +| Eb/D# | 20 | 68 | 116 | 164 | 212 | 260 | 308 | 356 | +| E | 24 | 72 | 120 | 168 | 216 | 264 | 312 | 360 | +| F | 28 | 76 | 124 | 172 | 220 | 268 | 316 | 364 | +| F#/Gb | 32 | 80 | 128 | 176 | 224 | 272 | 320 | 368 | +| G | 36 | 84 | 132 | 180 | 228 | 276 | 324 | 372 | +| Ab/G# | 40 | 88 | 136 | 184 | 232 | 280 | 328 | 376 | +| A | 44 | 92 | 140 | 188 | 236 | 284 | 332 | 380 | + +### Function 0x54 -- Sound Play SNDPLAY) | _Entry Parameters_ | B: 0x54 @@ -1551,6 +1551,26 @@ SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel por SND_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port SND_BITMODE | 0x03 | I/O PORT | D: Address port, E: Bit mask +### Function 0x56 -- Sound Duration (SNDDUR) + +| _Entry Parameters_ +| B: 0x56 +| C: Audio Device Unit ID +| HL: Duration + +| _Returned Values_ +| A: Status (0=OK, else error) + +This function sets the duration of the note to be played in milliseconds. + +If the duration is set to zero, then the play function will operate in a non-blocking +mode. i.e. a tone will start playing and the play function will return. The tone will +continue to play until the next tone is played. I/O PORT are not compatible and will +not play a note if the duration is zero. + +For other values, when a tone is played, it will play for the duration defined in HL +and then return. + `\clearpage`{=latex} System (SYS) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index debe3e08..6ddf9c1d 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -56,7 +56,8 @@ AY_FNTBL: .DW AY_NOTE .DW AY_PLAY .DW AY_QUERY - + .DW AY_DURATION +; #IF (($ - AY_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" !!!!! @@ -432,6 +433,19 @@ AY_QUERY_DEV: XOR A RET ; +;====================================================================== +; SOUND DRIVER FUNCTION - DURATION +;====================================================================== +; +AY_DURATION: + LD (AY_PENDING_DURATION),HL ; SET TONE DURATION + XOR A + RET +; +;====================================================================== +; NON-BLOCKING INTERRUPT CODE +;====================================================================== +; AY_DI: LD A, (AY_READY) BIT 1, A @@ -457,7 +471,7 @@ AY_WRTPSG: CALL AY_DI #IFDEF SBCV2004 LD A,8 ; SBC-V2-004 CHANGE - OUT (112),A ; TO HALF CLOCK SPEED + OUT (RTCIO),A ; TO HALF CLOCK SPEED #ENDIF #IF (CPUFAM == CPU_Z180) IN0 A,(Z180_DCNTL) ; GET WAIT STATES @@ -475,7 +489,7 @@ AY_WRTPSG: #ENDIF #IFDEF SBCV2004 LD A,0 ; SBC-V2-004 CHANGE TO - OUT (112),A ; NORMAL CLOCK SPEED + OUT (RTCIO),A ; NORMAL CLOCK SPEED #ENDIF JP AY_EI ; @@ -487,7 +501,7 @@ AY_RDPSG: CALL AY_DI #IFDEF SBCV2004 LD A,8 ; SBC-V2-004 CHANGE - OUT (112),A ; TO HALF CLOCK SPEED + OUT (RTCIO),A ; TO HALF CLOCK SPEED #ENDIF #IF (CPUFAM == CPU_Z180) IN0 A,(Z180_DCNTL) ; GET WAIT STATES @@ -505,7 +519,7 @@ AY_RDPSG: #ENDIF #IFDEF SBCV2004 LD A,0 ; SBC-V2-004 CHANGE TO - OUT (112),A ; NORMAL CLOCK SPEED + OUT (RTCIO),A ; NORMAL CLOCK SPEED #ENDIF JP AY_EI ; @@ -513,6 +527,7 @@ AY_RDPSG: ; AY_PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS) ; ORDER AY_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) ; SIGNIFICANT +AY_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS) AY_READY .DB 0 ; BIT 0 -> NZ DRIVER IS READY TO RECEIVE PLAY COMMAND ; BIT 1 -> NZ EXECUTING WITHIN TIMER HANDLER = DO NOT DIS/ENABLE INT ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 8b8c116e..61a1683e 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2296,7 +2296,7 @@ SND_ADDENT: ; WORD DRIVER FUNCTION TABLE ADDRESS ; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS) ; -SND_FNCNT .EQU 6 ; NUMBER OF SND FUNCS (FOR RANGE CHECK) +SND_FNCNT .EQU 7 ; NUMBER OF SND FUNCS (FOR RANGE CHECK) SND_MAX .EQU 3 ; UP TO 2 UNITS SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 6e25d5f4..3a9933ca 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -62,6 +62,7 @@ BF_SNDPRD .EQU BF_SND + 2 ; REQUEST SOUND PERIOD - HL CONTAINS DRIVER SPECIFIC V BF_SNDNOTE .EQU BF_SND + 3 ; REQUEST NOTE - L CONTAINS NOTE - EACH VALUE IS QUARTER NOTE BF_SNDPLAY .EQU BF_SND + 4 ; INITIATE THE REQUESTED SOUND COMMAND BF_SNDQUERY .EQU BF_SND + 5 ; E IS SUBFUNCTION +BF_SNDDURATION .EQU BF_SND + 6 ; REQUEST DURATION HL MILLISECONDS ; ; BF_SNDQUERY SUBCOMMANDS BF_SNDQ_STATUS .EQU 0 diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 220e07e3..0590d256 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -262,7 +262,7 @@ SN7_APPLY_PRD: LD A, L ; GET LOWER 4 BITS FOR COMMAND 1 AND $F - OR B ; A NOW CONATINS FIRST PERIOD COMMAND + OR B ; A NOW CONTAINS FIRST PERIOD COMMAND AUDTRACE(SNT_REGWR) AUDTRACE_A @@ -299,6 +299,10 @@ SN7_APPLY_PRD: POP DE RET +SN7_DURATION: + LD (SN7_PENDING_DURATION),HL ; SET TONE DURATION + XOR A + RET SN7_FNTBL: .DW SN7_RESET @@ -307,7 +311,8 @@ SN7_FNTBL: .DW SN7_NOTE .DW SN7_PLAY .DW SN7_QUERY - + .DW SN7_DURATION +; #IF (($ - SN7_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" !!!!! @@ -317,6 +322,8 @@ SN7_PENDING_PERIOD .DW 0 ; PENDING PERIOD (10 BITS) SN7_PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED) +SN7_PENDING_DURATION + .DW 0 ; PENDING DURATION (16 BITS) STR_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$" STR_MESSAGERT .DB ", RIGHT IO=0x$" diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 168693ce..427bcf4c 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -4,6 +4,12 @@ ; ;====================================================================== ; +; LIMITATIONS - CPU FREQUENCY ADJUSTMENT LIMITED TO 1MHZ RESOLUTION +; QUARTER TONES NOT SUPPORTED +; DURATION FIXED TO 1 SECOND. +; NO VOLUME ADJUSTMENT DUE TO HARDWARE LIMITATION +;====================================================================== +; ; DRIVER FUNCTION TABLE AND INSTANCE DATA ; SP_FNTBL: @@ -13,6 +19,7 @@ SP_FNTBL: .DW SP_NOTE .DW SP_PLAY .DW SP_QUERY + .DW SP_DURATION ; #IF (($ - SP_FNTBL) != (SND_FNCNT * 2)) .ECHO "*** INVALID SND FUNCTION TABLE ***\n" @@ -31,6 +38,7 @@ SP_RTCIOMSK .EQU 00000100B ; SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS) SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS) +SP_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS) ; ;====================================================================== ; DRIVER INITIALIZATION @@ -303,9 +311,22 @@ BE_END: POP IX RET ; ALWAYS EXITS WITH SUCCESS STATUS (A=0) ; -; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). +;====================================================================== +; SOUND DRIVER FUNCTION - DURATION +;====================================================================== +; +SP_DURATION: + LD (SP_PENDING_DURATION),HL; SET TONE PERIOD TO ZERO + XOR A + RET +; +;====================================================================== +; +; STANDARD ONE SECOND TONE TABLES AT 1MHZ. ; FOR SP_BEEPER ROUTINE, FIRST WORD LOADED INTO DE, SECOND INTO HL ; +;====================================================================== +; #DEFINE SP_TONESET(SP_FREQ) .DW SP_FREQ/100, 12500000/SP_FREQ ; SP_TUNTBL: From ff31cce0abcd0f79c1a23641a8ea7571b220be39 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 24 May 2020 18:45:40 +0800 Subject: [PATCH 27/27] Update time.asm --- Source/HBIOS/time.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/time.asm b/Source/HBIOS/time.asm index 315bde39..9bdd8c3e 100644 --- a/Source/HBIOS/time.asm +++ b/Source/HBIOS/time.asm @@ -83,7 +83,7 @@ DOW_YR .DB 0 DOW_DT .DB 0 DOW_MO .DB 0 ; -; DERIVE DOW FROM STARNDARD TIME BUFFER AT HL +; DERIVE DOW FROM STANDARD TIME BUFFER AT HL ; RETURN DOW IN A (0-6: SUN-SAT) ; TIMDOW: