Browse Source

Merge pull request #312 from b1ackmai1er/dev

ym2612 driver updates
pull/331/head
Wayne Warthen 3 years ago
committed by GitHub
parent
commit
c10497bd03
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 348
      Source/Apps/TEST/sound/Scales.asm
  2. 2
      Source/Apps/Tune/printing.inc
  3. 2
      Source/Apps/VGM/Build.cmd
  4. 4
      Source/Apps/VGM/Makefile
  5. 2
      Source/Apps/VGM/printing.inc
  6. 1
      Source/Apps/VGM/ymfmdemo.asm
  7. 15
      Source/Doc/Architecture.md
  8. 5
      Source/HBIOS/hbios.asm
  9. 1
      Source/HBIOS/hbios.inc
  10. 1141
      Source/HBIOS/ym2612.asm

348
Source/Apps/TEST/sound/Scales.asm

@ -1,22 +1,209 @@
; ;
;------------------------------------------------------------------------------
; PLAY SCALES USING HBIOS
;------------------------------------------------------------------------------
;
FCB .EQU $5C ; Location of default FCB
BDOS .EQU $0005
;
.ORG $0100
;
LD (OLDSTACK),SP ; save old stack pointer
LD SP,STACK ; set new stack pointer
;
;------------------------------------------------------------------------------
; GET DEVICE # FROM COMMAND LINE
;------------------------------------------------------------------------------
;
LD A,(FCB+1) ; GET FIRST CHAR
SUB ' '
JR Z,NO_ARG
SUB '0'-' '
JP C,EXIT
;
;------------------------------------------------------------------------------
; DISPLAY DEVICE AND NUMBER OF CHANNELS
;------------------------------------------------------------------------------
;
NO_ARG: LD (DEVICE),A ;
LD DE,TXT_DEV ; DEVICE:
CALL PRTSTR
CALL PRTDECB
LD C,A ; GET DEVICE ID
LD A,':'
CALL PRTCHR
LD B,$55
PUSH BC
LD E,4
RST 08
LD DE,TXT_NAME
LD A,B
RRCA \ RRCA \ RRCA \ RRCA
CALL PRTIDXDEA ; SHOW NAME
LD DE,TXT_CH
CALL PRTSTR
;
POP BC ; GET & DISPLAY # CHANNELS
LD E,1
RST 08
LD A,B
CALL PRTDECB
CALL CRLF ; NUMBER OF CHANNELS IS IN B
;
;------------------------------------------------------------------------------
; LOOP THROUGH EACH CHANNEL
;------------------------------------------------------------------------------
CH__TONE: LD A,(DEVICE) ; C CONTAINS DEVICE
LD C,A ; THROUGH THIS LOOP
;
PUSH BC
LD B,50H ; RESET DEVICE
RST 08
POP BC
;
PUSH BC
LD B,51H ; VOLUME FULL
LD L,0FFH
RST 08
POP BC
;
LD A,B
TST_TONE_LP: DEC A
LD (CHANNEL),A ; SAVE CURRENT CHANNEL
CALL TST_SCALES ; SCALES TEST
; CALL TST_VOLUME ; VOLUME TEST
CALL CRLF
DJNZ TST_TONE_LP
;
PUSH BC
LD B,50H ; RESET DEVICE
RST 08
POP BC
;
;------------------------------------------------------------------------------
; RESTORE STACK & EXIT
;------------------------------------------------------------------------------
;
EXIT: LD SP, (OLDSTACK) ; Exit to CP/M
RST 00H
DI
HALT
;
;------------------------------------------------------------------------------
; PLAY SCALES FROM HIGHEST HBIOS NOTE TO LOWEST
;------------------------------------------------------------------------------
;
TST_SCALES: PUSH BC
PUSH AF
;
LD HL,380 ; START NOTE
LD (NOTE),HL ; Top of Octave 7 is 343
LD B,51H ; VOLUME HIGH
LD L,0FFH
PUSH BC
RST 08
POP BC
;
NEXT0: PUSH BC
;
LD DE,TXT_TSTCH ; DISPLAY CHANNEL
CALL PRTSTR
LD A,(CHANNEL)
CALL PRTDECB
;
LD DE,TXT_NOTE ; DISPLAY NOTE
CALL PRTSTR
LD HL,(NOTE)
CALL PRTDECW
POP BC
;
LD B,53H ; SET NOTE
LD HL,(NOTE)
PUSH BC
RST 08
POP BC
.ORG $0100
OR A ; DID DRIVER FAIL
JR Z,NEXT4 ; THIS NOTE ?
; SCALES ON ALL THREE CHANNELS
LD DE,TXT_BAD_N
CALL FAILMSG
JR SKIP
;
NEXT4: LD B,57H ; DURATION
LD HL,1000
PUSH BC
RST 08
POP BC
; JR SKIP
LD B,54H ; PLAY
LD A,(CHANNEL)
LD D,A
PUSH BC
RST 08
POP BC
;
OR A ; DID DRIVER FAIL
JR Z,NEXT2 ; TO PLAY ?
LD B,3
NEXTCH0 LD A,B
DEC A
LD (CHANNEL),A
PUSH BC ; ACROSS
CALL SCALE ; ALL
POP BC ; CHANNELS
DJNZ NEXTCH0
LD DE,TXT_BAD_N
CALL FAILMSG
JR SKIP
;
NEXT2: CALL DELAY
CALL CRLF
;
SKIP: LD HL,(NOTE)
DEC HL
LD (NOTE),HL
INC HL
LD A,H
OR L
DEC HL
JR NZ,NEXT0
;
LD B,51H ; VOLUME
LD L,00H ; OFF
PUSH BC
RST 08
POP BC
;
LD B,54H ; PLAY
LD A,(CHANNEL)
LD D,A
PUSH BC
RST 08
POP BC
PUSH BC
LD C, 6 ; check for keypress
LD E,0FFH
CALL BDOS
POP BC
OR A
JP NZ,EXIT
; CONSTANT TONE ON ALL THREE CHANNELS, SCALE VOLUME
SKIP:
POP AF
POP BC
;
RET
;
FAILMSG: PUSH AF
PUSH BC
CALL PRTSTR
CALL CRLF
POP BC
POP AF
RET
;
;------------------------------------------------------------------------------
; CONSTANT TONE ON ALL CHANNELS, SCALE VOLUME
;------------------------------------------------------------------------------
;
TST_VOLUME:
LD HL,332+48 ; TONE LD HL,332+48 ; TONE
LD (NOTE),HL LD (NOTE),HL
; ;
@ -26,31 +213,46 @@ NEXTCH1 LD A,B
LD (CHANNEL),A LD (CHANNEL),A
PUSH BC ; ACROSS PUSH BC ; ACROSS
CALL TONE ; ALL CALL TONE ; ALL
LD C, 6 ; KEYPRESS
LD E, 0FFH
CALL BDOS
POP BC ; CHANNELS POP BC ; CHANNELS
OR A
JP NZ,EXIT
DJNZ NEXTCH1 DJNZ NEXTCH1
RET RET
TONE: LD B,50H ; RESET
LD C,0
TONE: LD A,(DEVICE)
LD C,A
LD B,50H ; RESET
PUSH BC
RST 08 RST 08
POP BC
; ;
NEXT1: LD B,51H ; VOLUME NEXT1: LD B,51H ; VOLUME
LD C,0
LD A,(VOLUME) LD A,(VOLUME)
LD L,A LD L,A
PUSH BC
RST 08 RST 08
POP BC
; ;
LD B,53H ; NOTE LD B,53H ; NOTE
LD C,0
LD HL,(NOTE) LD HL,(NOTE)
PUSH BC
RST 08 RST 08
POP BC
; ;
LD B,54H ; PLAY LD B,54H ; PLAY
LD C,0
LD A,(CHANNEL) LD A,(CHANNEL)
LD D,A LD D,A
PUSH BC
RST 08 RST 08
POP BC
; ;
CALL DELAY CALL DELAY
; ;
@ -60,74 +262,23 @@ NEXT1: LD B,51H ; VOLUME
JR NZ,NEXT1 JR NZ,NEXT1
; ;
LD B,51H ; VOLUME LD B,51H ; VOLUME
LD C,0
LD L,00H LD L,00H
PUSH BC
RST 08 RST 08
POP BC
; ;
LD B,54H ; PLAY LD B,54H ; PLAY
LD C,0
LD A,(CHANNEL)
LD D,A
RST 08
;
RET
;
;
;
SCALE: LD B,50H ; RESET
LD C,0
RST 08
;
LD B,51H ; VOLUME
LD C,0
LD L,80H
RST 08
;
LD HL,380
LD (NOTE),HL
;
NEXT0: LD B,53H ; NOTE
LD C,0
LD HL,(NOTE)
RST 08
;
LD B,54H ; PLAY
LD C,0
LD A,(CHANNEL)
LD D,A
RST 08
;
OR A
JR Z,NEXT2
LD C,9
LD DE,BADFLAG
CALL 5
JR NEXT3
;
NEXT2: CALL DELAY
;
NEXT3: LD HL,(NOTE)
DEC HL
LD A,L
LD (NOTE),A
LD A,H
LD (NOTE+1),A
OR L
;
JR NZ,NEXT0
;
LD B,51H ; VOLUME
LD C,0
LD L,00H
RST 08
;
LD B,54H ; PLAY
LD C,0
PUSH BC
LD A,(CHANNEL) LD A,(CHANNEL)
LD D,A LD D,A
POP BC
RST 08 RST 08
; ;
RET RET
;;
;------------------------------------------------------------------------------
; LONG DELAY
;------------------------------------------------------------------------------
; ;
DELAY: LD HL,-1 DELAY: LD HL,-1
DELAY1: DEC HL DELAY1: DEC HL
@ -136,10 +287,43 @@ DELAY1: DEC HL
JR NZ,DELAY1 JR NZ,DELAY1
RET RET
; ;
BADFLAG .DB '*', $0D, $0A, '$'
NOTE .DW 128
VOLUME .DB 0
CHANNEL .DB 0
;------------------------------------------------------------------------------
; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY 0
; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS
; TO THE START OF THE STRING LIST.
;------------------------------------------------------------------------------
;
PRTIDXDEA: LD C,A
OR A
PRTIDXDEA1: JR Z,PRTIDXDEA3 ; FOUND TARGET SO EXIT
PRTIDXDEA2: LD A,(DE) ; LOOP UNIT
INC DE ; WE REACH
OR A ; END OF STRING
JR NZ,PRTIDXDEA2
DEC C ; AT STRING END. SO GO
JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH
PRTIDXDEA3: CALL PRTSTR ; DISPLAY THE STRING
RET
;
#INCLUDE "printing.inc"
;
TXT_CH .DB "CHANNELS: ",0
TXT_TSTCH .DB "CHANNEL: ",0
TXT_BAD_N .DB " BAD NOTE",0
TXT_BAD_P .DB " PLAY ERROR",0
TXT_NOTE .DB " NOTE: ",0
TXT_DEV .DB "DEVICE: ",0
TXT_NAME .DB "SN76489 ",0
.DB "AY-3-8910 ",0
.DB "I/O PORT ",0
.DB "YM2612 ",0
MODE .DB 0 ; scales mode or volume mode
DEVICE .DB 0
NOTE .DW 128
VOLUME .DB 0
CHANNEL .DB 0
OLDSTACK .DW 0 ; original stack pointer
.DS 40H ; space for stack
STACK ; top of stack
; ;
.END .END

