Reload Table
Reload TilFile
'd7 - High_boost
'd6 - Loops value
'd5 - read_bytes_counter
'd4 - akulmulator'|DAC last value'|akulmulator|DAC last value
'd3 - Wl
'd2 - Flag|Average val
'd1 - temp
'd0 - temp
'a2 - quantize table
'a1 - Dac_Block start
Asm
move.B #$01, ($A11100) ; request Z80 bus
move.B #$2B, ($A04000) ; DAC On
move.B #$80, ($A04001) ; DAC On
move.B #$2A, ($A04000) ; Will DAC Out
move.l #__SBSDATA_Power2, a2 ; 4bit_to_value table
move.B (a6)+, d0 ; Read first DAC_byte
clr.L d4 ; Val = 0
clr.L d2 ; Flag, Avg_Val = 0
clr.L d3
move.B d0, d4 ; Val = first_value
@Next_block
move.W d4, d0 ;
Swap d4 ;
move.W d0, d4 ; Save akk, Val d4.L_lo -> d4.L_hi
bclr.L #16, d2 ; Set 1st_2nd_byte_flag = 0
beq.S @Skip_offset_correction
adda #1, a6
@Skip_offset_correction
move.B (a6)+, d3 ; Read Wl
beq @Break ; If Wl = 0: EOF
move.B (a6)+, d6 ; Read Loops
move.B (a6), d7 ; Read High_boost
eori.b #7, d7 ; prepare 7-d7 value
Swap d7 ;
move.B (a6)+, d7 ; Repeat Read High_boost
move.L a6, a1 ; Keep Dac_Block start
@Repeat_Loop
move.B d3, d5 ; Wl->read_bytes_counter
bclr.L #16, d2 ; Set 1st_2nd_byte_flag = 0
@Next_DAC_Byte
bchg.L #16, d2 ; Check & Xor 1st_2nd_byte_flag
bne.S @Second_Nibble ; If 1st_2nd_byte_flag = 1: take 2nd half
move.B (a6), d0 ; Read DAC_byte
lsr.L #4, d0 ; Get first nibble
bra.S @First_Nibble
@Second_Nibble
clr.W d0
move.B (a6)+, d0 ; Read DAC_byte
@First_Nibble
And.W #$000F, d0 ; Filter rubbish Or get second nibble
move.B (a2,d0), d0 ; Convert 4bit To diff value
ror.w #8, d4 ; d4.B ~ akulmulator
cmp.B #21, d4 ; If abs(akulmulator)>21: akulmulator=0
sle d1
And.B d1, d4
cmp.B #-21, d4
sge d1
And.B d1, d4
add.B d0, d4 ; akulmulator = akulmulator + twos[dac_block[i]]
move.B d4, d0
ror.w #8, d4 ; d4.B ~ Val
add.B d0, d4 ; Val = Val + akulmulator
move.B d4, d0
ext.W d0
Swap d3
ext.W d3
Sub.W d3, d0 ; d0 = diff
asr.W d7, d0 ; d0~diff, equalize
Swap d7
asr.B d7, d1 ; compensate asr cycles bias
Swap d7
cmp.B #7, d7 ; special Case To prevent -1
sne d1
And.B d1, d0
add.W d0, d2 ; Avg_Val = High + Avg_Val
move.B d4, d1
ext.W d1
add.W d1, d2 ; Avg_Val = Byte + Avg_Val
asr.W #1, d2 ; Avg_Val = Avg_Val / 2
move.B d2, d1 ; To keep average unchanged
add.B #$80, d1 ; Signed -> unsigned
move.B d1,($A04001) ; DAC_byte out
move.W d0, d1 ;keep diff
move.W #2, d0 ; Prepare pause counter
@Pause
dbf d0, @Pause ; 22 kHz delay
move.W #22, d0 ; Prepare pause counter
@Pause1
dbf d0, @Pause1 ; Read operations delay
Sub.W d1, d2 ; Avg_Val = Avg_Val - High
move.B d4, d1
move.B d4, d3 ; d3 = prev_byte
Swap d3
ext.W d1
add.W d1, d2 ; Avg_Val = Byte + Avg_Val
asr.W #1, d2 ; Avg_Val = Avg_Val / 2
move.B d2, d1 ; Keep average unchanged
add.B #$80, d1 ; Signed -> unsigned
move.B d1,($A04001) ; DAC_byte out
move.W #2, d0 ; Prepare pause counter
@Pause2
dbf d0, @Pause2 ; 22 kHz delay
@No_Pause
subi.B #1, d5 ; Read_bytes_counter - 1
bne @Next_DAC_Byte ; If read_bytes < Wl: Next_DacByte
@Loop_Done
Subq.B #1, d6 ; Loops - 1
beq @Next_block ; If Loops=0: Next_Block
move.L d4, d0
Swap d0
move.W d0, d4 ; Restore akk, Val d4.L_hi -> d4.L_lo
move.L a1, a6 ; Reset datapointer
bra @Repeat_Loop
@Break
End Asm
Print "That End"
TilFile:
DataFile "C:\input.til", Bin
Table:
Data 0,1,4,9,16,25,36,49,64,-1,-4,-9,-16,-25,-36,-49
Нихуя не понял, но было интересно. Лайк
Вот ради такого дтф и создавался. Ну и для всяких пропатчиваний, кхм.
Согласен, я бы такое почаще читал бы. Но и тематика развлечения тоже должна быть иначе будет сухо на платформе
для щитпостинга он создан
Для решения этой проблемы сделали Sega CD :)
Контент который современный пдф не заслужил. Вот это основательность в подходе. Тоже пытался шаманить со звуком на SMD, но ты просто больной ублюдок :D
Большая часть непонятна совсем, но хотелось бы яснее понять, что за противоречие в сеговском цапе? Вроде как написано, что с ее качеством и размером картриджа больше 2.5 минут не впихнуть, но так и нет и не надо столько в играх - там бэком может 8 нот в лупе идти и персонаж пару фраз говорить за всю игру. Короче, интересно, но тема Сеги не раскрыта)