diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index 6f340a2e..83759c02 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -40,6 +40,7 @@ ; 2020-02-11 [WBW] Made hardware config & detection more flexible ; 2020-03-29 [WBW] Fix error in Z180 I/O W/S bracketing ; 2020-04-25 [DEN] Added support to use HBIOS Sound driver +; 2020-05-02 [PMS] Add support for SBC-V2 slow-io hack ;_______________________________________________________________________________ ; ; ToDo: @@ -53,14 +54,18 @@ #include "hbios.inc" #include "cpm.inc" #include "tune.inc" - +; HEAPEND .EQU $C000 ; End of heap storage ; TYPPT2 .EQU 1 ; FILTYP value for PT2 sound file TYPPT3 .EQU 2 ; FILTYP value for PT3 sound file TYPMYM .EQU 3 ; FILTYP value for MYM sound file ; - +; HIGH SPEED CPU CONTROL +; +SBCV2004 .EQU 1 ; USE SBC-V2-004 HALF CLOCK DIVIDER +CPUFAMZ180 .EQU 1 ; USE Z180 WAIT STATE MANAGEMENT +; ;Conditional assembly - use -D switch on TASM or uz80as assembler to control _ZX .EQU 0 ; 1) Version of ROUT (ZX or MSX standards) _MSX .EQU 0 @@ -401,43 +406,44 @@ IDBIO2: ; ; ; -SLOWCPU: - LD A,(Z180) ; Z180 base I/O port - CP $FF ; Check for no value - RET Z ; Bail out if no value - ADD A,$1E ; Apply offset of CMR register - LD C,A ; And put it in C - LD B,0 ; MSB for 16-bit I/O - IN A,(C) ; Get current value - LD (CMRSAV),A ; Save it to restore later - XOR A ; Go slow - OUT (C),A ; And update CMR - INC C ; Now point to CCR register - IN A,(C) ; Get current value - LD (CCRSAV),A ; Save it to restore later - XOR A ; Go slow - OUT (C),A ; And update CCR - RET -; -; -; -NORMCPU: - LD A,(Z180) ; Z180 base I/O port - CP $FF ; Check for no value - RET Z ; Bail out if no value - ADD A,$1E ; Apply offset of CMR register - LD C,A ; And put it in C - LD B,0 ; MSB for 16-bit I/O - LD A,(CMRSAV) ; Get original CMR value - OUT (C),A ; And update CMR - INC C ; Now point to CCR register - LD A,(CCRSAV) ; Get original CCR value - OUT (C),A ; And update CCR - RET -; -; +;SLOWCPU: +; LD A,(Z180) ; Z180 base I/O port +; CP $FF ; Check for no value +; RET Z ; Bail out if no value +; ADD A,$1E ; Apply offset of CMR register +; LD C,A ; And put it in C +; LD B,0 ; MSB for 16-bit I/O +; IN A,(C) ; Get current value +; LD (CMRSAV),A ; Save it to restore later +; XOR A ; Go slow +; OUT (C),A ; And update CMR +; INC C ; Now point to CCR register +; IN A,(C) ; Get current value +; LD (CCRSAV),A ; Save it to restore later +; XOR A ; Go slow +; OUT (C),A ; And update CCR +; RET +; +; +; +;NORMCPU: +; LD A,(Z180) ; Z180 base I/O port +; CP $FF ; Check for no value +; RET Z ; Bail out if no value +; ADD A,$1E ; Apply offset of CMR register +; LD C,A ; And put it in C +; LD B,0 ; MSB for 16-bit I/O +; LD A,(CMRSAV) ; Get original CMR value +; OUT (C),A ; And update CMR +; INC C ; Now point to CCR register +; LD A,(CCRSAV) ; Get original CCR value +; OUT (C),A ; And update CCR +; RET +; +; SLOW DOWN I/O FOR FAST CPU'S ; SLOWIO: +#IF (CPUFAMZ180) LD A,(Z180) ; Z180 base I/O port CP $FF ; Check for no value RET Z ; Bail out if no value @@ -448,11 +454,17 @@ SLOWIO: LD (DCSAV),A ; Save it to restore later OR %00110000 ; Force slow operation (I/O W/S=3) OUT (C),A ; And update DCNTL +#ENDIF +#IF (SBCV2004) + LD A,8 ; sbc-v2-004 change to + OUT (112),A ; half clock speed +#ENDIF RET ; -; +; RESTORE I/O SPEED FOR FAST CPU'S ; NORMIO: +#IF (CPUFAMZ180) LD A,(Z180) ; Z180 base I/O port CP $FF ; Check for no value RET Z ; Bail out if no value @@ -461,8 +473,12 @@ NORMIO: LD B,0 ; MSB for 16-bit I/O LD A,(DCSAV) ; Get saved DCNTL value OUT (C),A ; And restore it +#ENDIF +#IF (SBCV2004) + LD A,0 ; sbc-v2-004 change to + OUT (112),A ; normal clock speed +#ENDIF RET - ; ERRBIO: ; Invalid BIOS or version LD DE,MSGBIO @@ -1982,87 +1998,93 @@ LOUT OUT (C), A ; SELECT REGISTER JP M, LOUT2 ; IF BIT 7 SET, RETURN W/O WRITING VALUE LD C, D ; SELECT DATA PORT OUT (C), A ; WRITE VALUE TO REGISTER 13 -LOUT2 - CALL NORMIO +LOUT2 CALL NORMIO EI RET ; AND DONE PLAYVIAHBIOS: - LD B, BF_SNDVOL - LD C, 0 - LD H, 0 - LD A, (AYREGS + AmplA) - AND $0F - rlca - rlca - rlca - rlca +; +; CHANNEL 0 (LEFT) +; + LD B, BF_SNDVOL ; SET VOLUME + LD C, 0 ; DEVICE 0 +; LD H, 0 + LD A, (AYREGS + AmplA) ; GET 4-BIT + AND $0F ; VOLUME 0-15 + RLCA ; AND CONVERT + RLCA ; TO HBIOS + RLCA ; RANGE 0-255 + RLCA LD L, A RST 08 - - LD B, BF_SNDPRD - LD C, 0 - LD HL, (AYREGS+TonA) - ld a, h - AND $0F +; + LD B, BF_SNDPRD ; SET PERIOD + LD C, 0 ; DEVICE 0 + LD HL, (AYREGS+TonA) ; GET 12-BIT TONE PERIOD + ld A, H ; MASK OFF HIGH + AND $0F ; NIBBLE LD H, A RST 08 - - LD B, BF_SNDPLAY - LD C, 0 - LD D, 0 +; + LD B, BF_SNDPLAY ; PLAY + LD C, 0 ; DEVICE 0 + LD D, 0 ; CHANNEL 0 RST 08 - - LD B, BF_SNDVOL - LD C, 0 - LD H, 0 - LD A, (AYREGS + AmplB) - AND $0F - rlca - rlca - rlca - rlca +; +; CHANNEL 1 (MIDDLE) +; + LD B, BF_SNDVOL ; SET VOLUME + LD C, 0 ; DEVICE 0 +; LD H, 0 + LD A, (AYREGS + AmplB) ; GET 4-BIT + AND $0F ; VOLUME 0-15 + RLCA ; AND CONVERT + RLCA ; TO HBIOS + RLCA ; RANGE 0-255 + RLCA LD L, A RST 08 - - LD B, BF_SNDPRD - LD C, 0 - LD HL, (AYREGS+TonB) - ld a, h - AND $0F +; + LD B, BF_SNDPRD ; SET PERIOD + LD C, 0 ; DEVICE 0 + LD HL, (AYREGS+TonB) ; GET 12-BIT ONE PERIOD + ld a, h ; MASK OFF HIGH + AND $0F ; NIBBLE LD H, A RST 08 - - LD B, BF_SNDPLAY - LD C, 0 - LD D, 1 +; + LD B, BF_SNDPLAY ; PLAY + LD C, 0 ; DEVICE 0 + LD D, 1 ; CHANNEL 1 RST 08 - - LD B, BF_SNDVOL - LD C, 0 - LD H, 0 - LD A, (AYREGS + AmplC) - AND $0F - rlca - rlca - rlca - rlca +; +; CHANNEL 2 (RIGHT) +; + LD B, BF_SNDVOL ; SET VOLUME + LD C, 0 ; DEVICE 0 +; LD H, 0 + LD A, (AYREGS + AmplC) ; GET 4-BIT + AND $0F ; VOLUME 0-15 + RLCA ; AND CONVERT + RLCA ; TO HBIOS + RLCA ; RANGE 0-255 + RLCA LD L, A RST 08 - - LD B, BF_SNDPRD - LD C, 0 - LD HL, (AYREGS+TonC) - ld a, h - AND $0F +; + LD B, BF_SNDPRD ; SET PERIOD + LD C, 0 ; DEVICE 0 + LD HL, (AYREGS+TonC) ; GET 12-BIT ONE PERIOD + ld A, H ; MASK OFF HIGH + AND $0F ; NIBBLE LD H, A RST 08 - - LD B, BF_SNDPLAY - LD C, 0 - LD D, 2 - RST 08 - +; + LD B, BF_SNDPLAY ; PLAY + LD C, 0 ; DEVICE 0 + LD D, 2 ; CHANNEL 2 + RST 08 ; HBIOS CALL + RET #ENDIF diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 7ead4371..aeff3143 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1502,7 +1502,7 @@ The currently defined audio device types are: AUDIO ID | Value | Device | Returned registers -------------- | ----- | ---------- | -------------------------------------------- SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel port -SND_SNAY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port +SND_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port `\clearpage`{=latex} diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 13695c93..d9a88d7e 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -59,10 +59,12 @@ AY_IDAT .EQU 0 ; NO INSTANCE DATA ASSOCIATED WITH THIS DEVICE ; ;====================================================================== ; -; DEVICE CAPABILITIES AND CONFIGURATION - -AY_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS -AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS +; DEVICE CAPABILITIES AND CONFIGURATION +; +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 ; AY_CLKDIVIDER .EQU 2 AY_CLK .EQU CPUOSC / AY_CLKDIVIDER @@ -81,6 +83,8 @@ C7 .EQU SN7RATIO / AY_LAST_NOTE .ECHO C7 .ECHO ")\n" +AUDIOTRACE .SET TRUE + #INCLUDE "audio.inc" ;====================================================================== @@ -123,8 +127,8 @@ AY_RESET: AUDTRACE(TRACE_INIT) ; LD D,AY_R7ENAB ; SET MIXER CONTROL / IO ENABLE - LD E,$FF ; $FF - 11 111 111 - CALL AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A DISABLE + LD E,$F8 ; $F8 - 11 111 000 + CALL AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE ; CALL AY_VOLUME_OFF ; TURN VOLUME OFF ; RET ; AND RETURN SUCCESS @@ -166,9 +170,8 @@ AY_PERIOD: AUDTRACE_HL AUDDEBUG("\r\n") - INC HL ; MAXIMUM TONE PERIOD IS 12-BITS - LD A, H ; ALLOWED RANGE IS 0001-0FFF (4095) - CP $10 ; SO OFFSET AND CHECK OF OVERFLOW + LD A, H ; MAXIMUM TONE PERIOD IS 12-BITS + CP $10 ; ALLOWED RANGE IS 0001-0FFF (4095) JP NC, AY_QUERY_PERIOD1 ; RETURN NZ IF NUMBER TOO LARGE LD (PENDING_PERIOD), HL ; SAVE AND @@ -285,7 +288,7 @@ AY_QUERY_VOLUME: RET ; AY_QUERY_DEV: - LD B, BF_SND_AY38910 ; RETURN DEVICE IDENTIFIER + LD B, BF_SND_AY38910 ; RETURN DEVICE IDENTIFIER LD DE, (AY_RSEL*256)+AY_RDAT ; AND ADDRESS AND DATA PORT XOR A RET @@ -342,11 +345,11 @@ AY_APPLY_PRD: AUDTRACE(TRACE_NEWLINE) ; LD HL,(PENDING_PERIOD) ; WRITE THE LOWER - LD E,L ; 8-BITS OF THE PERIOD + LD E,L ; 8-BITS OF THE TONE PERIOD CALL AY_WRTPSG INC D LD E,H ; WRITE THE UPPER - CALL AY_WRTPSG ; 8-BITS OF THE PERIOD + CALL AY_WRTPSG ; 8-BITS OF THE TONE PERIOD ; POP AF @@ -363,6 +366,10 @@ AY_APPLY_PRD: ; AY_WRTPSG: HB_DI +#IF (SBCV2004) + LD A,8 ; SBC-V2-004 CHANGE + OUT (112),A ; TO HALF CLOCK SPEED +#ENDIF #IF (CPUFAM == CPU_Z180) IN0 A,(Z180_DCNTL) ; GET WAIT STATES PUSH AF ; SAVE VALUE @@ -376,16 +383,18 @@ AY_WRTPSG: #IF (CPUFAM == CPU_Z180) POP AF ; GET SAVED DCNTL VALUE OUT0 (Z180_DCNTL),A ; AND RESTORE IT +#ENDIF +#IF (SBCV2004) + LD A,0 ; SBC-V2-004 CHANGE TO + OUT (112),A ; NORMAL CLOCK SPEED #ENDIF HB_EI RET ; ;====================================================================== ; -PENDING_PERIOD - .DW 0 ; PENDING PERIOD (10 BITS) -PENDING_VOLUME - .DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED) +PENDING_PERIOD .DW 0 ; PENDING PERIOD (12 BITS) +PENDING_VOLUME .DB 0 ; PENDING VOL (8 BITS) #IF AUDIOTRACE TRACE_INIT .DB "\r\nAY_INIT CALLED\r\n$" @@ -393,7 +402,7 @@ TRACE_VOLUME_OFF .DB "\r\nAY_VOLUME_OFF\r\n$" TRACE_VOLUME_SET .DB "\r\nAY_VOLUME_SET CH: $" TRACE_PLAY .DB "\r\nPLAY\r\n$" TRACE_VOLUME .DB ", VOL: $" -TRACE_PORT_WR .DB "\r\nOUT AY-3-8910 $" +TRACE_REG_WR .DB "\r\nOUT AY-3-8910 $" TRACE_PERIOD_SET .DB "\r\nAY_PERIOD_SET CH: $" TRACE_PERIOD .DB ", PERIOD: $" TRACE_NEWLINE .DB "\r\n$" diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 4ce9546b..0293dd15 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -347,7 +347,7 @@ SN7_FNTBL: PENDING_PERIOD .DW 0 ; PENDING PERIOD (10 BITS) PENDING_VOLUME - .DB 0 ; PENDING VOL (8 BITS -> DOWNOVERTED TO 4 BITS AND INVERTED) + .DB 0 ; PENDING VOL (8 BITS -> DOWNCONVERTED TO 4 BITS AND INVERTED) STR_MESSAGELT .DB "\r\nSN76489: LEFT IO=0x$" STR_MESSAGERT .DB ", RIGHT IO=0x$"