From b3f8cce0ae7aa34efaef0b36ddf2457e33ba0ed4 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Wed, 6 May 2020 20:48:35 +0800 Subject: [PATCH] Basic ay-3-8910 harware detection --- Source/HBIOS/ay38910.asm | 59 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 64b6e648..e3070813 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -4,26 +4,32 @@ ; ;====================================================================== ; +AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE +; #IF (AYMODE == AYMODE_SCG) AY_RSEL .EQU $9A AY_RDAT .EQU $9B +AY_RIN .EQU AY_RSEL AY_ACR .EQU $9C #ENDIF ; #IF (AYMODE == AYMODE_N8) AY_RSEL .EQU $9C AY_RDAT .EQU $9D +AY_RIN .EQU AY_RSEL AY_ACR .EQU N8_DEFACR #ENDIF ; #IF (AYMODE == AYMODE_RCZ80) AY_RSEL .EQU $D8 AY_RDAT .EQU $D0 +AY_RIN .EQU AY_RSEL+AY_RCSND #ENDIF ; #IF (AYMODE == AYMODE_RCZ180) AY_RSEL .EQU $68 AY_RDAT .EQU $60 +AY_RIN .EQU AY_RSEL+AY_RCSND #ENDIF ; ;====================================================================== @@ -87,12 +93,24 @@ AY38910_INIT: CALL PRTHEXBYTE ; #IF ((AYMODE == AYMODE_SCG) | (AYMODE == AYMODE_N8)) - ; ACTIVATE DEVICE - LD A,$FF ; BIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED + LD A,$FF ; ACTIVATE DEVICEBIT 4 IS AY RESET CONTROL, BIT 3 IS ACTIVE LED OUT (AY_ACR),A ; SET INIT AUX CONTROL REG #ENDIF + + LD D,AY_R2CHBP ; SIMPLE HARDWARE PROBE + LD E,$AA + CALL AY_WRTPSG ; WRITE AND + CALL AY_RDPSG + LD A,$AA + CP E + JR Z,AY_FND + + CALL PRTSTRD \ .TEXT " NOT PRESENT$" + + LD A,$FF ; UNSUCCESSFULL INIT + RET ; - LD IY, AY_IDAT ; SETUP FUNCTION TABLE +AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD BC, AY_FNTBL ; POINTER TO INSTANCE DATA LD DE, AY_IDAT ; BC := FUNCTION TABLE ADDRESS CALL SND_ADDENT ; DE := INSTANCE DATA PTR @@ -114,7 +132,8 @@ AY38910_INIT: LD E,$00 ; SET VOLUME OFF CALL AY_SETV ; ON ALL CHANNELS ; -; RET + XOR A ; SUCCESSFULL INIT + RET ; ;====================================================================== ; INITIALIZE DEVICE @@ -390,6 +409,38 @@ AY_WRTPSG: 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 + +; +;====================================================================== +; +; READ FROM REGISTER D AND RETURN WITH RESULT IN E +; +AY_RDPSG: + 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 + OR %00110000 ; FORCE SLOW OPERATION (I/O W/S=3) + OUT0 (Z180_DCNTL),A ; AND UPDATE DCNTL +#ENDIF + LD A,D ; SELECT THE REGISTER WE + OUT (AY_RSEL),A ; WANT TO READ + IN A,(AY_RIN) ; READ SELECTED REGISTER + LD E,A +#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