|
|
|
@ -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,86 +1998,92 @@ 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 |
|
|
|
|