2
Source/Apps/Tune/printing.inc

@ -34,6 +34,7 @@ PRTCR:
; Print a zero terminated string at (DE) without destroying any registers ; Print a zero terminated string at (DE) without destroying any registers
; ;
PRTSTR: PRTSTR:
PUSH AF
PUSH DE PUSH DE
; ;
PRTSTR1: PRTSTR1:
@ -46,6 +47,7 @@ PRTSTR1:
; ;
PRTSTR2: PRTSTR2:
POP DE ; restore registers POP DE ; restore registers
POP AF
RET RET
; ;
; Print the value in A in hex without destroying any registers ; Print the value in A in hex without destroying any registers

2
Source/Apps/VGM/Build.cmd

@ -6,7 +6,7 @@ set PATH=%TOOLS%\tasm32;%PATH%
set TASMTABS=%TOOLS%\tasm32 set TASMTABS=%TOOLS%\tasm32
tasm -t180 -g3 -fFF -dWBW vgmplay.asm vgmplay.com vgmplay.lst || exit /b tasm -t180 -g3 -fFF -dWBW vgmplay.asm vgmplay.com vgmplay.lst || exit /b
tasm -t180 -g3 -fFF -dWBW ym2612.asm ym2612.com ym2612.lst || exit /b
tasm -t180 -g3 -fFF -dWBW ymfmdemo.asm ymfmdemo.com ymfmdemo.lst || exit /b
copy /Y vgmplay.com ..\..\..\Binary\Apps\ || exit /b copy /Y vgmplay.com ..\..\..\Binary\Apps\ || exit /b
copy /Y Tunes\*.vgm ..\..\..\Binary\Apps\Tunes\ || exit /b copy /Y Tunes\*.vgm ..\..\..\Binary\Apps\Tunes\ || exit /b

