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 (NOTE),HL
;
@ -26,31 +213,46 @@ NEXTCH1 LD A,B
LD (CHANNEL),A
PUSH BC ; ACROSS
CALL TONE ; ALL
LD C, 6 ; KEYPRESS
LD E, 0FFH
CALL BDOS
POP BC ; CHANNELS
OR A
JP NZ,EXIT
DJNZ NEXTCH1
RET
TONE: LD B,50H ; RESET
LD C,0
TONE: LD A,(DEVICE)
LD C,A
LD B,50H ; RESET
PUSH BC
RST 08
POP BC
;
NEXT1: LD B,51H ; VOLUME
LD C,0
LD A,(VOLUME)
LD L,A
PUSH BC
RST 08
POP BC
;
LD B,53H ; NOTE
LD C,0
LD HL,(NOTE)
PUSH BC
RST 08
POP BC
;
LD B,54H ; PLAY
LD C,0
LD A,(CHANNEL)
LD D,A
PUSH BC
RST 08
POP BC
;
CALL DELAY
;
@ -60,74 +262,23 @@ NEXT1: LD B,51H ; VOLUME
JR NZ,NEXT1
;
LD B,51H ; VOLUME
LD C,0
LD L,00H
PUSH BC
RST 08
POP BC
;
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 D,A
POP BC
RST 08
;
RET
;;
;------------------------------------------------------------------------------
; LONG DELAY
;------------------------------------------------------------------------------
;
DELAY: LD HL,-1
DELAY1: DEC HL
@ -136,10 +287,43 @@ DELAY1: DEC HL
JR NZ,DELAY1
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

2
Source/Apps/Tune/printing.inc

@ -34,6 +34,7 @@ PRTCR:
; Print a zero terminated string at (DE) without destroying any registers
;
PRTSTR:
PUSH AF
PUSH DE
;
PRTSTR1:
@ -46,6 +47,7 @@ PRTSTR1:
;
PRTSTR2:
POP DE ; restore registers
POP AF
RET
;
; 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
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 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
ym2612.com:
$(TASM) -dWBW ym2612.asm ym2612.com ym2612.lst
$(TASM) -dWBW ymfmdemo.asm ymfmdemo.com ymfmdemo.lst
all::
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
;
PRTSTR:
PUSH AF
PUSH DE
;
PRTSTR1:
@ -46,6 +47,7 @@ PRTSTR1:
;
PRTSTR2:
POP DE ; restore registers
POP AF
RET
;
; 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_type .equ sbcecb ; Select build configuration
plt_cpuspd .equ 6 ; Non ROMWBW cpu speed default
debug .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.
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
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=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
```
@ -1518,6 +1518,8 @@ 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
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)
@ -1547,10 +1549,10 @@ and then return.
| _Exit Results_
| 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
indicates the device type (driver) and register E indicates the physical
@ -1565,6 +1567,7 @@ _Id_ | _Device Type / Driver_
0x00 | SN76489
0x10 | AY38910
0x20 | BITMODE
0x30 | YM2612
`\clearpage`{=latex}

5
Source/HBIOS/hbios.asm

@ -3725,7 +3725,7 @@ SND_ADDENT:
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS)
;
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
;
.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
;==================================================================================================
;
; ROUTINE TO BEEP THE DEAULT SOUND UNIT
; ROUTINE TO BEEP THE DEFAULT SOUND UNIT
; NEED TO CHECK FOR EXISTENCE OF SOUND UNIT
; WHICH CHANNEL SHOULD BE USED? IS THERE A GOOD DEFAULT CHANNEL?
;
@ -7041,6 +7041,7 @@ PS_SDSND .TEXT "SND$"
PS_SDSN76489 .TEXT "SN76489$"
PS_SDAY38910 .TEXT "AY-3-8910$"
PS_SDBITMODE .TEXT "I/O PORT$"
PS_SDYM2612 .TEXT "YM2612$"
;
; 0 1 2 3 4 5 6 7
; 01234567890123456789012345678901234567890123456789012345678901234567890123456789

1
Source/HBIOS/hbios.inc

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

1141
Source/HBIOS/ym2612.asm

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