Code: Select all
\ ***************************************
\ * TWOBITS PLAYER FOR RK-86 BY SHAOS *
\ * THIS CODE IS PUBLIC DOMAIN !!! *
\ *-------------------------------------*
\ * CREATED JAN 2014 | UPDATED SEP 2024 *
\ ***************************************
\ 80.62 TICKS PER SAMPLE FOR 22050 HZ
\ OR 241.87 PER 3 SAMPLES (WITHOUT DMA):
\ 80.62 X 1 ~ 81
\ 80.62 X 2 ~ 161
\ 80.62 X 3 ~ 242
ORG 0
\ DB 0,4,0,255
MVI_E, #00
LXI_H, #0100
CALL TWOBITS
MVI_A, #FF
STA #A002
HLT
\ TWOBITS FORMAT:
\ ONE BYTE PLAYS 3 DIFFERENT 2-BIT SAMPLES
\ OR MAXIMUM 50 IDENTICAL 2-BIT SAMPLES
\ 00000000 - END OF STREAM
\ 0NNNNNBB - OUTPUT BB NNNNN+3 TIMES
\ 10NNNNBB - OUTPUT BB NNNN+35 TIMES
\ 11DDCCBB - OUTPUT BB THEN CC THEN DD
\ PLAY TWOBITS COMPRESSED SOUND
\ HL - ADDRESS ON ROM-DISK (#7FFF MAX)
\ E - PAGE ON ROM-DISK (#FF MAX)
TWOBITS: MVI_A, #80
STA #E008
XRA_A
STA #A002
MOV_A,E
STA #A001
MVI_A, #80
STA #A002
MVI_C, 2
SHLD #A001
GO0: \ 207 TICKS FROM PREVIOUS CYCLE (-36)
INX_H ; 5 -> 212 (-31)
LDA #A000 ; 13 -> 225 (-18)
MOV_B,A ; 5 -> 230 (-13)
STA #8002 ; 13 -> 243/0* (START HERE)
ANA_C ; 4 -> 4
JNZ SET1 ; 10 -> 14
NOP ; DI ; 4 -> 18**
JMP GO2 ; 10 -> 28
SET1:
NOP ; EI ; 4 -> 18**
JMP GO2 ; 10 -> 28
\ COUNTER (4...50) OR STOP (0)
COUNT1: MOV_A,B ; 47+5 -> 52
ORA_A ; 4 -> 56
RZ ; 5(11) -> 61
COUNT2: MOV_A,B ; 61+5 -> 66
CMP_A ; 4 -> 70
RAR ; 4 -> 74
CMP_A ; 4 -> 78
RAR ; 4 -> 82
INR_A ; 5 -> 87
MVI_B, #FF ; 7 -> 94
MVI_B, 4 ; 7 -> 101
CLOOP: \ 15*4=60 -> 161
DCR_B ; 5
JNZ CLOOP ; 10
COUNTER: \ 161 (-81) *
NOP ; 4 -> 165 (-77)
DCR_A ; 5 -> 170 (-72)
JNZ COUNTER_ ; 10 -> 180 (-62)
SHLD #A001 ; 16 -> 196 (-46)
JMP GO0 ; 10 -> 206 (-36)
COUNTER_: \ 180
MVI_B, 3 ; 7 -> 187
JMP CLOOP ; 10 -> 197 (+15*3=242)
GO2:
MOV_A,B ; 5 -> 33
RLC ; 4 -> 37
JNC COUNT1 ; 10 -> 47
RLC ; 4 -> 51
JNC COUNT2 ; 10 -> 61
MOV_A,B ; 5 -> 66
RRC ; 4 -> 70
RRC ; 4 -> 74
STA #8002 ; 13 -> 87* (+6)
ANA_C ; 4 -> 91
JNZ SET2 ; 10 -> 101
NOP ; DI ; 4 -> 105**
JMP GO3 ; 10 -> 115
SET2:
NOP ; EI ; 4 -> 105**
MOV_A,H ; 5 -> 110
MOV_A,H ; 5 -> 115
GO3:
ORA_H ; 4 -> 119
JP NONEXTPG ; 10 -> 129
\ NEXT PAGE
INR_E
XRA_A
STA #A002
MOV_A,E
STA #A001
MVI_A, #80
STA #A002
LXI_H, 0
NONEXTPG:
SHLD #A001 ; 16 -> 145
MOV_A,B ; 5 -> 150
RRC ; 4 -> 154
RRC ; 4 -> 158
RRC ; 4 -> 162
RRC ; 4 -> 166
STA #8002 ; 13 -> 179* (+18)
ANA_C ; 4 -> 183
JNZ SET3 ; 10 -> 193
NOP ; DI ; 4 -> 197*
JMP GO0 ; 10 -> 207
SET3:
NOP ; EI ; 4 -> 197**
JMP GO0 ; 10 -> 207

P.S. Как можно видеть я тут выдумал некую технологию сжатия, которая сжимает чиптюновую музыку в 2-3 раза по сравнению с непожатыми четырьмя сэмплами на байт - битрейт получается чуть меньше 15-20 килобит/сек при частоте 22050 Гц (это примерно 2-2.5 килобайта в секунду, т.е. в 1 мегабайт квазидиска может влезть до 9 минут звука).
P.P.S. В сентябре 2024 года слегка поправил исходник, чтобы работало с ромдиском по схеме vinxru и закомментил EI/DI (точнее заменил на NOP-ы) - пусть играет только через C1-C0 (эдакий двухбитный ковокс получается). Эти rom-ы надо кидать в онлайн эмулятор от vital72 где включён в настройках 2-битный covox (PC1..0) и запускать на исполнение командами R,FF и G