4
Source/Apps/VGM/Makefile

@ -11,8 +11,8 @@ vgmplay.com: $(DEPS)
$(TASM) -dWBW vgmplay.asm vgmplay.com vgmplay.lst $(TASM) -dWBW vgmplay.asm vgmplay.com vgmplay.lst
ym2612.com: ym2612.com:
$(TASM) -dWBW ym2612.asm ym2612.com ym2612.lst
$(TASM) -dWBW ymfmdemo.asm ymfmdemo.com ymfmdemo.lst
all:: all::
mkdir -p $(DEST)/Tunes mkdir -p $(DEST)/Tunes
cp Tunes/* $(DEST)/Tunes
cp Tunes/*.vgm $(DEST)/Tunes

2
Source/Apps/VGM/printing.inc

@ -34,6 +34,7 @@ PRTCR:
; Print a zero terminated string at (DE) without destroying any registers ; Print a zero terminated string at (DE) without destroying any registers
; ;
PRTSTR: PRTSTR:
PUSH AF
PUSH DE PUSH DE
; ;
PRTSTR1: PRTSTR1:
@ -46,6 +47,7 @@ PRTSTR1:
; ;
PRTSTR2: PRTSTR2:
POP DE ; restore registers POP DE ; restore registers
POP AF
RET RET
; ;
; Print the value in A in hex without destroying any registers ; Print the value in A in hex without destroying any registers

1
Source/Apps/VGM/YM2612.ASM → Source/Apps/VGM/ymfmdemo.asm

@ -25,6 +25,7 @@ MBC .equ 2
; ;
plt_romwbw .equ 1 ; Build for ROMWBW? plt_romwbw .equ 1 ; Build for ROMWBW?
plt_type .equ sbcecb ; Select build configuration plt_type .equ sbcecb ; Select build configuration
plt_cpuspd .equ 6 ; Non ROMWBW cpu speed default
debug .equ 0 debug .equ 0
ctc_delay .equ 0 ctc_delay .equ 0

15
Source/Doc/Architecture.md

@ -1398,7 +1398,7 @@ Increase by steps of 4 to select the next corresponding note.
Increase by steps of 48 to select the same note in next octave. 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 If the driver is able to generate the requested note, a success (0) is
returned, otherwise a non-zero error state will be returned.
returned, otherwise a non-zero error value will be returned.
The sound chip resolution and its oscillator limit the range and The sound chip resolution and its oscillator limit the range and
accuracy of the notes played. The typical range of the AY-3-8910 accuracy of the notes played. The typical range of the AY-3-8910
@ -1443,7 +1443,7 @@ the following HBIOS calls would need to be made:
``` ```
HBIOS B=51 C=00 L=80 ; Set volume to half level HBIOS B=51 C=00 L=80 ; Set volume to half level
HBIOS B=53 C=00 L=69 ; Select Middle C (C4) assuming SN76489
HBIOS B=53 C=00 HL=152 ; Select Middle C (C4)
HBIOS B=54 C=00 D=01 ; Play note on Channel 1 HBIOS B=54 C=00 D=01 ; Play note on Channel 1
``` ```
@ -1518,6 +1518,8 @@ AUDIO ID | Value | Device | Returned registers
SND_SN76489 | 0x01 | SN76489 | E: Left channel port, L: Right channel port 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_AY38910 | 0x02 | AY-3-8910 | D: Address port, E: Data port
SND_BITMODE | 0x03 | I/O PORT | D: Address port, E: Bit mask SND_BITMODE | 0x03 | I/O PORT | D: Address port, E: Bit mask
SND_YM2612 | 0x04 | YM2612 | D: Part 0 Address port, E: Part 0 Data port
| | | H: Part 1 Address port, L: Part 1 Data port
### Function 0x56 -- Sound Duration (SNDDUR) ### Function 0x56 -- Sound Duration (SNDDUR)
@ -1547,10 +1549,10 @@ and then return.
| _Exit Results_ | _Exit Results_
| A: Status (0=OK, else error) | A: Status (0=OK, else error)
| D: Serial Device Type
| E: Serial Device Number
| H: Serial Device Unit Mode
| L: Serial Device Unit I/O Base Address
| D: Sound Device Type
| E: Sound Device Number
| H: Sound Device Unit Mode
| L: Sound Device Unit I/O Base Address
Reports information about the sound device unit specified. Register D Reports information about the sound device unit specified. Register D
indicates the device type (driver) and register E indicates the physical indicates the device type (driver) and register E indicates the physical
@ -1565,6 +1567,7 @@ _Id_ | _Device Type / Driver_
0x00 | SN76489 0x00 | SN76489
0x10 | AY38910 0x10 | AY38910
0x20 | BITMODE 0x20 | BITMODE
0x30 | YM2612
`\clearpage`{=latex} `\clearpage`{=latex}

5
Source/HBIOS/hbios.asm

@ -3725,7 +3725,7 @@ SND_ADDENT:
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS) ; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS)
; ;
SND_FNCNT .EQU 8 ; NUMBER OF SND FUNCS (FOR RANGE CHECK) SND_FNCNT .EQU 8 ; NUMBER OF SND FUNCS (FOR RANGE CHECK)
SND_MAX .EQU 4 ; UP TO 4 UNITS
SND_MAX .EQU 5 ; UP TO 4 UNITS
SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES
; ;
.DB SND_FNCNT ; SND FUNCTION COUNT (FOR RANGE CHECK) .DB SND_FNCNT ; SND FUNCTION COUNT (FOR RANGE CHECK)
@ -3737,7 +3737,7 @@ SND_TBL .FILL SND_SIZ,0 ; SPACE FOR ENTRIES
; SPEAKER BEEP ROUTINE ; SPEAKER BEEP ROUTINE
;================================================================================================== ;==================================================================================================
; ;
; ROUTINE TO BEEP THE DEAULT SOUND UNIT
; ROUTINE TO BEEP THE DEFAULT SOUND UNIT
; NEED TO CHECK FOR EXISTENCE OF SOUND UNIT ; NEED TO CHECK FOR EXISTENCE OF SOUND UNIT
; WHICH CHANNEL SHOULD BE USED? IS THERE A GOOD DEFAULT CHANNEL? ; WHICH CHANNEL SHOULD BE USED? IS THERE A GOOD DEFAULT CHANNEL?
; ;
@ -7041,6 +7041,7 @@ PS_SDSND .TEXT "SND$"
PS_SDSN76489 .TEXT "SN76489$" PS_SDSN76489 .TEXT "SN76489$"
PS_SDAY38910 .TEXT "AY-3-8910$" PS_SDAY38910 .TEXT "AY-3-8910$"
PS_SDBITMODE .TEXT "I/O PORT$" PS_SDBITMODE .TEXT "I/O PORT$"
PS_SDYM2612 .TEXT "YM2612$"
; ;
; 0 1 2 3 4 5 6 7 ; 0 1 2 3 4 5 6 7
; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789

1
Source/HBIOS/hbios.inc

@ -333,6 +333,7 @@ VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445
SNDDEV_SN76489 .EQU $00 SNDDEV_SN76489 .EQU $00
SNDDEV_AY38910 .EQU $10 SNDDEV_AY38910 .EQU $10
SNDDEV_BITMODE .EQU $20 SNDDEV_BITMODE .EQU $20
SNDDEV_YM2612 .EQU $30
; ;
; HBIOS CONTROL BLOCK OFFSETS ; HBIOS CONTROL BLOCK OFFSETS
; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES ; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES

1141
Source/HBIOS/ym2612.asm

File diff suppressed because it is too large
Loading…
Cancel
Save