--- /dev/null
+ úù-ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-¿\r
+ ú subz3ro's ù\r
+ ù /´DLiB TR/´CK3R ][ G3 PLAYER ú\r
+ À-ÄÄÄÄÄ-ÄÄÄÄÄÄÄÄ--ùú 0.43\r
+\r
+ Ú-ÄÄÄÄÄÄÄÄÄÄÄÄ--ùú ú\r
+ ù HiGHLiGHTS ù\r
+ ú úù-ÄÄÄÄÄÄÄÄÄÄÄ-Ù\r
+\r
+ þ powered by PMODE/W 1.33\r
+\r
+ þ 255 instruments\r
+ 128 patterns\r
+ 128 order list entries ú\r
+ ù\r
+ þ 87 effects, ³\r
+ and 16 extended commands ³\r
+ ³\r
+ þ optional graphic interface ³\r
+ ³\r
+ þ replays A2M A2T AMD DFM ù\r
+ CFF FMK HSC MTK ú\r
+ RAD S3M SAT SA2\r
+ ú XMS\r
+ ù\r
+ À-ÄÄÄÄÄÄÄ--ùú\r
--- /dev/null
+{\r
+ function check_byte(var data; _byte: Byte; size: Longint): Boolean;\r
+ procedure insert_command(cmd,cmd2: Word; patterns: Byte; chan: Byte; exceptions: tByteSet);\r
+ procedure import_old_a2m_event1(patt,line,chan: Byte; old_chunk: tOLD_CHUNK;\r
+ processing_whole_song: Boolean);\r
+ procedure replace_old_adsr(patterns: Byte);\r
+ procedure import_old_a2m_patterns1(block: Byte; count: Byte);\r
+ procedure import_old_a2m_event2(patt,line,chan: Byte; old_chunk: tOLD_CHUNK);\r
+ procedure import_old_a2m_patterns2(block: Byte; count: Byte);\r
+ procedure import_old_flags;\r
+ procedure import_old_songdata(old_songdata: pOLD_FIXED_SONGDATA);\r
+ procedure import_old_instruments(old_songdata: pOLD_FIXED_SONGDATA;\r
+ new_songdata: pFIXED_SONGDATA;\r
+ instr,count: Byte);\r
+ procedure import_single_old_instrument(old_songdata: pOLD_FIXED_SONGDATA;\r
+ pos,instr: Byte);\r
+ procedure a2m_file_loader;\r
+ procedure a2t_file_loader;\r
+ procedure a2p_file_loader;\r
+ function dec2hex(dec: Byte): Byte;\r
+ function truncate_string(str: String): String;\r
+ procedure amd_file_loader;\r
+ procedure import_cff_event(patt,line,chan,byte0,byte1,byte2: Byte);\r
+ procedure import_cff_patterns(var data; patterns: Byte);\r
+ procedure cff_file_loader;\r
+ procedure import_standard_instrument(inst: Byte; var data);\r
+ procedure dfm_file_loader;\r
+ procedure import_hsc_event(patt,line,chan: Byte; event: Word);\r
+ procedure import_hsc_patterns(var data; patterns: Byte);\r
+ procedure import_hsc_instrument(inst: Byte; var data);\r
+ procedure hsc_file_loader;\r
+ procedure mtk_file_loader;\r
+ procedure rad_file_loader;\r
+ procedure fix_s3m_commands(patterns: Byte);\r
+ procedure fix_single_pattern(patt: Byte);\r
+ procedure s3m_file_loader;\r
+ procedure fix_fmk_commands(patterns: Byte);\r
+ procedure import_fin_instrument(inst: Byte; var data);\r
+ procedure fmk_file_loader;\r
+ procedure import_sat_instrument(inst: Byte; var data);\r
+ function import_sat_instrument_name(var data; inst: Byte): String;\r
+ procedure sat_file_loader;\r
+ function _sal(op1,op2: Word): Byte;\r
+ function _sar(op1,op2: Word): Byte;\r
+ procedure import_sa2_effect(effect,def1,def2: Byte;\r
+ var out1,out2: Byte);\r
+ procedure sa2_file_loader;\r
+}\r
+\r
+function check_byte(var data; _byte: Byte; size: Longint): Boolean;\r
+\r
+var\r
+ result: Boolean;\r
+\r
+begin\r
+ asm\r
+ mov edi,[data]\r
+ mov ecx,size\r
+ jecxz @@1\r
+ mov al,_byte\r
+ repnz scasb\r
+ jnz @@1\r
+ mov result,TRUE\r
+ jmp @@2\r
+@@1: mov result,FALSE\r
+@@2:\r
+ end;\r
+ check_byte := result;\r
+end;\r
+\r
+procedure insert_command(cmd,cmd2: Word; patterns: Byte; chan: Byte; exceptions: tByteSet);\r
+\r
+var\r
+ chunk: tCHUNK;\r
+ temp2,temp3: Byte;\r
+ patt_break: Byte;\r
+ order,patt: Byte;\r
+ patts: String;\r
+\r
+begin\r
+ patts := '';\r
+ order := 0; patt := BYTE_NULL;\r
+\r
+ Repeat\r
+ If (Pos(CHR(songdata.pattern_order[order]),patts) <> 0) or\r
+ (songdata.pattern_order[order] >= $80) then Inc(order)\r
+ else\r
+ begin\r
+ patt := songdata.pattern_order[order];\r
+ patt_break := songdata.patt_len;\r
+ For temp3 := 1 to songdata.nm_tracks do\r
+ For temp2 := 0 to PRED(songdata.patt_len) do\r
+ begin\r
+ get_chunk(patt,temp2,temp3,chunk);\r
+ If (chunk.effect_def in [ef_PositionJump,ef_PatternBreak]) or\r
+ (chunk.effect_def2 in [ef_PositionJump,ef_PatternBreak]) then\r
+ patt_break := temp2;\r
+\r
+ If (temp3 = chan) and (temp2 <= patt_break) then\r
+ If (cmd2 = 0) then\r
+ If (chunk.effect_def+chunk.effect = 0) or\r
+ (chunk.effect_def in exceptions) then\r
+ begin\r
+ chunk.effect_def := HI(cmd);\r
+ chunk.effect := LO(cmd);\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ EXIT;\r
+ end\r
+ else If (chunk.effect_def2+chunk.effect2 = 0) or\r
+ (chunk.effect_def2 in exceptions) then\r
+ begin\r
+ chunk.effect_def2 := HI(cmd);\r
+ chunk.effect2 := LO(cmd);\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ EXIT;\r
+ end\r
+ else\r
+ else If ((chunk.effect_def+chunk.effect = 0) or\r
+ (chunk.effect_def in exceptions)) and\r
+ ((chunk.effect_def2+chunk.effect2 = 0) or\r
+ (chunk.effect_def2 in exceptions)) then\r
+ begin\r
+ chunk.effect_def := HI(cmd);\r
+ chunk.effect := LO(cmd);\r
+ chunk.effect_def2 := HI(cmd2);\r
+ chunk.effect2 := LO(cmd2);\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ EXIT;\r
+ end;\r
+ end;\r
+ Inc(order);\r
+ patts := patts+CHR(patt);\r
+ end;\r
+ until (patt >= patterns) or (order > $7f);\r
+end;\r
+\r
+var\r
+ adsr_carrier: array[1..9] of Boolean;\r
+\r
+procedure import_old_a2m_event1(patt,line,chan: Byte; old_chunk: tOLD_CHUNK;\r
+ processing_whole_song: Boolean);\r
+\r
+const\r
+ fx_Arpeggio = $00;\r
+ fx_FSlideUp = $01;\r
+ fx_FSlideDown = $02;\r
+ fx_FSlideUpFine = $03;\r
+ fx_FSlideDownFine = $04;\r
+ fx_TonePortamento = $05;\r
+ fx_TPortamVolSlide = $06;\r
+ fx_Vibrato = $07;\r
+ fx_VibratoVolSlide = $08;\r
+ fx_SetOpIntensity = $09;\r
+ fx_SetInsVolume = $0a;\r
+ fx_PatternBreak = $0b;\r
+ fx_PatternJump = $0c;\r
+ fx_SetTempo = $0d;\r
+ fx_SetTimer = $0e;\r
+ fx_Extended = $0f;\r
+ fx_ex_DefAMdepth = $00;\r
+ fx_ex_DefVibDepth = $01;\r
+ fx_ex_DefWaveform = $02;\r
+ fx_ex_ManSlideUp = $03;\r
+ fx_ex_ManSlideDown = $04;\r
+ fx_ex_VSlideUp = $05;\r
+ fx_ex_VSlideDown = $06;\r
+ fx_ex_VSlideUpFine = $07;\r
+ fx_ex_VSlideDownFine = $08;\r
+ fx_ex_RetrigNote = $09;\r
+ fx_ex_SetAttckRate = $0a;\r
+ fx_ex_SetDecayRate = $0b;\r
+ fx_ex_SetSustnLevel = $0c;\r
+ fx_ex_SetReleaseRate = $0d;\r
+ fx_ex_SetFeedback = $0e;\r
+ fx_ex_ExtendedCmd = $0f;\r
+\r
+var\r
+ chunk: tCHUNK;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ chunk.note := old_chunk.note;\r
+ chunk.instr_def := old_chunk.instr_def;\r
+ chunk.effect_def := old_chunk.effect_def;\r
+ chunk.effect := old_chunk.effect;\r
+\r
+ Case old_chunk.effect_def of\r
+ fx_Arpeggio: chunk.effect_def := ef_Arpeggio;\r
+ fx_FSlideUp: chunk.effect_def := ef_FSlideUp;\r
+ fx_FSlideDown: chunk.effect_def := ef_FSlideDown;\r
+ fx_FSlideUpFine: chunk.effect_def := ef_FSlideUpFine;\r
+ fx_FSlideDownFine: chunk.effect_def := ef_FSlideDownFine;\r
+ fx_TonePortamento: chunk.effect_def := ef_TonePortamento;\r
+ fx_TPortamVolSlide: chunk.effect_def := ef_TPortamVolSlide;\r
+ fx_Vibrato: chunk.effect_def := ef_Vibrato;\r
+ fx_VibratoVolSlide: chunk.effect_def := ef_VibratoVolSlide;\r
+ fx_SetInsVolume: chunk.effect_def := ef_SetInsVolume;\r
+ fx_PatternJump: chunk.effect_def := ef_PositionJump;\r
+ fx_PatternBreak: chunk.effect_def := ef_PatternBreak;\r
+ fx_SetTempo: chunk.effect_def := ef_SetSpeed;\r
+ fx_SetTimer: chunk.effect_def := ef_SetTempo;\r
+\r
+ fx_SetOpIntensity:\r
+ If (old_chunk.effect DIV 16 <> 0) then\r
+ begin\r
+ chunk.effect_def := ef_SetCarrierVol;\r
+ chunk.effect := 3+(old_chunk.effect DIV 16)*4;\r
+ end\r
+ else If (old_chunk.effect MOD 16 <> 0) then\r
+ begin\r
+ chunk.effect_def := ef_SetModulatorVol;\r
+ chunk.effect := 3+(old_chunk.effect MOD 16)*4;\r
+ end\r
+ else chunk.effect_def := 0;\r
+\r
+ fx_Extended:\r
+ Case old_chunk.effect DIV 16 of\r
+ fx_ex_DefAMdepth:\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetTremDepth*16+old_chunk.effect MOD 16;\r
+ end;\r
+\r
+ fx_ex_DefVibDepth:\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetVibDepth*16+old_chunk.effect MOD 16;\r
+ end;\r
+\r
+\r
+ fx_ex_DefWaveform:\r
+ begin\r
+ chunk.effect_def := ef_SetWaveform;\r
+ Case old_chunk.effect MOD 16 of\r
+ 0..3: chunk.effect := (old_chunk.effect MOD 16)*16+$0f;\r
+ 4..7: chunk.effect := $0f0+(old_chunk.effect MOD 16)-4;\r
+ end;\r
+ end;\r
+\r
+ fx_ex_VSlideUp:\r
+ begin\r
+ chunk.effect_def := ef_VolSlide;\r
+ chunk.effect := (old_chunk.effect MOD 16)*16;\r
+ end;\r
+\r
+ fx_ex_VSlideDown:\r
+ begin\r
+ chunk.effect_def := ef_VolSlide;\r
+ chunk.effect := old_chunk.effect MOD 16;\r
+ end;\r
+\r
+ fx_ex_VSlideUpFine:\r
+ begin\r
+ chunk.effect_def := ef_VolSlideFine;\r
+ chunk.effect := (old_chunk.effect MOD 16)*16;\r
+ end;\r
+\r
+ fx_ex_VSlideDownFine:\r
+ begin\r
+ chunk.effect_def := ef_VolSlideFine;\r
+ chunk.effect := old_chunk.effect MOD 16;\r
+ end;\r
+\r
+ fx_ex_ManSlideUp:\r
+ begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_FineTuneUp*16+old_chunk.effect MOD 16;\r
+ end;\r
+\r
+ fx_ex_ManSlideDown:\r
+ begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_FineTuneDown*16+old_chunk.effect MOD 16;\r
+ end;\r
+\r
+ fx_ex_RetrigNote:\r
+ begin\r
+ chunk.effect_def := ef_RetrigNote;\r
+ chunk.effect := SUCC(old_chunk.effect MOD 16);\r
+ end;\r
+\r
+ fx_ex_SetAttckRate:\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := old_chunk.effect MOD 16;\r
+ If NOT adsr_carrier[chan] then\r
+ Inc(chunk.effect,ef_ex_SetAttckRateM*16)\r
+ else Inc(chunk.effect,ef_ex_SetAttckRateC*16);\r
+ end;\r
+\r
+ fx_ex_SetDecayRate:\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := old_chunk.effect MOD 16;\r
+ If NOT adsr_carrier[chan] then\r
+ Inc(chunk.effect,ef_ex_SetDecayRateM*16)\r
+ else Inc(chunk.effect,ef_ex_SetDecayRateC*16);\r
+ end;\r
+\r
+ fx_ex_SetSustnLevel:\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := old_chunk.effect MOD 16;\r
+ If NOT adsr_carrier[chan] then\r
+ Inc(chunk.effect,ef_ex_SetSustnLevelM*16)\r
+ else Inc(chunk.effect,ef_ex_SetSustnLevelC*16);\r
+ end;\r
+\r
+ fx_ex_SetReleaseRate:\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := old_chunk.effect MOD 16;\r
+ If NOT adsr_carrier[chan] then\r
+ Inc(chunk.effect,ef_ex_SetRelRateM*16)\r
+ else Inc(chunk.effect,ef_ex_SetRelRateC*16);\r
+ end;\r
+\r
+ fx_ex_SetFeedback:\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetFeedback*16+old_chunk.effect MOD 16;\r
+ end;\r
+\r
+ fx_ex_ExtendedCmd:\r
+ If (old_chunk.effect MOD 16 in [0..9]) then\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_ExtendedCmd*16;\r
+\r
+ Case old_chunk.effect MOD 16 of\r
+ 0: Inc(chunk.effect,ef_ex_cmd_RSS);\r
+ 1: Inc(chunk.effect,ef_ex_cmd_LockVol);\r
+ 2: Inc(chunk.effect,ef_ex_cmd_UnlockVol);\r
+ 3: Inc(chunk.effect,ef_ex_cmd_LockVP);\r
+ 4: Inc(chunk.effect,ef_ex_cmd_UnlockVP);\r
+\r
+ 5: begin\r
+ If processing_whole_song then chunk.effect_def := 255\r
+ else chunk.effect_def := 0;\r
+ chunk.effect := 0;\r
+ adsr_carrier[chan] := TRUE;\r
+ end;\r
+\r
+ 6: begin\r
+ If processing_whole_song then chunk.effect_def := 255\r
+ else chunk.effect_def := 0;\r
+ If processing_whole_song then chunk.effect := 1\r
+ else chunk.effect := 0;\r
+ adsr_carrier[chan] := FALSE;\r
+ end;\r
+\r
+ 7: Inc(chunk.effect,ef_ex_cmd_VSlide_car);\r
+ 8: Inc(chunk.effect,ef_ex_cmd_VSlide_mod);\r
+ 9: Inc(chunk.effect,ef_ex_cmd_VSlide_def);\r
+ end;\r
+ end\r
+ else begin\r
+ chunk.effect_def := 0;\r
+ chunk.effect := 0;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ put_chunk(patt,line,chan,chunk);\r
+end;\r
+\r
+procedure replace_old_adsr(patterns: Byte);\r
+\r
+var\r
+ chunk,chunk2: tCHUNK;\r
+ temp2,temp3: Byte;\r
+ patt_break: Byte;\r
+ order,patt: Byte;\r
+ patts: String;\r
+\r
+begin\r
+ patts := '';\r
+ FillChar(adsr_carrier,SizeOf(adsr_carrier),0);\r
+\r
+ order := 0; patt := BYTE_NULL;\r
+ Repeat\r
+ If (songdata.pattern_order[order] >= $80) then Inc(order)\r
+ else\r
+ begin\r
+ patt := songdata.pattern_order[order];\r
+ patt_break := BYTE_NULL;\r
+ For temp2 := 0 to $3f do\r
+ For temp3 := 1 to 9 do\r
+ begin\r
+ get_chunk(patt,temp2,temp3,chunk);\r
+ chunk2 := chunk;\r
+\r
+ If (chunk.effect_def in [ef_PositionJump,ef_PatternBreak]) then\r
+ patt_break := temp2;\r
+\r
+ If (chunk.effect_def in [$ff,ef_Extended]) then\r
+ begin\r
+ If (chunk.effect_def = $ff) then\r
+ begin\r
+ chunk2.effect_def := 0;\r
+ chunk2.effect := 0;\r
+\r
+ If (temp2 <= patt_break) then\r
+ Case chunk.effect of\r
+ 0: adsr_carrier[temp3] := TRUE;\r
+ 1: adsr_carrier[temp3] := FALSE;\r
+ end;\r
+ end;\r
+\r
+ If (chunk.effect_def = ef_Extended) then\r
+ Case chunk.effect DIV 16 of\r
+ ef_ex_SetAttckRateM,\r
+ ef_ex_SetAttckRateC:\r
+ If adsr_carrier[temp3] then\r
+ chunk2.effect := ef_ex_SetAttckRateC*16+chunk.effect MOD 16\r
+ else chunk2.effect := ef_ex_SetAttckRateM*16+chunk.effect MOD 16;\r
+\r
+ ef_ex_SetDecayRateM,\r
+ ef_ex_SetDecayRateC:\r
+ If adsr_carrier[temp3] then\r
+ chunk2.effect := ef_ex_SetDecayRateC*16+chunk.effect MOD 16\r
+ else chunk2.effect := ef_ex_SetDecayRateM*16+chunk.effect MOD 16;\r
+\r
+ ef_ex_SetSustnLevelM,\r
+ ef_ex_SetSustnLevelC:\r
+ If adsr_carrier[temp3] then\r
+ chunk2.effect := ef_ex_SetSustnLevelC*16+chunk.effect MOD 16\r
+ else chunk2.effect := ef_ex_SetSustnLevelM*16+chunk.effect MOD 16;\r
+\r
+ ef_ex_SetRelRateM,\r
+ ef_ex_SetRelRateC:\r
+ If adsr_carrier[temp3] then\r
+ chunk2.effect := ef_ex_SetRelRateC*16+chunk.effect MOD 16\r
+ else chunk2.effect := ef_ex_SetRelRateM*16+chunk.effect MOD 16;\r
+ end;\r
+\r
+ If (Pos(CHR(songdata.pattern_order[order]),patts) = 0) then\r
+ If (chunk.effect_def <> chunk2.effect_def) or\r
+ (chunk.effect <> chunk2.effect) then\r
+ put_chunk(patt,temp2,temp3,chunk2);\r
+ end;\r
+ end;\r
+ Inc(order);\r
+ patts := patts+CHR(patt);\r
+ end;\r
+ until (patt >= patterns) or (order > $7f);\r
+end;\r
+\r
+procedure import_old_a2m_patterns1(block: Byte; count: Byte);\r
+\r
+procedure get_old_chunk(pattern,line,channel: Byte; var chunk: tOLD_CHUNK);\r
+begin chunk := old_hash_buffer[pattern][line][channel]; end;\r
+\r
+var\r
+ patt,line,chan: Byte;\r
+ chunk: tOLD_CHUNK;\r
+\r
+begin { import_old_a2m_patterns1 }\r
+ For patt := 0 to max(PRED(count),15) do\r
+ For line := 0 to $3f do\r
+ For chan := 1 to 9 do\r
+ begin\r
+ get_old_chunk(patt,line,chan,chunk);\r
+ import_old_a2m_event1(block*16+patt,line,chan,chunk,TRUE);\r
+ end;\r
+end;\r
+\r
+procedure import_old_a2m_event2(patt,line,chan: Byte; old_chunk: tOLD_CHUNK);\r
+\r
+const\r
+ ef_ManualFSlide = 22;\r
+\r
+var\r
+ chunk: tCHUNK;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ chunk.note := old_chunk.note;\r
+ chunk.instr_def := old_chunk.instr_def;\r
+\r
+ If (old_chunk.effect_def <> ef_ManualFSlide) then\r
+ begin\r
+ chunk.effect_def := old_chunk.effect_def;\r
+ chunk.effect := old_chunk.effect;\r
+ end\r
+ else If (old_chunk.effect DIV 16 <> 0) then\r
+ begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_FineTuneUp*16+old_chunk.effect DIV 16;\r
+ end\r
+ else begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_FineTuneDown*16+old_chunk.effect MOD 16;\r
+ end;\r
+\r
+ put_chunk(patt,line,chan,chunk);\r
+end;\r
+\r
+procedure import_old_a2m_patterns2(block: Byte; count: Byte);\r
+\r
+procedure get_old_chunk(pattern,line,channel: Byte; var chunk: tOLD_CHUNK);\r
+begin chunk := hash_buffer[pattern][channel][line]; end;\r
+\r
+var\r
+ patt,line,chan: Byte;\r
+ chunk: tOLD_CHUNK;\r
+\r
+begin { import_old_a2m_patterns2 }\r
+ For patt := 0 to max(PRED(count),7) do\r
+ For line := 0 to $3f do\r
+ For chan := 1 to 18 do\r
+ begin\r
+ get_old_chunk(patt,line,chan,chunk);\r
+ import_old_a2m_event2(block*8+patt,line,chan,chunk);\r
+ end;\r
+end;\r
+\r
+procedure import_old_flags;\r
+\r
+var\r
+ temp: Byte;\r
+\r
+begin\r
+ If (songdata.common_flag OR 2 = songdata.common_flag) then\r
+ For temp := 1 to 20 do\r
+ songdata.lock_flags[temp] := songdata.lock_flags[temp] OR $10;\r
+\r
+ If (songdata.common_flag OR 4 = songdata.common_flag) then\r
+ For temp := 1 to 20 do\r
+ songdata.lock_flags[temp] := songdata.lock_flags[temp] OR $20;\r
+\r
+ If (songdata.common_flag OR $20 = songdata.common_flag) then\r
+ For temp := 1 to 20 do\r
+ songdata.lock_flags[temp] := songdata.lock_flags[temp] AND NOT 3;\r
+end;\r
+\r
+procedure import_old_songdata(old_songdata: pOLD_FIXED_SONGDATA);\r
+\r
+var\r
+ temp: Byte;\r
+\r
+begin\r
+ songdata.songname := old_songdata^.songname;\r
+ songdata.composer := old_songdata^.composer;\r
+\r
+ For temp := 1 to 250 do\r
+ begin\r
+ songdata.instr_names[temp] := old_songdata^.instr_names[temp];\r
+ songdata.instr_data[temp].fm_data := old_songdata^.instr_data[temp].fm_data;\r
+ songdata.instr_data[temp].panning := old_songdata^.instr_data[temp].panning;\r
+ songdata.instr_data[temp].fine_tune := old_songdata^.instr_data[temp].fine_tune;\r
+ songdata.instr_data[temp].perc_voice := 0;\r
+ end;\r
+\r
+ Move(old_songdata^.pattern_order,\r
+ songdata.pattern_order,\r
+ SizeOf(old_songdata^.pattern_order));\r
+\r
+ songdata.tempo := old_songdata^.tempo;\r
+ songdata.speed := old_songdata^.speed;\r
+ songdata.common_flag := old_songdata^.common_flag;\r
+ import_old_flags;\r
+end;\r
+\r
+\r
+procedure a2m_file_loader;\r
+\r
+type\r
+ tOLD_HEADER = Record\r
+ ident: array[1..10] of Char;\r
+ crc32: Longint;\r
+ ffver: Byte;\r
+ patts: Byte;\r
+ b0len: Word;\r
+ b1len: Word;\r
+ b2len: Word;\r
+ b3len: Word;\r
+ b4len: Word;\r
+ b5len: Word;\r
+ b6len: Word;\r
+ b7len: Word;\r
+ b8len: Word;\r
+ end;\r
+type\r
+ tHEADER = Record\r
+ ident: array[1..10] of Char;\r
+ crc32: Longint;\r
+ ffver: Byte;\r
+ patts: Byte;\r
+ b0len: Longint;\r
+ b1len: array[0..15] of Longint;\r
+ end;\r
+\r
+const\r
+ id = '_A2module_';\r
+\r
+const\r
+ old_a2m_header_size = 26;\r
+\r
+var\r
+ f: File;\r
+ header: tHEADER;\r
+ header2: tOLD_HEADER;\r
+ temp,temp2: Longint;\r
+ crc: Longint;\r
+ xlen: array[0..6] of Word;\r
+\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ If NOT (header.ffver in [1..11]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_old_songdata;\r
+ If (header.ffver in [1..4]) then\r
+ begin\r
+ FillChar(adsr_carrier,SizeOf(adsr_carrier),BYTE(FALSE));\r
+ ResetF(f);\r
+ BlockReadF(f,header2,SizeOf(header2),temp);\r
+ If NOT ((temp = SizeOf(header2)) and (header2.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ xlen[0] := header2.b2len;\r
+ xlen[1] := header2.b3len;\r
+ xlen[2] := header2.b4len;\r
+\r
+ SeekF(f,old_a2m_header_size);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := DWORD_NULL;\r
+ BlockReadF(f,buf1,header2.b0len,temp);\r
+ If NOT (temp = header2.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header2.b1len,temp);\r
+ If NOT (temp = header2.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ For temp2 := 0 to 2 do\r
+ If ((header2.patts-1) DIV 16 > temp2) then\r
+ begin\r
+ BlockReadF(f,buf1,xlen[temp2],temp);\r
+ If NOT (temp = xlen[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ crc := Update32(buf1,temp,crc);\r
+ end;\r
+\r
+ crc := Update32(header2.b0len,2,crc);\r
+ crc := Update32(header2.b1len,2,crc);\r
+\r
+ For temp2 := 0 to 2 do\r
+ crc := Update32(xlen[temp2],2,crc);\r
+\r
+ If (crc <> header2.crc32) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ SeekF(f,old_a2m_header_size);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header2.b0len,temp);\r
+ If NOT (temp = header2.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Case header2.ffver of\r
+ 4: Move(buf1,old_songdata,header2.b0len);\r
+ 3: LZSS_decompress(buf1,old_songdata,header2.b0len);\r
+ 2: LZW_decompress(buf1,old_songdata);\r
+ 1: SIXPACK_decompress(buf1,old_songdata,header2.b0len);\r
+ end;\r
+\r
+ For temp := 1 to 250 do\r
+ old_songdata.instr_data[temp].panning := 0;\r
+\r
+ BlockReadF(f,buf1,header2.b1len,temp);\r
+ If NOT (temp = header2.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Case header2.ffver of\r
+ 4: Move(buf1,old_hash_buffer,header2.b1len);\r
+ 3: LZSS_decompress(buf1,old_hash_buffer,header2.b1len);\r
+ 2: LZW_decompress(buf1,old_hash_buffer);\r
+ 1: SIXPACK_decompress(buf1,old_hash_buffer,header2.b1len);\r
+ end;\r
+ import_old_a2m_patterns1(0,16);\r
+\r
+ For temp2 := 0 to 2 do\r
+ If ((header2.patts-1) DIV 16 > temp2) then\r
+ begin\r
+ BlockReadF(f,buf1,xlen[temp2],temp);\r
+ If NOT (temp = xlen[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Case header2.ffver of\r
+ 4: Move(buf1,old_hash_buffer,xlen[temp2]);\r
+ 3: LZSS_decompress(buf1,old_hash_buffer,xlen[temp2]);\r
+ 2: LZW_decompress(buf1,old_hash_buffer);\r
+ 1: SIXPACK_decompress(buf1,old_hash_buffer,xlen[temp2]);\r
+ end;\r
+ import_old_a2m_patterns1(SUCC(temp2),16);\r
+ end;\r
+\r
+ replace_old_adsr(header2.patts);\r
+ import_old_songdata(Addr(old_songdata));\r
+ end;\r
+\r
+ If (header.ffver in [5..8]) then\r
+ begin\r
+ ResetF(f);\r
+ BlockReadF(f,header2,SizeOf(header2),temp);\r
+ If NOT ((temp = SizeOf(header2)) and (header2.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ xlen[0] := header2.b2len;\r
+ xlen[1] := header2.b3len;\r
+ xlen[2] := header2.b4len;\r
+ xlen[3] := header2.b5len;\r
+ xlen[4] := header2.b6len;\r
+ xlen[5] := header2.b7len;\r
+ xlen[6] := header2.b8len;\r
+\r
+ crc := DWORD_NULL;\r
+ BlockReadF(f,buf1,header2.b0len,temp);\r
+ If NOT (temp = header2.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header2.b1len,temp);\r
+ If NOT (temp = header2.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ For temp2 := 0 to 6 do\r
+ If ((header2.patts-1) DIV 8 > temp2) then\r
+ begin\r
+ BlockReadF(f,buf1,xlen[temp2],temp);\r
+ If NOT (temp = xlen[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ crc := Update32(buf1,temp,crc);\r
+ end;\r
+\r
+ crc := Update32(header2.b0len,2,crc);\r
+ crc := Update32(header2.b1len,2,crc);\r
+\r
+ For temp2 := 0 to 6 do\r
+ crc := Update32(xlen[temp2],2,crc);\r
+\r
+ If (crc <> header2.crc32) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 18\r
+ else If (songdata.nm_tracks < 18) then songdata.nm_tracks := 18;\r
+\r
+ SeekF(f,SizeOf(header2));\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header2.b0len,temp);\r
+ If NOT (temp = header2.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Case header2.ffver of\r
+ 8: Move(buf1,old_songdata,header2.b0len);\r
+ 7: LZSS_decompress(buf1,old_songdata,header2.b0len);\r
+ 6: LZW_decompress(buf1,old_songdata);\r
+ 5: SIXPACK_decompress(buf1,old_songdata,header2.b0len);\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header2.b1len,temp);\r
+ If NOT (temp = header2.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Case header2.ffver of\r
+ 8: Move(buf1,hash_buffer,header2.b1len);\r
+ 7: LZSS_decompress(buf1,hash_buffer,header2.b1len);\r
+ 6: LZW_decompress(buf1,hash_buffer);\r
+ 5: SIXPACK_decompress(buf1,hash_buffer,header2.b1len);\r
+ end;\r
+ import_old_a2m_patterns2(0,8);\r
+\r
+ For temp2 := 0 to 6 do\r
+ If ((header2.patts-1) DIV 8 > temp2) then\r
+ begin\r
+ BlockReadF(f,buf1,xlen[temp2],temp);\r
+ If NOT (temp = xlen[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Case header2.ffver of\r
+ 8: Move(buf1,hash_buffer,header2.b2len);\r
+ 7: LZSS_decompress(buf1,hash_buffer,header2.b2len);\r
+ 6: LZW_decompress(buf1,hash_buffer);\r
+ 5: SIXPACK_decompress(buf1,hash_buffer,header2.b2len);\r
+ end;\r
+ import_old_a2m_patterns2(SUCC(temp2),8);\r
+ end;\r
+ import_old_songdata(Addr(old_songdata));\r
+ end;\r
+\r
+ If (header.ffver in [9,10,11]) then\r
+ begin\r
+ crc := DWORD_NULL;\r
+ BlockReadF(f,buf1,header.b0len,temp);\r
+ If NOT (temp = header.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header.b1len[0],temp);\r
+ If NOT (temp = header.b1len[0]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ For temp2 := 1 to 15 do\r
+ If ((header.patts-1) DIV 8 > PRED(temp2)) then\r
+ begin\r
+ BlockReadF(f,buf1,header.b1len[temp2],temp);\r
+ If NOT (temp = header.b1len[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ crc := Update32(buf1,temp,crc);\r
+ end;\r
+\r
+ crc := Update32(header.b0len,2,crc);\r
+ For temp2 := 0 to 15 do\r
+ crc := Update32(header.b1len[temp2],2,crc);\r
+\r
+ If (crc <> header.crc32) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ SeekF(f,SizeOf(header));\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header.b0len,temp);\r
+ If NOT (temp = header.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata);\r
+ BlockReadF(f,buf1,header.b1len[0],temp);\r
+ If NOT (temp = header.b1len[0]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (header.ffver = 9) then\r
+ import_old_flags;\r
+\r
+\r
+ APACK_decompress(buf1,pattdata^[0]);\r
+ For temp2 := 1 to 15 do\r
+ If ((header.patts-1) DIV 8 > PRED(temp2)) then\r
+ begin\r
+ BlockReadF(f,buf1,header.b1len[temp2],temp);\r
+ If NOT (temp = header.b1len[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (temp2*8+8 <= max_patterns) then\r
+ APACK_decompress(buf1,pattdata^[temp2])\r
+ else limit_exceeded := TRUE;\r
+ end;\r
+ end;\r
+\r
+ speed := songdata.speed;\r
+ tempo := songdata.tempo;\r
+\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ Case header.ffver of\r
+ 1..4: load_flag := 1;\r
+ else load_flag := 2;\r
+ end;\r
+end;\r
+\r
+procedure a2t_file_loader;\r
+\r
+type\r
+ tOLD_HEADER1 = Record\r
+ ident: array[1..15] of Char;\r
+ crc32: Longint;\r
+ ffver: Byte;\r
+ patts: Byte;\r
+ tempo: Byte;\r
+ speed: Byte;\r
+ b0len: Word;\r
+ b1len: Word;\r
+ b2len: Word;\r
+ b3len: Word;\r
+ b4len: Word;\r
+ b5len: Word;\r
+ end;\r
+type\r
+ tOLD_HEADER2 = Record\r
+ ident: array[1..15] of Char;\r
+ crc32: Longint;\r
+ ffver: Byte;\r
+ patts: Byte;\r
+ tempo: Byte;\r
+ speed: Byte;\r
+ cflag: Byte;\r
+ b0len: Word;\r
+ b1len: Word;\r
+ b2len: Word;\r
+ b3len: Word;\r
+ b4len: Word;\r
+ b5len: Word;\r
+ b6len: Word;\r
+ b7len: Word;\r
+ b8len: Word;\r
+ b9len: Word;\r
+ end;\r
+type\r
+ tOLD_HEADER3 = Record\r
+ ident: array[1..15] of Char;\r
+ crc32: Longint;\r
+ ffver: Byte;\r
+ patts: Byte;\r
+ tempo: Byte;\r
+ speed: Byte;\r
+ cflag: Byte;\r
+ patln: Word;\r
+ nmtrk: Byte;\r
+ mcspd: Word;\r
+ b0len: Longint;\r
+ b1len: Longint;\r
+ b2len: Longint;\r
+ b3len: Longint;\r
+ b4len: array[0..15] of Longint;\r
+ end;\r
+type\r
+ tOLD_HEADER4 = Record\r
+ ident: array[1..15] of Char;\r
+ crc32: Longint;\r
+ ffver: Byte;\r
+ patts: Byte;\r
+ tempo: Byte;\r
+ speed: Byte;\r
+ cflag: Byte;\r
+ patln: Word;\r
+ nmtrk: Byte;\r
+ mcspd: Word;\r
+ is4op: Byte;\r
+ locks: array[1..20] of Byte;\r
+ b0len: Longint;\r
+ b1len: Longint;\r
+ b2len: Longint;\r
+ b3len: Longint;\r
+ b4len: array[0..15] of Longint;\r
+ end;\r
+type\r
+ tHEADER = Record\r
+ ident: array[1..15] of Char;\r
+ crc32: Longint;\r
+ ffver: Byte;\r
+ patts: Byte;\r
+ tempo: Byte;\r
+ speed: Byte;\r
+ cflag: Byte;\r
+ patln: Word;\r
+ nmtrk: Byte;\r
+ mcspd: Word;\r
+ is4op: Byte;\r
+ locks: array[1..20] of Byte;\r
+ b0len: Longint;\r
+ b1len: Longint;\r
+ b2len: Longint;\r
+ b3len: Longint;\r
+ b4len: Longint;\r
+ b5len: array[0..15] of Longint;\r
+ end;\r
+const\r
+ id = '_A2tiny_module_';\r
+\r
+var\r
+ f: File;\r
+ header: tHEADER;\r
+ header2: tOLD_HEADER1;\r
+ header3: tOLD_HEADER2;\r
+ header4: tOLD_HEADER3;\r
+ header5: tOLD_HEADER4;\r
+ temp,temp2: Longint;\r
+ crc: Longint;\r
+ xlen: array[0..6] of Word;\r
+\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ If NOT (header.ffver in [1..11]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_old_songdata;\r
+ If (header.ffver in [1..4]) then\r
+ begin\r
+ FillChar(adsr_carrier,SizeOf(adsr_carrier),BYTE(FALSE));\r
+ ResetF(f);\r
+ BlockReadF(f,header2,SizeOf(header2),temp);\r
+ If NOT ((temp = SizeOf(header2)) and (header2.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ xlen[0] := header2.b3len;\r
+ xlen[1] := header2.b4len;\r
+ xlen[2] := header2.b5len;\r
+\r
+ crc := DWORD_NULL;\r
+ BlockReadF(f,buf1,header2.b0len,temp);\r
+ If NOT (temp = header2.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header2.b1len,temp);\r
+ If NOT (temp = header2.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header2.b2len,temp);\r
+ If NOT (temp = header2.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ For temp2 := 0 to 2 do\r
+ If ((header2.patts-1) DIV 16 > temp2) then\r
+ begin\r
+ BlockReadF(f,buf1,xlen[temp2],temp);\r
+ If NOT (temp = xlen[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ crc := Update32(buf1,temp,crc);\r
+ end;\r
+\r
+ crc := Update32(header2.b0len,2,crc);\r
+ crc := Update32(header2.b1len,2,crc);\r
+ crc := Update32(header2.b2len,2,crc);\r
+\r
+ For temp2 := 0 to 2 do\r
+ crc := Update32(xlen[temp2],2,crc);\r
+\r
+ If (crc <> header2.crc32) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ SeekF(f,SizeOf(header2));\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header2.b0len,temp);\r
+ If NOT (temp = header2.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ old_songdata.tempo := header2.tempo;\r
+ old_songdata.speed := header2.speed;\r
+\r
+ Case header2.ffver of\r
+ 4: Move(buf1,old_songdata.instr_data,header2.b0len);\r
+ 3: LZSS_decompress(buf1,old_songdata.instr_data,header2.b0len);\r
+ 2: LZW_decompress(buf1,old_songdata.instr_data);\r
+ 1: SIXPACK_decompress(buf1,old_songdata.instr_data,header2.b0len);\r
+ end;\r
+\r
+ For temp := 1 to 250 do\r
+ old_songdata.instr_data[temp].panning := 0;\r
+\r
+ BlockReadF(f,buf1,header2.b1len,temp);\r
+ If NOT (temp = header2.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Case header2.ffver of\r
+ 4: Move(buf1,old_songdata.pattern_order,header2.b1len);\r
+ 3: LZSS_decompress(buf1,old_songdata.pattern_order,header2.b1len);\r
+ 2: LZW_decompress(buf1,old_songdata.pattern_order);\r
+ 1: SIXPACK_decompress(buf1,old_songdata.pattern_order,header2.b1len);\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header2.b2len,temp);\r
+ If NOT (temp = header2.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(old_hash_buffer,SizeOf(old_hash_buffer),0);\r
+ Case header2.ffver of\r
+ 4: Move(buf1,old_hash_buffer,header2.b2len);\r
+ 3: LZSS_decompress(buf1,old_hash_buffer,header2.b2len);\r
+ 2: LZW_decompress(buf1,old_hash_buffer);\r
+ 1: SIXPACK_decompress(buf1,old_hash_buffer,header2.b2len);\r
+ end;\r
+ import_old_a2m_patterns1(0,16);\r
+\r
+ For temp2 := 0 to 2 do\r
+ If ((header2.patts-1) DIV 16 > temp2) then\r
+ begin\r
+ BlockReadF(f,buf1,xlen[temp2],temp);\r
+ If NOT (temp = xlen[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(old_hash_buffer,SizeOf(old_hash_buffer),0);\r
+ Case header2.ffver of\r
+ 4: Move(buf1,old_hash_buffer,header2.b3len);\r
+ 3: LZSS_decompress(buf1,old_hash_buffer,header2.b3len);\r
+ 2: LZW_decompress(buf1,old_hash_buffer);\r
+ 1: SIXPACK_decompress(buf1,old_hash_buffer,header2.b3len);\r
+ end;\r
+ import_old_a2m_patterns1(SUCC(temp2),16);\r
+ end;\r
+\r
+ replace_old_adsr(header2.patts);\r
+ import_old_songdata(Addr(old_songdata));\r
+ end;\r
+\r
+ If (header.ffver in [5..8]) then\r
+ begin\r
+ ResetF(f);\r
+ BlockReadF(f,header3,SizeOf(header3),temp);\r
+ If NOT ((temp = SizeOf(header3)) and (header3.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ xlen[0] := header3.b3len;\r
+ xlen[1] := header3.b4len;\r
+ xlen[2] := header3.b5len;\r
+ xlen[3] := header3.b6len;\r
+ xlen[4] := header3.b7len;\r
+ xlen[5] := header3.b8len;\r
+ xlen[6] := header3.b9len;\r
+\r
+ crc := DWORD_NULL;\r
+ BlockReadF(f,buf1,header3.b0len,temp);\r
+ If NOT (temp = header3.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header3.b1len,temp);\r
+ If NOT (temp = header3.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header3.b2len,temp);\r
+ If NOT (temp = header3.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ For temp2 := 0 to 6 do\r
+ If ((header3.patts-1) DIV 8 > temp2) then\r
+ begin\r
+ BlockReadF(f,buf1,xlen[temp2],temp);\r
+ If NOT (temp = xlen[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ crc := Update32(buf1,temp,crc);\r
+ end;\r
+\r
+ crc := Update32(header3.b0len,2,crc);\r
+ crc := Update32(header3.b1len,2,crc);\r
+ crc := Update32(header3.b2len,2,crc);\r
+\r
+ For temp2 := 0 to 6 do\r
+ crc := Update32(xlen[temp2],2,crc);\r
+\r
+ If (crc <> header3.crc32) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 18\r
+ else If (songdata.nm_tracks < 18) then songdata.nm_tracks := 18;\r
+\r
+ SeekF(f,SizeOf(header3));\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header3.b0len,temp);\r
+ If NOT (temp = header3.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ old_songdata.tempo := header3.tempo;\r
+ old_songdata.speed := header3.speed;\r
+ old_songdata.common_flag := header3.cflag;\r
+\r
+ Case header3.ffver of\r
+ 8: Move(buf1,old_songdata.instr_data,header3.b0len);\r
+ 7: LZSS_decompress(buf1,old_songdata.instr_data,header3.b0len);\r
+ 6: LZW_decompress(buf1,old_songdata.instr_data);\r
+ 5: SIXPACK_decompress(buf1,old_songdata.instr_data,header3.b0len);\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header3.b1len,temp);\r
+ If NOT (temp = header3.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Case header3.ffver of\r
+ 8: Move(buf1,old_songdata.pattern_order,header3.b1len);\r
+ 7: LZSS_decompress(buf1,old_songdata.pattern_order,header3.b1len);\r
+ 6: LZW_decompress(buf1,old_songdata.pattern_order);\r
+ 5: SIXPACK_decompress(buf1,old_songdata.pattern_order,header3.b1len);\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header3.b2len,temp);\r
+ If NOT (temp = header3.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(hash_buffer,SizeOf(hash_buffer),0);\r
+ Case header3.ffver of\r
+ 8: Move(buf1,hash_buffer,header3.b2len);\r
+ 7: LZSS_decompress(buf1,hash_buffer,header3.b2len);\r
+ 6: LZW_decompress(buf1,hash_buffer);\r
+ 5: SIXPACK_decompress(buf1,hash_buffer,header3.b2len);\r
+ end;\r
+ import_old_a2m_patterns2(0,8);\r
+\r
+ For temp2 := 0 to 6 do\r
+ If ((header3.patts-1) DIV 8 > temp2) then\r
+ begin\r
+ BlockReadF(f,buf1,xlen[temp2],temp);\r
+ If NOT (temp = xlen[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(hash_buffer,SizeOf(hash_buffer),0);\r
+ Case header3.ffver of\r
+ 8: Move(buf1,hash_buffer,header3.b3len);\r
+ 7: LZSS_decompress(buf1,hash_buffer,header3.b3len);\r
+ 6: LZW_decompress(buf1,hash_buffer);\r
+ 5: SIXPACK_decompress(buf1,hash_buffer,header3.b3len);\r
+ end;\r
+ import_old_a2m_patterns2(SUCC(temp2),8);\r
+ end;\r
+ import_old_songdata(Addr(old_songdata));\r
+ end;\r
+\r
+ If (header.ffver = 9) then\r
+ begin\r
+ ResetF(f);\r
+ BlockReadF(f,header4,SizeOf(header4),temp);\r
+ If NOT ((temp = SizeOf(header4)) and (header4.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := DWORD_NULL;\r
+ BlockReadF(f,buf1,header4.b0len,temp);\r
+ If NOT (temp = header4.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header4.b1len,temp);\r
+ If NOT (temp = header4.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header4.b2len,temp);\r
+ If NOT (temp = header4.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header4.b3len,temp);\r
+ If NOT (temp = header4.b3len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header4.b4len[0],temp);\r
+ If NOT (temp = header4.b4len[0]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ For temp2 := 1 to 15 do\r
+ If ((header4.patts-1) DIV 8 > PRED(temp2)) then\r
+ begin\r
+ BlockReadF(f,buf1,header4.b4len[temp2],temp);\r
+ If NOT (temp = header4.b4len[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ crc := Update32(buf1,temp,crc);\r
+ end;\r
+\r
+ crc := Update32(header4.b0len,2,crc);\r
+ crc := Update32(header4.b1len,2,crc);\r
+ crc := Update32(header4.b2len,2,crc);\r
+ crc := Update32(header4.b3len,2,crc);\r
+\r
+ For temp2 := 0 to 15 do\r
+ crc := Update32(header4.b4len[temp2],2,crc);\r
+\r
+ If (crc <> header4.crc32) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ SeekF(f,SizeOf(header4));\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header4.b0len,temp);\r
+ If NOT (temp = header4.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.instr_data);\r
+ BlockReadF(f,buf1,header4.b1len,temp);\r
+ If NOT (temp = header4.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.instr_macros);\r
+ BlockReadF(f,buf1,header4.b2len,temp);\r
+ If NOT (temp = header4.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.macro_table);\r
+ BlockReadF(f,buf1,header4.b3len,temp);\r
+ If NOT (temp = header4.b3len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ songdata.tempo := header4.tempo;\r
+ songdata.speed := header4.speed;\r
+ songdata.common_flag := header4.cflag;\r
+ songdata.patt_len := header4.patln;\r
+ songdata.nm_tracks := header4.nmtrk;\r
+ songdata.macro_speedup := header4.mcspd;\r
+ import_old_flags;\r
+\r
+ APACK_decompress(buf1,songdata.pattern_order);\r
+ BlockReadF(f,buf1,header4.b4len[0],temp);\r
+ If NOT (temp = header4.b4len[0]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,pattdata^[0]);\r
+ For temp2 := 1 to 15 do\r
+ If ((header4.patts-1) DIV 8 > PRED(temp2)) then\r
+ begin\r
+ BlockReadF(f,buf1,header4.b4len[temp2],temp);\r
+ If NOT (temp = header4.b4len[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (temp2*8+8 <= max_patterns) then\r
+ APACK_decompress(buf1,pattdata^[temp2])\r
+ else limit_exceeded := TRUE;\r
+ end;\r
+ end;\r
+\r
+ If (header.ffver = 10) then\r
+ begin\r
+ ResetF(f);\r
+ BlockReadF(f,header5,SizeOf(header5),temp);\r
+ If NOT ((temp = SizeOf(header5)) and (header5.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := DWORD_NULL;\r
+ BlockReadF(f,buf1,header5.b0len,temp);\r
+ If NOT (temp = header5.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header5.b1len,temp);\r
+ If NOT (temp = header5.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header5.b2len,temp);\r
+ If NOT (temp = header5.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header5.b3len,temp);\r
+ If NOT (temp = header5.b3len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header5.b4len[0],temp);\r
+ If NOT (temp = header5.b4len[0]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ For temp2 := 1 to 15 do\r
+ If ((header5.patts-1) DIV 8 > PRED(temp2)) then\r
+ begin\r
+ BlockReadF(f,buf1,header5.b4len[temp2],temp);\r
+ If NOT (temp = header5.b4len[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ crc := Update32(buf1,temp,crc);\r
+ end;\r
+\r
+ crc := Update32(header5.b0len,2,crc);\r
+ crc := Update32(header5.b1len,2,crc);\r
+ crc := Update32(header5.b2len,2,crc);\r
+ crc := Update32(header5.b3len,2,crc);\r
+\r
+ For temp2 := 0 to 15 do\r
+ crc := Update32(header5.b4len[temp2],2,crc);\r
+\r
+ If (crc <> header5.crc32) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ SeekF(f,SizeOf(header5));\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header5.b0len,temp);\r
+ If NOT (temp = header5.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.instr_data);\r
+ BlockReadF(f,buf1,header5.b1len,temp);\r
+ If NOT (temp = header5.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.instr_macros);\r
+ BlockReadF(f,buf1,header5.b2len,temp);\r
+ If NOT (temp = header5.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.macro_table);\r
+ BlockReadF(f,buf1,header5.b3len,temp);\r
+ If NOT (temp = header5.b3len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ songdata.tempo := header5.tempo;\r
+ songdata.speed := header5.speed;\r
+ songdata.common_flag := header5.cflag;\r
+ songdata.patt_len := header5.patln;\r
+ songdata.nm_tracks := header5.nmtrk;\r
+ songdata.macro_speedup := header5.mcspd;\r
+ songdata.flag_4op := header5.is4op;\r
+ Move(header5.locks,songdata.lock_flags,SizeOf(songdata.lock_flags));\r
+\r
+ APACK_decompress(buf1,songdata.pattern_order);\r
+ BlockReadF(f,buf1,header5.b4len[0],temp);\r
+ If NOT (temp = header5.b4len[0]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,pattdata^[0]);\r
+ For temp2 := 1 to 15 do\r
+ If ((header5.patts-1) DIV 8 > PRED(temp2)) then\r
+ begin\r
+ BlockReadF(f,buf1,header5.b4len[temp2],temp);\r
+ If NOT (temp = header5.b4len[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (temp2*8+8 <= max_patterns) then\r
+ APACK_decompress(buf1,pattdata^[temp2])\r
+ else limit_exceeded := TRUE;\r
+ end;\r
+ end;\r
+\r
+ If (header.ffver = 11) then\r
+ begin\r
+ crc := DWORD_NULL;\r
+ BlockReadF(f,buf1,header.b0len,temp);\r
+ If NOT (temp = header.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header.b1len,temp);\r
+ If NOT (temp = header.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header.b2len,temp);\r
+ If NOT (temp = header.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header.b3len,temp);\r
+ If NOT (temp = header.b3len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header.b4len,temp);\r
+ If NOT (temp = header.b4len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ BlockReadF(f,buf1,header.b5len[0],temp);\r
+ If NOT (temp = header.b5len[0]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ crc := Update32(buf1,temp,crc);\r
+ For temp2 := 1 to 15 do\r
+ If ((header.patts-1) DIV 8 > PRED(temp2)) then\r
+ begin\r
+ BlockReadF(f,buf1,header.b5len[temp2],temp);\r
+ If NOT (temp = header.b5len[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ crc := Update32(buf1,temp,crc);\r
+ end;\r
+\r
+ crc := Update32(header.b0len,2,crc);\r
+ crc := Update32(header.b1len,2,crc);\r
+ crc := Update32(header.b2len,2,crc);\r
+ crc := Update32(header.b3len,2,crc);\r
+ crc := Update32(header.b4len,2,crc);\r
+\r
+ For temp2 := 0 to 15 do\r
+ crc := Update32(header.b5len[temp2],2,crc);\r
+\r
+ If (crc <> header.crc32) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ SeekF(f,SizeOf(header));\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,buf1,header.b0len,temp);\r
+ If NOT (temp = header.b0len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.instr_data);\r
+ BlockReadF(f,buf1,header.b1len,temp);\r
+ If NOT (temp = header.b1len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.instr_macros);\r
+ BlockReadF(f,buf1,header.b2len,temp);\r
+ If NOT (temp = header.b2len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.macro_table);\r
+ BlockReadF(f,buf1,header.b3len,temp);\r
+ If NOT (temp = header.b3len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,songdata.dis_fmreg_col);\r
+ BlockReadF(f,buf1,header.b4len,temp);\r
+ If NOT (temp = header.b4len) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ songdata.tempo := header.tempo;\r
+ songdata.speed := header.speed;\r
+ songdata.common_flag := header.cflag;\r
+ songdata.patt_len := header.patln;\r
+ songdata.nm_tracks := header.nmtrk;\r
+ songdata.macro_speedup := header.mcspd;\r
+ songdata.flag_4op := header.is4op;\r
+ Move(header.locks,songdata.lock_flags,SizeOf(songdata.lock_flags));\r
+\r
+ APACK_decompress(buf1,songdata.pattern_order);\r
+ BlockReadF(f,buf1,header.b5len[0],temp);\r
+ If NOT (temp = header.b5len[0]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ APACK_decompress(buf1,pattdata^[0]);\r
+ For temp2 := 1 to 15 do\r
+ If ((header.patts-1) DIV 8 > PRED(temp2)) then\r
+ begin\r
+ BlockReadF(f,buf1,header.b5len[temp2],temp);\r
+ If NOT (temp = header.b5len[temp2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (temp2*8+8 <= max_patterns) then\r
+ APACK_decompress(buf1,pattdata^[temp2])\r
+ else limit_exceeded := TRUE;\r
+ end;\r
+ end;\r
+\r
+ speed := songdata.speed;\r
+ tempo := songdata.tempo;\r
+\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ Case header.ffver of\r
+ 1..4: load_flag := 3;\r
+ else load_flag := 4;\r
+ end;\r
+end;\r
+\r
+\r
+function dec2hex(dec: Byte): Byte;\r
+begin dec2hex := (dec DIV 10)*16 +(dec MOD 10); end;\r
+\r
+function truncate_string(str: String): String;\r
+begin\r
+ While (Length(str) > 0) and (str[Length(str)] in [#0,#32,#255]) do\r
+ Delete(str,Length(str),1);\r
+ truncate_string := str;\r
+end;\r
+\r
+procedure amd_file_loader;\r
+\r
+type\r
+ tPATDAT = array[0..$24] of\r
+ array[0..$3f] of array[1..9] of\r
+ array[0..2] of Byte;\r
+type\r
+ tINSDAT = Record\r
+ iName: array[1..23] of Char; { Instrument name }\r
+ iData: array[0..10] of Byte; { Instrument data }\r
+ end;\r
+type\r
+ tHEADER = Record\r
+ sname: array[1..24] of Char; { Name of song [ASCIIZ] }\r
+ aname: array[1..24] of Char; { Name of author [ASCIIZ] }\r
+ instr: array[0..25] of tINSDAT; { 26 instruments }\r
+ snlen: Byte; { Song length }\r
+ nopat: Byte; { Number of patterns -1 }\r
+ order: array[0..$7f] of Byte; { Pattern table }\r
+ ident: array[1..9] of Char; { ID }\r
+ versn: Byte; { Version 10h=normal module }\r
+ { 11h=packed module }\r
+ end;\r
+const\r
+ id_amd = '<oïQUîRoR';\r
+ id_xms = 'MaDoKaN96';\r
+\r
+var\r
+ f: File;\r
+ header: tHEADER;\r
+ temp,tmp2,temp2,temp3,temp4: Longint;\r
+ byte1,byte2,byte3: Byte;\r
+\r
+procedure import_amd_instrument(inst: Byte; var data);\r
+begin\r
+ With songdata.instr_data[inst] do\r
+ begin\r
+ fm_data.AM_VIB_EG_modulator := tDUMMY_BUFF(data)[0];\r
+ fm_data.KSL_VOLUM_modulator := tDUMMY_BUFF(data)[1];\r
+ fm_data.ATTCK_DEC_modulator := tDUMMY_BUFF(data)[2];\r
+ fm_data.SUSTN_REL_modulator := tDUMMY_BUFF(data)[3];\r
+ fm_data.WAVEFORM_modulator := tDUMMY_BUFF(data)[4] AND 3;\r
+ fm_data.AM_VIB_EG_carrier := tDUMMY_BUFF(data)[5];\r
+ fm_data.KSL_VOLUM_carrier := tDUMMY_BUFF(data)[6];\r
+ fm_data.ATTCK_DEC_carrier := tDUMMY_BUFF(data)[7];\r
+ fm_data.SUSTN_REL_carrier := tDUMMY_BUFF(data)[8];\r
+ fm_data.WAVEFORM_carrier := tDUMMY_BUFF(data)[9] AND 3;\r
+ fm_data.FEEDBACK_FM := tDUMMY_BUFF(data)[10] AND $0f;\r
+ end;\r
+\r
+ songdata.instr_data[inst].panning := 0;\r
+ songdata.instr_data[inst].fine_tune := 0;\r
+end;\r
+\r
+procedure import_amd_event(pattern,line,channel,byte1,byte2,byte3: Byte);\r
+\r
+var\r
+ chunk: tCHUNK;\r
+ param: Byte;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ If ((byte2 SHR 4)+(byte1 AND 1) SHL 4 <> 0) then\r
+ chunk.instr_def := (byte2 SHR 4)+(byte1 AND 1) SHL 4;\r
+\r
+ If (byte1 SHR 4 in [1..12]) and ((byte1 SHR 1) AND 7 in [0..7]) then\r
+ chunk.note := 12*((byte1 SHR 1) AND 7)+(byte1 SHR 4);\r
+\r
+ param := byte3 AND $7f;\r
+ Case byte2 AND $0f of\r
+ { ARPEGGIO }\r
+ $00: begin\r
+ chunk.effect_def := ef_Arpeggio;\r
+ chunk.effect := dec2hex(param);\r
+ end;\r
+\r
+ { SLIDE FREQUENCY UP }\r
+ $01: begin\r
+ chunk.effect_def := ef_FSlideUp;\r
+ chunk.effect := param;\r
+ end;\r
+\r
+ { SLIDE FREQUENCY DOWN }\r
+ $02: begin\r
+ chunk.effect_def := ef_FSlideDown;\r
+ chunk.effect := param;\r
+ end;\r
+\r
+ { SET CARRIER/MODULATOR INTENSITY }\r
+ $03: If (param DIV 10 in [1..9]) then\r
+ begin\r
+ chunk.effect_def := ef_SetCarrierVol;\r
+ chunk.effect := (param DIV 10)*7;\r
+ end\r
+ else If (param MOD 10 in [1..9]) then\r
+ begin\r
+ chunk.effect_def := ef_SetModulatorVol;\r
+ chunk.effect := (param MOD 10)*7;\r
+ end;\r
+\r
+ { SET THE VOLUME }\r
+ $04: begin\r
+ chunk.effect_def := ef_SetInsVolume;\r
+ If (param < 64) then chunk.effect := param\r
+ else chunk.effect := 63;\r
+ end;\r
+\r
+ { JUMP INTO PATTERN }\r
+ $05: begin\r
+ chunk.effect_def := ef_PositionJump;\r
+ If (param < 100) then chunk.effect := param\r
+ else chunk.effect := 99;\r
+ end;\r
+\r
+ { PATTERNBREAK }\r
+ $06: begin\r
+ chunk.effect_def := ef_PatternBreak;\r
+ If (param < 64) then chunk.effect := param\r
+ else chunk.effect := 63;\r
+ end;\r
+\r
+ { SET SONGSPEED }\r
+ $07: If (param < 99) then\r
+ If (param in [1..31]) then\r
+ begin\r
+ chunk.effect_def := ef_SetSpeed;\r
+ chunk.effect := param;\r
+ end\r
+ else begin\r
+ chunk.effect_def := ef_SetTempo;\r
+ If (param = 0) then chunk.effect := 18\r
+ else chunk.effect := param;\r
+ end;\r
+\r
+ { TONEPORTAMENTO }\r
+ $08: begin\r
+ chunk.effect_def := ef_TonePortamento;\r
+ chunk.effect := param;\r
+ end;\r
+\r
+ { EXTENDED COMMAND }\r
+ $09: If (param < 60) then\r
+ Case param DIV 10 of\r
+ { DEFINE CELL-TREMOLO }\r
+ 0: If (param MOD 10 < 2) then\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := dec2hex(param);\r
+ end;\r
+\r
+ { DEFINE CELL-VIBRATO }\r
+ 1: If (param MOD 10 < 2) then\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := $10+dec2hex(param);\r
+ end;\r
+\r
+ { INCREASE VOLUME FAST }\r
+ 2: begin\r
+ chunk.effect_def := ef_VolSlide;\r
+ chunk.effect := (param MOD 10)*16;\r
+ end;\r
+\r
+ { DECREASE VOLUME FAST }\r
+ 3: begin\r
+ chunk.effect_def := ef_VolSlide;\r
+ chunk.effect := param MOD 10;\r
+ end;\r
+\r
+ { INCREASE VOLUME FINE }\r
+ 4: begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_VolSlideUpXF*16+(param MOD 10);\r
+ end;\r
+\r
+ { DECREASE VOLUME FINE }\r
+ 5: begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_VolSlideDnXF*16+(param MOD 10);\r
+ end;\r
+ end;\r
+ end;\r
+\r
+// specific corrections for Amusic event\r
+ If (chunk.note = 0) then chunk.instr_def := 0;\r
+ put_chunk(pattern,line,channel,chunk);\r
+end;\r
+\r
+procedure import_amd_packed_patterns(var data; patterns: Byte);\r
+\r
+var\r
+ temp,temp2,temp3,temp4,temp5: Word;\r
+ count: Byte;\r
+\r
+var\r
+ tracks: Word;\r
+ track_order: array[0..$3f] of array[1..9] of Word;\r
+ track: array[0..$3f] of tCHUNK;\r
+\r
+begin\r
+ temp := (patterns+1)*9*SizeOf(WORD);\r
+ Move(data,track_order,temp);\r
+\r
+ tracks := tDUMMY_BUFF(data)[temp]+(tDUMMY_BUFF(data)[temp+1]) SHL 8;\r
+ Inc(temp,2);\r
+\r
+ temp3 := 0;\r
+ temp4 := 0;\r
+ count := 0;\r
+\r
+ Repeat\r
+ If (count = 0) then\r
+ begin\r
+ If (temp3 = 0) then\r
+ begin\r
+ temp2 := tDUMMY_BUFF(data)[temp]+(tDUMMY_BUFF(data)[temp+1]) SHL 8;\r
+ Inc(temp,2);\r
+ end;\r
+\r
+ If (tDUMMY_BUFF(data)[temp] OR $80 <> tDUMMY_BUFF(data)[temp]) then\r
+ begin\r
+ If (temp2 DIV 9 <= $3f) and (temp2 MOD 9 < 9) then\r
+ import_amd_event(temp2 DIV 9,temp3,temp2 MOD 9 +1,\r
+ tDUMMY_BUFF(data)[temp+2],\r
+ tDUMMY_BUFF(data)[temp+1],\r
+ tDUMMY_BUFF(data)[temp+0]);\r
+ Inc(temp,3);\r
+ end\r
+ else\r
+ begin\r
+ count := (tDUMMY_BUFF(data)[temp] AND $7f)-1;\r
+ Inc(temp);\r
+ end;\r
+ end\r
+ else Dec(count);\r
+\r
+ Inc(temp3);\r
+ If (temp3 > $3f) then\r
+ begin\r
+ temp3 := 0;\r
+ count := 0;\r
+ Inc(temp4);\r
+ end;\r
+ until NOT (temp4 < tracks);\r
+\r
+ For temp := 0 to patterns do\r
+ For temp2 := 1 to 9 do\r
+ begin\r
+ temp3 := track_order[temp][temp2];\r
+ temp4 := temp3 DIV 9;\r
+\r
+ If (temp3 < 64*9) then\r
+ begin\r
+ For temp5 := 0 to $3f do\r
+ get_chunk(temp4,temp5,temp3 MOD 9 +1,track[temp5]);\r
+ For temp5 := 0 to $3f do\r
+ put_chunk( temp,temp5,temp2,track[temp5]);\r
+ end;\r
+ end;\r
+end;\r
+\r
+function get_byte(var pos: Longint): Byte;\r
+begin\r
+ If (pos = SizeOf(buf1)) then\r
+ begin\r
+ Move(buf3,buf1,SizeOf(buf3));\r
+ pos := 0;\r
+ end;\r
+ get_byte := buf1[pos];\r
+ Inc(pos);\r
+end;\r
+\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and\r
+ ((header.ident = id_amd) or (header.ident = id_xms))) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ If NOT (header.versn in [$10,$11]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,buf1,SizeOf(buf1),temp);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ tmp2 := WORD_NULL;\r
+ If (temp = SizeOf(buf1)) then\r
+ begin\r
+ FillChar(buf3,SizeOf(buf3),0);\r
+ BlockReadF(f,buf3,SizeOf(buf3),tmp2);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ tempo := 50;\r
+ speed := 6;\r
+\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+\r
+ For temp2 := 0 to header.snlen-1 do\r
+ If (temp2 < 128) and (header.order[temp2] in [0..header.nopat]) then\r
+ songdata.pattern_order[temp2] := header.order[temp2];\r
+\r
+ For temp2 := 0 to 25 do\r
+ begin\r
+ import_amd_instrument(temp2+1,header.instr[temp2].iData);\r
+ songdata.instr_names[temp2+1] :=\r
+ Copy(songdata.instr_names[temp2+1],1,9)+\r
+ truncate_string(header.instr[temp2].iName);\r
+ end;\r
+\r
+ temp := 0;\r
+ If (header.versn = $10) then\r
+ For temp2 := 0 to header.nopat do\r
+ For temp3 := 0 to $3f do\r
+ For temp4 := 1 to 9 do\r
+ begin\r
+ byte3 := get_byte(temp);\r
+ byte2 := get_byte(temp);\r
+ byte1 := get_byte(temp);\r
+ import_amd_event(temp2,temp3,temp4,byte1,byte2,byte3);\r
+ end\r
+ else\r
+ import_amd_packed_patterns(buf1,header.nopat);\r
+\r
+ songdata.common_flag := songdata.common_flag OR $80;\r
+ songdata.songname := CutStr(asciiz_string(header.sname));\r
+ songdata.composer := CutStr(asciiz_string(header.aname));\r
+ import_old_flags;\r
+\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ If (header.ident = id_amd) then load_flag := 5\r
+ else load_flag := 6;\r
+end;\r
+\r
+procedure import_hsc_instrument(inst: Byte; var data); forward;\r
+\r
+procedure import_cff_event(patt,line,chan,byte0,byte1,byte2: Byte);\r
+\r
+var\r
+ chunk: tCHUNK;\r
+ temp1,temp2,temp3,temp4: Byte;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ temp1 := byte2;\r
+ temp2 := temp1 DIV 16;\r
+ temp3 := temp1 MOD 16;\r
+\r
+ Case CHAR(byte1) of\r
+ { SET SPEED }\r
+ 'A': If (temp1 > 0) then\r
+ begin\r
+ chunk.effect_def := ef_SetSpeed;\r
+ chunk.effect := temp1;\r
+ end;\r
+\r
+ { SET CARRIER WAVEFORM }\r
+ 'B': If (temp1 < 4) then\r
+ begin\r
+ chunk.effect_def := ef_SetWaveform;\r
+ chunk.effect := temp1*16;\r
+ end;\r
+\r
+ { SET MODULATOR VOLUME }\r
+ 'C': begin\r
+ chunk.effect_def := ef_SetModulatorVol;\r
+ If (temp1 < 64) then chunk.effect := 63-temp1\r
+ else chunk.effect := 0;\r
+ end;\r
+\r
+ { VOLUME SLIDE UP/DOWN }\r
+ 'D': begin\r
+ chunk.effect_def := ef_VolSlide;\r
+ chunk.effect := temp1;\r
+ end;\r
+\r
+ { SLIDE DOWN }\r
+ 'E': If (temp1 <> 0) then\r
+ begin\r
+ chunk.effect_def := ef_FSlideDown;\r
+ chunk.effect := temp1;\r
+ end;\r
+\r
+ { SLIDE UP }\r
+ 'F': If (temp1 <> 0) then\r
+ begin\r
+ chunk.effect_def := ef_FSlideUp;\r
+ chunk.effect := temp1;\r
+ end;\r
+\r
+ { SET CARRIER VOLUME }\r
+ 'G': begin\r
+ chunk.effect_def := ef_SetCarrierVol;\r
+ If (temp1 < 64) then chunk.effect := 63-temp1\r
+ else chunk.effect := 0;\r
+ end;\r
+\r
+ { SET TEMPO }\r
+ 'H': If (temp1 > 0) then\r
+ begin\r
+ chunk.effect_def := ef_SetTempo;\r
+ If NOT (temp1 > 21) then temp1 := 125;\r
+ temp4 := 1412926 DIV LONGINT(temp1 SHR 1);\r
+ chunk.effect := 1;\r
+ While (1193180 DIV chunk.effect > temp4) and\r
+ (chunk.effect < 255) do\r
+ Inc(chunk.effect);\r
+ end;\r
+\r
+ { SET INSTRUMENT }\r
+ 'I': If (temp1 < 47) then\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_ExtendedCmd*16+ef_ex_cmd_ResetVol;\r
+ chunk.instr_def := temp1+1;\r
+ end;\r
+\r
+ { ARPEGGIO }\r
+ 'J': begin\r
+ chunk.effect_def := ef_Arpeggio;\r
+ chunk.effect := temp1;\r
+ end;\r
+\r
+ { JUMP TO ORDER }\r
+ 'K': If (temp1 < 128) then\r
+ begin\r
+ chunk.effect_def := ef_PositionJump;\r
+ chunk.effect := temp1;\r
+ end;\r
+\r
+ { JUMP TO NEXT PATTERN IN ORDER }\r
+ 'L': chunk.effect_def := ef_PatternBreak;\r
+\r
+ { SET TREMOLO HIGHER / SET VIBRATO DEEPER }\r
+ 'M': begin\r
+ chunk.effect_def := ef_Extended;\r
+ If (temp2 = 1) and (temp3 = 0) then chunk.effect := dec2hex(01);\r
+ If (temp2 = 0) and (temp3 = 1) then chunk.effect := dec2hex(10);\r
+ If (temp2 = 1) and (temp3 = 1) then chunk.effect := dec2hex(11);\r
+ end;\r
+ end;\r
+\r
+ Case byte0 of\r
+ { REGULAR NOTE }\r
+ 1..12*8+1: begin\r
+ If NOT fix_c_note_bug then chunk.note := byte0\r
+ else begin\r
+ chunk.note := byte0+1;\r
+ If (chunk.note > 12*8+1) then\r
+ chunk.note := 12*8+1;\r
+ end;\r
+ end;\r
+ { PAUSE }\r
+ $6d: chunk.note := BYTE_NULL;\r
+ end;\r
+\r
+ put_chunk(patt,line,chan,chunk);\r
+end;\r
+\r
+procedure import_cff_patterns(var data; patterns: Byte);\r
+\r
+type\r
+ tPATDAT = array[0..$24] of\r
+ array[0..$3f] of array[1..9] of\r
+ array[0..2] of Byte;\r
+\r
+var\r
+ voice: array[1..9] of Byte;\r
+ arpgg: array[1..9] of Byte;\r
+ chunk: tCHUNK;\r
+ temp,temp2,temp3,temp4: Byte;\r
+ order,patt: Byte;\r
+ patt_break: Byte;\r
+ patts: String;\r
+\r
+function _empty_event(var data): Boolean;\r
+begin\r
+ _empty_event := (tDUMMY_BUFF(data)[0] = 0) and\r
+ (tDUMMY_BUFF(data)[1] = 0) and\r
+ (tDUMMY_BUFF(data)[2] = 0);\r
+end;\r
+\r
+begin\r
+ patts := '';\r
+ FillChar(arpgg,SizeOf(arpgg),0);\r
+ If NOT accurate_conv then\r
+ For temp := 1 to 9 do voice[temp] := temp\r
+ else For temp := 1 to 9 do voice[temp] := 0;\r
+\r
+ For temp := 0 to $24 do\r
+ For temp2 := 0 to $3f do\r
+ For temp3 := 1 to 9 do\r
+ If NOT _empty_event(tPATDAT(data)[temp][temp2][temp3]) then\r
+ import_cff_event(temp,temp2,temp3,tPATDAT(data)[temp][temp2][temp3][0],\r
+ tPATDAT(data)[temp][temp2][temp3][1],\r
+ tPATDAT(data)[temp][temp2][temp3][2]);\r
+ order := 0;\r
+ patt := BYTE_NULL;\r
+\r
+ Repeat\r
+ If (songdata.pattern_order[order] > $24) then Inc(order)\r
+ else\r
+ begin\r
+ patt := songdata.pattern_order[order];\r
+ patt_break := BYTE_NULL;\r
+ For temp2 := 0 to $3f do\r
+ For temp3 := 1 to 9 do\r
+ begin\r
+ get_chunk(patt,temp2,temp3,chunk);\r
+ temp4 := tPATDAT(data)[patt][temp2][temp3][2];\r
+\r
+ Case CHAR(tPATDAT(data)[patt][temp2][temp3][1]) of\r
+ { SET MODULATOR VOLUME }\r
+ 'C': If (chunk.instr_def = 0) and NOT accurate_conv then\r
+ chunk.instr_def := voice[temp3]\r
+ else If (chunk.instr_def = 0) and\r
+ (voice[temp3] = 0) then chunk.instr_def := temp3;\r
+\r
+ { SET CARRIER VOLUME }\r
+ 'G': If (chunk.instr_def = 0) and NOT accurate_conv then\r
+ chunk.instr_def := voice[temp3]\r
+ else If (chunk.instr_def = 0) and\r
+ (voice[temp3] = 0) then chunk.instr_def := temp3;\r
+\r
+ { SET INSTRUMENT }\r
+ 'I': If (temp4 < 47) then\r
+ If (temp2 <> patt_break) then\r
+ begin\r
+ voice[temp3] := temp4+1;\r
+ If NOT accurate_conv then\r
+ chunk.instr_def := voice[temp3];\r
+ end;\r
+\r
+ { ARPEGGIO }\r
+ 'J': begin\r
+ chunk.effect_def := ef_Arpeggio;\r
+ If (temp4 <> 0) then\r
+ begin\r
+ chunk.effect := temp4;\r
+ arpgg[temp3] := temp4;\r
+ end\r
+ else chunk.effect := arpgg[temp3];\r
+ end;\r
+\r
+ { JUMP TO ORDER }\r
+ 'K': If (temp4 < 128) then\r
+ patt_break := temp2+1;\r
+\r
+ { JUMP TO NEXT PATTERN IN ORDER }\r
+ 'L': patt_break := temp2+1;\r
+ end;\r
+\r
+ Case tPATDAT(data)[patt][temp2][temp3][0] of\r
+ { REGULAR NOTE }\r
+ 1..12*8+1: begin\r
+ If accurate_conv then\r
+ If (voice[temp3] = 0) then\r
+ begin\r
+ voice[temp3] := temp3;\r
+ chunk.instr_def := voice[temp3];\r
+ end;\r
+\r
+ If NOT accurate_conv then\r
+ chunk.instr_def := voice[temp3];\r
+ end;\r
+ end;\r
+\r
+ If (Pos(CHR(songdata.pattern_order[order]),patts) = 0) then\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+ Inc(order);\r
+ patts := patts+CHR(patt);\r
+ end;\r
+ until (patt >= patterns) or (order > $40);\r
+end;\r
+\r
+procedure cff_file_loader;\r
+\r
+type\r
+ tHEADER = Record\r
+ ident: array[1..16] of Char; { Identification }\r
+ versn: Byte; { Format version }\r
+ fsize: Word; { Filesize -32 }\r
+ cflag: Byte; { Flag 1=compressed data }\r
+ resrv: array[0..11] of Byte; { Reserved }\r
+ end;\r
+type\r
+ tINSDAT = Record\r
+ iData: array[0..11] of Byte; { Instrument data }\r
+ iName: array[1..20] of Char; { Instrument name }\r
+ end;\r
+type\r
+ tHEADR2 = Record\r
+ instr: array[0..46] of tINSDAT; { 47 instruments }\r
+ nopat: Byte; { Number of patterns }\r
+ ascii: array[1..31] of Char; { ASCII blab }\r
+ writr: array[1..20] of Char; { Song writer }\r
+ sname: array[1..20] of Char; { Song name }\r
+ order: array[0..64] of Byte; { Pattern order }\r
+ end;\r
+const\r
+ _PRE_ASCII_BLAB_SIZE = $5e1; // SizeOf(tHEADR2.instr)+SizeOf(tHEADR2.nopat)\r
+\r
+const\r
+ id = '<CUD-FM-File>'+#26+CHR($de)+CHR($e0);\r
+ ascii_blab = 'CUD-FM-File - SEND A POSTCARD -';\r
+\r
+var\r
+ f: File;\r
+ header: tHEADER;\r
+ headr2: tHEADR2;\r
+ temp,temp2: Longint;\r
+ offs,out_size: Longint;\r
+\r
+function LZTYR_decompress(var input,output): Longint;\r
+\r
+type\r
+ tSTRING = array[0..255] of Byte;\r
+\r
+var\r
+ input_idx: Longint;\r
+\r
+ the_string,\r
+ temp_string: tSTRING;\r
+\r
+ old_code_length: Byte;\r
+ repeat_length: Byte;\r
+ repeat_counter: Longint;\r
+ output_length: Longint;\r
+ code_length: Byte;\r
+ bits_buffer: Longint;\r
+ bits_left: Word;\r
+ old_code: Longint;\r
+ new_code: Longint;\r
+ idx: Word;\r
+\r
+ _cff_heap_length: Word;\r
+ _cff_dictionary_length: Word;\r
+ _cff_dictionary: array[0..32767] of Pointer;\r
+\r
+function get_code: Longint;\r
+\r
+var\r
+ code: Longint;\r
+\r
+begin\r
+ While (bits_left < code_length) do\r
+ begin\r
+ bits_buffer := bits_buffer OR (tDUMMY_BUFF(input)[input_idx] SHL\r
+ bits_left);\r
+ Inc(input_idx);\r
+ Inc(bits_left,8);\r
+ end;\r
+\r
+ code := bits_buffer AND ((1 SHL code_length)-1);\r
+ bits_buffer := bits_buffer SHR code_length;\r
+ Dec(bits_left,code_length);\r
+ get_code := code;\r
+end;\r
+\r
+procedure translate_code(code: Longint; var str: tSTRING);\r
+\r
+var\r
+ translated_string: tSTRING;\r
+\r
+begin\r
+ If (code >= $104) then\r
+ Move(_cff_dictionary[code-$104]^,translated_string,\r
+ BYTE(_cff_dictionary[code-$104]^)+1)\r
+ else begin\r
+ translated_string[0] := 1;\r
+ translated_string[1] := (code-4) AND $0ff;\r
+ end;\r
+\r
+ Move(translated_string,str,256);\r
+end;\r
+\r
+procedure startup;\r
+\r
+var\r
+ idx: Longint;\r
+\r
+begin\r
+ old_code := get_code;\r
+ translate_code(old_code,the_string);\r
+\r
+ If (the_string[0] > 0) then\r
+ For idx := 0 to the_string[0]-1 do\r
+ begin\r
+ tDUMMY_BUFF(output)[output_length] := the_string[idx+1];\r
+ Inc(output_length);\r
+ end;\r
+end;\r
+\r
+procedure cleanup;\r
+begin\r
+ code_length := 9;\r
+ bits_buffer := 0;\r
+ bits_left := 0;\r
+ _cff_heap_length := 0;\r
+ _cff_dictionary_length := 0;\r
+end;\r
+\r
+procedure expand__cff_dictionary(str: tSTRING);\r
+begin\r
+ If (str[0] >= $0f0) then EXIT;\r
+ Move(str,buf3[_cff_heap_length],str[0]+1);\r
+ _cff_dictionary[_cff_dictionary_length] := Addr(buf3[_cff_heap_length]);\r
+ Inc(_cff_dictionary_length);\r
+ Inc(_cff_heap_length,str[0]+1);\r
+end;\r
+\r
+begin\r
+ input_idx := 0;\r
+ output_length := 0;\r
+ cleanup;\r
+ startup;\r
+\r
+ Repeat\r
+ new_code := get_code;\r
+\r
+ // $00: end of data\r
+ If (new_code = 0) then BREAK;\r
+\r
+ // $01: end of block\r
+ If (new_code = 1) then\r
+ begin\r
+ cleanup;\r
+ startup;\r
+ CONTINUE;\r
+ end;\r
+\r
+ // $02: expand code length\r
+ If (new_code = 2) then\r
+ begin\r
+ Inc(code_length);\r
+ CONTINUE;\r
+ end;\r
+\r
+ // $03: RLE\r
+ If (new_code = 3) then\r
+ begin\r
+ old_code_length := code_length;\r
+ code_length := 2;\r
+ repeat_length := get_code+1;\r
+ code_length := 4 SHL get_code;\r
+ repeat_counter := get_code;\r
+\r
+ For idx := 0 to PRED(repeat_counter*repeat_length) do\r
+ begin\r
+ tDUMMY_BUFF(output)[output_length] :=\r
+ tDUMMY_BUFF(output)[output_length-repeat_length];\r
+ Inc(output_length);\r
+ end;\r
+\r
+ code_length := old_code_length;\r
+ startup;\r
+ CONTINUE;\r
+ end;\r
+\r
+ If (new_code >= $104+_cff_dictionary_length) then\r
+ begin\r
+ Inc(the_string[0]);\r
+ the_string[the_string[0]] := the_string[1];\r
+ end\r
+ else begin\r
+ translate_code(new_code,temp_string);\r
+ Inc(the_string[0]);\r
+ the_string[the_string[0]] := temp_string[1];\r
+ end;\r
+\r
+ expand__cff_dictionary(the_string);\r
+ translate_code(new_code,the_string);\r
+\r
+ For idx := 0 to PRED(the_string[0]) do\r
+ begin\r
+ tDUMMY_BUFF(output)[output_length] := the_string[idx+1];\r
+ Inc(output_length);\r
+ end;\r
+\r
+ old_code := new_code;\r
+ until FALSE;\r
+\r
+ LZTYR_decompress := output_length;\r
+end;\r
+\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.ident = id)) or\r
+ (FileSize(f) > SizeOf(buf1)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ If (header.cflag = 1) then\r
+ begin\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ ResetF(f);\r
+ BlockReadF(f,buf1,SizeOf(buf1),temp);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ CloseF(f);\r
+ temp := LZTYR_decompress(buf1[$30],hash_buffer);\r
+ out_size := temp;\r
+\r
+ offs := SensitiveScan(hash_buffer,0,temp,ascii_blab);\r
+ If (offs <> _PRE_ASCII_BLAB_SIZE) then\r
+ begin\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ Move(hash_buffer,headr2,SizeOf(headr2));\r
+ Move(POINTER(Ofs(hash_buffer)+SizeOf(headr2))^,buf1,out_size-SizeOf(headr2));\r
+ end\r
+ else\r
+ begin\r
+ BlockReadF(f,headr2,SizeOf(headr2),temp);\r
+ If NOT ((temp = SizeOf(headr2)) and (headr2.ascii = ascii_blab)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,buf1,SizeOf(buf1),temp);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ CloseF(f);\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ tempo := 51;\r
+ speed := 6;\r
+\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+\r
+ For temp2 := 0 to 64 do\r
+ If (headr2.order[temp2] in [0..headr2.nopat]) then\r
+ songdata.pattern_order[temp2] := headr2.order[temp2];\r
+\r
+ For temp2 := 0 to 46 do\r
+ begin\r
+ import_hsc_instrument(temp2+1,headr2.instr[temp2].iData);\r
+ songdata.instr_data[temp2+1].fine_tune := 0;\r
+ songdata.instr_names[temp2+1] :=\r
+ Copy(songdata.instr_names[temp2+1],1,9)+\r
+ truncate_string(headr2.instr[temp2].iName);\r
+ end;\r
+\r
+ songdata.common_flag := songdata.common_flag OR 2;\r
+ songdata.songname := CutStr(headr2.sname);\r
+ songdata.composer := CutStr(headr2.writr);\r
+ import_old_flags;\r
+\r
+ import_cff_patterns(buf1,headr2.nopat);\r
+ songdata_title := NameOnly(songdata_source);\r
+ load_flag := 7;\r
+end;\r
+\r
+procedure import_standard_instrument(inst: Byte; var data);\r
+begin\r
+ With songdata.instr_data[inst] do\r
+ begin\r
+ fm_data.AM_VIB_EG_modulator := tDUMMY_BUFF(data)[0];\r
+ fm_data.AM_VIB_EG_carrier := tDUMMY_BUFF(data)[1];\r
+ fm_data.KSL_VOLUM_modulator := tDUMMY_BUFF(data)[2];\r
+ fm_data.KSL_VOLUM_carrier := tDUMMY_BUFF(data)[3];\r
+ fm_data.ATTCK_DEC_modulator := tDUMMY_BUFF(data)[4];\r
+ fm_data.ATTCK_DEC_carrier := tDUMMY_BUFF(data)[5];\r
+ fm_data.SUSTN_REL_modulator := tDUMMY_BUFF(data)[6];\r
+ fm_data.SUSTN_REL_carrier := tDUMMY_BUFF(data)[7];\r
+ fm_data.WAVEFORM_modulator := tDUMMY_BUFF(data)[8] AND 3;\r
+ fm_data.WAVEFORM_carrier := tDUMMY_BUFF(data)[9] AND 3;\r
+ fm_data.FEEDBACK_FM := tDUMMY_BUFF(data)[10] AND $0f;\r
+ end;\r
+\r
+ songdata.instr_data[inst].panning := 0;\r
+ songdata.instr_data[inst].fine_tune := 0;\r
+end;\r
+\r
+procedure dfm_file_loader;\r
+\r
+const\r
+ id = 'DFM'+#26;\r
+\r
+var\r
+ header: Record\r
+ ident: array[1..4] of Char;\r
+ versn: Word;\r
+ sname: String[32];\r
+ tempo: Byte;\r
+ instn: array[1..32] of String[11];\r
+ instd: array[1..32] of tFM_INST_DATA;\r
+ order: array[1..128] of Byte;\r
+ patts: Byte;\r
+ end;\r
+\r
+var\r
+ f: File;\r
+ temp,temp2,temp3: Longint;\r
+ pattern,line,channel,byte1,byte2: Byte;\r
+\r
+procedure import_dfm_event(patt,line,chan,byte1,byte2: Byte);\r
+\r
+var\r
+ chunk: tCHUNK;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ If (byte1 AND $0f in [1..12,15]) and ((byte1 SHR 4) AND 7 in [0..7]) then\r
+ If (byte1 AND $0f <> 15) then\r
+ chunk.note := SUCC(PRED(byte1 AND $0f)+((byte1 SHR 4) AND 7)*12)\r
+ else chunk.note := BYTE_NULL;\r
+\r
+ Case byte2 SHR 5 of\r
+ { INSTRUMENT CHANGE }\r
+ 1: chunk.instr_def := SUCC(byte2 AND $1f);\r
+\r
+ { SET INSTRUMENT VOLUME }\r
+ 2: begin\r
+ chunk.effect_def := ef_SetInsVolume;\r
+ chunk.effect := (byte2 AND $1f)*2;\r
+ end;\r
+\r
+ { TEMPO CHANGE }\r
+ 3: begin\r
+ chunk.effect_def := ef_SetSpeed;\r
+ chunk.effect := SUCC(byte2 AND $1f);\r
+ end;\r
+\r
+ { SLIDE UP }\r
+ 4: begin\r
+ chunk.effect_def := ef_FSlideUpFine;\r
+ chunk.effect := byte2 AND $1f;\r
+ end;\r
+\r
+ { SLIDE DOWN }\r
+ 5: begin\r
+ chunk.effect_def := ef_FSlideDownFine;\r
+ chunk.effect := byte2 AND $1f;\r
+ end;\r
+\r
+ { END OF PATTERN }\r
+ 7: chunk.effect_def := ef_PatternBreak;\r
+ end;\r
+\r
+ put_chunk(patt,line,chan,chunk);\r
+end;\r
+\r
+procedure process_dfm_patterns(patterns: Byte);\r
+\r
+var\r
+ chunk: tCHUNK;\r
+ temp2,temp3: Byte;\r
+ order,patt: Byte;\r
+ patts: String;\r
+ instr_cache: array[1..18] of Byte;\r
+\r
+begin\r
+ patts := '';\r
+ FillChar(instr_cache,SizeOf(instr_cache),0);\r
+ order := 0;\r
+ patt := BYTE_NULL;\r
+\r
+ Repeat\r
+ If (songdata.pattern_order[order] >= $80) then Inc(order)\r
+ else\r
+ begin\r
+ patt := songdata.pattern_order[order];\r
+ For temp2 := 0 to $3f do\r
+ For temp3 := 1 to 9 do\r
+ begin\r
+ get_chunk(patt,temp2,temp3,chunk);\r
+ If (chunk.instr_def <> 0) then\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_ExtendedCmd*16+ef_ex_cmd_ResetVol;\r
+ instr_cache[temp3] := chunk.instr_def;\r
+ If NOT (chunk.note in [1..12*8+1]) and\r
+ NOT accurate_conv then\r
+ chunk.instr_def := 0;\r
+ end\r
+ else If (chunk.note in [1..12*8+1]) and\r
+ (chunk.instr_def = 0) and NOT accurate_conv then\r
+ chunk.instr_def := instr_cache[temp3];\r
+\r
+ If (Pos(CHR(songdata.pattern_order[order]),patts) = 0) then\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+ Inc(order);\r
+ patts := patts+CHR(patt);\r
+ end;\r
+ until (patt >= patterns) or (order > $7f);\r
+end;\r
+\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,buf1,SizeOf(buf1),temp);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ tempo := 135;\r
+ speed := SUCC(header.tempo);\r
+\r
+ songdata.songname := CutStr(header.sname);\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+ songdata.common_flag := songdata.common_flag OR 1;\r
+ songdata.common_flag := songdata.common_flag OR 2;\r
+ songdata.common_flag := songdata.common_flag OR 8;\r
+ songdata.common_flag := songdata.common_flag OR $10;\r
+ import_old_flags;\r
+\r
+ For temp2 := 1 to 128 do\r
+ If (header.order[temp2] in [0..$7f]) then\r
+ songdata.pattern_order[temp2-1] := header.order[temp2]\r
+ else If (header.order[temp2] = $80) then BREAK\r
+ else songdata.pattern_order[temp2-1] := $80+temp2;\r
+\r
+ For temp2 := 1 to 32 do\r
+ begin\r
+ songdata.instr_names[temp2] :=\r
+ Copy(songdata.instr_names[temp2],1,9)+\r
+ CutStr(header.instn[temp2]);\r
+ While (BYTE(songdata.instr_names[temp2][\r
+ Length(songdata.instr_names[temp2])]) < 32) and\r
+ (Length(songdata.instr_names[temp2]) <> 0) do\r
+ Delete(songdata.instr_names[temp2],\r
+ Length(songdata.instr_names[temp2]),1);\r
+ import_standard_instrument(temp2,header.instd[temp2]);\r
+ end;\r
+\r
+ temp2 := 0;\r
+ temp3 := 0;\r
+ Repeat\r
+ pattern := buf1[temp2];\r
+ If (pattern > 127) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Inc(temp2);\r
+ Inc(temp3);\r
+\r
+ For line := 0 to $3f do\r
+ For channel := 1 to 9 do\r
+ begin\r
+ byte1 := buf1[temp2];\r
+ If (temp2 >= temp) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end\r
+ else Inc(temp2);\r
+\r
+ If (byte1 OR $80 <> byte1) then byte2 := 0\r
+ else begin\r
+ byte2 := buf1[temp2];\r
+ Inc(temp2);\r
+ end;\r
+ import_dfm_event(pattern,line,channel,byte1,byte2);\r
+ end;\r
+ until (temp2 >= temp);\r
+\r
+ process_dfm_patterns(temp3);\r
+ CloseF(f);\r
+\r
+ songdata_title := NameOnly(songdata_source);\r
+ load_flag := 8;\r
+end;\r
+\r
+type\r
+ tHSC_PATTERNS = array[0..$31] of\r
+ array[0..$3f] of array[1..9] of Word;\r
+type\r
+ tHSC_DATA = Record\r
+ instr: array[0..$7f] of array[0..$0b] of Byte;\r
+ order: array[0..$31] of Byte;\r
+ patts: tHSC_PATTERNS;\r
+ end;\r
+\r
+procedure import_hsc_event(patt,line,chan: Byte; event: Word);\r
+\r
+var\r
+ chunk: tCHUNK;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ Case HI(event) of\r
+ { REGULAR NOTE }\r
+ 1..12*8+1: If NOT fix_c_note_bug then chunk.note := HI(event)\r
+ else begin\r
+ chunk.note := HI(event)+1;\r
+ If (chunk.note > 12*8+1) then\r
+ chunk.note := 12*8+1;\r
+ end;\r
+ { PAUSE }\r
+ $7f: chunk.note := BYTE_NULL;\r
+\r
+ { INSTRUMENT }\r
+ $80: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_ExtendedCmd*16+ef_ex_cmd_ResetVol;\r
+ chunk.instr_def := LO(event)+1;\r
+ chunk.note := BYTE_NULL;\r
+ end;\r
+ end;\r
+\r
+ If (HI(event) <> $80) then\r
+ Case (LO(event) AND $0f0) of\r
+ { PATTERNBREAK }\r
+ $00: If (LO(event) AND $0f = 1) then\r
+ chunk.effect_def := ef_PatternBreak;\r
+\r
+ { MANUAL SLIDE UP }\r
+ $10: begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_FineTuneUp*16+\r
+ max(LO(event) AND $0f +1,15);\r
+ end;\r
+\r
+ { MANUAL SLIDE DOWN }\r
+ $20: begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_FineTuneDown*16+\r
+ max(LO(event) AND $0f +1,15);\r
+ end;\r
+\r
+ { SET CARRIER VOLUME }\r
+ $a0: begin\r
+ chunk.effect_def := ef_SetCarrierVol;\r
+ chunk.effect := 63-(LO(event) AND $0f)*4;\r
+ chunk.instr_def := LO(event)+1;\r
+ end;\r
+\r
+ { SET MODULATOR VOLUME }\r
+ $b0: begin\r
+ chunk.effect_def := ef_SetModulatorVol;\r
+ chunk.effect := 63-(LO(event) AND $0f)*4;\r
+ end;\r
+\r
+ { SET INSTRUMENT VOLUME }\r
+ $c0: begin\r
+ chunk.effect_def := ef_SetInsVolume;\r
+ chunk.effect := 63-(LO(event) AND $0f)*4;\r
+ end;\r
+\r
+ { SET SPEED }\r
+ $f0: begin\r
+ chunk.effect_def := ef_SetSpeed;\r
+ chunk.effect := (LO(event) AND $0f)+1;\r
+ end;\r
+ end;\r
+ put_chunk(patt,line,chan,chunk);\r
+end;\r
+\r
+procedure import_hsc_patterns(var data; patterns: Byte);\r
+\r
+var\r
+ voice: array[1..9] of Byte;\r
+ event: Word;\r
+ chunk: tCHUNK;\r
+ temp,temp2,temp3: Byte;\r
+ order,patt: Byte;\r
+ patt_break: Byte;\r
+ patts: String;\r
+\r
+function _hsc_event(patt,line,chan: Byte): Word;\r
+begin\r
+ _hsc_event := LO(tHSC_PATTERNS(data)[patt][line][chan+1])+\r
+ HI(tHSC_PATTERNS(data)[patt][line][chan]) SHL 8;\r
+end;\r
+\r
+begin { import_hsc_patterns }\r
+ patts := '';\r
+ If NOT accurate_conv then\r
+ For temp := 1 to 9 do voice[temp] := temp\r
+ else For temp := 1 to 9 do voice[temp] := 0;\r
+\r
+ For temp := 0 to $31 do\r
+ For temp2 := 0 to $3f do\r
+ For temp3 := 1 to 9 do\r
+ If (_hsc_event(temp,temp2,temp3) <> 0) then\r
+ import_hsc_event(temp,temp2,temp3,_hsc_event(temp,temp2,temp3));\r
+\r
+ order := 0;\r
+ patt := BYTE_NULL;\r
+\r
+ Repeat\r
+ If (songdata.pattern_order[order] > $31) then Inc(order)\r
+ else\r
+ begin\r
+ patt := songdata.pattern_order[order];\r
+ patt_break := BYTE_NULL;\r
+ For temp2 := 0 to $3f do\r
+ For temp3 := 1 to 9 do\r
+ begin\r
+ get_chunk(patt,temp2,temp3,chunk);\r
+ event := _hsc_event(patt,temp2,temp3);\r
+\r
+ Case HI(event) of\r
+ { REGULAR NOTE }\r
+ 1..12*8+1: begin\r
+ If accurate_conv then\r
+ If (voice[temp3] = 0) then\r
+ begin\r
+ voice[temp3] := temp3;\r
+ chunk.instr_def := voice[temp3];\r
+ end;\r
+\r
+ If NOT accurate_conv then\r
+ chunk.instr_def := voice[temp3];\r
+ end;\r
+\r
+ { INSTRUMENT }\r
+ $80: If (temp2 <> patt_break) then\r
+ begin\r
+ voice[temp3] := LO(event)+1;\r
+ If NOT accurate_conv then\r
+ begin\r
+ chunk.instr_def := voice[temp3];\r
+ chunk.note := BYTE_NULL;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ If (HI(event) <> $80) then\r
+ Case (LO(event) AND $0f0) of\r
+ { PATTERNBREAK }\r
+ $00: If (LO(event) AND $0f = 1) then\r
+ patt_break := temp2+1;\r
+\r
+ { SET CARRIER VOLUME }\r
+ $a0: If (chunk.instr_def = 0) and NOT accurate_conv then\r
+ chunk.instr_def := voice[temp3]\r
+ else If (chunk.instr_def = 0) and\r
+ (voice[temp3] = 0) then chunk.instr_def := temp3;\r
+\r
+ { SET MODULATOR VOLUME }\r
+ $b0: If (chunk.instr_def = 0) and NOT accurate_conv then\r
+ chunk.instr_def := voice[temp3]\r
+ else If (chunk.instr_def = 0) and\r
+ (voice[temp3] = 0) then chunk.instr_def := temp3;\r
+\r
+ { SET INSTRUMENT VOLUME }\r
+ $c0: If (chunk.instr_def = 0) and NOT accurate_conv then\r
+ chunk.instr_def := voice[temp3]\r
+ else If (chunk.instr_def = 0) and\r
+ (voice[temp3] = 0) then chunk.instr_def := temp3;\r
+ end;\r
+\r
+ If (Pos(CHR(songdata.pattern_order[order]),patts) = 0) then\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+ Inc(order);\r
+ patts := patts+CHR(patt);\r
+ end;\r
+ until (patt >= patterns) or (order > $7f);\r
+end;\r
+\r
+procedure import_hsc_instrument(inst: Byte; var data);\r
+begin\r
+ With songdata.instr_data[inst] do\r
+ begin\r
+ fm_data.AM_VIB_EG_carrier := tDUMMY_BUFF(data)[0];\r
+ fm_data.AM_VIB_EG_modulator := tDUMMY_BUFF(data)[1];\r
+ fm_data.KSL_VOLUM_carrier := tDUMMY_BUFF(data)[2];\r
+ fm_data.KSL_VOLUM_modulator := tDUMMY_BUFF(data)[3];\r
+ fm_data.ATTCK_DEC_carrier := tDUMMY_BUFF(data)[4];\r
+ fm_data.ATTCK_DEC_modulator := tDUMMY_BUFF(data)[5];\r
+ fm_data.SUSTN_REL_carrier := tDUMMY_BUFF(data)[6];\r
+ fm_data.SUSTN_REL_modulator := tDUMMY_BUFF(data)[7];\r
+ fm_data.FEEDBACK_FM := tDUMMY_BUFF(data)[8] AND $0f;\r
+ fm_data.WAVEFORM_carrier := tDUMMY_BUFF(data)[9] AND 3;\r
+ fm_data.WAVEFORM_modulator := tDUMMY_BUFF(data)[10] AND 3;\r
+ end;\r
+\r
+ songdata.instr_data[inst].panning := 0;\r
+ songdata.instr_data[inst].fine_tune := tDUMMY_BUFF(data)[11] SHR 4;\r
+end;\r
+\r
+var\r
+ hscbuf: tHSC_DATA;\r
+\r
+procedure hsc_file_loader;\r
+\r
+const\r
+ HSC_KSL: array[0..3] of Byte = (0,3,2,1);\r
+\r
+var\r
+ f: File;\r
+ temp,temp2,temp3: Longint;\r
+\r
+begin\r
+ If (Lower(ExtOnly(songdata_source)) <> 'hsc') then\r
+ begin\r
+ load_flag := $7f;\r
+ EXIT;\r
+ end;\r
+\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(hscbuf,SizeOf(hscbuf),0);\r
+ BlockReadF(f,hscbuf,SizeOf(hscbuf),temp);\r
+ If (temp < SizeOf(hscbuf.instr)+SizeOf(hscbuf.order)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ For temp2 := 0 to $31 do\r
+ If (hscbuf.order[temp2] > $b0) then hscbuf.order[temp2] := $080;\r
+\r
+ temp3 := 0;\r
+ While (temp3 < temp-SizeOf(hscbuf.instr)-SizeOf(hscbuf.order)) do\r
+ begin\r
+ If NOT (tDUMMY_BUFF(Addr(hscbuf.patts)^)[temp3+1] in\r
+ [1..12*8+1,$00,$7f,$80]) or\r
+ NOT (tDUMMY_BUFF(Addr(hscbuf.patts)^)[temp3] AND $0f0 in\r
+ [$00,$10,$20,$a0,$b0,$c0,$f0]) then\r
+ begin\r
+ If NOT (tDUMMY_BUFF(Addr(hscbuf.patts)^)[temp3+1] in\r
+ [1..12*8+1,$00,$7f,$80]) then\r
+ tDUMMY_BUFF(Addr(hscbuf.patts)^)[temp3+1] := $00;\r
+\r
+ If NOT (tDUMMY_BUFF(Addr(hscbuf.patts)^)[temp3] AND $0f0 in\r
+ [$00,$10,$20,$a0,$b0,$c0,$f0]) then\r
+ tDUMMY_BUFF(Addr(hscbuf.patts)^)[temp3] := 0;\r
+ end;\r
+ Inc(temp3,2);\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ tempo := 18;\r
+ speed := 2;\r
+\r
+ songdata.common_flag := songdata.common_flag OR 2;\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+ import_old_flags;\r
+\r
+ For temp2 := 0 to $31 do\r
+ songdata.pattern_order[temp2] := hscbuf.order[temp2];\r
+\r
+ import_hsc_patterns(hscbuf.patts,(temp-SizeOf(hscbuf.instr)\r
+ -SizeOf(hscbuf.order)-1) DIV $480);\r
+\r
+// specific corrections for HSC-Tracker instrument\r
+ For temp2 := 0 to $7f do\r
+ begin\r
+ import_hsc_instrument(temp2+1,hscbuf.instr[temp2]);\r
+ With songdata.instr_data[temp2+1].fm_data do\r
+ begin\r
+ KSL_VOLUM_modulator := KSL_VOLUM_modulator AND $3f+\r
+ HSC_KSL[KSL_VOLUM_modulator SHR 6] SHL 6;\r
+ KSL_VOLUM_carrier := KSL_VOLUM_carrier AND $3f+\r
+ HSC_KSL[KSL_VOLUM_carrier SHR 6] SHL 6;\r
+ end;\r
+ end;\r
+\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ load_flag := 9;\r
+end;\r
+\r
+type\r
+ tMTK_DATA = Record\r
+ sname: String[33];\r
+ compo: String[33];\r
+ instn: array[0..$7f] of String[33];\r
+ instt: array[0..$7f] of array[0..$0b] of Byte;\r
+ order: array[0..$7f] of Byte;\r
+ patts: tHSC_PATTERNS;\r
+ dummy: Byte;\r
+ end;\r
+\r
+var\r
+ buffer2: tMTK_DATA;\r
+\r
+procedure mtk_file_loader;\r
+\r
+var\r
+ f: File;\r
+ temp,temp2: Longint;\r
+ crc: Word;\r
+ old_c_fix: Boolean;\r
+\r
+const\r
+ id = 'mpu401tr\92kkîr@data';\r
+\r
+var\r
+ header: Record\r
+ id_string: array[1..18] of Char;\r
+ crc_16bit: Word;\r
+ data_size: Word;\r
+ end;\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.id_string = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,buf1,SizeOf(buf1),temp);\r
+\r
+ crc := 0;\r
+ crc := Update16(buf1,temp,crc);\r
+ If (crc <> header.crc_16bit) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ FillChar(buffer2,SizeOf(buffer2),0);\r
+ temp2 := RDC_decompress(buf1,buffer2,temp);\r
+ If NOT (temp2 = header.data_size) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ tempo := 18;\r
+ speed := 2;\r
+\r
+ songdata.common_flag := songdata.common_flag OR 2;\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+ import_old_flags;\r
+\r
+ For temp2 := 0 to $31 do\r
+ If (buffer2.order[temp2] <> $ff) then songdata.pattern_order[temp2] := buffer2.order[temp2]\r
+ else songdata.pattern_order[temp2] := $080;\r
+\r
+ old_c_fix := fix_c_note_bug;\r
+ fix_c_note_bug := FALSE;\r
+ import_hsc_patterns(buffer2.patts,\r
+ (header.data_size-SizeOf(buffer2.sname)\r
+ -SizeOf(buffer2.compo)\r
+ -SizeOf(buffer2.instn)\r
+ -SizeOf(buffer2.instt)\r
+ -SizeOf(buffer2.order)-1) DIV $480);\r
+ fix_c_note_bug := old_c_fix;\r
+\r
+// specific corrections for MPU-401 TR\92KKîR instrument\r
+ For temp2 := 0 to $7f do\r
+ begin\r
+ import_hsc_instrument(temp2+1,buffer2.instt[temp2]);\r
+ With songdata.instr_data[temp2+1].fm_data do\r
+ begin\r
+ If (KSL_VOLUM_modulator > 128) then\r
+ KSL_VOLUM_modulator := KSL_VOLUM_modulator DIV 3;\r
+ If (KSL_VOLUM_carrier > 128) then\r
+ KSL_VOLUM_carrier := KSL_VOLUM_carrier DIV 3;\r
+ end;\r
+\r
+ songdata.instr_names[temp2+1] :=\r
+ Copy(songdata.instr_names[temp2+1],1,9)+\r
+ truncate_string(Copy(buffer2.instn[temp2],10,32));\r
+ end;\r
+\r
+ songdata.songname := CutStr(buffer2.sname);\r
+ songdata.composer := CutStr(buffer2.compo);\r
+\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ load_flag := 10;\r
+end;\r
+\r
+procedure rad_file_loader;\r
+\r
+const\r
+ id = 'RAD by REALiTY!!';\r
+\r
+var\r
+ header: Record\r
+ ident: array[1..16] of Char; { Use this to recognize a RAD tune }\r
+ rmver: Byte; { Version of RAD file (10h) }\r
+ xbyte: Byte; { bit7 Set if a description follows }\r
+ end; { bit6 Set if it's a "slow-timer" tune }\r
+ { bit[4..0] The initial speed of the tune }\r
+var\r
+ f: File;\r
+ dscbuf: array[0..PRED(80*22)] of Char;\r
+ pattoffs: array[0..$1f] of Word;\r
+ temp,temp2,temp3,temp4,temp5,offs0: Longint;\r
+\r
+procedure import_rad_event(pattern,line,channel,byte1,byte2,byte3: Byte);\r
+\r
+var\r
+ chunk: tCHUNK;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ If ((byte2 SHR 4)+(byte1 SHR 7) SHL 4 <> 0) then\r
+ chunk.instr_def := (byte2 SHR 4)+(byte1 SHR 7) SHL 4;\r
+\r
+ If (byte1 AND $0f in [1..12]) then chunk.note := 12*((byte1 SHR 4) AND 7)+(byte1 AND $0f)+1\r
+ else If (byte1 AND $0f = $0f) then chunk.note := BYTE_NULL;\r
+\r
+ Case byte2 AND $0f of\r
+ { PORTAMENTO (FREQUENCY SLIDE) UP }\r
+ $01: begin\r
+ chunk.effect_def := ef_FSlideUp;\r
+ chunk.effect := byte3;\r
+ end;\r
+\r
+ { PORTAMENTO (FREQUENCY SLIDE) DOWN }\r
+ $02: begin\r
+ chunk.effect_def := ef_FSlideDown;\r
+ chunk.effect := byte3;\r
+ end;\r
+\r
+ { PORTAMENTO TO NOTE }\r
+ $03: begin\r
+ chunk.effect_def := ef_TonePortamento;\r
+ chunk.effect := byte3;\r
+ end;\r
+\r
+ { PORTAMENTO TO NOTE WITH VOLUME SLIDE }\r
+ $05: If (byte3 in [1..49]) then\r
+ begin\r
+ chunk.effect_def := ef_TPortamVolSlide;\r
+ chunk.effect := max(byte3,15);\r
+\r
+ If (byte3 > 15) then\r
+ begin\r
+ chunk.effect_def2 := ef_TPortamVolSlide;\r
+ chunk.effect2 := max(byte3-15,15);\r
+ end;\r
+ end\r
+ else If (byte3 in [51..99]) then\r
+ begin\r
+ chunk.effect_def := ef_TPortamVolSlide;\r
+ chunk.effect := max(byte3-50,15)*16;\r
+\r
+ If (byte3-50 > 15) then\r
+ begin\r
+ chunk.effect_def2 := ef_TPortamVolSlide;\r
+ chunk.effect2 := max(byte3-50-15,15);\r
+ end;\r
+ end;\r
+\r
+ { VOLUME SLIDE }\r
+ $0a: If (byte3 in [1..49]) then\r
+ begin\r
+ chunk.effect_def := ef_VolSlide;\r
+ chunk.effect := max(byte3,15);\r
+\r
+ If (byte3 > 15) then\r
+ begin\r
+ chunk.effect_def2 := ef_VolSlide;\r
+ chunk.effect2 := max(byte3-15,15);\r
+ end;\r
+ end\r
+ else If (byte3 in [51..99]) then\r
+ begin\r
+ chunk.effect_def := ef_VolSlide;\r
+ chunk.effect := max(byte3-50,15)*16;\r
+\r
+ If (byte3-50 > 15) then\r
+ begin\r
+ chunk.effect_def2 := ef_VolSlide;\r
+ chunk.effect2 := max(byte3-50-15,15);\r
+ end;\r
+ end;\r
+\r
+ { SET VOLUME }\r
+ $0c: begin\r
+ chunk.effect_def := ef_SetInsVolume;\r
+ If (byte3 < 64) then chunk.effect := byte3\r
+ else chunk.effect := 63;\r
+ end;\r
+\r
+ { JUMP TO NEXT PATTERN IN ORDER LIST }\r
+ $0d: begin\r
+ chunk.effect_def := ef_PatternBreak;\r
+ If (byte3 < 64) then chunk.effect := byte3\r
+ else chunk.effect := 63;\r
+ end;\r
+\r
+ { SET SPEED }\r
+ $0f: begin\r
+ chunk.effect_def := ef_SetSpeed;\r
+ chunk.effect := byte3;\r
+ end;\r
+ end;\r
+\r
+// specific corrections for RAd-Tracker event\r
+ If (chunk.effect_def in [ef_TonePortamento,\r
+ ef_TPortamVolSlide]) and\r
+ (chunk.note = BYTE_NULL) then chunk.note := 0;\r
+ If (chunk.effect_def in [ef_TonePortamento,\r
+ ef_TPortamVolSlide]) then chunk.instr_def := 0;\r
+ If (chunk.note = 0) then chunk.instr_def := 0;\r
+ put_chunk(pattern,line,channel+1,chunk);\r
+end;\r
+\r
+\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,buf1,SizeOf(buf1),temp);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ temp2 := 0;\r
+ offs0 := SizeOf(header);\r
+\r
+ If (header.xbyte OR $80 = header.xbyte) then\r
+ begin\r
+ While (temp2 < temp) and (buf1[temp2] <> 0) do Inc(temp2);\r
+ If (temp2 >= temp) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ Inc(offs0,temp2+1);\r
+ Dec(temp,temp2+1);\r
+ Move(buf1,dscbuf,temp2+1);\r
+ Move(buf1[temp2+1],buf1,temp);\r
+ end;\r
+\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ If (header.xbyte OR $40 = header.xbyte) then tempo := 18\r
+ else tempo := 50;\r
+\r
+ If (header.xbyte AND $1f in [1..31]) then speed := header.xbyte AND $1f\r
+ else speed := 2;\r
+\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+\r
+ temp2 := 0;\r
+ Repeat\r
+ temp3 := buf1[temp2];\r
+ Inc(temp2);\r
+ If (temp3 <> 0) and (temp2+11 < temp) then\r
+ begin\r
+ import_hsc_instrument(temp3,buf1[temp2]);\r
+ songdata.instr_data[temp3].fine_tune := 0;\r
+ Inc(temp2,11);\r
+ end;\r
+ until (temp3 = 0) or (temp3 >= temp);\r
+\r
+ Inc(offs0,temp2);\r
+ Dec(temp,temp2);\r
+ Move(buf1[temp2],buf1,temp);\r
+\r
+ Inc(offs0,buf1[0]+1);\r
+ If (buf1[0] <> 0) then\r
+ Move(buf1[1],songdata.pattern_order,buf1[0]);\r
+\r
+ Inc(offs0,32*SizeOf(WORD));\r
+ Dec(temp,buf1[0]+1+32*SizeOf(WORD));\r
+\r
+ Move(buf1[buf1[0]+1],pattoffs,32*SizeOf(WORD));\r
+ Move(buf1[buf1[0]+32*SizeOf(WORD)+1],buf1,temp);\r
+\r
+ temp5 := temp;\r
+ For temp := 0 to 31 do\r
+ begin\r
+ temp2 := 0;\r
+ temp3 := 0;\r
+ If (pattoffs[temp] <> 0) and\r
+ (pattoffs[temp] <= FileSize(f)) then\r
+ Repeat\r
+ temp2 := buf1[pattoffs[temp]-offs0+temp3];\r
+ Repeat\r
+ Inc(temp3);\r
+ temp4 := buf1[pattoffs[temp]-offs0+temp3];\r
+ If (buf1[pattoffs[temp]-offs0+temp3+2] AND $0f <> 0) then\r
+ begin\r
+ If (temp4 AND $0f in [0..8]) then\r
+ import_rad_event(temp,temp2 AND $3f,temp4 AND $0f,\r
+ buf1[pattoffs[temp]-offs0+temp3+1],\r
+ buf1[pattoffs[temp]-offs0+temp3+2],\r
+ buf1[pattoffs[temp]-offs0+temp3+3]);\r
+ Inc(temp3,3);\r
+ end\r
+ else begin\r
+ If (temp4 AND $0f in [0..8]) then\r
+ import_rad_event(temp,temp2 AND $3f,temp4 AND $0f,\r
+ buf1[pattoffs[temp]-offs0+temp3+1],\r
+ buf1[pattoffs[temp]-offs0+temp3+2],\r
+ 0);\r
+ Inc(temp3,2);\r
+ end;\r
+ until (temp4 OR $80 = temp4) or (temp3 > temp5);\r
+ Inc(temp3);\r
+ until (temp2 OR $80 = temp2) or (temp3 > temp5);\r
+ end;\r
+\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ load_flag := 11;\r
+end;\r
+\r
+const\r
+ temp_ef_Arpeggio = $0f0;\r
+ temp_ef_rep = $0f1;\r
+ temp_ef_XFVSlide = $0f2;\r
+\r
+var\r
+ ins_c4factor: array[1..99] of Shortint;\r
+\r
+procedure fix_s3m_commands(patterns: Byte);\r
+\r
+var\r
+ chunk,chunk2: tCHUNK;\r
+ temp,temp4: Byte;\r
+ patt_break: Byte;\r
+ order,patt: Byte;\r
+ patts: String;\r
+ ins_cache,\r
+ misc_cache,\r
+ arpg_cache,\r
+ volsld_cache,\r
+ slide_cache,\r
+ note_cache,\r
+ patloop_cache: array[1..20] of Byte;\r
+ prev_cache: array[1..20] of Record\r
+ effect_def,\r
+ effect,\r
+ effect_def2,\r
+ effect2: Byte;\r
+ end;\r
+\r
+procedure fix_single_pattern(patt: Byte);\r
+\r
+var\r
+ temp2,temp3: Byte;\r
+\r
+begin\r
+ FillChar(prev_cache,SizeOf(prev_cache),0);\r
+ FillChar(patloop_cache,SizeOf(patloop_cache),BYTE_NULL);\r
+ patt_break := BYTE_NULL;\r
+\r
+ For temp2 := 0 to $3f do\r
+ For temp3 := 1 to 20 do\r
+ begin\r
+ get_chunk(patt,temp2,temp3,chunk);\r
+ If (chunk.effect_def in [ef_PositionJump,ef_PatternBreak]) then\r
+ patt_break := temp2;\r
+\r
+ If (chunk.instr_def <> 0) and (temp2 <= patt_break) then\r
+ ins_cache[temp3] := chunk.instr_def;\r
+\r
+ If (chunk.note in [1..12*8+1]) and (temp2 <= patt_break) then\r
+ note_cache[temp3] := chunk.note;\r
+\r
+ If (chunk.instr_def <> 0) or ((chunk.instr_def = 0) and\r
+ (chunk.note in [1..12*8+1]) and\r
+ (ins_cache[temp3] <> 0)) then\r
+ begin\r
+ If (chunk.instr_def <> 0) then temp4 := chunk.instr_def\r
+ else temp4 := ins_cache[temp3];\r
+ If (ins_c4factor[temp4] <> 0) and\r
+ NOT (Pos(CHR(songdata.pattern_order[order]),patts) <> 0) then\r
+ begin\r
+ If (ins_c4factor[temp4] <> -127) then\r
+ chunk.note := min(max(chunk.note+ins_c4factor[temp4],12*8+1),1)\r
+ else chunk.note := 1;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+ end;\r
+\r
+ If (chunk.effect_def = ef_Extended) and\r
+ (chunk.effect DIV 16 = ef_ex_PatternLoop) and\r
+ (chunk.effect MOD 16 <> 0) then\r
+ If NOT (patloop_cache[temp3] in [0,BYTE_NULL]) and (temp2 <> 0) then\r
+ begin\r
+ If (prev_cache[temp3].effect_def = 0) and\r
+ (prev_cache[temp3].effect = 0) then\r
+ begin\r
+ get_chunk(patt,PRED(temp2),temp3,chunk2);\r
+ chunk2.effect_def := ef_Extended;\r
+ chunk2.effect := ef_ex_PatternLoop*16;\r
+ If NOT ((chunk2.effect_def = chunk2.effect_def2) and\r
+ (chunk2.effect = chunk2.effect2)) then\r
+ begin\r
+ put_chunk(patt,PRED(temp2),temp3,chunk2);\r
+ prev_cache[temp3].effect_def := chunk.effect_def;\r
+ prev_cache[temp3].effect := chunk.effect;\r
+ end;\r
+ end\r
+ else If (prev_cache[temp3].effect_def2 = 0) and\r
+ (prev_cache[temp3].effect2 = 0) then\r
+ begin\r
+ get_chunk(patt,PRED(temp2),temp3,chunk2);\r
+ chunk2.effect_def2 := ef_Extended;\r
+ chunk2.effect2 := ef_ex_PatternLoop*16;\r
+ If NOT ((chunk2.effect_def2 = chunk2.effect_def) and\r
+ (chunk2.effect2 = chunk2.effect)) then\r
+ begin\r
+ put_chunk(patt,PRED(temp2),temp3,chunk2);\r
+ prev_cache[temp3].effect_def2 := chunk.effect_def2;\r
+ prev_cache[temp3].effect2 := chunk.effect2;\r
+ end;\r
+ end;\r
+ end\r
+ else If (patloop_cache[temp3] <> 0) and (temp2 <> 0) then\r
+ begin\r
+ get_chunk(patt,0,temp3,chunk2);\r
+ If (chunk2.effect_def = 0) and\r
+ (chunk2.effect = 0) then\r
+ begin\r
+ chunk2.effect_def := ef_Extended;\r
+ chunk2.effect := ef_ex_PatternLoop*16;\r
+ If NOT ((chunk2.effect_def = chunk2.effect_def2) and\r
+ (chunk2.effect = chunk2.effect2)) then\r
+ put_chunk(patt,0,temp3,chunk2);\r
+ end\r
+ else If (chunk2.effect_def2 = 0) and\r
+ (chunk2.effect2 = 0) then\r
+ begin\r
+ chunk2.effect_def2 := ef_Extended;\r
+ chunk2.effect2 := ef_ex_PatternLoop*16;\r
+ If NOT ((chunk2.effect_def2 = chunk2.effect_def) and\r
+ (chunk2.effect2 = chunk2.effect)) then\r
+ put_chunk(patt,0,temp3,chunk2);\r
+ end;\r
+ end;\r
+\r
+ If (temp2 <= patt_break) then\r
+ begin\r
+ If (chunk.effect DIV 16 <> 0) then\r
+ misc_cache[temp3] := chunk.effect AND $0f0+\r
+ misc_cache[temp3] AND $0f\r
+ else If (chunk.effect_def in [ef_Vibrato,\r
+ ef_ExtraFineVibrato,\r
+ ef_Tremolo,\r
+ ef_Tremor,\r
+ ef_MultiRetrigNote]) then\r
+ begin\r
+ chunk.effect := misc_cache[temp3] AND $0f0+\r
+ chunk.effect AND $0f;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect MOD 16 <> 0) then\r
+ misc_cache[temp3] := misc_cache[temp3] AND $0f0+\r
+ chunk.effect AND $0f\r
+ else If (chunk.effect_def in [ef_Vibrato,\r
+ ef_ExtraFineVibrato,\r
+ ef_Tremolo,\r
+ ef_Tremor,\r
+ ef_MultiRetrigNote]) then\r
+ begin\r
+ chunk.effect := chunk.effect AND $0f0+\r
+ misc_cache[temp3] AND $0f;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def = temp_ef_Arpeggio) then\r
+ If (chunk.effect <> 0) then arpg_cache[temp3] := chunk.effect\r
+ else begin\r
+ chunk.effect := arpg_cache[temp3];\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def in [ef_FSlideDown,ef_FSlideDownFine,\r
+ ef_FSlideUp,ef_FSlideUpFine,\r
+ ef_TonePortamento]) then\r
+ If (chunk.effect <> 0) then slide_cache[temp3] := chunk.effect\r
+ else begin\r
+ chunk.effect := slide_cache[temp3];\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ // experimental method to fix up frequency slide\r
+ If (chunk.effect_def in [ef_FSlideDown,ef_FSlideDownFine,\r
+ ef_FSlideUp,ef_FSlideUpFine,\r
+ ef_Vibrato,\r
+ ef_ExtraFineVibrato,\r
+ ef_TonePortamento]) then\r
+ If (note_cache[temp3] <> 0) then\r
+ begin\r
+ If (chunk.effect_def in [ef_Vibrato,ef_ExtraFineVibrato]) then\r
+ begin\r
+ temp := chunk.effect AND $0f0;\r
+ chunk.effect := chunk.effect MOD 16;\r
+ end;\r
+\r
+ Case SUCC(PRED(note_cache[temp3]) DIV 12) of\r
+ 1: chunk.effect := max(Round(chunk.effect*0.55),255);\r
+ 2: chunk.effect := max(Round(chunk.effect*0.75),255);\r
+ 3: chunk.effect := max(Round(chunk.effect*0.95),255);\r
+ 4: chunk.effect := max(Round(chunk.effect*1.15),255);\r
+ 5: chunk.effect := max(Round(chunk.effect*1.35),255);\r
+ 6: chunk.effect := max(Round(chunk.effect*1.55),255);\r
+ 7: chunk.effect := max(Round(chunk.effect*1.75),255);\r
+ 8: chunk.effect := max(Round(chunk.effect*1.95),255);\r
+ end;\r
+\r
+ If (chunk.effect_def in [ef_Vibrato,ef_ExtraFineVibrato]) then\r
+ chunk.effect := max(chunk.effect,15)+temp;\r
+\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def = ef_Extended2) and\r
+ (chunk.effect DIV 16 in [ef_ex2_FreqSlideDnXF,ef_ex2_FreqSlideUpXF]) then\r
+ If (chunk.effect MOD 16 <> 0) then slide_cache[temp3] := chunk.effect MOD 16\r
+ else begin\r
+ chunk.effect := chunk.effect AND $0f0+slide_cache[temp3] AND $0f;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def in [ef_TPortamVolSlide,ef_VibratoVolSlide,\r
+ ef_VolSlide,ef_VolSlideFine]) and\r
+ (temp2 <= patt_break) then\r
+ begin\r
+ If (chunk.effect <> 0) then volsld_cache[temp3] := chunk.effect\r
+ else begin\r
+ chunk.effect := volsld_cache[temp3];;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+ end;\r
+\r
+ If (chunk.effect_def = ef_Extended2) and\r
+ (chunk.effect DIV 16 in [ef_ex2_VolSlideDnXF,ef_ex2_VolSlideUpXF]) then\r
+ If (chunk.effect MOD 16 <> 0) then\r
+ Case chunk.effect DIV 16 of\r
+ ef_ex2_VolSlideDnXF:\r
+ volsld_cache[temp3] := chunk.effect MOD 16;\r
+ ef_ex2_VolSlideUpXF:\r
+ volsld_cache[temp3] := chunk.effect MOD 16 SHL 4;\r
+ end\r
+ else begin\r
+ Case chunk.effect DIV 16 of\r
+ ef_ex2_VolSlideDnXF:\r
+ chunk.effect := chunk.effect AND $0f0+volsld_cache[temp3] AND $0f;\r
+ ef_ex2_VolSlideUpXF:\r
+ chunk.effect := volsld_cache[temp3] AND $0f0+chunk.effect AND $0f;\r
+ end;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+ end;\r
+\r
+ If (prev_cache[temp3].effect_def in [ef_Vibrato,ef_ExtraFineVibrato,ef_VibratoVolSlide]) and\r
+ NOT (chunk.effect_def in [ef_Vibrato,ef_ExtraFineVibrato,ef_VibratoVolSlide]) then\r
+ If (chunk.effect_def = 0) and (chunk.effect = 0) then\r
+ begin\r
+ chunk2 := chunk;\r
+ chunk2.effect_def := ef_Extended;\r
+ chunk2.effect := ef_ex_ExtendedCmd*16+ef_ex_cmd_VibrOff;\r
+ If NOT ((chunk2.effect_def = chunk2.effect_def2) and\r
+ (chunk2.effect = chunk2.effect2)) then\r
+ begin\r
+ put_chunk(patt,temp2,temp3,chunk2);\r
+ chunk := chunk2;\r
+ end;\r
+ end\r
+ else If (chunk.effect_def2 = 0) and (chunk.effect2 = 0) then\r
+ begin\r
+ chunk2 := chunk;\r
+ chunk2.effect_def2 := ef_Extended;\r
+ chunk2.effect2 := ef_ex_ExtendedCmd*16+ef_ex_cmd_VibrOff;\r
+ If NOT ((chunk2.effect_def2 = chunk2.effect_def) and\r
+ (chunk2.effect2 = chunk2.effect)) then\r
+ begin\r
+ put_chunk(patt,temp2,temp3,chunk2);\r
+ chunk := chunk2;\r
+ end;\r
+ end;\r
+\r
+ If (chunk.effect_def = ef_Extended) and\r
+ (chunk.effect DIV 16 = ef_ex_PatternLoop) then\r
+ patloop_cache[temp3] := chunk.effect MOD 16;\r
+\r
+ prev_cache[temp3].effect_def := chunk.effect_def;\r
+ prev_cache[temp3].effect := chunk.effect;\r
+ prev_cache[temp3].effect_def2 := chunk.effect_def2;\r
+ prev_cache[temp3].effect2 := chunk.effect2;\r
+\r
+ If (chunk.effect_def = temp_ef_Arpeggio) then\r
+ begin\r
+ chunk2 := chunk;\r
+ chunk2.effect_def := ef_Arpeggio;\r
+ put_chunk(patt,temp2,temp3,chunk2);\r
+ end;\r
+ end;\r
+end;\r
+\r
+begin { fix_s3m_commands }\r
+ FillChar(ins_cache,SizeOf(ins_cache),0);\r
+ FillChar(note_cache,SizeOf(note_cache),0);\r
+ FillChar(volsld_cache,SizeOf(volsld_cache),0);\r
+ FillChar(slide_cache,SizeOf(slide_cache),0);\r
+ FillChar(misc_cache,SizeOf(misc_cache),0);\r
+ FillChar(arpg_cache,SizeOf(arpg_cache),0);\r
+\r
+ patts := '';\r
+ order := 0; patt := BYTE_NULL;\r
+\r
+ Repeat\r
+ If (songdata.pattern_order[order] >= $80) then Inc(order)\r
+ else\r
+ begin\r
+ patt := songdata.pattern_order[order];\r
+ If NOT (Pos(CHR(patt),patts) <> 0) then\r
+ fix_single_pattern(patt);\r
+ Inc(order);\r
+ patts := patts+CHR(patt);\r
+ end;\r
+ until (patt >= patterns) or (order > $7f);\r
+\r
+ For patt := 0 to PRED(patterns) do\r
+ If NOT (Pos(CHR(patt),patts) <> 0) then\r
+ fix_single_pattern(patt);\r
+end;\r
+\r
+procedure s3m_file_loader;\r
+\r
+type\r
+ tS3M_HEADER = Record\r
+ songname: array[1..28] of Char; { ASCIIZ }\r
+ byte1a: Byte; { 1Ah }\r
+ ftype: Byte; { File type: 16=ST3 module }\r
+ resrvd1: array[0..1] of Byte;\r
+ ordnum: Word; { Number of orders in file (should be even!) }\r
+ insnum: Word; { Number of instruments in file }\r
+ patnum: Word; { Number of patterns in file }\r
+ flags: Word; { [ These are old flags for Ffv1. Not supported in ST3.01 }\r
+ { | +1:st2vibrato }\r
+ { | +2:st2tempo }\r
+ { | +4:amigaslides }\r
+ { | +32:enable filter/sfx with sb }\r
+ { ] }\r
+ { +8: 0vol optimizations }\r
+ { Automatically turn off looping notes whose volume }\r
+ { is zero for >2 note rows. }\r
+ { +16: amiga limits }\r
+ { Disallow any notes that go beyond the amiga hardware }\r
+ { limits (like amiga does). This means that sliding }\r
+ { up stops at B#5 etc. Also affects some minor amiga }\r
+ { compatibility issues. }\r
+ { +64: st3.00 volumeslides }\r
+ { Normally volumeslide is NOT performed on first }\r
+ { frame of each row (this is according to amiga }\r
+ { playing). If this is set, volumeslide is performed }\r
+ { ALSO on the first row. This is set by default }\r
+ { if the Cwt/v files is 0x1300 }\r
+ { +128: special custom data in file (see below) }\r
+ cwt_v: Word; { Created with tracker / version: &0xfff=version, >>12=tracker }\r
+ { ST3.00:0x1300 (NOTE: volumeslides on EVERY frame) }\r
+ { ST3.01:0x1301 }\r
+ { ST3.03:0x1303 }\r
+ { ST3.20:0x1320 }\r
+ ffi: Word; { File format information }\r
+ { 1=[VERY OLD] signed samples }\r
+ { 2=unsigned samples }\r
+ id: array[1..4] of Char; { "SCRM" }\r
+ g_v: Byte; { global volume (see next section) }\r
+ i_s: Byte; { initial speed (command A) }\r
+\r
+ i_t: Byte; { initial tempo (command T) }\r
+ m_v: Byte; { master volume (see next section) 7 lower bits }\r
+ { bit 8: stereo(1) / mono(0) }\r
+ u_c: Byte; { ultra click removal }\r
+ d_p: Byte; { 252 when default channel pan positions are present }\r
+ { in the end of the header (xxx3). If !=252 ST3 doesn't }\r
+ { try to load channel pan settings. }\r
+ resrvd2: array[0..7] of Byte;\r
+ special: Word;\r
+ chan_set: array[1..32] of Byte;\r
+ end;\r
+type\r
+ tS3M_ADLINS = Record\r
+ itype: Byte; { 2:amel 3:abd 4:asnare 5:atom 6:acym 7:ahihat }\r
+ dosname: array[1..12] of Char;\r
+ id0: array[0..2] of Char;\r
+ fmdata: array[0..11] of Byte; { D00..D0B contains the adlib instrument specs packed like this: }\r
+ { modulator: carrier: }\r
+ { D00=[freq.muliplier]+[?scale env.]*16+[?sustain]*32+ =D01 }\r
+ { [?pitch vib]*64+[?vol.vib]*128 }\r
+ { D02=[63-volume]+[levelscale&1]*128+[l.s.&2]*64 =D03 }\r
+ { D04=[attack]*16+[decay] =D05 }\r
+ { D06=[15-sustain]*16+[release] =D07 }\r
+ { D08=[wave select] =D09 }\r
+ { D0A=[modulation feedback]*2+[?additive synthesis] }\r
+ { D0B=unused }\r
+ vol: Byte; { Default volume 0..64 }\r
+ dsk: Byte;\r
+ resrvd1: array[0..1] of Byte;\r
+ c2spd: Word; { 'Herz' for middle C. ST3 only uses lower 16 bits. }\r
+ { Actually this is a modifier since there is no }\r
+ { clear frequency for adlib instruments. It scales }\r
+ { the note freq sent to adlib. }\r
+ hi_c2sp: Word;\r
+ resrvd2: array[0..11] of Byte;\r
+ smpname: array[1..28] of Char; { ASCIIZ }\r
+ id: array[1..4] of Char; { "SCRI" or "SCRS" }\r
+ end;\r
+const\r
+ id_mod = 'SCRM';\r
+ id_ins_adl = 'SCRI';\r
+ id_ins_smp = 'SCRS';\r
+\r
+var\r
+ f: File;\r
+ header: tS3M_HEADER;\r
+ order_list: array[0..254] of Byte;\r
+ paraptr_ins: array[1..99] of Word;\r
+ default_vol: array[1..99] of Byte;\r
+ paraptr_pat: array[0..99] of Word;\r
+ temp,temp2: Longint;\r
+ insdata: tS3M_ADLINS;\r
+ pat,row,chan: Byte;\r
+ note,ins,vol,cmd,info: Byte;\r
+ patlen,index: Word;\r
+\r
+procedure import_s3m_event(pattern,line,channel,note,ins,vol,cmd,info: Byte);\r
+\r
+var\r
+ chunk: tCHUNK;\r
+\r
+function scale_slide(slide: Byte): Byte;\r
+begin\r
+ If (slide > 16) then scale_slide := Round(16+slide/8)\r
+ else scale_slide := Round(slide*(2-slide/16));\r
+end;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ chunk.instr_def := ins;\r
+\r
+ Case note of\r
+ 254: chunk.note := BYTE_NULL;\r
+ 255: chunk.note := 0;\r
+ else If (note AND $0f in [0..11]) then\r
+ chunk.note := 12*((note SHR 4) AND 7)+(note AND $0f)+1\r
+ end;\r
+\r
+ If (vol <> BYTE_NULL) then\r
+ begin\r
+ chunk.effect_def2 := ef_SetInsVolume;\r
+ chunk.effect2 := max(vol,63);\r
+ end\r
+ else\r
+ If NOT (note in [254,255]) and\r
+ (ins <> 0) and\r
+ (max(default_vol[ins],63) <> 63) then\r
+ begin\r
+ chunk.effect_def2 := ef_SetInsVolume;\r
+ chunk.effect2 := max(default_vol[ins],63);\r
+ end;\r
+\r
+ Case CHR(cmd+ORD('A')-1) of\r
+ { NONE }\r
+ '@': chunk.effect := info;\r
+\r
+ { SET SPEED }\r
+ 'A': If (info <> 0) then\r
+ begin\r
+ chunk.effect_def := ef_SetSpeed;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { JUMP TO ORDER }\r
+ 'B': If (info <= 254) then\r
+ begin\r
+ chunk.effect_def := ef_PositionJump;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { BREAK PATTERN }\r
+ 'C': If (info < 64) then\r
+ begin\r
+ chunk.effect_def := ef_PatternBreak;\r
+ chunk.effect := Str2num(Num2str(info,16),10);\r
+ end;\r
+\r
+ { VOLUME SLIDE }\r
+ 'D': { VOLUME SLIDE DOWN }\r
+ Case info DIV 16 of\r
+ { NORMAL }\r
+ 0: begin\r
+ chunk.effect_def := ef_VolSlide;\r
+ chunk.effect := info MOD 16;\r
+ end;\r
+\r
+ { FINE }\r
+ 15: begin\r
+ chunk.effect_def := ef_VolSlideFine;\r
+ chunk.effect := info MOD 16;\r
+ end;\r
+ else\r
+ { VOLUME SLIDE UP }\r
+ Case info MOD 16 of\r
+ { NORMAL }\r
+ 0: begin\r
+ chunk.effect_def := ef_VolSlide;\r
+ chunk.effect := info AND $0f0;\r
+ end;\r
+\r
+ { FINE }\r
+ 15: begin\r
+ chunk.effect_def := ef_VolSlideFine;\r
+ chunk.effect := info AND $0f0;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ { SLIDE DOWN }\r
+ 'E': Case info DIV 16 of\r
+ { NORMAL }\r
+ 0..13: begin\r
+ chunk.effect_def := ef_FSlideDown;\r
+ chunk.effect := scale_slide(info);\r
+ end;\r
+\r
+ { EXTRA FINE }\r
+ 14: begin\r
+ chunk.effect_def := ef_Extended2;\r
+ If (info <> 0) then\r
+ chunk.effect := ef_ex2_FreqSlideDnXF*16+min((info AND $0f) DIV 4,1)\r
+ else chunk.effect := ef_ex2_FreqSlideDnXF*16;\r
+ end;\r
+\r
+ { FINE }\r
+ 15: begin\r
+ chunk.effect_def := ef_FSlideDownFine;\r
+ chunk.effect := info AND $0f;\r
+ end;\r
+ end;\r
+\r
+ { SLIDE UP }\r
+ 'F': Case info DIV 16 of\r
+ { NORMAL }\r
+ 0..13: begin\r
+ chunk.effect_def := ef_FSlideUp;\r
+ chunk.effect := scale_slide(info);\r
+ end;\r
+\r
+ { EXTRA FINE }\r
+ 14: begin\r
+ chunk.effect_def := ef_Extended2;\r
+ If (info <> 0) then\r
+ chunk.effect := ef_ex2_FreqSlideUpXF*16+min((info AND $0f) DIV 4,1)\r
+ else chunk.effect := ef_ex2_FreqSlideUpXF*16;\r
+ end;\r
+\r
+ { FINE }\r
+ 15: begin\r
+ chunk.effect_def := ef_FSlideUpFine;\r
+ chunk.effect := info AND $0f;\r
+ end;\r
+ end;\r
+\r
+ { TONE PORTAMENTO }\r
+ 'G': begin\r
+ chunk.effect_def := ef_TonePortamento;\r
+ chunk.effect := scale_slide(info);\r
+ end;\r
+\r
+ { VIBRATO }\r
+ 'H': begin\r
+ chunk.effect_def := ef_Vibrato;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { FINE VIBRATO }\r
+ 'U': begin\r
+ chunk.effect_def := ef_ExtraFineVibrato;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { TREMOR }\r
+ 'I': begin\r
+ chunk.effect_def := ef_Tremor;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { ARPEGGIO }\r
+ 'J': begin\r
+ chunk.effect_def := temp_ef_Arpeggio;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { VIBRATO + VOLUME SLIDE }\r
+ 'K': begin\r
+ chunk.effect_def := ef_VibratoVolSlide;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { TONE PORTAMENTO + VOLUME SLIDE }\r
+ 'L': begin\r
+ chunk.effect_def := ef_TPortamVolSlide;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { RETRIG NOTE + VOLUME SLIDE }\r
+ 'Q': begin\r
+ chunk.effect_def := ef_MultiRetrigNote;\r
+ chunk.effect := (info MOD 16)*16+info DIV 16;\r
+ end;\r
+\r
+ { TREMOLO }\r
+ 'R': begin\r
+ chunk.effect_def := ef_Tremolo;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { SPECIAL COMMAND }\r
+ 'S': Case info DIV 16 of\r
+ { PATTERN LOOP }\r
+ $0b: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_PatternLoop*16+info MOD 16;\r
+ end;\r
+\r
+ { NOTE CUT }\r
+ $0c: begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_NoteCut*16+info MOD 16;\r
+ end;\r
+\r
+ { NOTE DELAY }\r
+ $0d: begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_NoteDelay*16+info MOD 16;\r
+ end;\r
+\r
+ { PATTERN DELAY }\r
+ $0e: begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_PatDelayRow*16+info MOD 16;\r
+ end;\r
+ end;\r
+\r
+ { TEMPO }\r
+ 'T': If (info >= 32) then\r
+ begin\r
+ chunk.effect_def := ef_SetTempo;\r
+ chunk.effect := Round(info/2.5);\r
+ end;\r
+\r
+ { SET GLOBAL VOLUME }\r
+ 'V': begin\r
+ chunk.effect_def := ef_SetGlobalVolume;\r
+ chunk.effect := max(info,63);\r
+ end;\r
+ end;\r
+\r
+ If (chunk.effect_def = 0) and (chunk.effect <> 0) then\r
+ chunk.effect := 0;\r
+ put_chunk(pattern,line,channel,chunk);\r
+end;\r
+\r
+// experimental method to fix up note fine-tuning\r
+function find_scale_factor(freq: Longint; var fine_tune: Shortint): Shortint;\r
+\r
+const\r
+ _factor: array[-3..3+1] of Real = (1/8,1/4,1/2,1,2,4,8,16);\r
+\r
+const\r
+ _freq: array[1..12+1] of Word =\r
+ { C-2 C#2 D-2 }\r
+ ( 33453 DIV 4,35441 DIV 4,37679 DIV 4,\r
+ { D#2 E-2 F-2 }\r
+ 39772 DIV 4,42441 DIV 4,44744 DIV 4,\r
+ { F#2 G-2 G#2 }\r
+ 47727 DIV 4,50416 DIV 4,53426 DIV 4,\r
+ { A-2 A#2 B-2 }\r
+ 56370 DIV 4,59658 DIV 4,63354 DIV 4,\r
+ { C-3 }\r
+ 33453 DIV 2);\r
+\r
+const\r
+ _fm_freq: array[1..12+1] of Word =\r
+ ($156, $16b, $181, $198, $1b0, $1ca,\r
+ $1e5, $202, $220, $241, $263, $287,\r
+ $2ae);\r
+\r
+var\r
+ factor: Real;\r
+ temp,scaler: Shortint;\r
+\r
+begin\r
+ scaler := -3;\r
+ fine_tune := 0;\r
+\r
+ For scaler := -3 to 3+1 do\r
+ For temp := 1 to 12 do\r
+ begin\r
+ factor := _factor[scaler];\r
+ If (freq >= Round(_freq[temp]*factor)) and\r
+ (freq <= Round(_freq[SUCC(temp)]*factor)) then\r
+ If (freq-Round(_freq[temp]*factor) < Round(_freq[SUCC(temp)]*factor)-freq) then\r
+ begin\r
+ fine_tune := Round((_fm_freq[SUCC(temp)]-_fm_freq[temp])/\r
+ (_freq[SUCC(temp)]-_freq[temp])*\r
+ (freq-Round(_freq[temp]*factor)));\r
+ find_scale_factor := scaler*12+PRED(temp);\r
+ EXIT;\r
+ end\r
+ else\r
+ begin\r
+ fine_tune := Round((_fm_freq[SUCC(temp)]-_fm_freq[temp])/\r
+ (_freq[SUCC(temp)]-_freq[temp])*\r
+ (freq-Round(_freq[SUCC(temp)]*factor)));\r
+ If (temp <> 12) then find_scale_factor := scaler*12+temp\r
+ else find_scale_factor := SUCC(scaler)*12;\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ find_scale_factor := -127;\r
+ fine_tune := 0;\r
+end;\r
+\r
+(* // another method -- it's hard to say whether more or less accurate :)\r
+function find_scale_factor(freq: Longint; var fine_tune: Shortint): Shortint;\r
+\r
+const\r
+ _factor: array[-3..3+1] of Real = (1/8,1/4,1/2,1,2,4,8,16);\r
+ _finetune_factor: array[-3..3+1] of Real = (8,4,2,1,1/2,1/4,1/8,1/16);\r
+\r
+const\r
+ _freq: array[1..12+1] of Word =\r
+ { C-2 C#2 D-2 }\r
+ ( 33453 DIV 4,35441 DIV 4,37679 DIV 4,\r
+ { D#2 E-2 F-2 }\r
+ 39772 DIV 4,42441 DIV 4,44744 DIV 4,\r
+ { F#2 G-2 G#2 }\r
+ 47727 DIV 4,50416 DIV 4,53426 DIV 4,\r
+ { A-2 A#2 B-2 }\r
+ 56370 DIV 4,59658 DIV 4,63354 DIV 4,\r
+ { C-3 }\r
+ 33453 DIV 2);\r
+\r
+var\r
+ factor: Real;\r
+ temp,scaler: Shortint;\r
+\r
+begin\r
+ scaler := -3;\r
+ fine_tune := 0;\r
+\r
+ For scaler := -3 to 3+1 do\r
+ For temp := 1 to 12 do\r
+ begin\r
+ factor := _factor[scaler];\r
+ If (freq >= Round(_freq[temp]*factor)) and\r
+ (freq <= Round(_freq[SUCC(temp)]*factor)) then\r
+ If (freq-Round(_freq[temp]*factor) < Round(_freq[SUCC(temp)]*factor)-freq) then\r
+ begin\r
+ fine_tune := Round((freq-Round(_freq[temp]*factor))/\r
+ Round(16/_finetune_factor[scaler]));\r
+ find_scale_factor := scaler*12+PRED(temp);\r
+ EXIT;\r
+ end\r
+ else\r
+ begin\r
+ If (temp = 12) then Inc(scaler);\r
+ fine_tune := Round((freq-Round(_freq[SUCC(temp)]*factor))/\r
+ Round(16/_finetune_factor[scaler]));\r
+ If (temp = 12) then temp := 0;\r
+ find_scale_factor := scaler*12+temp;\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ find_scale_factor := -127;\r
+ fine_tune := 0;\r
+end;\r
+*)\r
+\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.id = id_mod)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ If (header.byte1a <> $1a) or (header.ftype <> $10) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,order_list,header.ordnum,temp);\r
+ If (IOresult <> 0) or (temp <> header.ordnum) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,paraptr_ins,header.insnum*2,temp);\r
+ If (IOresult <> 0) or (temp <> header.insnum*2) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,paraptr_pat,header.patnum*2,temp);\r
+ If (IOresult <> 0) or (temp <> header.patnum*2) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ If (header.i_s <> 0) then speed := header.i_s\r
+ else speed := 1;\r
+\r
+ If (Round(header.i_t/2.5) < 255) then tempo := Round(header.i_t/2.5)\r
+ else tempo := 255;\r
+\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+ songdata.songname := truncate_string(asciiz_string(header.songname));\r
+ songdata.common_flag := songdata.common_flag OR $80;\r
+ import_old_flags;\r
+\r
+ For temp := 32 downto 1 do\r
+ If (header.chan_set[temp] <> 255) then BREAK;\r
+\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := max(temp,18)\r
+ else If (songdata.nm_tracks < 18) then songdata.nm_tracks := 18;\r
+\r
+ For temp := 1 to max(header.ordnum,128) do\r
+ Case order_list[temp-1] of\r
+ 254: songdata.pattern_order[temp-1] := $80+temp;\r
+ 255: songdata.pattern_order[temp-1] := $80;\r
+ else songdata.pattern_order[temp-1] := order_list[temp-1];\r
+ end;\r
+\r
+ FillChar(ins_c4factor,SizeOf(ins_c4factor),0);\r
+ For temp := 1 to header.insnum do\r
+ begin\r
+ SeekF(f,paraptr_ins[temp]*16);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,insdata,SizeOf(insdata),temp2);\r
+ If (IOresult <> 0) or (temp2 <> SizeOf(insdata)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (truncate_string(insdata.smpname) <> '') then\r
+ songdata.instr_names[temp] :=\r
+ Copy(songdata.instr_names[temp],1,9)+\r
+ Copy(truncate_string(asciiz_string(insdata.smpname)),1,32)\r
+ else\r
+ songdata.instr_names[temp] :=\r
+ Copy(songdata.instr_names[temp],1,9)+\r
+ truncate_string(insdata.dosname);\r
+\r
+ If (insdata.itype in [2..7]) then\r
+ begin\r
+ If (insdata.id <> id_ins_adl) and (insdata.id <> id_ins_smp) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ import_standard_instrument(temp,insdata.fmdata);\r
+ end;\r
+\r
+ default_vol[temp] := insdata.vol;\r
+ If (insdata.c2spd <> 0) and\r
+ (insdata.c2spd <> 8363) then\r
+ ins_c4factor[temp] := find_scale_factor(insdata.c2spd,songdata.instr_data[temp].fine_tune);\r
+ end;\r
+\r
+ For pat := 0 to PRED(header.patnum) do\r
+ begin\r
+ SeekF(f,paraptr_pat[pat]*16);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,patlen,SizeOf(patlen),temp2);\r
+ If (temp2 <> SizeOf(patlen)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (patlen = 0) then CONTINUE;\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,buf1,patlen-2,temp2);\r
+\r
+ index := 0;\r
+ row := 0;\r
+\r
+ Repeat\r
+ If (buf1[index] <> 0) then\r
+ begin\r
+ note := BYTE_NULL;\r
+ ins := 0;\r
+ vol := BYTE_NULL;\r
+ cmd := 0;\r
+ info := 0;\r
+ temp := buf1[index];\r
+ Inc(index);\r
+\r
+ chan := SUCC(temp AND 31);\r
+ If (temp OR $20 = temp) then\r
+ begin\r
+ note := buf1[index];\r
+ Inc(index);\r
+ ins := buf1[index];\r
+ Inc(index);\r
+ end;\r
+\r
+ If (temp OR $40 = temp) then\r
+ begin\r
+ vol := buf1[index];\r
+ Inc(index);\r
+ end;\r
+\r
+ If (temp OR $80 = temp) then\r
+ begin\r
+ cmd := buf1[index];\r
+ Inc(index);\r
+ info := buf1[index];\r
+ Inc(index);\r
+ end;\r
+\r
+ If (chan > songdata.nm_tracks) then songdata.nm_tracks := max(chan,18);\r
+ If (chan in [1..songdata.nm_tracks]) then\r
+ import_s3m_event(pat,row,chan,note,ins,vol,cmd,info);\r
+ end\r
+ else\r
+ begin\r
+ Inc(row);\r
+ Inc(index);\r
+ end;\r
+ until (row = 64);\r
+ end;\r
+\r
+ fix_s3m_commands(header.patnum);\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ load_flag := 12;\r
+end;\r
+\r
+procedure fix_fmk_commands(patterns: Byte);\r
+\r
+var\r
+ chunk,chunk2,\r
+ chunk3: tCHUNK;\r
+ patt_break: Byte;\r
+ order,patt: Byte;\r
+ patts: String;\r
+ ins_cache,\r
+ misc_cache,\r
+ arpg_cache,\r
+ forcevol_cache,\r
+ volsld_cache,\r
+ xfvolsld_cache,\r
+ slide_cache: array[1..20] of Byte;\r
+ _1st_ins_load: array[1..20] of Boolean;\r
+ _speed_table_fixed: array[0..$7f] of Boolean;\r
+ prev_cache: array[1..20] of Record\r
+ effect_def,\r
+ effect,\r
+ effect_def2,\r
+ effect2: Byte;\r
+ end;\r
+\r
+procedure fix_single_pattern(patt: Byte);\r
+\r
+var\r
+ temp2,temp3: Byte;\r
+\r
+begin\r
+ FillChar(prev_cache,SizeOf(prev_cache),0);\r
+ patt_break := BYTE_NULL;\r
+\r
+ If NOT _speed_table_fixed[patt] then\r
+ For temp2 := 0 to $3f do\r
+ begin\r
+ For temp3 := 1 to 20 do\r
+ begin\r
+ get_chunk(patt,temp2,temp3,chunk);\r
+ If (chunk.effect_def = 0) then\r
+ begin\r
+ chunk.effect_def := ef_SetCustomSpeedTab;\r
+ chunk.effect := $0fa;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ _speed_table_fixed[patt] := TRUE;\r
+ end\r
+ else If (chunk.effect_def2 = 0) then\r
+ begin\r
+ chunk.effect_def2 := ef_SetCustomSpeedTab;\r
+ chunk.effect2 := $0fa;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ _speed_table_fixed[patt] := TRUE;\r
+ end;\r
+ If _speed_table_fixed[patt] then BREAK;\r
+ end;\r
+ If _speed_table_fixed[patt] then BREAK;\r
+ end;\r
+\r
+ For temp2 := 0 to $3f do\r
+ For temp3 := 1 to 20 do\r
+ begin\r
+ get_chunk(patt,temp2,temp3,chunk);\r
+ If (chunk.effect_def = temp_ef_rep) then\r
+ begin\r
+ chunk.effect_def := prev_cache[temp3].effect_def;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def = temp_ef_XFVSlide) then\r
+ begin\r
+ chunk.effect_def := ef_Extended2;\r
+ If (xfvolsld_cache[temp3] <> 0) then\r
+ chunk.effect := ef_ex2_VolSlideUpXF*16+volsld_cache[temp3] DIV 16\r
+ else chunk.effect := ef_ex2_VolSlideDnXF*16+volsld_cache[temp3] MOD 16;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def in [ef_PositionJump,ef_PatternBreak]) then\r
+ patt_break := temp2;\r
+\r
+ If (temp2 <= patt_break) and\r
+ (chunk.instr_def <> ins_cache[temp3]) and\r
+ (chunk.effect_def2 <> ef_ForceInsVolume) then\r
+ If (chunk.instr_def <> 0) then\r
+ forcevol_cache[temp3] := 0;\r
+\r
+ If ((chunk.effect_def = ef_Extended) and\r
+ (chunk.effect = ef_ex_ExtendedCmd*16+ef_ex_cmd_ResetVol)) or\r
+ ((chunk.effect_def2 = ef_Extended) and\r
+ (chunk.effect2 = ef_ex_ExtendedCmd*16+ef_ex_cmd_ResetVol)) then\r
+ forcevol_cache[temp3] := 0;\r
+\r
+ If (chunk.effect_def2 = ef_ForceInsVolume) and\r
+ (temp2 <= patt_break) then\r
+ forcevol_cache[temp3] := 1;\r
+\r
+ If (chunk.instr_def <> 0) and (temp2 <= patt_break) then\r
+ ins_cache[temp3] := chunk.instr_def;\r
+\r
+ If (chunk.instr_def <> 0) or ((chunk.instr_def = 0) and\r
+ (chunk.note in [1..12*8+1]) and\r
+ (ins_cache[temp3] <> 0)) then\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+\r
+ If (temp2 <= patt_break) then\r
+ begin\r
+ If (chunk.effect DIV 16 <> 0) then\r
+ misc_cache[temp3] := chunk.effect AND $0f0+\r
+ misc_cache[temp3] AND $0f\r
+ else If (chunk.effect_def in [ef_Vibrato,\r
+ ef_Tremolo]) then\r
+ begin\r
+ chunk.effect := misc_cache[temp3] AND $0f0+\r
+ chunk.effect AND $0f;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect MOD 16 <> 0) then\r
+ misc_cache[temp3] := misc_cache[temp3] AND $0f0+\r
+ chunk.effect AND $0f\r
+ else If (chunk.effect_def in [ef_Vibrato,\r
+ ef_Tremolo]) then\r
+ begin\r
+ chunk.effect := chunk.effect AND $0f0+\r
+ misc_cache[temp3] AND $0f;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def = ef_RetrigNote) then\r
+ If (chunk.effect <> 0) then misc_cache[temp3] := chunk.effect\r
+ else begin\r
+ chunk.effect := misc_cache[temp3];\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def = temp_ef_Arpeggio) then\r
+ If (chunk.effect <> 0) then arpg_cache[temp3] := chunk.effect\r
+ else begin\r
+ chunk.effect := arpg_cache[temp3];\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def in [ef_FSlideDown,ef_FSlideDownFine,\r
+ ef_FSlideUp,ef_FSlideUpFine,\r
+ ef_TonePortamento]) then\r
+ If (chunk.effect <> 0) then slide_cache[temp3] := chunk.effect\r
+ else begin\r
+ chunk.effect := slide_cache[temp3];\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def = ef_Extended2) and\r
+ (chunk.effect DIV 16 in [ef_ex2_FreqSlideDnXF,ef_ex2_FreqSlideUpXF]) then\r
+ If (chunk.effect MOD 16 <> 0) then slide_cache[temp3] := chunk.effect MOD 16\r
+ else begin\r
+ chunk.effect := chunk.effect AND $0f0+slide_cache[temp3] AND $0f;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+\r
+ If (chunk.effect_def in [ef_TPortamVolSlide,ef_VibratoVolSlide,\r
+ ef_VolSlide,ef_VolSlideFine]) and\r
+ (temp2 <= patt_break) then\r
+ begin\r
+ If (chunk.effect <> 0) then volsld_cache[temp3] := chunk.effect\r
+ else begin\r
+ chunk.effect := volsld_cache[temp3];;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+ end;\r
+\r
+ If (chunk.effect_def = ef_Extended2) and\r
+ (chunk.effect DIV 16 in [ef_ex2_VolSlideDnXF,ef_ex2_VolSlideUpXF]) then\r
+ If (chunk.effect MOD 16 <> 0) then\r
+ Case chunk.effect DIV 16 of\r
+ ef_ex2_VolSlideDnXF:\r
+ begin\r
+ volsld_cache[temp3] := chunk.effect MOD 16;\r
+ xfvolsld_cache[temp3] := 0;\r
+ end;\r
+\r
+ ef_ex2_VolSlideUpXF:\r
+ begin\r
+ volsld_cache[temp3] := chunk.effect MOD 16*16;\r
+ xfvolsld_cache[temp3] := 1;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ If (prev_cache[temp3].effect_def in [ef_Vibrato,ef_VibratoVolSlide]) and\r
+ NOT (chunk.effect_def in [ef_Vibrato,ef_VibratoVolSlide]) then\r
+ If (chunk.effect_def = 0) and (chunk.effect = 0) then\r
+ begin\r
+ chunk2 := chunk;\r
+ chunk2.effect_def := ef_Extended;\r
+ chunk2.effect := ef_ex_ExtendedCmd*16+ef_ex_cmd_VibrOff;\r
+ If NOT ((chunk2.effect_def = chunk2.effect_def2) and\r
+ (chunk2.effect = chunk2.effect2)) then\r
+ begin\r
+ put_chunk(patt,temp2,temp3,chunk2);\r
+ chunk := chunk2;\r
+ end;\r
+ end\r
+ else If (chunk.effect_def2 = 0) and (chunk.effect2 = 0) then\r
+ begin\r
+ chunk2 := chunk;\r
+ chunk2.effect_def2 := ef_Extended;\r
+ chunk2.effect2 := ef_ex_ExtendedCmd*16+ef_ex_cmd_VibrOff;\r
+ If NOT ((chunk2.effect_def2 = chunk2.effect_def) and\r
+ (chunk2.effect2 = chunk2.effect)) then\r
+ begin\r
+ put_chunk(patt,temp2,temp3,chunk2);\r
+ chunk := chunk2;\r
+ end;\r
+ end;\r
+\r
+ If (_1st_ins_load[temp3] and (chunk.instr_def <> 0)) or\r
+ (forcevol_cache[temp3] <> 0) and\r
+ (temp2 <= patt_break) and\r
+ (chunk.instr_def <> 0) then\r
+ If (chunk.effect_def2+chunk.effect2 = 0) then\r
+ If NOT (chunk.effect_def in [ef_SetModulatorVol,ef_SetCarrierVol]) then\r
+ begin\r
+ chunk.effect_def2 := ef_Extended;\r
+ chunk.effect2 := ef_ex_ExtendedCmd*16+ef_ex_cmd_ResetVol;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ forcevol_cache[temp3] := 0;\r
+ _1st_ins_load[temp3] := FALSE;\r
+ end\r
+ else begin\r
+ chunk.effect_def2 := chunk.effect_def;\r
+ chunk.effect2 := chunk.effect;\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_ExtendedCmd*16+ef_ex_cmd_ResetVol;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ forcevol_cache[temp3] := 0;\r
+ _1st_ins_load[temp3] := FALSE;\r
+ end;\r
+\r
+ prev_cache[temp3].effect_def := chunk.effect_def;\r
+ prev_cache[temp3].effect := chunk.effect;\r
+ prev_cache[temp3].effect_def2 := chunk.effect_def2;\r
+ prev_cache[temp3].effect2 := chunk.effect2;\r
+\r
+ If is_4op_chan(temp3) and\r
+ (temp3 in [1,3,5,10,12,14]) then\r
+ begin\r
+ get_chunk(patt,temp2,SUCC(temp3),chunk3);\r
+ If (chunk.instr_def = 0) and (chunk3.instr_def <> 0) then\r
+ begin\r
+ If (ins_cache[temp3] <> 0) then\r
+ chunk.instr_def := ins_cache[temp3]\r
+ else chunk.instr_def := chunk3.instr_def;\r
+ put_chunk(patt,temp2,temp3,chunk);\r
+ end;\r
+ end;\r
+\r
+ If (chunk.effect_def = temp_ef_Arpeggio) then\r
+ begin\r
+ chunk2 := chunk;\r
+ chunk2.effect_def := ef_Arpeggio;\r
+ put_chunk(patt,temp2,temp3,chunk2);\r
+ end;\r
+\r
+ If (chunk.effect_def in [ef_SetModulatorVol,ef_SetCarrierVol]) and\r
+ (chunk.effect_def2 = ef_ForceInsVolume) then\r
+ begin\r
+ chunk2 := chunk;\r
+ chunk2.effect_def := chunk.effect_def2;\r
+ chunk2.effect := chunk.effect2;\r
+ chunk2.effect_def2 := chunk.effect_def;\r
+ chunk2.effect2 := chunk.effect;\r
+ put_chunk(patt,temp2,temp3,chunk2);\r
+ end;\r
+ end;\r
+end;\r
+\r
+begin { fix_fmk_commands }\r
+ FillChar(ins_cache,SizeOf(ins_cache),0);\r
+ FillChar(_1st_ins_load,SizeOf(_1st_ins_load),TRUE);\r
+ FillChar(_speed_table_fixed,SizeOf(_speed_table_fixed),FALSE);\r
+ FillChar(xfvolsld_cache,SizeOf(volsld_cache),0);\r
+ FillChar(volsld_cache,SizeOf(volsld_cache),0);\r
+ FillChar(slide_cache,SizeOf(slide_cache),0);\r
+ FillChar(misc_cache,SizeOf(misc_cache),0);\r
+ FillChar(arpg_cache,SizeOf(arpg_cache),0);\r
+ FillChar(forcevol_cache,SizeOf(forcevol_cache),0);\r
+\r
+ patts := '';\r
+ order := 0; patt := BYTE_NULL;\r
+\r
+ Repeat\r
+ If (songdata.pattern_order[order] >= $80) then Inc(order)\r
+ else\r
+ begin\r
+ patt := songdata.pattern_order[order];\r
+ fix_single_pattern(patt);\r
+ Inc(order);\r
+ patts := patts+CHR(patt);\r
+ end;\r
+ until (patt >= patterns) or (order > $7f);\r
+\r
+ For patt := 0 to PRED(patterns) do\r
+ If NOT (Pos(CHR(patt),patts) <> 0) then\r
+ fix_single_pattern(patt);\r
+end;\r
+\r
+procedure import_fin_instrument(inst: Byte; var data);\r
+begin\r
+ With songdata.instr_data[inst] do\r
+ begin\r
+ fm_data.AM_VIB_EG_modulator := tDUMMY_BUFF(data)[0];\r
+ fm_data.AM_VIB_EG_carrier := tDUMMY_BUFF(data)[1];\r
+ fm_data.KSL_VOLUM_modulator := tDUMMY_BUFF(data)[2];\r
+ fm_data.KSL_VOLUM_carrier := tDUMMY_BUFF(data)[3];\r
+ fm_data.ATTCK_DEC_modulator := tDUMMY_BUFF(data)[4];\r
+ fm_data.ATTCK_DEC_carrier := tDUMMY_BUFF(data)[5];\r
+ fm_data.SUSTN_REL_modulator := tDUMMY_BUFF(data)[6];\r
+ fm_data.SUSTN_REL_carrier := tDUMMY_BUFF(data)[7];\r
+ fm_data.WAVEFORM_modulator := tDUMMY_BUFF(data)[8] AND 7;\r
+ fm_data.WAVEFORM_carrier := tDUMMY_BUFF(data)[9] AND 7;\r
+ fm_data.FEEDBACK_FM := tDUMMY_BUFF(data)[10] AND $0f;\r
+ end;\r
+\r
+ songdata.instr_data[inst].panning := 0;\r
+ songdata.instr_data[inst].fine_tune := 0;\r
+end;\r
+\r
+procedure fmk_file_loader;\r
+\r
+type\r
+ tFMK_HEADER = Record\r
+ id: array[1..4] of Char; { FMK! }\r
+ songname: array[1..28] of Char; { Song name (28) }\r
+ composer: array[1..28] of Char; { Composer name (28) }\r
+ bytef4: Byte; { Value 244 (f4h), just for check. }\r
+ ftype: Byte; { File type {1=evolution 1, 2=evolution 2 }\r
+ glob_var: Byte; { Global variables, bits : 0 = stereo, 1 = opl3, 2 = rhythm }\r
+ { 3 = 4.8 db tremolo 4 = 14 cent vibrato. }\r
+ base_spd: Byte; { Song basespeed, ticks / second. this version : fixed 50. }\r
+ init_spd: Byte; { Song initial speed. }\r
+ reserved: array[0..8] of Byte; { Reserved }\r
+ ordnum: Byte; { Length of song (order). }\r
+ insnum: Byte; { Number of instruments. }\r
+ patnum: Byte; { Number of patterns. }\r
+ trk_pan: array[1..5] of Byte; { Track stereo pan positions, bits 0-1, 2-3, 4-5, 6-7. }\r
+ { value 0 = left 1 = both 2 = right, from track 1 to 18. }\r
+ trk_set: array[1..20] of Byte; { Track initial settings, 255=unused, bits : }\r
+ { 0-2, type value: 0 = normal 1=hihat 2=cymbal 3=tom tom 4=snare 5=bass }\r
+ { 6 = 4op 7=unused }\r
+ { 3-7, OPL-channel number (1-18), 21 = none. }\r
+{ ### if ftype=2 --> trk_set: 1..18; type_value: 0 = normal 6 = 4op 7=unused }\r
+ end;\r
+const\r
+ id = 'FMK!';\r
+\r
+const\r
+ _conv_fmk_pan: array[0..2] of Byte = (1,0,2);\r
+\r
+type\r
+ tFIN_DATA = Record\r
+ dname: array[1..12] of Char;\r
+ iname: array[1..27] of Char;\r
+ idata: tFM_INST_DATA;\r
+ end;\r
+var\r
+ f: File;\r
+ header: tFMK_HEADER;\r
+ order_list: array[0..254] of Byte;\r
+ paraptr_ins: array[1..99] of Word;\r
+ paraptr_pat: array[0..63] of Longint;\r
+ paraptr_msg: Word;\r
+ insdata: tFIN_DATA;\r
+ temp,temp2,fpos_bak: Longint;\r
+ pat,row,chan,\r
+ desc_rows: Byte;\r
+ note,ins,vol,cmd,info: Byte;\r
+ patlen,index: Word;\r
+ dscbuf: array[0..PRED(20*24)] of Char;\r
+\r
+\r
+procedure import_fmk_event(pattern,line,channel,note,ins,vol,cmd,info: Byte);\r
+\r
+var\r
+ chunk: tCHUNK;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ If (ins in [1..99]) then chunk.instr_def := ins;\r
+\r
+ Case note of\r
+ 254: chunk.note := BYTE_NULL;\r
+ 255: chunk.note := 0;\r
+ else If (note AND $0f in [1..12]) then\r
+ chunk.note := 12*(note SHR 4)+(note AND $0f)\r
+ end;\r
+\r
+ If (vol <> BYTE_NULL) then\r
+ begin\r
+ chunk.effect_def2 := ef_ForceInsVolume;\r
+ chunk.effect2 := 63-max(vol,63)\r
+ end;\r
+\r
+ Case CHR(cmd+ORD('A')-1) of\r
+ { SET SPEED }\r
+ 'A': If (info <> 0) then\r
+ begin\r
+ chunk.effect_def := ef_SetSpeed;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { JUMP TO ORDER }\r
+ 'B': If (info <= 254) then\r
+ begin\r
+ chunk.effect_def := ef_PositionJump;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { CARRIER PARAM }\r
+ 'C': Case info DIV 16 of\r
+ 1: begin\r
+ chunk.effect_def := ef_Extended3;\r
+ chunk.effect := ef_ex3_SetMultipC*16+info MOD 16;\r
+ end;\r
+\r
+ 2: begin\r
+ chunk.effect_def := ef_Extended3;\r
+ chunk.effect := ef_ex3_SetKslC*16+(info MOD 16) AND 3;\r
+ end;\r
+\r
+ 3: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetAttckRateC*16+info MOD 16;\r
+ end;\r
+\r
+ 4: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetDecayRateC*16+info MOD 16;\r
+ end;\r
+\r
+ 5: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetSustnLevelC*16+info MOD 16;\r
+ end;\r
+\r
+ 6: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetRelRateC*16+info MOD 16;\r
+ end;\r
+\r
+ 7: begin\r
+ chunk.effect_def := ef_SetWaveform;\r
+ chunk.effect := info AND 7 SHL 4+$0f;\r
+ end;\r
+\r
+ 8: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetFeedback*16+info AND 7;\r
+ end;\r
+ end;\r
+\r
+ { VOLUME SLIDE }\r
+ 'D': { VOLUME SLIDE DOWN }\r
+ Case info DIV 16 of\r
+ { NORMAL }\r
+ 0: If (info MOD 16 = 0) then chunk.effect_def := temp_ef_XFVSlide\r
+ else begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_VolSlideDnXF*16+info MOD 16\r
+ end;\r
+ { FINE }\r
+ 15: begin\r
+ chunk.effect_def := ef_VolSlideFine;\r
+ chunk.effect := info MOD 16;\r
+ end;\r
+ else\r
+ { VOLUME SLIDE UP }\r
+ Case info MOD 16 of\r
+ { NORMAL }\r
+ 0: If (info DIV 16 = 0) then chunk.effect_def := temp_ef_XFVSlide\r
+ else begin\r
+ chunk.effect_def := ef_Extended2;\r
+ chunk.effect := ef_ex2_VolSlideUpXF*16+info DIV 16;\r
+ end;\r
+ { FINE }\r
+ 15: begin\r
+ chunk.effect_def := ef_VolSlideFine;\r
+ chunk.effect := info AND $0f0;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ { SLIDE DOWN }\r
+ 'E': Case info DIV 16 of\r
+ { NORMAL }\r
+ 0..14: begin\r
+ chunk.effect_def := ef_FSlideDown;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { FINE }\r
+ 15: begin\r
+ chunk.effect_def := ef_FSlideDownFine;\r
+ chunk.effect := info AND $0f;\r
+ end;\r
+ end;\r
+\r
+ { SLIDE UP }\r
+ 'F': Case info DIV 16 of\r
+ { NORMAL }\r
+ 0..14: begin\r
+ chunk.effect_def := ef_FSlideUp;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { FINE }\r
+ 15: begin\r
+ chunk.effect_def := ef_FSlideUpFine;\r
+ chunk.effect := info AND $0f;\r
+ end;\r
+ end;\r
+\r
+ { TONE PORTAMENTO }\r
+ 'G': begin\r
+ chunk.effect_def := ef_TonePortamento;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { VIBRATO }\r
+ 'H': begin\r
+ chunk.effect_def := ef_Vibrato;\r
+ If (info <> 0) and (info DIV 16 = 0) then\r
+ chunk.effect := $10+info AND $0f\r
+ else If (info <> 0) and (info MOD 16 = 0) then\r
+ chunk.effect := info AND $0f0+1\r
+ else chunk.effect := info;\r
+ end;\r
+\r
+ { RETRIG NOTE }\r
+ 'I': begin\r
+ chunk.effect_def := ef_RetrigNote;\r
+ If (info <> 0) then chunk.effect := max(info*2,255);\r
+ end;\r
+\r
+ { ARPEGGIO }\r
+ 'J': begin\r
+ chunk.effect_def := temp_ef_Arpeggio;\r
+ chunk.effect := info;\r
+ end;\r
+\r
+ { MODLATOR PARAM }\r
+ 'M': Case info DIV 16 of\r
+ 1: begin\r
+ chunk.effect_def := ef_Extended3;\r
+ chunk.effect := ef_ex3_SetMultipM*16+info MOD 16;\r
+ end;\r
+\r
+ 2: begin\r
+ chunk.effect_def := ef_Extended3;\r
+ chunk.effect := ef_ex3_SetKslM*16+(info MOD 16) AND 3;\r
+ end;\r
+\r
+ 3: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetAttckRateM*16+info MOD 16;\r
+ end;\r
+\r
+ 4: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetDecayRateM*16+info MOD 16;\r
+ end;\r
+\r
+ 5: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetSustnLevelM*16+info MOD 16;\r
+ end;\r
+\r
+ 6: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetRelRateM*16+info MOD 16;\r
+ end;\r
+\r
+ 7: begin\r
+ chunk.effect_def := ef_SetWaveform;\r
+ chunk.effect := $0f0+info AND 7;\r
+ end;\r
+\r
+ 8: begin\r
+ chunk.effect_def := ef_Extended;\r
+ chunk.effect := ef_ex_SetFeedback*16+info AND 7;\r
+ end;\r
+ end;\r
+\r
+ { SET VIBRATO/TREMOLO WAVEFORM }\r
+ 'N': ;\r
+\r
+ { BREAK PATTERN }\r
+ 'P': If (info < 64) then\r
+ begin\r
+ chunk.effect_def := ef_PatternBreak;\r
+ chunk.effect := Str2num(Num2str(info,16),10);\r
+ end;\r
+\r
+ { TREMOLO }\r
+ 'R': begin\r
+ chunk.effect_def := ef_Tremolo;\r
+ If (info <> 0) and (info DIV 16 = 0) then\r
+ chunk.effect := $10+info AND $0f\r
+ else If (info <> 0) and (info MOD 16 = 0) then\r
+ chunk.effect := info AND $0f0+1\r
+ else chunk.effect := info;\r
+ end;\r
+\r
+ { STEREO CONTROL }\r
+ 'S': If (header.glob_var AND 1 = 1) then\r
+ begin\r
+ chunk.effect_def := ef_Extended;\r
+ Case info of\r
+ 1: chunk.effect := ef_ex_SetPanningPos*16+1;\r
+ 2: chunk.effect := ef_ex_SetPanningPos*16+0;\r
+ 3: chunk.effect := ef_ex_SetPanningPos*16+2;\r
+ end;\r
+ end;\r
+\r
+ { MODULATOR VOLUME }\r
+ 'T': begin\r
+ chunk.effect_def := ef_SetModulatorVol;\r
+ chunk.effect := info AND $3f;\r
+ end;\r
+\r
+ { CARRIER VOLUME }\r
+ 'U': begin\r
+ chunk.effect_def := ef_SetCarrierVol;\r
+ chunk.effect := info AND $3f;\r
+ end;\r
+ end;\r
+\r
+ If (chunk.effect_def = 0) and (chunk.effect <> 0) then\r
+ chunk.effect := 0;\r
+ put_chunk(pattern,line,channel,chunk);\r
+end;\r
+\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.id = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ If (header.bytef4 <> $f4) or NOT (header.ftype in [1,2]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (header.ftype = 2) then\r
+ begin\r
+ SeekF(f,SizeOf(header)-2);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ If (header.ordnum <> 0) then\r
+ begin\r
+ BlockReadF(f,order_list,header.ordnum,temp);\r
+ If (IOresult <> 0) or (temp <> header.ordnum) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ BlockReadF(f,paraptr_msg,SizeOf(paraptr_msg),temp);\r
+ If (IOresult <> 0) or (temp <> SizeOf(paraptr_msg)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ fpos_bak := FilePos(f);\r
+ If (paraptr_msg <> 0) then\r
+ begin\r
+ SeekF(f,paraptr_msg);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,desc_rows,SizeOf(desc_rows),temp);\r
+ If (IOresult <> 0) or (temp <> SizeOf(desc_rows)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (desc_rows <> 0) then\r
+ begin\r
+ BlockReadF(f,dscbuf,desc_rows*20,temp);\r
+ If (IOresult <> 0) or (temp <> desc_rows*20) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ end;\r
+\r
+ SeekF(f,fpos_bak);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (header.insnum <> 0) then\r
+ begin\r
+ BlockReadF(f,paraptr_ins,header.insnum*2,temp);\r
+ If (IOresult <> 0) or (temp <> header.insnum*2) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ If (header.patnum <> 0) then\r
+ begin\r
+ BlockReadF(f,paraptr_pat,header.patnum*4,temp);\r
+ If (IOresult <> 0) or (temp <> header.patnum*4) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ If (header.init_spd <> 0) then speed := header.init_spd\r
+ else speed := 1;\r
+\r
+ If (header.base_spd <> 0) then tempo := header.base_spd\r
+ else tempo := 50;\r
+\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+ songdata.songname := truncate_string(header.songname);\r
+ songdata.composer := truncate_string(header.composer);\r
+ songdata.common_flag := songdata.common_flag OR 1;\r
+ songdata.common_flag := songdata.common_flag OR 2;\r
+ songdata.common_flag := songdata.common_flag OR $80;\r
+\r
+ For temp := 18 downto 1 do\r
+ If NOT (header.trk_set[temp] AND 7 = 7) then BREAK;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := temp\r
+ else If (songdata.nm_tracks < 18) then songdata.nm_tracks := 18;\r
+\r
+ For temp2 := 1 to temp do\r
+ If (header.trk_set[temp2] AND 7 = 6) then\r
+ Case temp2 of\r
+ 1,2: songdata.flag_4op := songdata.flag_4op OR 1;\r
+ 3,4: songdata.flag_4op := songdata.flag_4op OR 2;\r
+ 5,6: songdata.flag_4op := songdata.flag_4op OR 4;\r
+ 10,11: songdata.flag_4op := songdata.flag_4op OR 8;\r
+ 12,13: songdata.flag_4op := songdata.flag_4op OR $10;\r
+ 14,15: songdata.flag_4op := songdata.flag_4op OR $20;\r
+ end;\r
+\r
+ If (header.glob_var AND 1 = 1) then\r
+ songdata.common_flag := songdata.common_flag OR $20;\r
+\r
+ If (header.glob_var SHR 3 AND 1 = 1) then\r
+ songdata.common_flag := songdata.common_flag OR 8;\r
+\r
+ If (header.glob_var SHR 4 AND 1 = 1) then\r
+ songdata.common_flag := songdata.common_flag OR $10;\r
+\r
+ import_old_flags;\r
+ If (header.glob_var AND 1 = 1) then\r
+ begin\r
+ Inc(songdata.lock_flags[1], _conv_fmk_pan[header.trk_pan[1] AND 3]);\r
+ Inc(songdata.lock_flags[2], _conv_fmk_pan[header.trk_pan[1] SHR 2 AND 3]);\r
+ Inc(songdata.lock_flags[3], _conv_fmk_pan[header.trk_pan[1] SHR 4 AND 3]);\r
+ Inc(songdata.lock_flags[4], _conv_fmk_pan[header.trk_pan[1] SHR 6 AND 3]);\r
+ Inc(songdata.lock_flags[5], _conv_fmk_pan[header.trk_pan[2] AND 3]);\r
+ Inc(songdata.lock_flags[6], _conv_fmk_pan[header.trk_pan[2] SHR 2 AND 3]);\r
+ Inc(songdata.lock_flags[7], _conv_fmk_pan[header.trk_pan[2] SHR 4 AND 3]);\r
+ Inc(songdata.lock_flags[8], _conv_fmk_pan[header.trk_pan[2] SHR 6 AND 3]);\r
+ Inc(songdata.lock_flags[9], _conv_fmk_pan[header.trk_pan[3] AND 3]);\r
+ Inc(songdata.lock_flags[10],_conv_fmk_pan[header.trk_pan[3] SHR 2 AND 3]);\r
+ Inc(songdata.lock_flags[11],_conv_fmk_pan[header.trk_pan[3] SHR 4 AND 3]);\r
+ Inc(songdata.lock_flags[12],_conv_fmk_pan[header.trk_pan[3] SHR 6 AND 3]);\r
+ Inc(songdata.lock_flags[13],_conv_fmk_pan[header.trk_pan[4] AND 3]);\r
+ Inc(songdata.lock_flags[14],_conv_fmk_pan[header.trk_pan[4] SHR 2 AND 3]);\r
+ Inc(songdata.lock_flags[15],_conv_fmk_pan[header.trk_pan[4] SHR 4 AND 3]);\r
+ Inc(songdata.lock_flags[16],_conv_fmk_pan[header.trk_pan[4] SHR 6 AND 3]);\r
+ Inc(songdata.lock_flags[17],_conv_fmk_pan[header.trk_pan[5] AND 3]);\r
+ Inc(songdata.lock_flags[18],_conv_fmk_pan[header.trk_pan[5] SHR 2 AND 3]);\r
+ end;\r
+\r
+ For temp := 1 to max(header.ordnum,128) do\r
+ Case order_list[temp-1] of\r
+ 255: songdata.pattern_order[temp-1] := $80;\r
+ else songdata.pattern_order[temp-1] := order_list[temp-1];\r
+ end;\r
+\r
+ For temp := 1 to header.insnum do\r
+ begin\r
+ SeekF(f,paraptr_ins[temp]);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,insdata,SizeOf(insdata),temp2);\r
+ If (IOresult <> 0) or (temp2 <> SizeOf(insdata)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (truncate_string(insdata.iname) <> '') then\r
+ songdata.instr_names[temp] :=\r
+ Copy(songdata.instr_names[temp],1,9)+\r
+ Copy(truncate_string(insdata.iname),1,32)\r
+ else\r
+ songdata.instr_names[temp] :=\r
+ Copy(songdata.instr_names[temp],1,9)+\r
+ truncate_string(insdata.dname);\r
+\r
+ import_fin_instrument(temp,insdata.idata);\r
+ end;\r
+\r
+ For pat := 0 to PRED(header.patnum) do\r
+ begin\r
+ SeekF(f,paraptr_pat[pat]);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (paraptr_pat[pat] = 0) then CONTINUE;\r
+ BlockReadF(f,patlen,SizeOf(patlen),temp2);\r
+ If (temp2 <> SizeOf(patlen)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If (patlen = 0) then CONTINUE;\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,buf1,patlen,temp2);\r
+\r
+ index := 0;\r
+ row := 0;\r
+\r
+ Repeat\r
+ If (buf1[index] <> 0) then\r
+ begin\r
+ note := BYTE_NULL;\r
+ ins := 0;\r
+ vol := BYTE_NULL;\r
+ cmd := 0;\r
+ info := 0;\r
+ temp := buf1[index];\r
+ Inc(index);\r
+\r
+ chan := SUCC(temp AND 31);\r
+ If (temp OR $20 = temp) then\r
+ begin\r
+ note := buf1[index];\r
+ Inc(index);\r
+ ins := buf1[index];\r
+ Inc(index);\r
+ end;\r
+\r
+ If (temp OR $40 = temp) then\r
+ begin\r
+ vol := buf1[index];\r
+ Inc(index);\r
+ end;\r
+\r
+ If (temp OR $80 = temp) then\r
+ begin\r
+ cmd := buf1[index];\r
+ Inc(index);\r
+ info := buf1[index];\r
+ Inc(index);\r
+ end;\r
+\r
+ If (PRED(chan) in [1..18]) then\r
+ import_fmk_event(pat,row,PRED(chan),note,ins,vol,cmd,info);\r
+ end\r
+ else\r
+ begin\r
+ Inc(row);\r
+ Inc(index);\r
+ end;\r
+ until (row = 64);\r
+ end;\r
+\r
+ fix_fmk_commands(header.patnum);\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ load_flag := 13;\r
+end;\r
+\r
+procedure import_sat_instrument(inst: Byte; var data);\r
+begin\r
+ With songdata.instr_data[inst] do\r
+ begin\r
+ fm_data.FEEDBACK_FM := tDUMMY_BUFF(data)[0] AND $0f;\r
+ fm_data.AM_VIB_EG_modulator := tDUMMY_BUFF(data)[1];\r
+ fm_data.AM_VIB_EG_carrier := tDUMMY_BUFF(data)[2];\r
+ fm_data.ATTCK_DEC_modulator := tDUMMY_BUFF(data)[3];\r
+ fm_data.ATTCK_DEC_carrier := tDUMMY_BUFF(data)[4];\r
+ fm_data.SUSTN_REL_modulator := tDUMMY_BUFF(data)[5];\r
+ fm_data.SUSTN_REL_carrier := tDUMMY_BUFF(data)[6];\r
+ fm_data.WAVEFORM_modulator := tDUMMY_BUFF(data)[7] AND 3;\r
+ fm_data.WAVEFORM_carrier := tDUMMY_BUFF(data)[8] AND 3;\r
+ fm_data.KSL_VOLUM_modulator := tDUMMY_BUFF(data)[9];\r
+ fm_data.KSL_VOLUM_carrier := tDUMMY_BUFF(data)[10];\r
+ end;\r
+\r
+ songdata.instr_data[inst].panning := 0;\r
+ songdata.instr_data[inst].fine_tune := 0;\r
+end;\r
+\r
+function import_sat_instrument_name(var data; inst: Byte): String;\r
+\r
+var\r
+ temp1: Word;\r
+ temp2: Byte;\r
+ temp3: String;\r
+\r
+begin\r
+ temp1 := 0;\r
+ temp2 := 0;\r
+ temp3 := '';\r
+\r
+ While (temp1 < 496) do\r
+ begin\r
+ If (tDUMMY_BUFF(data)[temp1] = BYTE('\10')) then Inc(temp2);\r
+ Inc(temp1);\r
+ If (temp2 = inst+1) then\r
+ begin\r
+ While (tDUMMY_BUFF(data)[temp1] in [$20..$0ff]) and\r
+ (Length(temp3) < 22) do\r
+ begin\r
+ temp3 := temp3+CHR(tDUMMY_BUFF(data)[temp1]);\r
+ Inc(temp1);\r
+ end;\r
+ BREAK;\r
+ end;\r
+ end;\r
+\r
+ import_sat_instrument_name := temp3;\r
+end;\r
+\r
+procedure import_sa2_effect(effect,def1,def2: Byte;\r
+ var out1,out2: Byte); forward;\r
+procedure sat_file_loader;\r
+\r
+type\r
+ tHEADER = Record { version 1 }\r
+ ident: array[1..4] of Char; { ident_string }\r
+ vernm: Byte; { version_number (1) }\r
+ instt: array[0..$1e] of { 31_instruments }\r
+ array[0..$0a] of Byte;\r
+ instn: array[0..495] of Byte; { 31_instrument_names }\r
+ order: array[0..254] of Byte; { pattern_order }\r
+ nopat: Word; { number of patterns }\r
+ snlen: Byte; { song_length }\r
+ rspos: Byte; { restart_position }\r
+ calls: Word; { calls_per_second }\r
+ end;\r
+type\r
+ tHEADR2 = Record { version 6 }\r
+ ident: array[1..4] of Char; { ident_string }\r
+ vernm: Byte; { version_number (1) }\r
+ instt: array[0..$1e] of { 31_instruments }\r
+ array[0..$0e] of Byte;\r
+ instn: array[0..495] of Byte; { 31_instrument_names }\r
+ order: array[0..$7f] of Byte; { pattern_order }\r
+ nopat: Word; { number of patterns }\r
+ snlen: Byte; { song_length }\r
+ rspos: Byte; { restart_position }\r
+ calls: Word; { calls_per_second }\r
+ arpgd: array[1..512] of Byte; { arpeggio_data }\r
+ end;\r
+const\r
+ id = 'SAdT';\r
+\r
+var\r
+ f: File;\r
+ header: tHEADER;\r
+ headr2: tHEADR2;\r
+ SATver: Byte;\r
+ temp,tmp2,tmp3,temp2,temp3,\r
+ temp4,temp5: Longint;\r
+ byte1,byte2,byte3,byte4,byte5,note_inc: Byte;\r
+\r
+procedure import_sat_event(pattern,line,channel,\r
+ byte1,byte2,byte3,byte4,byte5: Byte);\r
+var\r
+ chunk: tCHUNK;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ If (byte2 in [1..31]) then chunk.instr_def := byte2;\r
+ If (byte1 in [1..12*8+1]) then chunk.note := byte1+note_inc;\r
+\r
+ import_sa2_effect(byte3,byte4,byte5,chunk.effect_def,chunk.effect);\r
+ If (chunk.effect_def = ef_Extended) and\r
+ (chunk.effect = ef_ex_ExtendedCmd*16) and (chunk.note = 0) then\r
+ begin\r
+ chunk.note := BYTE_NULL;\r
+ chunk.effect_def := 0;\r
+ chunk.effect := 0;\r
+ end;\r
+\r
+ put_chunk(pattern,line,channel,chunk);\r
+end;\r
+\r
+var\r
+ absolute: Longint;\r
+\r
+function get_byte(var pos: Longint): Byte;\r
+begin\r
+ If (pos = SizeOf(buf1)-5) then\r
+ begin\r
+ If NOT (absolute > SizeOf(buf1)-5) then Move(buf3,buf1,SizeOf(buf3)-5)\r
+ else Move(buf4,buf1,SizeOf(buf4)-5);\r
+ pos := 0;\r
+ end;\r
+ get_byte := buf1[pos];\r
+ Inc(pos);\r
+ Inc(absolute);\r
+end;\r
+\r
+begin\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If NOT (header.vernm in [1,5,6]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ SATver := header.vernm;\r
+ If (SATver in [5,6]) then\r
+ begin\r
+ SeekF(f,0);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,headr2,SizeOf(headr2),temp);\r
+ If (temp <> SizeOf(headr2)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ temp5 := (FileSize(f)-temp) DIV (64*9*5);\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,buf1,SizeOf(buf1)-5,temp);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ tmp2 := WORD_NULL;\r
+ If (temp = SizeOf(buf1)-5) then\r
+ begin\r
+ FillChar(buf3,SizeOf(buf3),0);\r
+ BlockReadF(f,buf3,SizeOf(buf3)-5,tmp2);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ tmp3 := WORD_NULL;\r
+ If (tmp2 = SizeOf(buf3)-5) then\r
+ begin\r
+ FillChar(buf4,SizeOf(buf4),0);\r
+ BlockReadF(f,buf4,SizeOf(buf4)-5,tmp3);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.common_flag := songdata.common_flag OR 8;\r
+ songdata.common_flag := songdata.common_flag OR $10;\r
+ import_old_flags;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ For temp := 1 to 20 do\r
+ songdata.lock_flags[temp] := songdata.lock_flags[temp] OR 4 OR 8;\r
+\r
+ If (SATver = 1) then\r
+ begin\r
+ speed := 6;\r
+ If (header.calls < 255) then tempo := header.calls\r
+ else tempo := 255;\r
+\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+\r
+ For temp := 0 to max(header.snlen-1,127) do\r
+ If (temp < 128) and (header.order[temp] in [0..63]) then\r
+ songdata.pattern_order[temp] := header.order[temp];\r
+ If (header.rspos < 128) and (SUCC(temp) < 128) then\r
+ songdata.pattern_order[SUCC(temp)] := $80+header.rspos;\r
+\r
+ temp5 := max(temp5,header.nopat);\r
+ For temp := 0 to $1e do\r
+ begin\r
+ import_sat_instrument(temp+1,header.instt[temp]);\r
+ songdata.instr_names[temp+1] :=\r
+ Copy(songdata.instr_names[temp+1],1,9)+\r
+ truncate_string(import_sat_instrument_name(header.instn,temp));\r
+ end;\r
+ end\r
+ else\r
+ begin\r
+ speed := 6;\r
+ If (headr2.calls < 255) then tempo := headr2.calls\r
+ else tempo := 255;\r
+\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+\r
+ For temp := 0 to headr2.snlen-1 do\r
+ If (temp < 128) and (headr2.order[temp] in [0..63]) then\r
+ songdata.pattern_order[temp] := headr2.order[temp];\r
+ If (headr2.rspos < 128) and (SUCC(temp) < 128) then\r
+ songdata.pattern_order[SUCC(temp)] := $80+headr2.rspos;\r
+\r
+ temp5 := max(temp5,headr2.nopat);\r
+ For temp := 0 to $1e do\r
+ begin\r
+ import_sat_instrument(temp+1,headr2.instt[temp]);\r
+ songdata.instr_names[temp+1] :=\r
+ Copy(songdata.instr_names[temp+1],1,9)+\r
+ truncate_string(import_sat_instrument_name(headr2.instn,temp));\r
+ end;\r
+ end;\r
+\r
+ temp := 0;\r
+ absolute := 0;\r
+\r
+ Case SATver of\r
+ 1: note_inc := 24;\r
+ 5: note_inc := 12;\r
+ 6: note_inc := 0;\r
+ end;\r
+\r
+ For temp2 := 0 to temp5-1 do\r
+ For temp3 := 0 to 63 do\r
+ For temp4 := 1 to 9 do\r
+ begin\r
+ byte1 := get_byte(temp);\r
+ byte2 := get_byte(temp);\r
+ byte3 := get_byte(temp);\r
+ byte4 := get_byte(temp);\r
+ byte5 := get_byte(temp);\r
+ import_sat_event(temp2,temp3,temp4,byte1,byte2,byte3,byte4,byte5);\r
+ end;\r
+\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ load_flag := 14;\r
+end;\r
+\r
+function _sal(op1,op2: Word): Byte;\r
+\r
+var\r
+ result: Byte;\r
+\r
+begin\r
+ asm\r
+ mov ax,op1\r
+ mov cx,op2\r
+ sal ax,cl\r
+ mov result,al\r
+ end;\r
+ _sal := result;\r
+end;\r
+\r
+function _sar(op1,op2: Word): Byte;\r
+\r
+var\r
+ result: Byte;\r
+\r
+begin\r
+ asm\r
+ mov ax,op1\r
+ mov cx,op2\r
+ sar ax,cl\r
+ mov result,al\r
+ end;\r
+ _sar := result;\r
+end;\r
+\r
+procedure import_sa2_effect(effect,def1,def2: Byte;\r
+ var out1,out2: Byte);\r
+begin\r
+ Case effect of\r
+ { NORMAL PLAY OR ARPEGGIO }\r
+ $00: begin\r
+ out1 := ef_Arpeggio;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { SLIDE UP }\r
+ $01: begin\r
+ out1 := ef_FSlideUp;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { SLIDE DOWN }\r
+ $02: begin\r
+ out1 := ef_FSlideDown;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { TONE PORTAMENTO }\r
+ $03: begin\r
+ out1 := ef_TonePortamento;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { VIBRATO }\r
+ $04: begin\r
+ out1 := ef_Vibrato;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { TONE PORTAMENTO + VOLUME SLIDE }\r
+ $05: If (def1+def2 <> 0) then\r
+ If (def1 in [1..15]) then\r
+ begin\r
+ out1 := ef_TPortamVolSlide;\r
+ out2 := min(_sar(def1,2),1)*16;\r
+ end\r
+ else begin\r
+ out1 := ef_TPortamVolSlide;\r
+ out2 := min(_sar(def2,2),1);\r
+ end\r
+ else\r
+ begin\r
+ out1 := ef_TPortamVolSlide;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { VIBRATO + VOLUME SLIDE }\r
+ $06: If (def1+def2 <> 0) then\r
+ If (def1 in [1..15]) then\r
+ begin\r
+ out1 := ef_VibratoVolSlide;\r
+ out2 := min(_sar(def1,2),1)*16;\r
+ end\r
+ else begin\r
+ out1 := ef_VibratoVolSlide;\r
+ out2 := min(_sar(def2,2),1);\r
+ end\r
+ else\r
+ begin\r
+ out1 := ef_VibratoVolSlide;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { RELEASE SUSTAINING SOUND }\r
+ $08: begin\r
+ out1 := ef_Extended;\r
+ out2 := ef_ex_ExtendedCmd*16+0;\r
+ end;\r
+\r
+ { VOLUME SLIDE }\r
+ $0a: If (def1+def2 <> 0) then\r
+ If (def1 in [1..15]) then\r
+ begin\r
+ out1 := ef_VolSlide;\r
+ out2 := min(_sar(def1,2),1)*16;\r
+ end\r
+ else begin\r
+ out1 := ef_VolSlide;\r
+ out2 := min(_sar(def2,2),1);\r
+ end\r
+ else\r
+ begin\r
+ out1 := ef_VolSlide;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { POSITION JUMP }\r
+ $0b: If (def1*16+def2 < 128) then\r
+ begin\r
+ out1 := ef_PositionJump;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { SET VOLUME }\r
+ $0c: begin\r
+ out1 := ef_SetInsVolume;\r
+ out2 := def1*16+def2;\r
+ If (out2 > 63) then out2 := 63;\r
+ end;\r
+\r
+ { PATTERN BREAK }\r
+ $0d: If (def1*16+def2 < 64) then\r
+ begin\r
+ out1 := ef_PatternBreak;\r
+ out2 := def1*16+def2;\r
+ end;\r
+\r
+ { SET SPEED }\r
+ $0f: If (def1*16+def2 < $20) then\r
+ begin\r
+ out1 := ef_SetSpeed;\r
+ out2 := def1*16+def2;\r
+ end\r
+ else If (def1 < 16) and (def2 < 16) then\r
+ begin\r
+ out1 := ef_SetTempo;\r
+ out2 := Round((def1*16+def2)/2.5);\r
+ end;\r
+ else begin\r
+ out1 := 0;\r
+ out2 := 0;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure sa2_file_loader;\r
+\r
+type\r
+ tHEADER = Record\r
+ ident: array[1..4] of Char; { These bytes mark a song }\r
+ vernm: Byte; { Version number (9) }\r
+ instt: array[0..$1e] of { 31 instruments }\r
+ array[0..$0e] of Byte;\r
+ instn: array[0..495] of Byte; { 31_instrument_names }\r
+ order: array[0..$7f] of Byte; { Pattern order }\r
+ nopat: Word; { Number of patterns }\r
+ snlen: Byte; { Length of song }\r
+ rspos: Byte; { Restart position }\r
+ snbpm: Word; { BPM }\r
+ arpgd: array[1..512] of Byte; { Arpeggio data (list+commands) }\r
+ ordr2: array[0..63] of { Track order }\r
+ array[1..9] of Byte;\r
+ chans: Word; { Active channels }\r
+ end;\r
+const\r
+ id = 'SAdT';\r
+\r
+var\r
+ f: File;\r
+ header: tHEADER;\r
+ temp,temp2,temp3,temp4,temp5: Longint;\r
+\r
+procedure import_sa2_event(pattern,line,channel,\r
+ byte1,byte2,byte3: Byte);\r
+var\r
+ chunk: tCHUNK;\r
+ temp: Byte;\r
+\r
+begin\r
+ FillChar(chunk,SizeOf(chunk),0);\r
+ temp := (byte1 AND 1) SHL 4 +(byte2 SHR 4);\r
+ If (temp in [1..31]) then chunk.instr_def := temp;\r
+ If (byte1 SHR 1 in [1..12*8+1]) then chunk.note := (byte1 SHR 1);\r
+\r
+ import_sa2_effect(byte2 AND $0f,byte3 SHR 4,byte3 AND $0f,\r
+ chunk.effect_def,chunk.effect);\r
+ If (chunk.effect_def = ef_Extended) and\r
+ (chunk.effect = ef_ex_ExtendedCmd*16) and (chunk.note = 0) then\r
+ begin\r
+ chunk.note := BYTE_NULL;\r
+ chunk.effect_def := 0;\r
+ chunk.effect := 0;\r
+ end;\r
+\r
+ put_chunk(pattern,line,channel,chunk);\r
+end;\r
+\r
+begin { sa2_file_loader }\r
+ {$i-}\r
+ Assign(f,songdata_source);\r
+ ResetF(f);\r
+ {$i+}\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ BlockReadF(f,header,SizeOf(header),temp);\r
+ If NOT ((temp = SizeOf(header)) and (header.ident = id)) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ If NOT (header.vernm in [8,9]) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ load_flag := $7f;\r
+ If (header.vernm = 8) then\r
+ begin\r
+ SeekF(f,FilePos(f)-2);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+ end;\r
+\r
+ FillChar(buf1,SizeOf(buf1),0);\r
+ BlockReadF(f,buf1,SizeOf(buf1)-3,temp);\r
+ If (IOresult <> 0) then\r
+ begin\r
+ CloseF(f);\r
+ EXIT;\r
+ end;\r
+\r
+ init_songdata;\r
+ load_flag := 0;\r
+\r
+ songdata.common_flag := songdata.common_flag OR 8;\r
+ songdata.common_flag := songdata.common_flag OR $10;\r
+ import_old_flags;\r
+\r
+ songdata.patt_len := 64;\r
+ If adjust_tracks then songdata.nm_tracks := 9\r
+ else If (songdata.nm_tracks < 9) then songdata.nm_tracks := 9;\r
+\r
+ For temp := 1 to 20 do\r
+ songdata.lock_flags[temp] := songdata.lock_flags[temp] OR 4 OR 8;\r
+\r
+ speed := 6;\r
+ If (Round(header.snbpm/2.5) < 255) then tempo := Round(header.snbpm/2.5)\r
+ else tempo := 255;\r
+\r
+ songdata.tempo := tempo;\r
+ songdata.speed := speed;\r
+\r
+ temp2 := 0;\r
+ temp3 := 0;\r
+ temp4 := 1;\r
+\r
+ Repeat\r
+ While (header.ordr2[temp2][temp4] = 0) and\r
+ (temp2 <= header.nopat-1) do\r
+ begin\r
+ Inc(temp4);\r
+ If (temp4 > 9) then begin temp4 := 1; Inc(temp2); end;\r
+ end;\r
+\r
+ If (temp2 <= header.nopat-1) then\r
+ begin\r
+ temp5 := 64*3*(header.ordr2[temp2][temp4]-1)+temp3*3;\r
+ import_sa2_event(temp2,temp3,temp4,buf1[temp5],\r
+ buf1[temp5+1],\r
+ buf1[temp5+2]);\r
+ Inc(temp3);\r
+ If (temp3 > $3f) then\r
+ begin\r
+ temp3 := 0;\r
+ If (temp4 < 9) then Inc(temp4)\r
+ else begin temp4 := 1; Inc(temp2); end;\r
+ end;\r
+ end;\r
+ until (temp2 > header.nopat-1);\r
+\r
+ For temp := 0 to header.snlen-1 do\r
+ If (temp < 128) and (header.order[temp] in [0..63]) then\r
+ songdata.pattern_order[temp] := header.order[temp];\r
+ If (header.rspos < 128) and (SUCC(temp) < 128) then\r
+ songdata.pattern_order[SUCC(temp)] := $80+header.rspos;\r
+\r
+ For temp := 0 to $1e do\r
+ begin\r
+ import_sat_instrument(temp+1,header.instt[temp]);\r
+ songdata.instr_names[temp+1] := Copy(songdata.instr_names[temp+1],1,9)+\r
+ truncate_string(import_sat_instrument_name(header.instn,temp));\r
+ end;\r
+\r
+ CloseF(f);\r
+ songdata_title := NameOnly(songdata_source);\r
+ load_flag := 15;\r
+end;\r
--- /dev/null
+@echo off\r
+del adt2play.exe >nul\r
+echo Compiling ADT2PLAY...\r
+tmtpc -$MAP+ -$W- adt2play >!log\r
--- /dev/null
+unit StringIO;\r
+interface\r
+\r
+type\r
+ characters = Set of Char;\r
+\r
+function Capitalize(str: String): String;\r
+function Upper(str: String): String;\r
+function Lower(str: String): String;\r
+function iCASE(str: String): String;\r
+function RotStrL(str1,str2: String; shift: Byte): String;\r
+function RotStrR(str1,str2: String; shift: Byte): String;\r
+function ExpStrL(str: String; size: Byte; chr: Char): String;\r
+function ExpStrR(str: String; size: Byte; chr: Char): String;\r
+function DietStr(str: String; size: Byte): String;\r
+function CutStr(str: String): String;\r
+function FlipStr(str: String): String;\r
+function FilterStr(str: String; chr0,chr1: Char): String;\r
+function FilterStr2(str: String; chr0: characters; chr1: Char): String;\r
+function Num2str(num: Longint; base: Byte): String;\r
+function Str2num(str: String; base: Byte): Longint;\r
+\r
+type\r
+ tINPUT_STR_SETTING = Record\r
+ insert_mode,\r
+ replace_enabled,\r
+ append_enabled: Boolean;\r
+ character_set,\r
+ valid_chars,\r
+ word_characters: characters;\r
+ terminate_keys: array[1..50] of Word\r
+ end;\r
+type\r
+ tINPUT_STR_ENVIRONMENT = Record\r
+ keystroke: Word;\r
+ locate_pos: Byte;\r
+ end;\r
+const\r
+ is_setting: tINPUT_STR_SETTING =\r
+ (insert_mode: TRUE;\r
+ replace_enabled: TRUE;\r
+ append_enabled: TRUE;\r
+ character_set: [#$20..#$0ff];\r
+ valid_chars: [#$20..#$0ff];\r
+ word_characters: ['A'..'Z','a'..'z','0'..'9','_'];\r
+ terminate_keys: ($011b,$1c0d,$0000,$0000,$0000,\r
+ $0000,$0000,$0000,$0000,$0000,\r
+ $0000,$0000,$0000,$0000,$0000,\r
+ $0000,$0000,$0000,$0000,$0000,\r
+ $0000,$0000,$0000,$0000,$0000,\r
+ $0000,$0000,$0000,$0000,$0000,\r
+ $0000,$0000,$0000,$0000,$0000,\r
+ $0000,$0000,$0000,$0000,$0000,\r
+ $0000,$0000,$0000,$0000,$0000,\r
+ $0000,$0000,$0000,$0000,$0000));\r
+var\r
+ is_environment: tINPUT_STR_ENVIRONMENT;\r
+\r
+function InputStr(s: String; x,y,ln,ln1: Byte; atr1,atr2: Byte): String;\r
+function SameName(str1,str2: String): Boolean;\r
+function PathOnly(path: String): String;\r
+function NameOnly(path: String): String;\r
+function BaseNameOnly(path: String): String;\r
+function ExtOnly(path: String): String;\r
+\r
+implementation\r
+\r
+uses\r
+ DOS,TxtScrIO;\r
+\r
+function Capitalize(str: String): String; assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,@result\r
+ mov al,[esi]\r
+ inc esi\r
+ mov [edi],al\r
+ inc edi\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@4\r
+ mov al,[esi]\r
+ inc esi\r
+ cmp al,'a'\r
+ jb @@0\r
+ cmp al,'z'\r
+ ja @@0\r
+ sub al,20h\r
+@@0: mov [edi],al\r
+ inc edi\r
+@@1: mov ah,al\r
+ mov al,[esi]\r
+ inc esi\r
+ cmp ah,' '\r
+ jnz @@2\r
+ cmp al,'a'\r
+ jb @@2\r
+ cmp al,'z'\r
+ ja @@2\r
+ sub al,20h\r
+ jmp @@3\r
+@@2: cmp al,'A'\r
+ jb @@3\r
+ cmp al,'Z'\r
+ ja @@3\r
+ add al,20h\r
+@@3: mov [edi],al\r
+ inc edi\r
+ loop @@1\r
+@@4:\r
+end;\r
+\r
+function Upper(str: String): String; assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,@result\r
+ mov al,[esi]\r
+ inc esi\r
+ mov [edi],al\r
+ inc edi\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@3\r
+@@1: mov al,[esi]\r
+ inc esi\r
+ cmp al,'a'\r
+ jb @@2\r
+ cmp al,'z'\r
+ ja @@2\r
+ sub al,20h\r
+@@2: mov [edi],al\r
+ inc edi\r
+ loop @@1\r
+@@3:\r
+end;\r
+\r
+function Lower(str: String): String; assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,@result\r
+ mov al,[esi]\r
+ inc esi\r
+ mov [edi],al\r
+ inc edi\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@3\r
+@@1: mov al,[esi]\r
+ inc esi\r
+ cmp al,'A'\r
+ jb @@2\r
+ cmp al,'Z'\r
+ ja @@2\r
+ add al,20h\r
+@@2: mov [edi],al\r
+ inc edi\r
+ loop @@1\r
+@@3:\r
+end;\r
+\r
+function iCase(str: String): String; assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,@result\r
+ mov al,[esi]\r
+ inc esi\r
+ mov [edi],al\r
+ inc edi\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@5\r
+ push edi\r
+ push ecx\r
+@@1: mov al,[esi]\r
+ inc esi\r
+ cmp al,'a'\r
+ jb @@2\r
+ cmp al,'z'\r
+ ja @@2\r
+ sub al,20h\r
+@@2: mov [edi],al\r
+ inc edi\r
+ loop @@1\r
+ pop ecx\r
+ pop edi\r
+@@3: mov al,[edi]\r
+ cmp al,'i'-20h\r
+ jnz @@4\r
+ add al,20h\r
+@@4: mov [edi],al\r
+ inc edi\r
+ loop @@3\r
+@@5:\r
+end;\r
+\r
+function RotStrL(str1,str2: String; shift: Byte): String;\r
+begin\r
+ RotStrL := Copy(str1,shift+1,Length(str1)-shift)+\r
+ Copy(str2,1,shift);\r
+end;\r
+\r
+function RotStrR(str1,str2: String; shift: Byte): String;\r
+begin\r
+ RotStrR := Copy(str2,Length(str2)-shift+1,shift)+\r
+ Copy(str1,1,Length(str1)-shift);\r
+end;\r
+\r
+function ExpStrL(str: String; size: Byte; chr: Char): String; assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,@result\r
+ cld\r
+ xor ecx,ecx\r
+ lodsb\r
+ cmp al,size\r
+ jge @@1\r
+ mov ah,al\r
+ mov al,size\r
+ stosb\r
+ mov al,ah\r
+ mov cl,size\r
+ sub cl,al\r
+ mov al,chr\r
+ rep stosb\r
+ mov cl,ah\r
+ rep movsb\r
+ jmp @@2\r
+@@1: stosb\r
+ mov cl,al\r
+ rep movsb\r
+@@2:\r
+end;\r
+\r
+function ExpStrR(str: String; size: Byte; chr: Char): String; assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,@result\r
+ cld\r
+ xor ecx,ecx\r
+ lodsb\r
+ cmp al,size\r
+ jge @@1\r
+ mov ah,al\r
+ mov al,size\r
+ stosb\r
+ mov cl,ah\r
+ rep movsb\r
+ mov al,ah\r
+ mov cl,size\r
+ sub cl,al\r
+ mov al,chr\r
+ rep stosb\r
+ jmp @@2\r
+@@1: stosb\r
+ mov cl,al\r
+ rep movsb\r
+@@2:\r
+end;\r
+\r
+function DietStr(str: String; size: Byte): String;\r
+begin\r
+ If (Length(str) <= size) then\r
+ begin\r
+ DietStr := str;\r
+ EXIT;\r
+ end;\r
+\r
+ Repeat\r
+ Delete(str,size DIV 2,1)\r
+ until (Length(str)+3 = size);\r
+\r
+ Insert('...',str,size DIV 2);\r
+ DietStr := str\r
+end;\r
+\r
+function CutStr(str: String): String;\r
+begin\r
+ While (str[0] <> #0) and (str[1] in [#00,#32]) do Delete(str,1,1);\r
+ While (str[0] <> #0) and (str[Length(str)] in [#00,#32]) do Delete(str,Length(str),1);\r
+ CutStr := str;\r
+end;\r
+\r
+function FlipStr(str: String): String; assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,@result\r
+ mov al,[esi]\r
+ inc esi\r
+ mov [edi],al\r
+ inc edi\r
+ dec edi\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@2\r
+ add edi,ecx\r
+@@1: mov al,[esi]\r
+ inc esi\r
+ mov [edi],al\r
+ dec edi\r
+ loop @@1\r
+@@2:\r
+end;\r
+\r
+function FilterStr(str: String; chr0,chr1: Char): String; assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,@result\r
+ mov al,[esi]\r
+ inc esi\r
+ mov [edi],al\r
+ inc edi\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@3\r
+@@1: mov al,[esi]\r
+ inc esi\r
+ cmp al,chr0\r
+ jnz @@2\r
+ mov al,chr1\r
+@@2: mov [edi],al\r
+ inc edi\r
+ loop @@1\r
+@@3:\r
+end;\r
+\r
+const\r
+ _treat_char: array[$80..$a5] of Char =\r
+ 'CueaaaaceeeiiiAAE_AooouuyOU_____aiounN';\r
+\r
+function FilterStr2(str: String; chr0: characters; chr1: Char): String;\r
+\r
+var\r
+ temp: Byte;\r
+\r
+begin\r
+ For temp := 1 to Length(str) do\r
+ If NOT (str[temp] in chr0) then\r
+ If (str[temp] >= #$80) and (str[temp] <= #$a5) then\r
+ str[temp] := _treat_char[BYTE(str[temp])]\r
+ else If (str[temp] = #0) then str[temp] := ' '\r
+ else str[temp] := chr1;\r
+ FilterStr2 := str;\r
+end;\r
+\r
+function Num2str(num: Longint; base: Byte): String; assembler;\r
+\r
+const\r
+ hexa: array[0..PRED(16)+32] of Char = '0123456789ABCDEF'+\r
+ #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0;\r
+asm\r
+ xor eax,eax\r
+ xor edx,edx\r
+ xor edi,edi\r
+ xor esi,esi\r
+ mov eax,num\r
+ xor ebx,ebx\r
+ mov bl,base\r
+ cmp bl,2\r
+ jb @@3\r
+ cmp bl,16\r
+ ja @@3\r
+ mov edi,32\r
+@@1: dec edi\r
+ xor edx,edx\r
+ div ebx\r
+ mov esi,edx\r
+ mov dl,byte ptr [hexa+esi]\r
+ mov byte ptr [hexa+edi+16],dl\r
+ and eax,eax\r
+ jnz @@1\r
+ mov esi,edi\r
+ mov ecx,32\r
+ sub ecx,edi\r
+ mov edi,@result\r
+ mov al,cl\r
+ stosb\r
+@@2: mov al,byte ptr [hexa+esi+16]\r
+ stosb\r
+ inc esi\r
+ loop @@2\r
+ jmp @@4\r
+@@3: mov edi,@result\r
+ xor al,al\r
+ stosb\r
+@@4:\r
+end;\r
+\r
+const\r
+ digits: array[0..35] of Char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\r
+\r
+function Digit2index(digit: Char): Byte;\r
+\r
+var\r
+ index: Byte;\r
+\r
+begin\r
+ digit := UpCase(digit);\r
+ index := 15;\r
+ While (index > 0) and (digit <> digits[index]) do Dec(index);\r
+ Digit2index := Index;\r
+end;\r
+\r
+function position_value(position,base: Byte): Longint;\r
+\r
+var\r
+ value: Longint;\r
+ index: Byte;\r
+\r
+begin\r
+ value := 1;\r
+ For index := 2 to position do value := value*base;\r
+ position_value := value;\r
+end;\r
+\r
+function Str2num(str: String; base: Byte): Longint;\r
+\r
+var\r
+ value: Longint;\r
+ index: Byte;\r
+\r
+begin\r
+ value := 0;\r
+ For index := 1 to Length(str) do\r
+ Inc(value,Digit2index(str[index])*\r
+ position_value(Length(str)-index+1,base));\r
+ Str2num := value;\r
+end;\r
+\r
+function InputStr(s: String; x,y,ln,ln1: Byte; atr1,atr2: Byte): String;\r
+\r
+var\r
+ appn,for1st,qflg,ins: Boolean;\r
+ cloc,xloc,xint,mx,attr: Byte;\r
+ key: Word;\r
+ cur: Longint;\r
+ s1,s2: String;\r
+\r
+function LookupKey(key: Word; var table; size: Byte): Boolean; assembler;\r
+asm\r
+ mov esi,[table]\r
+ xor ecx,ecx\r
+ mov cl,size\r
+ mov al,1\r
+ jecxz @@3\r
+@@1: lodsw\r
+ cmp ax,key\r
+ jz @@2\r
+ loop @@1\r
+@@2: xor al,al\r
+ jecxz @@3\r
+ mov al,1\r
+@@3:\r
+end;\r
+\r
+function more(value1,value2: Byte): Byte; assembler;\r
+asm\r
+ mov al,value1\r
+ cmp al,value2\r
+ jnb @@1\r
+ mov al,value2\r
+@@1:\r
+end;\r
+\r
+begin\r
+ s := Copy(s,1,ln);\r
+ If (is_environment.locate_pos > ln1) then\r
+ is_environment.locate_pos := ln1;\r
+ If (is_environment.locate_pos > Length(s)+1) then\r
+ is_environment.locate_pos := Length(s);\r
+\r
+ cloc := is_environment.locate_pos;\r
+ xloc := is_environment.locate_pos;\r
+ xint := x;\r
+ qflg := FALSE;\r
+ ins := is_setting.insert_mode;\r
+ appn := NOT is_setting.append_enabled;\r
+\r
+ Dec(x);\r
+ cur := GetCursor;\r
+ If ins then ThinCursor else WideCursor;\r
+ s1 := s;\r
+ If (BYTE(s1[0]) > ln1) then s1[0] := CHR(ln1);\r
+\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint,y,ExpStrR('',ln1,' '),atr1);\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint,y,s1,atr2);\r
+ for1st := TRUE;\r
+\r
+ Repeat\r
+ s2 := s1;\r
+ If (xloc = 1) then s1 := Copy(s,cloc,ln1)\r
+ else s1 := Copy(s,cloc-xloc+1,ln1);\r
+\r
+ If NOT appn then attr := atr2\r
+ else attr := atr1;\r
+\r
+ If appn and for1st then\r
+ begin\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint,y,ExpStrR(s1,ln1,' '),atr1);\r
+ for1st := FALSE;\r
+ end;\r
+\r
+ If (s2 <> s1) then\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint,y,ExpStrR(s1,ln1,' '),atr1);\r
+\r
+ If (ln1 < ln) then\r
+ If (cloc-xloc > 0) and (Length(s) > 0) then\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint,y,'\11',(attr AND $0f0)+$0f)\r
+ else If (cloc-xloc = 0) and (Length(s) <> 0) then\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint,y,s[1],attr)\r
+ else\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint,y,' ',atr1);\r
+\r
+ If (ln1 < ln) then\r
+ If (cloc-xloc+ln1 < Length(s)) then\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint+ln1-1,y,'\10',(attr AND $0f0)+$0f)\r
+ else If (cloc-xloc+ln1 = Length(s)) then\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint+ln1-1,y,s[Length(s)],attr)\r
+ else\r
+ ShowStr(Ptr(v_seg,v_ofs)^,xint+ln1-1,y,' ',atr1);\r
+\r
+ GotoXY(x+xloc,y);\r
+ asm xor ah,ah; int 16h; mov key,ax end;\r
+ If LookupKey(key,is_setting.terminate_keys,50) then qflg := TRUE;\r
+\r
+ If NOT qflg then\r
+ Case LO(key) of\r
+ $09: appn := TRUE;\r
+ $19: begin appn := TRUE; s := ''; cloc := 1; xloc := 1; end;\r
+\r
+ $14: begin\r
+ appn := TRUE;\r
+ While (s[cloc] in is_setting.word_characters) and\r
+ (cloc <= Length(s)) do Delete(s,cloc,1);\r
+\r
+ While NOT (s[cloc] in is_setting.word_characters) and\r
+ (cloc <= Length(s)) do Delete(s,cloc,1);\r
+ end;\r
+\r
+ $7f: begin\r
+ appn := TRUE;\r
+ While (s[cloc-1] in is_setting.word_characters) and\r
+ (cloc > 1) do\r
+ begin\r
+ Dec(cloc); Delete(s,cloc,1);\r
+ If (xloc > 1) then Dec(xloc);\r
+ end;\r
+\r
+ While NOT (s[cloc-1] in is_setting.word_characters) and\r
+ (cloc > 1) do\r
+ begin\r
+ Dec(cloc); Delete(s,cloc,1);\r
+ If (xloc > 1) then Dec(xloc);\r
+ end;\r
+ end;\r
+\r
+ $11: begin appn := TRUE; Delete(s,cloc,Length(s)); end;\r
+\r
+ $08: begin\r
+ appn := TRUE;\r
+ If (cloc > 1) then\r
+ begin\r
+ If (xloc > 1) then Dec(xloc);\r
+ Dec(cloc); Delete(s,cloc,1);\r
+ end;\r
+ end;\r
+\r
+ $00: begin\r
+ If (HI(key) in [$73,$74,$4b,$4d,$52,$47,$4f]) then\r
+ appn := TRUE;\r
+\r
+ Case (HI(key)) of\r
+ $73: begin\r
+ While (s[cloc] in is_setting.word_characters) and\r
+ (cloc > 1) do\r
+ begin\r
+ Dec(cloc);\r
+ If (xloc > 1) then Dec(xloc);\r
+ end;\r
+\r
+ While NOT (s[cloc] in is_setting.word_characters) and\r
+ (cloc > 1) do\r
+ begin\r
+ Dec(cloc);\r
+ If (xloc > 1) then Dec(xloc);\r
+ end;\r
+ end;\r
+\r
+ $74: begin\r
+ While (s[cloc] in is_setting.word_characters) and\r
+ (cloc < Length(s)) do\r
+ begin\r
+ Inc(cloc);\r
+ If (xloc < ln1) then Inc(xloc);\r
+ end;\r
+\r
+ While NOT (s[cloc] in is_setting.word_characters) and\r
+ (cloc < Length(s)) do\r
+ begin\r
+ Inc(cloc);\r
+ If (xloc < ln1) then Inc(xloc);\r
+ end;\r
+ end;\r
+\r
+ $4b: begin\r
+ If (cloc > 1) then Dec(cloc);\r
+ If (xloc > 1) then Dec(xloc);\r
+ end;\r
+\r
+ $4d: begin\r
+ If (cloc < Length(s)) or ((cloc = Length(s)) and\r
+ ((Length(s) < more(ln,ln1)))) then\r
+ Inc(cloc);\r
+ If (xloc < ln1) and (xloc <= Length(s)) then Inc(xloc);\r
+ end;\r
+\r
+ $53: begin\r
+ appn := TRUE;\r
+ If (cloc <= Length(s)) then Delete(s,cloc,1);\r
+ end;\r
+\r
+ $52: If is_setting.replace_enabled then\r
+ begin\r
+ ins := NOT ins;\r
+ If ins then ThinCursor else WideCursor;\r
+ end;\r
+\r
+ $47: begin cloc := 1; xloc := 1; end;\r
+\r
+ $4f: begin\r
+ If (Length(s) < more(ln,ln1)) then cloc := Succ(Length(s))\r
+ else cloc := Length(s);\r
+ If (cloc < ln1) then xloc := cloc else xloc := ln1;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ else If NOT (LO(key) in [$09,$19,$0d,$14,$0b,$7f]) and\r
+ (CHR(LO(key)) in characters(is_setting.character_set)) then\r
+ begin\r
+ If NOT appn then begin s := ''; cloc := 1; xloc := 1; end;\r
+ appn := TRUE;\r
+ If ins and (Length(s) < ln) then\r
+ begin\r
+ Insert(CHR(LO(key)),s,cloc);\r
+ s := FilterStr2(s,is_setting.valid_chars,'_');\r
+ If (cloc < ln) then Inc(cloc);\r
+ If (xloc < ln) and (xloc < ln1) then Inc(xloc)\r
+ end\r
+ else\r
+ If (Length(s) < ln) or NOT ins then\r
+ begin\r
+ If (cloc > Length(s)) and (Length(s) < ln) then\r
+ Inc(BYTE(s[0]));\r
+\r
+ s[cloc] := CHR(LO(key));\r
+ s := FilterStr2(s,is_setting.valid_chars,'_');\r
+ If (cloc < ln) then Inc(cloc);\r
+ If (xloc < ln) and (xloc < ln1) then Inc(xloc);\r
+ end;\r
+ end;\r
+ end;\r
+ until qflg;\r
+\r
+// SetCursor(cur);\r
+ If (cloc = 0) then is_environment.locate_pos := 1\r
+ else is_environment.locate_pos := cloc;\r
+ is_environment.keystroke := key;\r
+ InputStr := s;\r
+end;\r
+\r
+function SameName(str1,str2: String): Boolean; assembler;\r
+\r
+var\r
+ LastW: Word;\r
+\r
+asm\r
+ xor eax,eax\r
+ xor ecx,ecx\r
+ mov esi,[str1]\r
+ mov edi,[str2]\r
+ xor ah,ah\r
+ mov al,[esi]\r
+ inc esi\r
+ mov cx,ax\r
+ mov al,[edi]\r
+ inc edi\r
+ mov bx,ax\r
+ or cx,cx\r
+ jnz @@1\r
+ or bx,bx\r
+ jz @@13\r
+ jmp @@14\r
+ xor dh,dh\r
+@@1: mov al,[esi]\r
+ inc esi\r
+ cmp al,'*'\r
+ jne @@2\r
+ dec cx\r
+ jz @@13\r
+ mov dh,1\r
+ mov LastW,cx\r
+ jmp @@1\r
+@@2: cmp al,'?'\r
+ jnz @@3\r
+ inc edi\r
+ or bx,bx\r
+ je @@12\r
+ dec bx\r
+ jmp @@12\r
+@@3: or bx,bx\r
+ je @@14\r
+ cmp al,'['\r
+ jne @@11\r
+ cmp word ptr [esi],']?'\r
+ je @@9\r
+ mov ah,byte ptr [edi]\r
+ xor dl,dl\r
+ cmp byte ptr [esi],'!'\r
+ jnz @@4\r
+ inc esi\r
+ dec cx\r
+ jz @@14\r
+ inc dx\r
+@@4: mov al,[esi]\r
+ inc esi\r
+ dec cx\r
+ jz @@14\r
+ cmp al,']'\r
+ je @@7\r
+ cmp ah,al\r
+ je @@6\r
+ cmp byte ptr [esi],'-'\r
+ jne @@4\r
+ inc esi\r
+ dec cx\r
+ jz @@14\r
+ cmp ah,al\r
+ jae @@5\r
+ inc esi\r
+ dec cx\r
+ jz @@14\r
+ jmp @@4\r
+@@5: mov al,[esi]\r
+ inc esi\r
+ dec cx\r
+ jz @@14\r
+ cmp ah,al\r
+ ja @@4\r
+@@6: or dl,dl\r
+ jnz @@14\r
+ inc dx\r
+@@7: or dl,dl\r
+ jz @@14\r
+@@8: cmp al,']'\r
+ je @@10\r
+@@9: mov al,[esi]\r
+ inc esi\r
+ cmp al,']'\r
+ loopne @@9\r
+ jne @@14\r
+@@10: dec bx\r
+ inc edi\r
+ jmp @@12\r
+@@11: cmp [edi],al\r
+ jne @@14\r
+ inc edi\r
+ dec bx\r
+@@12: xor dh,dh\r
+ dec cx\r
+ jnz @@1\r
+ or bx,bx\r
+ jnz @@14\r
+@@13: mov al,1\r
+ jmp @@16\r
+@@14: or dh,dh\r
+ jz @@15\r
+ jecxz @@15\r
+ or bx,bx\r
+ jz @@15\r
+ inc edi\r
+ dec bx\r
+ jz @@15\r
+ mov ax,LastW\r
+ sub ax,cx\r
+ add cx,ax\r
+ sub esi,eax\r
+ dec esi\r
+ jmp @@1\r
+@@15: mov al,0\r
+@@16:\r
+end;\r
+\r
+var\r
+ dir: DirStr;\r
+ name: NameStr;\r
+ ext: ExtStr;\r
+\r
+function PathOnly(path: String): String;\r
+begin\r
+ FSplit(path,dir,name,ext);\r
+ PathOnly := dir;\r
+end;\r
+\r
+function NameOnly(path: String): String;\r
+begin\r
+ FSplit(path,dir,name,ext);\r
+ NameOnly := name+ext;\r
+end;\r
+\r
+function BaseNameOnly(path: String): String;\r
+begin\r
+ FSplit(path,dir,name,ext);\r
+ BaseNameOnly := name;\r
+end;\r
+\r
+function ExtOnly(path: String): String;\r
+begin\r
+ FSplit(path,dir,name,ext);\r
+ Delete(ext,1,1);\r
+ ExtOnly := ext;\r
+end;\r
+\r
+begin\r
+ is_environment.locate_pos := 1;\r
+end.\r
--- /dev/null
+procedure _font8x8; assembler;\r
+asm\r
+ dd 0AAAA0000h,0000000AAh,0AAAA8080h,0808080AAh,0AAAAA0A0h,0A0A0A0AAh,0AAAAA8A8h,0A8A8A8AAh\r
+ dd 0AAAAAAAAh,0AAAAAAAAh,0FE387C38h,07C387CFEh,07C381010h,07C387CFEh,03C180000h,00000183Ch\r
+ dd 0C3E7FFFFh,0FFFFE7C3h,042663C00h,0003C6642h,0BD99C3FFh,0FFC399BDh,07D0F070Fh,078CCCCCCh\r
+ dd 06666663Ch,0187E183Ch,0303F333Fh,0E0F07030h,0637F637Fh,0C0E66763h,0E73C5A99h,0995A3CE7h\r
+ dd 0FEF8E080h,00080E0F8h,0FE3E0E02h,000020E3Eh,0187E3C18h,0183C7E18h,066666666h,000660066h\r
+ dd 07BDBDB7Fh,0001B1B1Bh,06C38633Eh,078CC386Ch,000000000h,0007E7E7Eh,0187E3C18h,0FF183C7Eh\r
+ dd 0187E3C18h,000181818h,018181818h,000183C7Eh,0FE0C1800h,00000180Ch,0FE603000h,000003060h\r
+ dd 0C0C00000h,00000FEC0h,0FF662400h,000002466h,07E3C1800h,00000FFFFh,07EFFFF00h,00000183Ch\r
+ dd 000000000h,000000000h,030787830h,000300030h,0006C6C6Ch,000000000h,06CFE6C6Ch,0006C6CFEh\r
+ dd 078C07C30h,00030F80Ch,018CCC600h,000C66630h,076386C38h,00076CCDCh,000C06060h,000000000h\r
+ dd 060603018h,000183060h,018183060h,000603018h,0FF3C6600h,00000663Ch,0FC303000h,000003030h\r
+ dd 000000000h,060303000h,0FC000000h,000000000h,000000000h,000303000h,030180C06h,00080C060h\r
+ dd 0DECEC67Ch,0007CE6F6h,030307030h,000FC3030h,0380CCC78h,000FCCC60h,0380CCC78h,00078CC0Ch\r
+ dd 0CC6C3C1Ch,0001E0CFEh,00CF8C0FCh,00078CC0Ch,0F8C06038h,00078CCCCh,0180CCCFCh,000303030h\r
+ dd 078CCCC78h,00078CCCCh,07CCCCC78h,00070180Ch,000303000h,000303000h,000303000h,060303000h\r
+ dd 0C0603018h,000183060h,000FC0000h,00000FC00h,00C183060h,000603018h,0180CCC78h,000300030h\r
+ dd 0DEDEC67Ch,00078C0DEh,0CCCC7830h,000CCCCFCh,07C6666FCh,000FC6666h,0C0C0663Ch,0003C66C0h\r
+ dd 066666CF8h,000F86C66h,0786862FEh,000FE6268h,0786862FEh,000F06068h,0C0C0663Ch,0003E66CEh\r
+ dd 0FCCCCCCCh,000CCCCCCh,030303078h,000783030h,00C0C0C1Eh,00078CCCCh,0786C66E6h,000E6666Ch\r
+ dd 0606060F0h,000FE6662h,0FEFEEEC6h,000C6C6D6h,0DEF6E6C6h,000C6C6CEh,0C6C66C38h,000386CC6h\r
+ dd 07C6666FCh,000F06060h,0CCCCCC78h,0001C78DCh,07C6666FCh,000E6666Ch,070E0CC78h,00078CC1Ch\r
+ dd 03030B4FCh,000783030h,0CCCCCCCCh,000FCCCCCh,0CCCCCCCCh,0003078CCh,0D6C6C6C6h,000C6EEFEh\r
+ dd 0386CC6C6h,000C66C38h,078CCCCCCh,000783030h,0188CC6FEh,000FE6632h,060606078h,000786060h\r
+ dd 0183060C0h,00002060Ch,018181878h,000781818h,0C66C3810h,000000000h,000000000h,0FF000000h\r
+ dd 000183030h,000000000h,00C780000h,00076CC7Ch,07C6060E0h,000DC6666h,0CC780000h,00078CCC0h\r
+ dd 07C0C0C1Ch,00076CCCCh,0CC780000h,00078C0FCh,0F0606C38h,000F06060h,0CC760000h,0F80C7CCCh\r
+ dd 0766C60E0h,000E66666h,030700030h,000783030h,00C0C000Ch,078CCCC0Ch,06C6660E0h,000E66C78h\r
+ dd 030303070h,000783030h,0FECC0000h,000C6D6FEh,0CCF80000h,000CCCCCCh,0CC780000h,00078CCCCh\r
+ dd 066DC0000h,0F0607C66h,0CC760000h,01E0C7CCCh,076DC0000h,000F06066h,0C07C0000h,000F80C78h\r
+ dd 0307C3010h,000183430h,0CCCC0000h,00076CCCCh,0CCCC0000h,0003078CCh,0D6C60000h,0006CFEFEh\r
+ dd 06CC60000h,000C66C38h,0CCCC0000h,0F80C7CCCh,098FC0000h,000FC6430h,0E030301Ch,0001C3030h\r
+ dd 000181818h,000181818h,01C3030E0h,000E03030h,00000DC76h,000000000h,06C381000h,000FEC6C6h\r
+ dd 0CCC0CC78h,0780C1878h,0CC00CC00h,0007ECCCCh,0CC78001Ch,00078C0FCh,0063CC37Eh,0003F663Eh\r
+ dd 00C7800CCh,0007ECC7Ch,00C7800E0h,0007ECC7Ch,00C783030h,0007ECC7Ch,0C0780000h,0380C78C0h\r
+ dd 0663CC37Eh,0003C607Eh,0CC7800CCh,00078C0FCh,0CC7800E0h,00078C0FCh,0307000CCh,000783030h\r
+ dd 01838C67Ch,0003C1818h,0307000E0h,000783030h,0C66C38C6h,000C6C6FEh,078003030h,000CCFCCCh\r
+ dd 060FC001Ch,000FC6078h,00C7F0000h,0007FCC7Fh,0FECC6C3Eh,000CECCCCh,07800CC78h,00078CCCCh\r
+ dd 07800CC00h,00078CCCCh,07800E000h,00078CCCCh,0CC00CC78h,0007ECCCCh,0CC00E000h,0007ECCCCh\r
+ dd 0CC00CC00h,0F80C7CCCh,0663C18C3h,000183C66h,0CCCC00CCh,00078CCCCh,0C07E1818h,018187EC0h\r
+ dd 0F0646C38h,000FCE660h,0FC78CCCCh,03030FC30h,0FACCCCF8h,0C7C6CFC6h,03C181B0Eh,070D81818h\r
+ dd 00C78001Ch,0007ECC7Ch,030700038h,000783030h,078001C00h,00078CCCCh,0CC001C00h,0007ECCCCh\r
+ dd 0F800F800h,000CCCCCCh,0ECCC00FCh,000CCDCFCh,03E6C6C3Ch,000007E00h,0386C6C38h,000007C00h\r
+ dd 060300030h,00078CCC0h,0FC000000h,00000C0C0h,0FC000000h,000000C0Ch,0DECCC6C3h,00FCC6633h\r
+ dd 0DBCCC6C3h,003CF6F37h,018001818h,000181818h,0CC663300h,000003366h,03366CC00h,00000CC66h\r
+ dd 088228822h,088228822h,0AA55AA55h,0AA55AA55h,0EEDB77DBh,0EEDB77DBh,018181818h,018181818h\r
+ dd 018181818h,0181818F8h,018F81818h,0181818F8h,036363636h,0363636F6h,000000000h,0363636FEh\r
+ dd 018F80000h,0181818F8h,006F63636h,0363636F6h,036363636h,036363636h,006FE0000h,0363636F6h\r
+ dd 006F63636h,0000000FEh,036363636h,0000000FEh,018F81818h,0000000F8h,000000000h,0181818F8h\r
+ dd 018181818h,00000001Fh,018181818h,0000000FFh,000000000h,0181818FFh,018181818h,01818181Fh\r
+ dd 000000000h,0000000FFh,018181818h,0181818FFh,0181F1818h,01818181Fh,036363636h,036363637h\r
+ dd 030373636h,00000003Fh,0303F0000h,036363637h,000F73636h,0000000FFh,000FF0000h,0363636F7h\r
+ dd 030373636h,036363637h,000FF0000h,0000000FFh,000F73636h,0363636F7h,000FF1818h,0000000FFh\r
+ dd 036363636h,0000000FFh,000FF0000h,0181818FFh,000000000h,0363636FFh,036363636h,00000003Fh\r
+ dd 0181F1818h,00000001Fh,0181F0000h,01818181Fh,000000000h,03636363Fh,036363636h,0363636FFh\r
+ dd 018FF1818h,0181818FFh,018181818h,0000000F8h,000000000h,01818181Fh,0FFFFFFFFh,0FFFFFFFFh\r
+ dd 000000000h,0FFFFFFFFh,0F0F0F0F0h,0F0F0F0F0h,00F0F0F0Fh,00F0F0F0Fh,0FFFFFFFFh,000000000h\r
+ dd 0DC760000h,00076DCC8h,0F8CC7800h,0C0C0F8CCh,0C0CCFC00h,000C0C0C0h,06C6CFE00h,0006C6C6Ch\r
+ dd 03060CCFCh,000FCCC60h,0D87E0000h,00070D8D8h,066666600h,0C0607C66h,018DC7600h,000181818h\r
+ dd 0CC7830FCh,0FC3078CCh,0FEC66C38h,000386CC6h,0C6C66C38h,000EE6C6Ch,07C18301Ch,00078CCCCh\r
+ dd 0DB7E0000h,000007EDBh,0DB7E0C06h,0C0607EDBh,0F8C06038h,0003860C0h,0CCCCCC78h,000CCCCCCh\r
+ dd 0FC00FC00h,00000FC00h,030FC3030h,000FC0030h,030183060h,000FC0060h,030603018h,000FC0018h\r
+ dd 0181B1B0Eh,018181818h,018181818h,070D8D818h,0FC003030h,000303000h,000DC7600h,00000DC76h\r
+ dd 0386C6C38h,000000000h,018000000h,000000018h,000000000h,000000018h,00C0C0C0Fh,01C3C6CECh\r
+ dd 06C6C6C78h,00000006Ch,060301870h,000000078h,03C3C0000h,000003C3Ch,000000000h,000000000h\r
+end;\r
+\r
+procedure _font8x16; assembler;\r
+asm\r
+ dd 000000000h,000000000h,000000000h,000000000h,0817E0000h,0A58181A5h,07E818199h,000000000h\r
+ dd 0FF7E0000h,0DBFFFFDBh,07EFFFFE7h,000000000h,000000000h,0FEFEFE6Ch,010387CFEh,000000000h\r
+ dd 000000000h,0FE7C3810h,00010387Ch,000000000h,018000000h,0E7E73C3Ch,03C1818E7h,000000000h\r
+ dd 018000000h,0FFFF7E3Ch,03C18187Eh,000000000h,000000000h,03C180000h,00000183Ch,000000000h\r
+ dd 0FFFFFFFFh,0C3E7FFFFh,0FFFFE7C3h,0FFFFFFFFh,000000000h,042663C00h,0003C6642h,000000000h\r
+ dd 0FFFFFFFFh,0BD99C3FFh,0FFC399BDh,0FFFFFFFFh,0061E0000h,0CC781A0Eh,078CCCCCCh,000000000h\r
+ dd 0663C0000h,03C666666h,018187E18h,000000000h,0333F0000h,03030303Fh,0E0F07030h,000000000h\r
+ dd 0637F0000h,06363637Fh,0E6E76763h,0000000C0h,018000000h,0E73CDB18h,01818DB3Ch,000000000h\r
+ dd 0E0C08000h,0F8FEF8F0h,080C0E0F0h,000000000h,00E060200h,03EFE3E1Eh,002060E1Eh,000000000h\r
+ dd 03C180000h,01818187Eh,000183C7Eh,000000000h,066660000h,066666666h,066660066h,000000000h\r
+ dd 0DB7F0000h,01B7BDBDBh,01B1B1B1Bh,000000000h,060C67C00h,0C6C66C38h,0C60C386Ch,00000007Ch\r
+ dd 000000000h,000000000h,0FEFEFEFEh,000000000h,03C180000h,01818187Eh,07E183C7Eh,000000000h\r
+ dd 03C180000h,01818187Eh,018181818h,000000000h,018180000h,018181818h,0183C7E18h,000000000h\r
+ dd 000000000h,0FE0C1800h,00000180Ch,000000000h,000000000h,0FE603000h,000003060h,000000000h\r
+ dd 000000000h,0C0C00000h,00000FEC0h,000000000h,000000000h,0FE6C2800h,00000286Ch,000000000h\r
+ dd 000000000h,07C383810h,000FEFE7Ch,000000000h,000000000h,07C7CFEFEh,000103838h,000000000h\r
+ dd 000000000h,000000000h,000000000h,000000000h,03C180000h,018183C3Ch,018180018h,000000000h\r
+ dd 066666600h,000000024h,000000000h,000000000h,06C000000h,06C6CFE6Ch,06C6CFE6Ch,000000000h\r
+ dd 0C67C1818h,0067CC0C2h,07CC68606h,000001818h,000000000h,0180CC6C2h,086C66030h,000000000h\r
+ dd 06C380000h,0DC76386Ch,076CCCCCCh,000000000h,030303000h,000000060h,000000000h,000000000h\r
+ dd 0180C0000h,030303030h,00C183030h,000000000h,018300000h,00C0C0C0Ch,030180C0Ch,000000000h\r
+ dd 000000000h,0FF3C6600h,00000663Ch,000000000h,000000000h,07E181800h,000001818h,000000000h\r
+ dd 000000000h,000000000h,018181800h,000000030h,000000000h,0FE000000h,000000000h,000000000h\r
+ dd 000000000h,000000000h,018180000h,000000000h,000000000h,0180C0602h,080C06030h,000000000h\r
+ dd 0C67C0000h,0F6DECEC6h,07CC6C6E6h,000000000h,038180000h,018181878h,07E181818h,000000000h\r
+ dd 0C67C0000h,030180C06h,0FEC6C060h,000000000h,0C67C0000h,0063C0606h,07CC60606h,000000000h\r
+ dd 01C0C0000h,0FECC6C3Ch,01E0C0C0Ch,000000000h,0C0FE0000h,006FCC0C0h,07CC60606h,000000000h\r
+ dd 060380000h,0C6FCC0C0h,07CC6C6C6h,000000000h,0C6FE0000h,0180C0606h,030303030h,000000000h\r
+ dd 0C67C0000h,0C67CC6C6h,07CC6C6C6h,000000000h,0C67C0000h,0067EC6C6h,0780C0606h,000000000h\r
+ dd 000000000h,000001818h,000181800h,000000000h,000000000h,000001818h,030181800h,000000000h\r
+ dd 006000000h,06030180Ch,0060C1830h,000000000h,000000000h,000007E00h,00000007Eh,000000000h\r
+ dd 060000000h,0060C1830h,06030180Ch,000000000h,0C67C0000h,018180CC6h,018180018h,000000000h\r
+ dd 07C000000h,0DEDEC6C6h,07CC0DCDEh,000000000h,038100000h,0FEC6C66Ch,0C6C6C6C6h,000000000h\r
+ dd 066FC0000h,0667C6666h,0FC666666h,000000000h,0663C0000h,0C0C0C0C2h,03C66C2C0h,000000000h\r
+ dd 06CF80000h,066666666h,0F86C6666h,000000000h,066FE0000h,068786862h,0FE666260h,000000000h\r
+ dd 066FE0000h,068786862h,0F0606060h,000000000h,0663C0000h,0DEC0C0C2h,03A66C6C6h,000000000h\r
+ dd 0C6C60000h,0C6FEC6C6h,0C6C6C6C6h,000000000h,0183C0000h,018181818h,03C181818h,000000000h\r
+ dd 00C1E0000h,00C0C0C0Ch,078CCCCCCh,000000000h,066E60000h,078786C66h,0E666666Ch,000000000h\r
+ dd 060F00000h,060606060h,0FE666260h,000000000h,0EEC60000h,0C6D6FEFEh,0C6C6C6C6h,000000000h\r
+ dd 0E6C60000h,0CEDEFEF6h,0C6C6C6C6h,000000000h,0C67C0000h,0C6C6C6C6h,07CC6C6C6h,000000000h\r
+ dd 066FC0000h,0607C6666h,0F0606060h,000000000h,0C67C0000h,0C6C6C6C6h,07CDED6C6h,000000E0Ch\r
+ dd 066FC0000h,06C7C6666h,0E6666666h,000000000h,0C67C0000h,00C3860C6h,07CC6C606h,000000000h\r
+ dd 07E7E0000h,01818185Ah,03C181818h,000000000h,0C6C60000h,0C6C6C6C6h,07CC6C6C6h,000000000h\r
+ dd 0C6C60000h,0C6C6C6C6h,010386CC6h,000000000h,0C6C60000h,0D6D6C6C6h,06CEEFED6h,000000000h\r
+ dd 0C6C60000h,038387C6Ch,0C6C66C7Ch,000000000h,066660000h,0183C6666h,03C181818h,000000000h\r
+ dd 0C6FE0000h,030180C86h,0FEC6C260h,000000000h,0303C0000h,030303030h,03C303030h,000000000h\r
+ dd 080000000h,03870E0C0h,002060E1Ch,000000000h,00C3C0000h,00C0C0C0Ch,03C0C0C0Ch,000000000h\r
+ dd 0C66C3810h,000000000h,000000000h,000000000h,000000000h,000000000h,000000000h,00000FF00h\r
+ dd 000183030h,000000000h,000000000h,000000000h,000000000h,07C0C7800h,076CCCCCCh,000000000h\r
+ dd 060E00000h,0666C7860h,07C666666h,000000000h,000000000h,0C0C67C00h,07CC6C0C0h,000000000h\r
+ dd 00C1C0000h,0CC6C3C0Ch,076CCCCCCh,000000000h,000000000h,0FEC67C00h,07CC6C0C0h,000000000h\r
+ dd 06C380000h,060F06064h,0F0606060h,000000000h,000000000h,0CCCC7600h,07CCCCCCCh,00078CC0Ch\r
+ dd 060E00000h,066766C60h,0E6666666h,000000000h,018180000h,018183800h,03C181818h,000000000h\r
+ dd 006060000h,006060E00h,006060606h,0003C6666h,060E00000h,0786C6660h,0E6666C78h,000000000h\r
+ dd 018380000h,018181818h,03C181818h,000000000h,000000000h,0D6FEEC00h,0C6D6D6D6h,000000000h\r
+ dd 000000000h,06666DC00h,066666666h,000000000h,000000000h,0C6C67C00h,07CC6C6C6h,000000000h\r
+ dd 000000000h,06666DC00h,07C666666h,000F06060h,000000000h,0CCCC7600h,07CCCCCCCh,0001E0C0Ch\r
+ dd 000000000h,06676DC00h,0F0606060h,000000000h,000000000h,060C67C00h,07CC60C38h,000000000h\r
+ dd 030100000h,03030FC30h,01C363030h,000000000h,000000000h,0CCCCCC00h,076CCCCCCh,000000000h\r
+ dd 000000000h,066666600h,0183C6666h,000000000h,000000000h,0D6C6C600h,06CFED6D6h,000000000h\r
+ dd 000000000h,0386CC600h,0C66C3838h,000000000h,000000000h,0C6C6C600h,07EC6C6C6h,000F80C06h\r
+ dd 000000000h,018CCFE00h,0FEC66030h,000000000h,0180E0000h,018701818h,00E181818h,000000000h\r
+ dd 018180000h,018001818h,018181818h,000000000h,018700000h,0180E1818h,070181818h,000000000h\r
+ dd 0DC760000h,000000000h,000000000h,000000000h,000000000h,0C66C3810h,000FEC6C6h,000000000h\r
+ dd 0663C0000h,0C0C0C0C2h,00C3C66C2h,000007C06h,000CC0000h,0CCCCCC00h,076CCCCCCh,000000000h\r
+ dd 030180C00h,0FEC67C00h,07CC6C0C0h,000000000h,06C381000h,07C0C7800h,076CCCCCCh,000000000h\r
+ dd 000CC0000h,07C0C7800h,076CCCCCCh,000000000h,018306000h,07C0C7800h,076CCCCCCh,000000000h\r
+ dd 0386C3800h,07C0C7800h,076CCCCCCh,000000000h,000000000h,06060663Ch,0060C3C66h,00000003Ch\r
+ dd 06C381000h,0FEC67C00h,07CC6C0C0h,000000000h,000C60000h,0FEC67C00h,07CC6C0C0h,000000000h\r
+ dd 018306000h,0FEC67C00h,07CC6C0C0h,000000000h,000660000h,018183800h,03C181818h,000000000h\r
+ dd 0663C1800h,018183800h,03C181818h,000000000h,018306000h,018183800h,03C181818h,000000000h\r
+ dd 01000C600h,0C6C66C38h,0C6C6C6FEh,000000000h,000386C38h,0C6C66C38h,0C6C6C6FEh,000000000h\r
+ dd 000603018h,07C6066FEh,0FE666060h,000000000h,000000000h,03676CC00h,06ED8D87Eh,000000000h\r
+ dd 06C3E0000h,0CCFECCCCh,0CECCCCCCh,000000000h,06C381000h,0C6C67C00h,07CC6C6C6h,000000000h\r
+ dd 000C60000h,0C6C67C00h,07CC6C6C6h,000000000h,018306000h,0C6C67C00h,07CC6C6C6h,000000000h\r
+ dd 0CC783000h,0CCCCCC00h,076CCCCCCh,000000000h,018306000h,0CCCCCC00h,076CCCCCCh,000000000h\r
+ dd 000C60000h,0C6C6C600h,07EC6C6C6h,000780C06h,07C00C600h,0C6C6C6C6h,07CC6C6C6h,000000000h\r
+ dd 0C600C600h,0C6C6C6C6h,07CC6C6C6h,000000000h,03C181800h,060606066h,018183C66h,000000000h\r
+ dd 0646C3800h,06060F060h,0FCE66060h,000000000h,066660000h,0187E183Ch,01818187Eh,000000000h\r
+ dd 0CCCCF800h,0DECCC4F8h,0C6CCCCCCh,000000000h,0181B0E00h,0187E1818h,018181818h,0000070D8h\r
+ dd 060301800h,07C0C7800h,076CCCCCCh,000000000h,030180C00h,018183800h,03C181818h,000000000h\r
+ dd 060301800h,0C6C67C00h,07CC6C6C6h,000000000h,060301800h,0CCCCCC00h,076CCCCCCh,000000000h\r
+ dd 0DC760000h,06666DC00h,066666666h,000000000h,0C600DC76h,0DEFEF6E6h,0C6C6C6CEh,000000000h\r
+ dd 06C6C3C00h,0007E003Eh,000000000h,000000000h,06C6C3800h,0007C0038h,000000000h,000000000h\r
+ dd 030300000h,060303000h,07CC6C6C0h,000000000h,000000000h,0C0FE0000h,000C0C0C0h,000000000h\r
+ dd 000000000h,006FE0000h,000060606h,000000000h,0C2C0C000h,03018CCC6h,00C86DC60h,000003E18h\r
+ dd 0C2C0C000h,03018CCC6h,03E9ECE66h,000000606h,018180000h,018181800h,0183C3C3Ch,000000000h\r
+ dd 000000000h,0D86C3600h,00000366Ch,000000000h,000000000h,0366CD800h,00000D86Ch,000000000h\r
+ dd 044114411h,044114411h,044114411h,044114411h,0AA55AA55h,0AA55AA55h,0AA55AA55h,0AA55AA55h\r
+ dd 077DD77DDh,077DD77DDh,077DD77DDh,077DD77DDh,018181818h,018181818h,018181818h,018181818h\r
+ dd 018181818h,0F8181818h,018181818h,018181818h,018181818h,0F818F818h,018181818h,018181818h\r
+ dd 036363636h,0F6363636h,036363636h,036363636h,000000000h,0FE000000h,036363636h,036363636h\r
+ dd 000000000h,0F818F800h,018181818h,018181818h,036363636h,0F606F636h,036363636h,036363636h\r
+ dd 036363636h,036363636h,036363636h,036363636h,000000000h,0F606FE00h,036363636h,036363636h\r
+ dd 036363636h,0FE06F636h,000000000h,000000000h,036363636h,0FE363636h,000000000h,000000000h\r
+ dd 018181818h,0F818F818h,000000000h,000000000h,000000000h,0F8000000h,018181818h,018181818h\r
+ dd 018181818h,01F181818h,000000000h,000000000h,018181818h,0FF181818h,000000000h,000000000h\r
+ dd 000000000h,0FF000000h,018181818h,018181818h,018181818h,01F181818h,018181818h,018181818h\r
+ dd 000000000h,0FF000000h,000000000h,000000000h,018181818h,0FF181818h,018181818h,018181818h\r
+ dd 018181818h,01F181F18h,018181818h,018181818h,036363636h,037363636h,036363636h,036363636h\r
+ dd 036363636h,03F303736h,000000000h,000000000h,000000000h,037303F00h,036363636h,036363636h\r
+ dd 036363636h,0FF00F736h,000000000h,000000000h,000000000h,0F700FF00h,036363636h,036363636h\r
+ dd 036363636h,037303736h,036363636h,036363636h,000000000h,0FF00FF00h,000000000h,000000000h\r
+ dd 036363636h,0F700F736h,036363636h,036363636h,018181818h,0FF00FF18h,000000000h,000000000h\r
+ dd 036363636h,0FF363636h,000000000h,000000000h,000000000h,0FF00FF00h,018181818h,018181818h\r
+ dd 000000000h,0FF000000h,036363636h,036363636h,036363636h,03F363636h,000000000h,000000000h\r
+ dd 018181818h,01F181F18h,000000000h,000000000h,000000000h,01F181F00h,018181818h,018181818h\r
+ dd 000000000h,03F000000h,036363636h,036363636h,036363636h,0FF363636h,036363636h,036363636h\r
+ dd 018181818h,0FF18FF18h,018181818h,018181818h,018181818h,0F8181818h,000000000h,000000000h\r
+ dd 000000000h,01F000000h,018181818h,018181818h,0FFFFFFFFh,0FFFFFFFFh,0FFFFFFFFh,0FFFFFFFFh\r
+ dd 000000000h,0FF000000h,0FFFFFFFFh,0FFFFFFFFh,0F0F0F0F0h,0F0F0F0F0h,0F0F0F0F0h,0F0F0F0F0h\r
+ dd 00F0F0F0Fh,00F0F0F0Fh,00F0F0F0Fh,00F0F0F0Fh,0FFFFFFFFh,000FFFFFFh,000000000h,000000000h\r
+ dd 000000000h,0D8DC7600h,076DCD8D8h,000000000h,0CC780000h,0CCD8CCCCh,0CCC6C6C6h,000000000h\r
+ dd 0C6FE0000h,0C0C0C0C6h,0C0C0C0C0h,000000000h,000000000h,06C6C6CFEh,06C6C6C6Ch,000000000h\r
+ dd 0FE000000h,0183060C6h,0FEC66030h,000000000h,000000000h,0D8D87E00h,070D8D8D8h,000000000h\r
+ dd 000000000h,066666666h,060607C66h,0000000C0h,000000000h,01818DC76h,018181818h,000000000h\r
+ dd 07E000000h,066663C18h,07E183C66h,000000000h,038000000h,0FEC6C66Ch,0386CC6C6h,000000000h\r
+ dd 06C380000h,06CC6C6C6h,0EE6C6C6Ch,000000000h,0301E0000h,0663E0C18h,03C666666h,000000000h\r
+ dd 000000000h,0DBDB7E00h,000007EDBh,000000000h,003000000h,0DBDB7E06h,0C0607EF3h,000000000h\r
+ dd 0301C0000h,0607C6060h,01C306060h,000000000h,07C000000h,0C6C6C6C6h,0C6C6C6C6h,000000000h\r
+ dd 000000000h,0FE0000FEh,000FE0000h,000000000h,000000000h,0187E1818h,0FF000018h,000000000h\r
+ dd 030000000h,00C060C18h,07E003018h,000000000h,00C000000h,030603018h,07E000C18h,000000000h\r
+ dd 01B0E0000h,01818181Bh,018181818h,018181818h,018181818h,018181818h,070D8D8D8h,000000000h\r
+ dd 000000000h,07E001818h,000181800h,000000000h,000000000h,000DC7600h,00000DC76h,000000000h\r
+ dd 06C6C3800h,000000038h,000000000h,000000000h,000000000h,018000000h,000000018h,000000000h\r
+ dd 000000000h,000000000h,000000018h,000000000h,00C0C0F00h,0EC0C0C0Ch,01C3C6C6Ch,000000000h\r
+ dd 06C6CD800h,0006C6C6Ch,000000000h,000000000h,030D87000h,000F8C860h,000000000h,000000000h\r
+ dd 000000000h,07C7C7C7Ch,0007C7C7Ch,000000000h,000000000h,000000000h,000000000h,000000000h\r
+end;\r
+\r
+procedure _picture_palette;\r
+asm\r
+ dd 000000000h,000003F1Fh,002000001h,000020000h,000000200h,003000002h,000030000h,000000300h\r
+ dd 004000003h,000040000h,000000400h,005000004h,000050000h,000000500h,006000005h,000060000h\r
+ dd 000000600h,007000006h,000070000h,000000700h,008000007h,000080000h,000000800h,009000008h\r
+ dd 000090000h,000000900h,00A000009h,0000A0000h,000000A00h,00B00000Ah,0000B0000h,000000B00h\r
+ dd 00C00000Bh,0000C0000h,000000C00h,00D00000Ch,0000D0000h,000000D00h,00E00000Dh,0000E0000h\r
+ dd 000000E00h,00F00000Eh,0000F0000h,000000F00h,01000000Fh,000100000h,000001000h,011000010h\r
+ dd 000110000h,000001100h,012000011h,000120000h,000001200h,013000012h,000130000h,000001300h\r
+ dd 014000013h,000140000h,000001400h,015000014h,000150000h,000001500h,016000015h,000160000h\r
+ dd 000001600h,017000016h,000170000h,000001700h,018000017h,000180000h,000001800h,019000018h\r
+ dd 000190000h,000001900h,01A000019h,0001A0000h,000001A00h,01B00001Ah,0001B0000h,000001B00h\r
+ dd 01C00001Bh,0001C0000h,000001C00h,01D00001Ch,0001D0000h,000001D00h,01E00001Dh,0001E0000h\r
+ dd 000001E00h,01F00001Eh,0001F0000h,000001F00h,02000001Fh,000200000h,000002000h,021000020h\r
+ dd 000210000h,000002100h,022000021h,000220000h,000002200h,023000022h,000230000h,000002300h\r
+ dd 024000023h,000240000h,000002400h,025000024h,000250000h,000002500h,026000025h,000260000h\r
+ dd 000002600h,027000026h,000270000h,000002700h,028000027h,000280000h,000002800h,029000028h\r
+ dd 000290000h,000002900h,02A000029h,0002A0000h,000002A00h,02B00002Ah,0002B0000h,000002B00h\r
+ dd 02C00002Bh,0002C0000h,000002C00h,02D00002Ch,0002D0000h,000002D00h,02E00002Dh,0002E0000h\r
+ dd 000002E00h,02F00002Eh,0002F0000h,000002F00h,03000002Fh,000300000h,000003000h,031000030h\r
+ dd 000310000h,000003100h,032000031h,000320000h,000003200h,033000032h,000330000h,000003300h\r
+ dd 034000033h,000340000h,000003400h,035000034h,000350000h,000003500h,036000035h,000360000h\r
+ dd 000003600h,037000036h,000370000h,000003700h,038000037h,000380000h,000003800h,039000038h\r
+ dd 000390000h,000003900h,03A000039h,0003A0000h,000003A00h,03B00003Ah,0003B0000h,000003B00h\r
+ dd 03C00003Bh,0003C0000h,000003C00h,03D00003Ch,0003D0000h,000003D00h,03E00003Dh,0003E0000h\r
+ dd 000003E00h,03F00003Eh,0003F0000h,000003F00h,03020103Fh,016322212h,02A1A3626h,03F2F1F3Ah\r
+end;\r
+\r
+procedure _picture_bitmap; assembler;\r
+asm\r
+ dd 050434E6Bh,05A606156h,059635761h,05853604Fh,056535052h,063645855h,05E65655Ch,07965505Bh\r
+ dd 09A8B7A79h,0918A8D95h,079778387h,09A9D927Bh,08195938Ah,07F727A82h,0967E8388h,0829A9C92h\r
+ dd 0AAA49B94h,07AA3A9B1h,0958F8C79h,0908C8588h,080826787h,08E989687h,065748B99h,07875A181h\r
+ dd 0978E7679h,07D8B8C7Dh,09C8D887Fh,0AEA08F91h,0C5B7A5AAh,0B0B2B8C7h,0BBC2C4BEh,0CCB7B1BCh\r
+ dd 0ABB5AAACh,08F8F9097h,08F9B9B8Fh,095879992h,08B797A93h,09BA3847Bh,09C91999Ch,084868882h\r
+ dd 0918A8F8Eh,090989481h,0686F6879h,067676D65h,060555962h,065686B59h,07A676555h,06F768384h\r
+ dd 07A686168h,0716E6D72h,07D747A7Eh,07C877D75h,0695F5861h,092907E73h,07D868688h,0A9896E67h\r
+ dd 08E7B73B4h,096835C7Eh,08B8A9189h,07C85909Fh,0626A515Dh,079848170h,0676E645Dh,07C78696Eh\r
+ dd 0725A6B73h,0876C6C6Fh,08E607AA1h,098999191h,07F9394A0h,06B6D736Eh,06E61656Ch,06E6E726Eh\r
+ dd 068716E75h,062625D8Ah,0595D6762h,0706C705Fh,06161686Ch,0838F776Fh,04C878689h,05C635253h\r
+ dd 04845506Bh,0575D594Dh,053605A52h,04F49484Dh,057584453h,06C726A59h,074786D53h,07E70556Eh\r
+ dd 0907D7D80h,0AE9C989Eh,0708590A2h,090A19767h,08B848F99h,094857E89h,08C97907Fh,0A0A79394h\r
+ dd 0B69A9192h,080ACBDC0h,0A79A9378h,08C8F9085h,08C978684h,0AB9F8D74h,0978397B2h,089AEA496h\r
+ dd 09E7C7B6Eh,091999795h,0A4A1A590h,0C2B1B1ABh,0DBD6B1C6h,0CCCECED4h,0B0C0C7BDh,0C5AFC3C8h\r
+ dd 0C8C0BAC9h,09F8E8BB3h,0AEAB9689h,0B096C0B0h,080778F8Ah,07B9BA98Fh,0938E7986h,09DA59A8Dh\r
+ dd 09284859Bh,0979B9A87h,069796E91h,067776A60h,06A6B6B69h,0746D7461h,08A83786Bh,06B768987h\r
+ dd 0807B6E6Bh,07E727072h,086858C91h,0858B8389h,0655D5970h,079797970h,0676F707Fh,0B4968F66h\r
+ dd 07A7576BAh,0918E838Dh,085798084h,079848489h,070685463h,06C726F76h,072756258h,0797D6A75h\r
+ dd 0805A6B7Bh,0696E778Ah,084556B69h,09C8B767Bh,07E937F87h,08C8F7E6Eh,062576F73h,0686A6861h\r
+ dd 05B606E79h,06B5A546Fh,07B787F78h,0706D7672h,059636268h,06B806C65h,0537B817Fh,05F56404Bh\r
+ dd 058464D68h,048424C5Eh,0515A5649h,04E504652h,051544A53h,05C6A6455h,06377694Dh,087657E71h\r
+ dd 0ADA77E64h,0B29F98A7h,06F8FB8A4h,08A968960h,0797F8B8Eh,08C857170h,08CB68C72h,084999480h\r
+ dd 0BFB3A091h,0768FB8B9h,0A4AB9C84h,0A3957989h,081638698h,0AF929586h,0947B90B1h,0AA9EA49Bh\r
+ dd 0907E769Dh,0A49C9983h,09EB494A3h,0B8B89D90h,0D7D6BFB9h,0C3C7CCD6h,0C6CACDC7h,0BC9DC1B5h\r
+ dd 0C9C8BCBDh,0A9A3A6BCh,0B7B6A596h,0B1C0ADBBh,081767E79h,06392927Dh,095818376h,0B499A9B4h\r
+ dd 09E82808Fh,0AB8E9F9Eh,06D767CA5h,06F7C6B5Fh,07B736466h,079708176h,076826A64h,06D7D8D88h\r
+ dd 07A786D66h,07F787974h,0697E9097h,07CA27B6Ch,068656479h,0737B766Dh,05C566F76h,09E8D8660h\r
+ dd 06D7375A5h,0816A6275h,06373676Bh,07775776Ah,07C765F70h,0696C6D79h,0676E655Eh,06260706Ah\r
+ dd 07D846275h,062676F6Eh,06E585D63h,07B656C68h,0746C5A5Bh,07B747675h,06F696F72h,066747B6Dh\r
+ dd 071737279h,0675B5F6Dh,065525460h,04E4A5255h,041494D4Eh,049554546h,062606771h,04A445A4Ah\r
+ dd 05438456Eh,05B5A5961h,053534F45h,05360595Ah,0574D5454h,053606869h,058736957h,08569635Eh\r
+ dd 0A1A28C81h,0A19F9594h,07198AC9Dh,0A3826F65h,073868C88h,066716B6Ah,07D8D9276h,09E92A595h\r
+ dd 0AA9F9590h,07092C2ABh,094B3A66Ch,0A2988A8Dh,0A596A9A7h,0A0768E79h,09994A3B0h,0A4B2A7ABh\r
+ dd 0201D326Eh,0736B8548h,0949F987Bh,0DAB09B8Bh,0CBD8ACA3h,0C8CAC9CDh,0CBB9B0B7h,09E85C3B4h\r
+ dd 0B9CFB195h,0B8BCBCAAh,09CAEB6BCh,0A4B8BB9Ah,08E70708Ah,08EB3AB9Ah,0A8925C6Ch,0AFB5B091h\r
+ dd 0A58D8896h,0908E9C99h,07D667C8Bh,083857D73h,0867C5F67h,0766A8480h,07E977371h,072838E81h\r
+ dd 08682787Bh,08A76747Bh,06C869DA9h,086948076h,06A686983h,07583726Bh,07B677467h,094907B6Fh\r
+ dd 0757C8DA1h,0837C6172h,087876264h,0637F9487h,07B7B606Ch,06C737679h,0747B706Bh,066736D81h\r
+ dd 05D696579h,067636B74h,0696E6470h,0A1787B72h,0856B7071h,07F7E808Dh,07E7B868Eh,062868E7Eh\r
+ dd 06A697E78h,0655E645Fh,0676E565Bh,056555754h,0535F6B65h,05458424Fh,079576079h,0594A5671h\r
+ dd 050434646h,05B5A585Ah,04A53565Ch,056485243h,05C4B4B55h,065567367h,05C635963h,07F6F5763h\r
+ dd 090958060h,08C898788h,0718E838Fh,09C81786Ch,0707D7480h,082786F71h,0868A8472h,08A828F90h\r
+ dd 0A2A99696h,0738DA7B2h,095919E68h,0A5928991h,0A1A99DA1h,09089888Fh,0A9908AB2h,02D6E89A8h\r
+ dd 0211C1914h,01A222123h,02A1A1F1Ch,03041271Fh,0654D342Ch,0BCAB907Ch,0AEAEADB2h,0AD84BEC2h\r
+ dd 0AFB5BEBFh,0B0A9B2B1h,0A2A9B2B7h,0B1C3ADB0h,0ADA07A8Bh,09CB0AEC8h,0A1885A6Eh,0999D988Dh\r
+ dd 0ABA19595h,0957E9B9Eh,077797A8Eh,0878F8D7Ah,078746B77h,0746B6A76h,08E8F8184h,06C708987h\r
+ dd 0918E9484h,085767777h,07E929A96h,07D8D8F82h,06F857E77h,08681757Dh,07B7C737Fh,09190817Fh\r
+ dd 07569818Dh,0A2A07D84h,089938160h,086798F96h,076725E85h,078787277h,0847E836Ch,07C6A6C84h\r
+ dd 05B5A647Fh,0706A676Eh,07B7C8273h,0BFA75F73h,09C8776B9h,088747791h,07C7D768Bh,07881827Eh\r
+ dd 065707581h,0636B6561h,068635C59h,06C696161h,058556167h,05A636056h,0755C5C66h,05B615C6Ch\r
+ dd 05961545Ch,05F5C5C50h,06B51455Fh,065485A5Fh,075736A63h,06160747Ch,06E6C6C56h,077716A70h\r
+ dd 09D988878h,0818E8991h,0706F8282h,06A5D6D75h,07B83786Ch,0807A797Dh,089848180h,090858179h\r
+ dd 07077758Ch,080817F7Eh,090878081h,0847D8487h,08A8E8581h,0989D8681h,09B8F879Ah,01F24539Bh\r
+ dd 02726322Ch,0282A2C2Ah,029212528h,0403A403Ah,03735393Eh,02E2B343Dh,05D63553Ah,09B90B19Fh\r
+ dd 0A5AFA597h,08C8C8993h,08E948887h,0796E868Dh,06661616Ch,072796D76h,083726E6Ch,081767481h\r
+ dd 0918B868Ah,09C819084h,0706B788Ch,081847E6Ch,071776E74h,06C7C7263h,0697E8078h,077808F79h\r
+ dd 071789383h,061536372h,0676A7175h,07E7D6973h,06A726D78h,06C6D686Eh,06C616869h,07476676Eh\r
+ dd 075858C95h,0A6968783h,0A68C8982h,07A6A899Fh,0977F75A2h,07C776F83h,0747F846Eh,0746E7E73h\r
+ dd 05167636Fh,06B6A6257h,072787A66h,0B29B8C71h,09D816CACh,07D7E7E92h,079757A84h,0707B877Fh\r
+ dd 06E697A7Eh,05C6B575Fh,0615F565Ah,05D696867h,0615A5E60h,065665D5Dh,0706A6765h,05150566Dh\r
+ dd 05D5E6F68h,05A5C5C64h,076594B57h,05F635665h,05B615266h,06F5E6773h,07E6F645Ch,076748080h\r
+ dd 0A888867Eh,0A1A29EB1h,0A1A8B1A5h,068727E9Ch,0797E807Dh,078797C81h,07F8D9182h,098988F8Fh\r
+ dd 0ADAB8486h,091A1A8AEh,07C808A85h,0988C9183h,0A6B5B59Dh,0A2A49E9Fh,07892979Fh,01B282A41h\r
+ dd 02F292019h,02A323332h,01D232729h,0291E1B1Bh,0282E3731h,048383630h,030292A38h,0804C311Fh\r
+ dd 0ACB6AE9Fh,0ADA79C9Eh,097A7B1ACh,0B293A39Ch,0796D8E9Eh,08778757Dh,08697A49Bh,0958D988Fh\r
+ dd 0A79B8D98h,09BACBEA6h,07C79767Ah,0968F8677h,08D8A999Ah,09E9AACAAh,065859F96h,077738A8Dh\r
+ dd 0787B6E81h,0807A7570h,071687482h,09A96787Bh,06D67708Ah,05F6C766Eh,06F5C5F5Ch,08F7F7C7Ch\r
+ dd 06F89818Ch,07D83837Fh,087866A69h,050727F89h,08C7E6B5Ah,06E707180h,079857960h,07D6F8381h\r
+ dd 0647D6D78h,06F6F645Ch,08C896569h,0B0A0A28Ch,0907C7DB1h,095929CA2h,07C79708Bh,06A778B83h\r
+ dd 0647C7D78h,053586460h,06559515Ch,062696969h,0666B6B67h,064645A58h,070655560h,060606F7Bh\r
+ dd 073676165h,04E565E6Ch,069614A46h,0605E5B63h,0526E5F63h,0665C757Fh,085696268h,0908F8887h\r
+ dd 0AA908780h,0AFAB94A2h,0ABBAA7A8h,07A6B8DB8h,07D7C838Eh,083858888h,08A8D8B86h,0959D8E8Ch\r
+ dd 09695788Dh,08D979593h,088959384h,09886838Ch,08C999E93h,09CA69C90h,01D388598h,027202D23h\r
+ dd 0302E2E28h,026313635h,0302A2C29h,033262A2Eh,02D2D2E31h,032272F35h,02D343535h,0201D2338h\r
+ dd 0503E261Bh,0886E645Ah,0B0AD9A98h,0BEAEB7B3h,0936E9CB1h,0826B7A8Dh,07D82929Ah,08889927Eh\r
+ dd 097898688h,08D839A92h,07B808981h,07F958A7Ch,098837A7Bh,09CA4A5A0h,0778AA396h,06E768B81h\r
+ dd 068816F6Eh,06D6D7476h,067617770h,0797F8F6Bh,06A6F939Bh,0626B735Dh,06B687E6Ch,07D967672h\r
+ dd 067636976h,0847A7885h,087887488h,06C6B7883h,06A5F5B53h,0526A7B70h,0686C5C57h,0646F6E66h\r
+ dd 05757476Ch,06663605Ch,060706869h,0949D956Fh,080797C96h,079797C82h,076757B82h,0677D7F79h\r
+ dd 062697974h,04D555255h,0604F4A5Fh,047544E54h,04F4D4F4Bh,04E57544Ch,05F604B48h,0525A695Fh\r
+ dd 0706D6A5Dh,05D5A5F6Ah,0586D546Eh,065555154h,067615F68h,060666F6Fh,089787363h,091909389h\r
+ dd 0A8BA7C83h,0A19C9394h,0B4BEB49Eh,0666A84A4h,0887C8074h,088958D89h,09289848Bh,08E898C90h\r
+ dd 0838D8DABh,089949990h,09C97978Bh,094B29E9Fh,0A4A4A695h,0E3AEACA2h,0322E39C2h,0253D3232h\r
+ dd 02D30323Dh,02A291D2Dh,02535373Eh,02A26232Ah,08F613D40h,0717E9397h,041396676h,0210E1C19h\r
+ dd 0211A1F24h,0301E232Fh,09A6B352Fh,0AB8994BBh,0A880B9B4h,080817797h,08E7A9389h,0867A7A88h\r
+ dd 082807C79h,0877B7C82h,080717D89h,0858B8C7Dh,086929481h,0979E9687h,08888A58Bh,0807C7996h\r
+ dd 07B918563h,06E6F6773h,0676FA187h,09085877Bh,05F839599h,064647264h,0665B6459h,07464666Eh\r
+ dd 0A175757Bh,091A0A19Bh,07C8699A1h,0A0968D81h,0707A9579h,0677A7C75h,06E67776Ch,0615E4B70h\r
+ dd 06055616Ah,069626567h,0646E8070h,06064606Ch,06D615C69h,075677674h,08485836Ch,07477767Dh\r
+ dd 065727779h,071604B5Fh,06C7C6D66h,0776E7B79h,04C77897Ch,06B6A6458h,0475B5559h,0646B5B52h\r
+ dd 06B6D5E53h,0535B6666h,05A5D4E5Ch,069646660h,0605D5D5Fh,06A726B67h,07D6B7259h,086857A7Dh\r
+ dd 092968A98h,0A498A9A7h,08297A6A6h,07E71757Ah,07E89A699h,09E969F98h,09596928Ch,09D9EA9B0h\r
+ dd 0A99F8C9Fh,09EB0B9B8h,097919D9Bh,0AA97AE8Ah,09C958198h,090BABBA5h,03A37352Ch,033323033h\r
+ dd 022273035h,027171B19h,03852262Bh,0A87C5240h,0E3CFB6B4h,0C8CBD7DEh,06685BDCDh,0556C8B7Fh\r
+ dd 016112035h,0222C2D24h,02118252Ah,0B4748A64h,093947EA2h,0938874BFh,0767D9587h,06A7D788Fh\r
+ dd 06A687E7Fh,083767272h,07F817F81h,07B938C7Fh,097878889h,08C89848Dh,06F949F82h,0797F7C85h\r
+ dd 073837079h,073655C5Dh,07470888Fh,08187767Bh,0947A827Ch,0696485A1h,0757E6D74h,098976C6Dh\r
+ dd 0B08A798Ch,0A39AB7BBh,0B28798A7h,0A28695A6h,07C829687h,07F7A6B6Fh,06C836E6Ah,0636D6382h\r
+ dd 069696C6Ch,06368706Fh,060607163h,071845C6Eh,0766D6977h,074687779h,076727971h,073777275h\r
+ dd 065787779h,07874555Ah,05F646770h,07D686E6Ah,059848175h,0505D695Dh,05C5F535Eh,05C4F4E63h\r
+ dd 06F6A524Fh,05C626965h,0514C5261h,05255734Ch,04E4F535Ch,067635754h,06E72745Fh,06B7C7E73h\r
+ dd 083908E7Fh,0A292938Ch,073808C8Fh,05D676864h,0807A8F7Eh,083948C86h,083858B89h,08D878E89h\r
+ dd 07578738Eh,084877C74h,070807789h,06A6F8689h,092928376h,00D529D8Bh,037383E25h,02B272E30h\r
+ dd 01E1D2820h,03D2C2D0Ch,0A3B56C4Eh,0CFE1D0C2h,0CECCC6CBh,0999AA6BBh,0B29B9799h,0AE9BA497h\r
+ dd 0619DA29Fh,01E19212Ah,0212F2B30h,09A705B37h,0A8899DA3h,094858B93h,07F7A897Fh,08F8A7878h\r
+ dd 075707479h,08D8C8981h,09273767Fh,079777F83h,07A7F848Ah,0727B7A72h,06F93917Ch,064726E70h\r
+ dd 0696A6C60h,07282726Dh,0746D6B6Fh,0767A646Eh,06B6B616Ah,06D6A7567h,06668717Bh,0918D7D66h\r
+ dd 0A88C7385h,09CACC4B1h,0A2ABA8A5h,085A1A8A4h,0817F8E80h,0727D7F7Ch,077907876h,064625D71h\r
+ dd 064676867h,068686865h,0716C716Ah,084707383h,091999BA4h,07469747Ch,0726E6B71h,073777778h\r
+ dd 0676B7779h,066695D6Eh,061676E6Fh,06B686967h,0476A7C6Fh,057636A5Ah,05A595165h,072655352h\r
+ dd 0846A4C56h,060758380h,073656461h,07361645Fh,05E5D6684h,060586062h,06C64676Bh,076727A7Eh\r
+ dd 0A0958E79h,09DA39194h,079919D9Ch,083939479h,0A38C6D6Fh,07D818798h,08F847873h,0A69EABA2h\r
+ dd 07C878BABh,089959082h,09297A483h,09096938Bh,0A890949Eh,0213A91ABh,034362B3Eh,0592B2A2Eh\r
+ dd 09C7A4168h,08D9B8A60h,0B3C2C0A1h,0B5B7BDC0h,0BAC9C1B6h,0B49C97A1h,0AFADB1C3h,0A392A6AEh\r
+ dd 0CE9F8DB0h,05B696DAEh,01F20362Dh,089421513h,090A0B0AEh,07A718A7Dh,0675A7178h,06463596Ah\r
+ dd 0625C575Ah,08B7B756Fh,0736F7B89h,07A827C70h,07A7A8079h,083878279h,08B817B80h,06C777C85h\r
+ dd 07973747Eh,06A615972h,074737489h,0906F6C67h,07B817E8Fh,07F887872h,074707272h,0918C7463h\r
+ dd 0B2887E8Fh,0A5B4C0B8h,0B6CFBDACh,09594A8B5h,07B799197h,079898B7Bh,0837A9288h,06C5B5F7Dh\r
+ dd 0615C6168h,05F686766h,06962695Ch,09680767Ah,09D89789Ah,0867B9AA2h,0736F6F83h,073777275h\r
+ dd 0656B7779h,06964576Bh,06F7B776Fh,06F67686Bh,051717D71h,0656A6A5Dh,066675764h,0666B6268h\r
+ dd 0735C5270h,064737772h,06B5F5F63h,0606D776Ah,0442B5C76h,062544048h,069515C63h,07D788375h\r
+ dd 0A46D8D89h,0A297959Dh,0867A8F9Ah,0ADB2BC7Ch,0967C8C7Eh,0696E8295h,06D766E64h,0B4BBA792h\r
+ dd 095959A97h,09C998681h,08D7C7C84h,0A0929467h,0A4B590BEh,0197C9FBEh,036333337h,09C4C1D2Eh\r
+ dd 09FA29DA2h,0AFA46C68h,0AFD2C3C1h,0E3E1DFC8h,0C3CCD4C4h,0BFB8A1ABh,0B8C0BBBAh,0AC9AA3BEh\r
+ dd 0D1BFB3C9h,080594DB7h,02B398BBEh,01B251016h,0B6D1BB5Ah,07E728AABh,0756F7776h,060636A73h\r
+ dd 065604952h,07D74786Fh,0717C6D75h,07A8B7A5Fh,079866F72h,077797D7Ah,09490807Dh,08E9A9692h\r
+ dd 0886A6782h,072797388h,082808083h,0906C7980h,07074809Ch,08689827Bh,077889A86h,076866F84h\r
+ dd 0996A767Ch,095A48BC6h,08BA6CFB9h,0A9A4A6A8h,07A656680h,08A7B7D8Bh,0686F747Ah,06C586579h\r
+ dd 069676972h,08275696Eh,07161706Dh,06F786275h,075747469h,07D7B7C79h,073726D7Ch,06D697877h\r
+ dd 06B787978h,071684C77h,076737876h,06F5E6977h,04B687758h,04F606557h,0807B5E4Dh,06B606058h\r
+ dd 075654D6Fh,0646D6F63h,06C696F68h,067636064h,04F3C5B8Ah,0504F524Eh,0675A4E4Eh,06A63777Fh\r
+ dd 097809781h,0ABB0B7A4h,0958C889Ch,0A59FAB78h,07F7FA691h,06C70767Ah,0815D6969h,078827C7Ch\r
+ dd 0B7968E8Dh,0959DA5B0h,0A2A38387h,0A47FB4A0h,0AFC5B6C5h,0177E99AFh,0343A3435h,0B5852C17h\r
+ dd 0818DABA9h,08B7A7976h,0B1C3A7A6h,0CBC7B6ACh,0E5E3BAA2h,0A3B7C4CAh,0B69CAE9Dh,0A08DB2E2h\r
+ dd 09FC8B3A1h,01F2D4383h,08B76452Dh,018142770h,0BD8F251Ah,05C7BBAC0h,07B6E6866h,0645D6977h\r
+ dd 05D605358h,0766E8174h,072736D77h,08F6E6461h,07071697Fh,0757A7A7Ah,093866E6Bh,0808A8883h\r
+ dd 08C86746Fh,07664547Dh,07A676473h,0847A938Eh,0706D748Dh,086988F7Ch,07C718E7Ch,0685D717Dh\r
+ dd 06C7C6F79h,076835E6Ch,08064777Eh,076757686h,0666A6C69h,06083826Ah,06E706362h,0655F6A72h\r
+ dd 062616160h,063616464h,0575D6062h,05655565Dh,065565450h,062575A69h,07B7C7174h,07586787Ah\r
+ dd 06C808177h,0566F5B75h,043455057h,04B373D49h,06C675148h,05C656D67h,065536B63h,0605E6564h\r
+ dd 071594A7Eh,0696F6F64h,071747C75h,0675C5E5Fh,05D5B6881h,04A535D4Fh,067624D47h,06974677Dh\r
+ dd 0758F9A79h,0AA9AA68Bh,0A09993B3h,0ACA7AF7Eh,08E94A8A6h,0797D8085h,09A917975h,08988828Dh\r
+ dd 0B89F9286h,097ABABA9h,09BA0928Ah,08F89938Ch,0AEA39CAEh,02081B6AFh,0303A3F3Ah,0AC975717h\r
+ dd 08FB5B6A2h,0897F8781h,0B2AFC69Fh,0DDCEA99Eh,0F2D9D3C9h,0B4BDC5DAh,0C4C0AEABh,0C49ECCF1h\r
+ dd 0BEBAB9B7h,0596F79ACh,0A4AB8247h,0407EB79Dh,07E390616h,062A5BE9Fh,0695D646Dh,060585E68h\r
+ dd 05D655E5Dh,0746D877Ah,0736B7478h,06E736867h,06D7A696Dh,06B68696Dh,0847C7072h,0868C898Ah\r
+ dd 08F8C7A73h,0616C677Bh,095806A77h,0807C90A3h,06F70748Bh,0A5967E72h,094746E90h,0858A8087h\r
+ dd 0838E8180h,09D7B8C9Ch,089967C89h,0587B7286h,0616B9478h,0816C6C6Dh,074796870h,07A7F8A8Ah\r
+ dd 0726C7068h,06C737E7Dh,075786D79h,079717E89h,06A595B6Dh,091798688h,07F847F97h,07C747B7Eh\r
+ dd 07E949390h,0716D6072h,05D4D5C6Dh,05C575962h,07D826D54h,05C5D7081h,0675E5B5Bh,06D626561h\r
+ dd 0765D4A54h,061636A71h,07676756Bh,05F5A6A64h,061535E66h,050565853h,06162514Dh,06A8A6465h\r
+ dd 06B92906Dh,08D818480h,08F969497h,09E97A774h,09B9994A0h,0878B9194h,093957C7Fh,097938788h\r
+ dd 0BCA59786h,088ADB4ADh,0708B9678h,08D918067h,0AF7A809Fh,01E78D1B4h,029343C34h,0928C893Dh\r
+ dd 0848E9B8Fh,0809A988Ch,0A7BDAC77h,0BAC5B1A7h,0E7DCE3CCh,0BFC1BFCFh,0C7D3BCCBh,0C3A6E4EEh\r
+ dd 0CFE7D4A6h,0A4B3B7BDh,03F414084h,07E93614Ch,003033556h,068888336h,069706570h,07068726Dh\r
+ dd 0706D6F6Bh,07A7F7771h,080747A75h,07D7E8668h,06C74717Ah,057565B68h,0928B745Eh,08989898Dh\r
+ dd 08D897974h,0667D7E81h,072747C86h,07F7B7878h,0827C7986h,0879A9585h,094838788h,06D677C8Ah\r
+ dd 091937E6Bh,0BE8D9F9Dh,0A095838Fh,0749590A1h,073659884h,08A7C9395h,0808C7689h,08486939Ah\r
+ dd 0806A7875h,087868796h,07A64667Fh,0839BA191h,06D694A59h,0898F9F7Eh,07E7D7482h,0837D7E7Eh\r
+ dd 072797E8Dh,07A707A73h,06263707Bh,060535966h,0636D6C5Dh,066607576h,067666B79h,063627176h\r
+ dd 05E5E604Fh,061616D63h,0695E596Ch,04A3D4D6Dh,05046524Ah,053535351h,065634956h,05E7E5C5Dh\r
+ dd 057677563h,05D605E62h,0836F6E71h,079778A7Fh,0818F7D89h,09188908Dh,0796D7881h,07F80717Ah\r
+ dd 083808C74h,07E8E938Eh,0859FA37Eh,07A73868Fh,0AE928B96h,0285CCABBh,026303432h,0ABAEA467h\r
+ dd 0A58D8B85h,0D0B8B4B5h,0B8BCBAEAh,0BCC2BEB5h,0BABCB6C0h,0ACACA7A7h,0C2B3B2B9h,0B198A1B6h\r
+ dd 0A9AEB7B9h,0A6AF929Eh,08F8893A1h,077857D89h,02E506D76h,057330912h,066736983h,061595E60h\r
+ dd 0645E5460h,07D866E61h,08F757E77h,0757C8572h,06B697273h,05F5B667Ah,07979706Ah,06C676E77h\r
+ dd 096897D66h,071767288h,05B616C6Eh,07C746E69h,07D77787Bh,07776887Fh,07A786972h,06D826971h\r
+ dd 0AB817575h,09E8DAEB7h,0A89D887Dh,0778A8D98h,0807B8873h,0796A6D7Ch,08D908A97h,07C788DAEh\r
+ dd 07D5F6F7Eh,09F967E8Ch,07C61737Fh,06F7B7C86h,0747D475Ah,07C9A9A70h,07C7E8471h,0777A837Bh\r
+ dd 071778783h,06E606E6Dh,064646B78h,057535B65h,05C695D53h,06D6A6F66h,06756636Fh,0696B6F6Bh\r
+ dd 059556154h,0786B6F66h,066656769h,05A616864h,053535E56h,0605A5A57h,06B666C73h,0526D726Fh\r
+ dd 0746B5757h,071827C77h,090835F5Dh,08F96A5ABh,09CA78B96h,0C7A5B7BAh,08C6BA0C7h,09D9F9F8Ah\r
+ dd 09E7D7995h,0B09E9AA3h,093A1ACC2h,0A396A39Bh,0D6B3BFB5h,03849C0B6h,056323337h,0D4CEB697h\r
+ dd 0B9D2C4C2h,0E6FAF0C1h,0C5C8CDEEh,0A2C3C9D2h,0CEC4A9B9h,0E6BEC8D9h,0CDB0BCFAh,0D2D1DBCFh\r
+ dd 0D3D9CDCBh,0B7C5A1B9h,0BABBB1BFh,0ADB5A7A4h,08E7F98A9h,002357595h,056433A16h,05B605C63h\r
+ dd 057525C5Ah,07B7D7667h,089808880h,08B788489h,06B6D7357h,054717178h,0816A6D6Bh,078707F88h\r
+ dd 07869736Dh,0717C7475h,07984788Ch,07F7A6E76h,0B9C29060h,089798583h,06A62928Ch,084807778h\r
+ dd 091847886h,096AEA786h,09D8F786Eh,08490999Ch,069787169h,0876A5962h,0A992867Ah,06E788A95h\r
+ dd 08098917Dh,08B73797Ch,089847695h,067677D80h,08D735D68h,08B8F7F8Bh,089827C76h,07C828490h\r
+ dd 07D8B8986h,074656C73h,0656C6162h,0657A7C75h,07373686Bh,07E5A697Dh,06560677Ah,071717170h\r
+ dd 04D4F594Fh,06966755Ah,06F67657Dh,05B726064h,067636959h,070666A6Eh,071879B8Dh,073666462h\r
+ dd 062657C86h,06B766F65h,09F908975h,0868B96A2h,08A957E8Ch,0B5A4C0B5h,075769490h,0A89C8C77h\r
+ dd 0A389829Dh,0A5A2ABADh,0B6B2A39Dh,0BFA6B1BFh,0CBD8DDD3h,03B3EA5CAh,0762F3432h,0C6BFB893h\r
+ dd 0C8B6BDD0h,0D5C1B8C7h,0D6CDC7DFh,0D9CAC4E5h,0EBE9D6F2h,0E5E2DCE4h,09CB6C6DEh,0E0D8D0BCh\r
+ dd 0D4DAC9BFh,0CCD6B2C5h,0AFCAB7DBh,0BFB6A8A8h,0A28DA3BEh,0639EAEB7h,0050F0E2Fh,054411609h\r
+ dd 05E5E5561h,069766B5Eh,0866F837Bh,09F7C7F8Bh,0687CBCADh,077AB8670h,076587986h,06E6D7E83h\r
+ dd 0566F6A56h,06E645854h,07980878Fh,07B708277h,09DAAA193h,08F777F7Eh,0747D878Dh,08779858Ch\r
+ dd 07C836662h,0868F8777h,088747B70h,07C796F7Ah,067645E62h,07964545Ch,08E84867Fh,0757C807Bh\r
+ dd 0837A7473h,07D908A82h,060837A6Fh,0484E645Ah,07E655A5Ch,07C7D6D7Bh,07B7E7F76h,07F848493h\r
+ dd 063728B8Ah,05F5F6865h,05B56756Bh,06D616762h,06A6A6868h,06A616973h,06C636268h,0645A585Ch\r
+ dd 04B4A554Bh,061617157h,06C6C8081h,069715560h,0756F756Ch,07C736D75h,089949588h,0A29B8C83h\r
+ dd 06E727A9Ah,08483756Bh,09B87896Ch,08D8B8E8Fh,074918E9Ch,098A2AB8Eh,06F99A8A6h,092827878h\r
+ dd 097969478h,0B1AAA4A7h,0B9C5AD9Ch,0B59DAFA4h,0BBC6B3B3h,03E2FA4BCh,09552302Fh,0D3B2B28Ah\r
+ dd 0BEE1DEE5h,0EADEAC95h,0EFFAE7F9h,0F9F4E5F1h,0E9FAF7F9h,0DCFADECAh,0A3AEA2C1h,0F6D5B2ACh\r
+ dd 0D8D8DDEBh,0C9D2B5CFh,0ACC4C5DBh,0C4BCB9B3h,09989A8BBh,0A8A6AAAEh,03A6881A0h,00717251Fh\r
+ dd 05556300Ch,06F756551h,08A7A8278h,06E82847Eh,07F80879Fh,0778E7D80h,086677383h,06E758787h\r
+ dd 05B525578h,0806F6078h,080819087h,09681737Dh,0B5A09991h,09F7C6F8Fh,0646E8095h,096AF9D83h\r
+ dd 082818F81h,0727F92A1h,07373876Fh,06963879Ah,058636769h,073766452h,07B777B74h,06A666B72h\r
+ dd 0817D6A5Bh,074858A7Dh,06E807C8Ch,05A646082h,06B735D60h,069717D69h,06D717A6Fh,07A7D807Dh\r
+ dd 0707C8784h,06760666Ah,07E70645Ch,07E706C73h,06C757C6Ah,05B75776Bh,0675F5957h,066646465h\r
+ dd 05853574Dh,08D796C65h,07869766Eh,085857878h,087878880h,07D7A727Fh,08D8D7F7Bh,094AA908Eh\r
+ dd 07882757Ah,08C867B70h,08191A489h,089879987h,070828E9Eh,08F9C856Fh,0C3AFB2A3h,06588C9BCh\r
+ dd 0B89A8D92h,0B6ABB5C8h,0A2AC9FACh,0C6ADA2A0h,0C39FB9A7h,03C296419h,0C5722D27h,0D9B2AA9Fh\r
+ dd 091CCCCC7h,0EBEFFABDh,0F9EEE9D8h,0FAFAFAFAh,0D2E5E7F4h,0F6FAEFE0h,092D4E0D5h,0F6D2CA8Fh\r
+ dd 0D1E1EAFAh,0BCC3B3C5h,0C9D4CDCDh,0BBB5BBC0h,0868AB2AAh,0B09E7788h,094B37A83h,03B2E6173h\r
+ dd 02218313Dh,0584B4433h,0837D7760h,078819B80h,0789BA6BBh,0947E7E8Eh,0796D728Fh,068718686h\r
+ dd 0586E6664h,072756461h,096917E8Eh,08E7A7A80h,089A6A99Bh,09D716E6Ch,06B7C8C99h,07367A172h\r
+ dd 07579B2AAh,07CA7A79Eh,0887C7C66h,07C8B7C8Ah,068666978h,067675E5Ah,0706D736Bh,069737977h\r
+ dd 07D736E75h,0788A8173h,06E76708Ah,06E7C686Ch,06B675D5Dh,068666666h,07D686369h,07477787Ah\r
+ dd 065707F7Dh,06F68696Dh,0655B6075h,0737D645Bh,06F737A7Fh,05F556472h,064696B6Ch,0656F736Eh\r
+ dd 062746B69h,07B7D7159h,0767D7F8Bh,072716D72h,0747A7A76h,06C796B6Fh,07E7B796Fh,06E768883h\r
+ dd 078856974h,07D868678h,07E8A7C80h,0747A7977h,06B6D6C75h,07781787Fh,09E8F8489h,086A2A2AEh\r
+ dd 0B18E8B84h,0B4BCAFACh,0B4B4A6A1h,0CBBFBCABh,093CDCDD3h,02F395327h,0B6903B23h,0A1AEACA1h\r
+ dd 0BE91D5C9h,0FAF6F7F6h,0FAFAFAFAh,0FAFAFAFAh,0D1E0ECF9h,0EDF1DCD1h,09CB6C9D5h,0AC98A196h\r
+ dd 0B0A9AAB7h,0908994A5h,0B5BBC09Ch,0B7B6AAB0h,0958F9BA0h,096AA929Ah,0829D736Eh,087908377h\r
+ dd 05E65727Dh,010062836h,020240C10h,04D56482Bh,0859C6255h,07B757C84h,0807C767Ah,072708497h\r
+ dd 08B878679h,07C777071h,07B80707Ch,0977C6272h,07E877F8Dh,07E696577h,0736D737Fh,05D799672h\r
+ dd 07076A473h,06870837Fh,0886D6B77h,07C918A87h,071686C78h,08A6C706Eh,0937B798Ch,07E7D8776h\r
+ dd 06A7C759Bh,081857161h,06E727C7Bh,066818C7Ch,06F717158h,0675C6268h,079735F6Ch,0787D7D76h\r
+ dd 061718484h,071775875h,06D56656Bh,0786F6167h,0767F8075h,077757A79h,073777773h,077788480h\r
+ dd 0825E4C6Bh,06A6B667Fh,0474D5452h,05A5A5A65h,060626B5Ah,0646C6664h,07C846D6Eh,0746F9C87h\r
+ dd 084878380h,0918B8684h,07F8F7880h,07A767E7Ch,080878A8Ah,07C6D7486h,077707478h,07B8F7F83h\r
+ dd 09286A497h,09396878Eh,09D999178h,0A69EBD9Ah,072A88C9Eh,0433D6247h,0A6A08229h,0B7D3BBC1h\r
+ dd 0F5B28ED4h,0FAFAF5FAh,0FAFAFAFAh,0FAFAFAFAh,0D3D9E1F0h,0E5E0D4D0h,0C2CACFD9h,09D9FA7CCh\r
+ dd 0AFB8C19Fh,0C2BCB7B7h,0B0ADABB4h,09AA3AAB7h,0A497A2A7h,07FA5A8ACh,07B929387h,08A7B7570h\r
+ dd 07C79828Eh,03E54808Eh,029221A1Bh,03B3C262Dh,0A5865F76h,0899C9792h,070727576h,06D71647Eh\r
+ dd 0958F8588h,0787F7E78h,070847C70h,094887878h,07F86737Fh,084758284h,0929D7F9Bh,091968080h\r
+ dd 07987AD8Ah,084788A84h,081858084h,080858A8Ah,06A676D7Dh,075657061h,076837971h,07A7F7B64h\r
+ dd 06272626Eh,06E786E5Ch,0626E7F78h,06B778F74h,094959388h,0858A8D91h,081856F80h,079829080h\r
+ dd 071647378h,07F7E5D7Ah,0535C827Fh,07E6F5B57h,071747D7Ah,070766664h,06E5B5668h,079696864h\r
+ dd 0746C6260h,06A7C807Fh,05C5C5F49h,08A807D62h,07A6D7D90h,05D5B8091h,06F796255h,088668C77h\r
+ dd 08E7F7672h,08C84848Dh,0888C9B8Eh,0646D7175h,07F787571h,06A555967h,06A646F63h,065595B97h\r
+ dd 09D86948Ch,0877D86A0h,086AAB375h,0957D8A99h,04D9F89ACh,0273D272Fh,097A37E0Eh,0D6BED3C2h\r
+ dd 0FAF89789h,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0D7D7DFFAh,0FAF6E5D8h,0C7DCF1FAh,0B6A8C4B3h\r
+ dd 0B7BEB78Ah,0D4C5AEB8h,0CAD3CBBDh,099A7BCB7h,0B9C0CCC6h,0A49F9FB3h,07B8198AAh,09791857Eh\r
+ dd 072899F9Bh,033948880h,01A1B280Bh,0462B1E1Eh,0748F7A52h,079768E85h,07A757C91h,07285736Dh\r
+ dd 083648A7Bh,084A2CBBFh,088B1A279h,09A898093h,099B6A897h,0858E908Ch,099999A82h,093838C94h\r
+ dd 08377988Fh,08D7B7279h,07573716Fh,0656A7577h,0665E5D65h,06E758266h,08F65627Dh,085897A6Dh\r
+ dd 06577727Dh,06A666367h,063726E6Bh,06E635C5Dh,0847F7C87h,0727E8B8Ah,08688847Dh,086949187h\r
+ dd 072627983h,06A666C7Eh,07161776Fh,07E74666Dh,058636F72h,0484D4B50h,0554C4448h,0686D7D86h\r
+ dd 0625F8178h,06F708689h,07B68867Bh,084858A7Bh,054587781h,072685A5Ch,06E757752h,0B1797B71h\r
+ dd 081716D6Dh,08A797282h,07C719D76h,07A816D66h,089616376h,045404353h,05A749467h,089916352h\r
+ dd 0997D7783h,0835D799Ch,0A0B0B18Bh,08885807Ah,01E7D96A4h,02B37152Fh,0B4BFCA35h,098DFE6CEh\r
+ dd 0FAFAE266h,0FAFAFAFAh,0FAFAFAFAh,0F7FAFAFAh,0E7E0DEF6h,0FAFAF1E9h,0DBF9FAFAh,0CDB3C3E2h\r
+ dd 09AABAA9Ah,0D7B3989Ah,0B6B8C3BEh,0A9C4B9B8h,0A7A3ABB6h,0C0C5A6B1h,07A827D9Bh,09A877E79h\r
+ dd 0867E9CA3h,093A37A98h,026221D4Dh,01A253123h,06E4F2632h,08B807B6Bh,070808D8Ah,06E6E6D68h\r
+ dd 0B37C8878h,0ACB2ACBDh,078718EA4h,0857C8673h,081AA9A8Dh,08C91826Fh,09D98888Bh,0787F8C9Bh\r
+ dd 06C7A947Fh,0897E937Ch,076708A88h,084857F74h,07D6E7483h,081787469h,089779A8Eh,067727381h\r
+ dd 06A6E6971h,07B63617Bh,070797A68h,06D696471h,07C7A7883h,077787978h,08074717Ah,0757A7F7Dh\r
+ dd 0667A837Fh,076667663h,066716871h,06B7E6A67h,07174756Ah,052526C79h,072736954h,088837C64h\r
+ dd 0695C6764h,084707987h,074877F86h,055636A59h,04B4A4A54h,04B554B48h,0707C734Eh,0876B646Eh\r
+ dd 07779797Ch,08072787Bh,077868B87h,06376746Ch,0567D6571h,05E4A7577h,04A616F68h,0615D7559h\r
+ dd 0905D6879h,094768F9Ah,0AF9D947Eh,0768085A2h,01E83A68Fh,0142D2B42h,0AEA4BE63h,084D5E9CCh\r
+ dd 0FAF9F8C5h,0F3F0FAFAh,0EFF9FAFAh,0FAFAF4F8h,0E4D0D5FAh,0FAFAF8EBh,0F8FAF2F0h,0E7DBE4E8h\r
+ dd 0A4B093C3h,0CCD8C3B3h,0B5ACC0E9h,0BFBBBCB3h,09E9097AFh,0B8A1B09Bh,08D9399A0h,07F8D6982h\r
+ dd 0727E9996h,08A9C7881h,022359DB1h,02D272826h,031302728h,0818B5A5Ah,07F7D8573h,090938D7Bh\r
+ dd 0A0997C6Dh,08F808BADh,0838278A0h,084738C83h,0827C7990h,0767E8A8Ah,0838E8F80h,0A7ACAB90h\r
+ dd 0A5BFA6A4h,0BA9C84ABh,08FA194A4h,0A5A59E9Fh,0798A919Dh,0818C8077h,07E848F83h,06A807177h\r
+ dd 08D66746Ch,0565C5F85h,0717C755Fh,06E697875h,08697877Dh,08789878Ch,08E927E82h,078749081h\r
+ dd 06E697786h,07774686Ch,05C59635Ah,062766666h,05C6B6972h,03D525B59h,05E664A4Fh,0826E777Ah\r
+ dd 07A5E5461h,06D756D75h,07579776Ah,04B616F73h,04A43414Dh,05A504F4Eh,0524E535Eh,076594C55h\r
+ dd 0767C777Dh,070778384h,0717B8B73h,089717672h,03B475670h,056617F79h,070706950h,08E838D56h\r
+ dd 08C6C92A7h,08C88989Fh,0B68C7978h,0799CA8A5h,0165BC991h,0402F3946h,0CFB9D8A7h,095A3E6EAh\r
+ dd 0FAFAF3FAh,0F9DAF6FAh,0F9FAFAFAh,0FAFAFAFAh,0DBD7D2F0h,0FAFAF6E2h,0EDFAFAF3h,0C9CCE7F3h\r
+ dd 0BECCC1BCh,0B9BBB9CBh,0CAC4B2AEh,0C7D9D2B8h,09BABB7C8h,095A5BF92h,0A293ACA2h,0AA9B7F91h\r
+ dd 07B8E939Fh,0899C998Dh,07E9EBEA7h,0272A1D25h,0282F2A27h,05239132Ah,08E99928Ah,0B6BEABA7h\r
+ dd 0A78C619Ch,08D8D9194h,08F9E9795h,07B6D8880h,097948B8Bh,082848289h,07F878F86h,093A59D89h\r
+ dd 0809A9E8Fh,0B391999Fh,08CA58CA4h,0A5959A9Bh,084958988h,08F817F78h,093999D92h,06171708Dh\r
+ dd 087746E5Ch,05D6B6B87h,06C746B59h,06760816Ch,0818D7C83h,088878289h,08B848275h,075777F83h\r
+ dd 073817684h,05C56555Eh,050685252h,0646E5456h,06E675262h,043585358h,06D68524Ah,078878192h\r
+ dd 07268656Ah,0827C7372h,0666C6B8Bh,0777F7D90h,06F65657Bh,07B777473h,069777D81h,0746E7970h\r
+ dd 059636F81h,06661766Ch,06D6F5F65h,06C706F73h,068625D6Eh,0808A7681h,093A09F88h,08F8F858Bh\r
+ dd 072777F87h,08F878B82h,070666F78h,08D8C937Ch,04C4DC3AAh,05B243C55h,0BCB5BCB5h,0D37F9ECAh\r
+ dd 0FAFAD0D4h,0FAF7F1F6h,0F3DBF8FAh,0FAE8F6F3h,0D5D1D7E6h,0FAEBD1D3h,0F6FAFAFAh,0E3DEE8EDh\r
+ dd 0D9D2DFC2h,0949EB4C5h,094999798h,0BCB8959Ah,0A7AAB1B2h,09FA8A697h,08785A797h,091797283h\r
+ dd 094838086h,097918984h,0AB9E9B85h,025162689h,02C35362Fh,01F293636h,087958A44h,0767C889Eh\r
+ dd 08D6D6783h,07F85857Ch,089897D91h,08372808Eh,08B867A89h,094716679h,07A7C758Fh,08D9A9786h\r
+ dd 0A0A2958Bh,0BBAFB3B1h,076797D9Fh,08CAEB094h,080828598h,08F707F72h,0809D9B8Bh,055608B83h\r
+ dd 08D907258h,05C565C88h,07A81696Dh,06E546B6Dh,07F8C7B83h,08E8C8487h,08E898B89h,07876838Fh\r
+ dd 0616F7787h,07B6A655Dh,0646B5260h,08278597Ah,05F68607Ah,04E534C50h,067595647h,0818C7885h\r
+ dd 0616D7157h,0837A686Bh,09A746E6Dh,0878A807Ah,0857E7A81h,080898587h,06C6A7064h,072887677h\r
+ dd 05B687D84h,05D6B8474h,072616957h,08973656Eh,0636B5D5Bh,08CB08784h,08C78727Dh,0717E8D7Dh\r
+ dd 0968C667Dh,08B768097h,05B6D5B62h,0946E7C77h,04E2C9CA2h,07E26383Fh,0BDD0D6C7h,0F0967CB7h\r
+ dd 0FAF9F8B4h,0FAFAF4F4h,0F4E9D2ECh,0FAFAFAF9h,0BFD9F4F3h,0FAF3D6C2h,0FAFAFAFAh,0EDEDF9FAh\r
+ dd 0EFD4EAE2h,0BF9BB9D3h,096AFA99Ah,0A08F9892h,0C0A3A99Bh,090A08EA5h,07B9393A8h,080888499h\r
+ dd 098937E7Dh,0978BB092h,09C859F9Ah,018338BA2h,02B2E322Ah,037262827h,08C702A25h,07A8FB09Bh\r
+ dd 092686564h,0848A9387h,07B92AA9Ch,08E76727Fh,087867B82h,0AE866F78h,08F989CB1h,09092938Ch\r
+ dd 0A9919792h,0A6AA9194h,06C6E8C90h,066829384h,07D8D977Dh,098709679h,0828B8697h,0615C798Bh\r
+ dd 0698E715Ah,075664E64h,06F6F7087h,0977A8279h,081958486h,0837F8586h,080857D95h,072737E87h\r
+ dd 0797F7180h,07370817Eh,075666869h,06C6E7A74h,05577777Fh,05A4E575Bh,07B5F6143h,093928A90h\r
+ dd 06163AD71h,07C59695Ah,0687B716Ah,0887E5D77h,073807D77h,077707274h,070668B8Bh,075586172h\r
+ dd 063777E99h,069608079h,070705A5Dh,05E81667Bh,081807465h,082768375h,06E7A7F71h,08777857Fh\r
+ dd 096777D8Ch,0978387AAh,08482747Fh,08A8D7981h,06126959Fh,0A8242E5Ah,0B7C3EBD8h,0B0EA759Eh\r
+ dd 0F6FAF8D7h,0E2E3F6FAh,0FAF4E5C7h,0F7FAF8F6h,0B9BADBF8h,0FAFAFAD5h,0FAFAFAFAh,0FAFAFAFAh\r
+ dd 0D1E1EAFAh,0CED8C9BFh,0B4A0A3BDh,095919AB0h,0DEA89296h,08D809098h,0AB9D7577h,08D7C928Ah\r
+ dd 085847183h,07F78787Eh,08E809095h,02E7580A3h,02D2F291Eh,0222B3131h,06B212B2Ch,08085B3ADh\r
+ dd 0966E7269h,08A8A929Bh,0AEA493CAh,074786F77h,076738E80h,0A2776876h,08B91BC98h,0988D8D9Dh\r
+ dd 083807576h,09F957979h,08D91879Ah,07374877Ch,07E878F83h,080827F7Eh,07B7F827Fh,0626F607Ah\r
+ dd 0504D4E55h,073525451h,073576169h,07C746470h,0897E746Dh,07E7F8689h,08B887E82h,0747A8487h\r
+ dd 07A888080h,07B837B81h,0727C7C7Dh,0626B7874h,069757C74h,054464A5Bh,074665E61h,07F7E7881h\r
+ dd 065527181h,079817E48h,0947F798Dh,075787772h,0A07A7F7Bh,0666E7D79h,072718281h,0757D817Bh\r
+ dd 080767478h,0636D727Fh,06C755C7Dh,077867881h,09495746Eh,0816A6D72h,075717173h,087818278h\r
+ dd 088836184h,0757E8374h,0857E7569h,09896808Dh,047277A93h,0C04B2346h,0BFD0E2D2h,0C6CDAC7Fh\r
+ dd 0ECF1FAFAh,0C6E1ECEDh,0FAEEFAE7h,0EAEEF5F5h,0E8CAA9B3h,0FAFAFAF6h,0FAFAFAFAh,0F0FAF7F9h\r
+ dd 0E9F6F6F6h,0E5C7B2D0h,0B7AAAFC7h,0ACA7ABBDh,0DEAB8C9Bh,08594A1A6h,09B9F837Bh,089817B79h\r
+ dd 07A7E7C85h,08A847E74h,0939BA7A5h,0807F6FA9h,01E1E1F44h,023242421h,0313C2A2Ah,08C82BF64h\r
+ dd 076667F91h,081837980h,091A2978Fh,07D696A74h,086A56E89h,09B716D5Bh,08C95AD9Dh,08A8A8B94h\r
+ dd 088717183h,0A4AD9790h,0A1A29FAAh,08FA3A194h,0596F909Ah,09281695Bh,071757C80h,071836C72h\r
+ dd 058677985h,07E5E6B5Dh,086657482h,09D919490h,08D8682A0h,0858C8B8Ah,08D907882h,08A918388h\r
+ dd 0838C9292h,0856F6680h,07F74747Bh,0757B7E7Ah,068786B6Bh,0726E726Ah,09188796Dh,07D848591h\r
+ dd 06A646A54h,08F919476h,073706798h,0898F8681h,0AE8A9F81h,05280AA94h,0A6939582h,0756F6D6Eh\r
+ dd 07E837472h,073768B8Bh,0787B648Bh,0767A7780h,08E937074h,07468726Eh,0786D686Ch,07C6F6E82h\r
+ dd 07472747Bh,070868476h,07569716Dh,097948E80h,03B436589h,0BF6B2149h,0A9D7CCD2h,0E09DB077h\r
+ dd 0FAEAF3FAh,0D2C4DFFAh,0ECFAFAFAh,097CCF1EFh,0F9FADDA7h,0FAFAFAFAh,0FAFAF9FAh,0F1FAF9FAh\r
+ dd 0EBEFEAE0h,0C8C4DEECh,0B0B2B6D9h,0B6B3B9B5h,0D1A988A3h,095AABDBBh,0A3A88E8Fh,08B8A838Bh\r
+ dd 06C6C6C79h,0A18A786Ch,0848D9097h,08B776A7Eh,01A0C3486h,01E20211Fh,03B28201Fh,082764231h\r
+ dd 0796C687Bh,0858B6174h,05F6D807Fh,088727A6Dh,07D907E8Fh,09C7C7E75h,099A2B6B3h,0A2A79D9Ch\r
+ dd 082738DA8h,0A4917F81h,09CAC87ADh,09B928F92h,0616E8F9Dh,075695E61h,07C746C6Ah,0737F6C77h\r
+ dd 05B636464h,076555952h,08E6F808Ah,09480949Bh,09796939Eh,0898C8D8Fh,07F7C858Ch,0858E8E85h\r
+ dd 0938D8A8Dh,078706B91h,078777578h,0807A7A74h,06E818D81h,0757D897Eh,082817E79h,07E848490h\r
+ dd 04F606758h,06D7A6555h,06B7A5C6Fh,080807465h,06F6B6F7Eh,04F848278h,0A3A98581h,066646E80h\r
+ dd 06F5D5C52h,07C737579h,06B685B6Bh,06D6E6366h,07F595B75h,069596570h,0746C6059h,059767588h\r
+ dd 05162756Fh,0645F5756h,07968845Ch,07C6D8085h,03D6E7690h,0BC993245h,07AC5ABDCh,0FAC5A8ADh\r
+ dd 0FAFAEEECh,0F4B9B4DFh,0EBEFF5F9h,0C4A5E2E7h,0E7E4F1E3h,0F2F3F1EBh,0F3F1EEF1h,0E6F4EFF5h\r
+ dd 0D9D2DBD1h,0F2F0E9EBh,0C7CCBDD9h,0ADA9B6C6h,0A9A18EA7h,08A88A0A3h,09D8E6685h,076778294h\r
+ dd 08073626Bh,091828487h,081909C9Dh,08592798Dh,020296386h,01C212729h,030292A2Ah,06D183A2Eh\r
+ dd 086866E74h,06F847E8Ch,0796A7587h,07E87847Fh,0777C8381h,0848C8280h,08286919Bh,0ABAD9183h\r
+ dd 0958C90A5h,096A78F8Dh,0B19D8C8Eh,09BA18791h,05D6E8494h,0605C5A58h,0736E7280h,0779B7F67h\r
+ dd 06652586Dh,06B5D6664h,092696777h,09C86A19Eh,09B938E9Fh,090969899h,07879858Ch,07F888D7Eh\r
+ dd 093828086h,0746C6794h,06F62727Bh,082737A72h,0587A8C7Dh,0817F7E69h,08177767Fh,0817D7577h\r
+ dd 0625F605Eh,07273696Bh,06C7287ABh,0655D7375h,05C585762h,0586C5E56h,0A4A59983h,06088BE96h\r
+ dd 0936D8366h,069849073h,0716F827Ch,066775A65h,0777B6E55h,06D68647Eh,062796C75h,06D746D80h\r
+ dd 072777D79h,07B646272h,0BAA3747Bh,08C8193ADh,03A995185h,0ADCC4B4Fh,084C9C2E2h,0F8FAA3CBh\r
+ dd 0FAFAFADBh,0FAFACEE0h,0D3F8EAFAh,0FAFAD08Ch,0F3F2E7FAh,0FAFAFAF7h,0FAFAFAF9h,0D7F1F3FAh\r
+ dd 0E5E8E9E9h,0FAF3F4EAh,0EBDFF1FAh,0D4D5D9DDh,0A5BDC1CFh,0B0A59B98h,0A999B49Dh,083ABA0A4h\r
+ dd 0988A9895h,0748D8078h,09487A380h,09097958Ah,061B1BDAFh,0170E3970h,030252524h,0240E1620h\r
+ dd 07B557B61h,0AA8A8CA4h,099919785h,08BA797A7h,08F867778h,089939196h,08C877EA9h,0B0B89886h\r
+ dd 09A8699A2h,0736E9795h,09BCBAA81h,0899C9898h,06C707777h,087777B7Bh,05F736074h,08B8F626Ah\r
+ dd 0555C5B55h,058786B65h,08A6A5F59h,09AA58DA8h,0979A8A97h,07F96B2A1h,07F79868Bh,07F8E7E7Eh\r
+ dd 09C807E83h,07482759Eh,07E7D817Dh,082788781h,058758F85h,07D7B8270h,06979787Bh,07B757161h\r
+ dd 072566665h,08E877B94h,07E7E8F8Bh,078725D6Dh,068747E75h,072887D70h,098918F80h,0867D9B9Ch\r
+ dd 093918D75h,062778D75h,0817C8C78h,09C916A8Dh,0929CA594h,064616188h,0928A8268h,05F756D84h\r
+ dd 0716E7379h,09F9B766Fh,0ACAF8D81h,090AC9BADh,01E5D2180h,0DFD0583Dh,06094DAF3h,0EFFAB3A5h\r
+ dd 0E5FAFAFAh,0FAFAFAD7h,0A4B4E4FAh,0FAFAFAA2h,0F5EAF0FAh,0FAFAF9F6h,0EDF5FAFAh,0E9F4ECEAh\r
+ dd 0EBF1F1EEh,0FAFAFAF0h,0E7F4FAFAh,0DFDCDDE6h,0B0B4C9DDh,0BDBAAAACh,0B9A0BBB1h,081868BA4h\r
+ dd 0948A8881h,080868D86h,086ADA9A2h,0A5AD9D88h,0BDCA8F9Eh,011386BAAh,028241C13h,01B151F1Dh\r
+ dd 08D775C2Eh,09A9F8582h,0ACB8997Dh,08FAAA2A3h,07E8B7E80h,0A8AC978Eh,095878F8Eh,0A09F9990h\r
+ dd 093818EA8h,081719397h,0AEAFA5A2h,0789C9DA5h,061626F71h,090837A71h,06A69879Ah,071716854h\r
+ dd 0544B6384h,071797571h,0955E6D80h,0909C9384h,09286948Ah,07E818695h,07E7D848Ch,088768280h\r
+ dd 07B7C807Ah,0757B7084h,078937C6Ch,071716F6Bh,05E717E75h,07D767267h,070787F7Ch,075706761h\r
+ dd 05E566E5Ah,0868B9A8Ah,081848690h,058605965h,08E8C7D6Ch,06D78707Eh,0948B6B6Fh,0868C8DA6h\r
+ dd 064707C7Eh,060616F5Bh,08565816Ah,0A1887684h,09FACB7A0h,07171678Dh,0998D9D85h,0747E6972h\r
+ dd 08982878Fh,0A6B08781h,065879571h,0C1A1D072h,01E4D1FA1h,0CFAE7131h,0A46AD1CFh,0FAFAD79Bh\r
+ dd 0F4F9FAFAh,0FAFAFAFAh,0B6BABFEAh,0FAFAFAF1h,0EFD2FAFAh,0FAFAF6F8h,0FAFAFAFAh,0E2EEF7F0h\r
+ dd 0EDF2F1E8h,0EEF7F4EDh,0E8FAF9E3h,0D5DEE5EDh,0C0AFBECFh,0D0CFCCD3h,0AFA6D3CDh,090AFA3A6h\r
+ dd 0AEA0B2B4h,080879299h,0B1BDB88Ch,09EAEA7A0h,0A9A19BAFh,0378DAEB0h,0201E0E0Dh,0161B261Ah\r
+ dd 084411913h,09397A9A8h,0A68AA4B5h,093A5ADA6h,08886A384h,0929C9FA5h,09D9E9388h,0809B8394h\r
+ dd 086898581h,08C9EA497h,093957B8Bh,08B908F8Fh,0737D8E92h,07C7C7772h,073848A8Ch,075857570h\r
+ dd 06F584F51h,0867F7675h,065767A7Fh,0817B717Fh,090867089h,08B8A8F8Eh,083837D8Bh,076828383h\r
+ dd 076838D8Bh,0918F7B7Fh,08B8C9194h,0858F988Fh,0998F8E8Ah,08D8D8C93h,072576F88h,09591838Ch\r
+ dd 05E656F69h,06D6D765Eh,071807360h,065565D70h,07D848A7Bh,0646C8183h,07C797486h,08C86898Ah\r
+ dd 07976827Fh,06A696B77h,050628365h,0AD95776Bh,0A0ACBAA4h,05B6E6B8Ch,0887F8073h,0707389A1h\r
+ dd 07B777677h,09286757Ah,077AF7C7Eh,0B0A0462Ah,017351AA3h,0D29F8C1Bh,0B75BA1C1h,0FAFAF6A6h\r
+ dd 0FADEFAFAh,0DBFAFAFAh,0DFC29BA9h,0FAFAF9F2h,0EAA0D0FAh,0FAFAFAF6h,0F9FAFAFAh,0D8E5F9F4h\r
+ dd 0F0F2EDE1h,0E4E5E9EEh,0FAFAFAE7h,0E7E8E8F1h,0CED2D6E4h,0D6D2D6CFh,0C0B3E9E0h,096B1CDC4h\r
+ dd 0B09CC3C3h,080897684h,0425A9BA1h,0A1B28552h,0A49F9E9Fh,097AD8493h,0080F1C4Eh,01C191F1Ah\r
+ dd 04B1E192Bh,0A8B6A287h,09897ADA9h,08F9CA8AEh,09E978E81h,0AEADBBB5h,091978D99h,092778F94h\r
+ dd 072787D88h,0817B8392h,098888F8Fh,085918F91h,08987898Eh,0777F7D7Eh,077889893h,0707F735Eh\r
+ dd 064495776h,06B616568h,08B64885Dh,0988A8C99h,09C836DA0h,09CA19B9Ah,0878B9293h,07C8E8286h\r
+ dd 0767D9292h,095966D6Eh,0838398A4h,09B9F9E8Dh,0B0A1919Bh,096A4A4A6h,091637C85h,09B978698h\r
+ dd 073757270h,0755D6872h,066625E7Ch,06C6F4A64h,0887B6E72h,052647583h,082756C79h,08B8CAC9Ah\r
+ dd 06E707E7Fh,05E6A6065h,0688E7F5Fh,07D897169h,0A49AA1ABh,07C727A9Dh,076716968h,0706E6B68h\r
+ dd 07D7E7574h,09D956D79h,08BB39C8Dh,090272A6Eh,01E2E2AA0h,0C8B99623h,08A946EC7h,0FAFAF9E5h\r
+ dd 0FAF3FAFAh,096EFFAFAh,0E3DBCB99h,0F6F8FAEBh,0F4E782FAh,0F3F1FAF5h,0E0FAFAF3h,0CFE5E0EFh\r
+ dd 0E6EFF9E7h,0E6EFEAE6h,0FAFAFAF1h,0F3F1F1F8h,0DCECE7F3h,0D9DCECEDh,0C1B5DAD8h,0B8D3D4CEh\r
+ dd 0C49BAEC8h,08DA98BA5h,025A892A5h,08F6B4122h,0A09AB2A6h,0ACA48F9Ch,0042C70A4h,01D1A2119h\r
+ dd 013272225h,08F965D25h,0979A9895h,07E8A9CA2h,0809A7E7Fh,0A195847Dh,092908282h,08F999583h\r
+ dd 0687B9173h,094BD957Eh,0979B8386h,08D849096h,08D918E8Fh,081928A96h,07381A1AAh,069787880h\r
+ dd 0606E5970h,0767C665Dh,0546C816Fh,0766E6578h,09F847296h,08C9BA19Ah,08280887Bh,08C919082h\r
+ dd 0737E8A96h,0968D7669h,087958F99h,09E9F706Fh,096837E96h,09EB6A79Fh,085588F99h,084786F7Fh\r
+ dd 06F78736Ch,05D5A5558h,07B6E666Eh,07E796D73h,081787882h,070817778h,06B727E80h,087888179h\r
+ dd 06B88978Dh,0656E6C60h,077737263h,08B837C82h,093928192h,06F7A7B86h,062606166h,07264636Dh\r
+ dd 080898075h,0888C7D7Fh,096AA9899h,04330539Ah,025475B61h,0D4CDB577h,0A1BC69C8h,0FAFAF7F3h\r
+ dd 0FAFAE0FAh,0A5AEECFAh,0F7DAE0D0h,0DDF6F7FAh,0F4F9CEE0h,0F0E6F4F9h,0FAF7EEFAh,0C1E4F6D5h\r
+ dd 0E7E3E3E8h,0E5F5F5E8h,0FAFAFAE8h,0EBF1F9F7h,0C8DBD3E6h,0D8D7DADAh,0E4DED4D8h,0C0B5D2DEh\r
+ dd 099B9D0B9h,0987794A1h,0889E93A6h,0333E3030h,07E6F5D41h,096909790h,04E8A9696h,02A2E192Dh\r
+ dd 02933261Eh,098642524h,06A7E8AA4h,08D8B7F7Ah,081978E82h,08F76888Bh,0928EA096h,0799B8A8Eh\r
+ dd 0618D7A76h,0A6A3BA96h,0878D849Ch,07B888587h,08F919287h,08A918795h,0797F969Dh,071707066h\r
+ dd 066645A81h,06670747Ch,073708078h,07267595Fh,0AA95688Eh,08D919C8Dh,084878E8Dh,0858E877Eh\r
+ dd 06974848Fh,091857463h,071889A9Eh,0A3A29268h,085707F9Bh,095A69395h,07E6EA491h,077717081h\r
+ dd 06D7F7C73h,08C765F65h,08A7B7475h,098787E87h,097999CAEh,08895868Ch,07C90747Fh,09EA29A8Ah\r
+ dd 083979499h,0737B928Bh,093949885h,0A2899E94h,07DA4999Ah,073917C63h,0736F6C6Eh,0775F637Ch\r
+ dd 08683928Ch,0697B7577h,06C7C7D81h,069446B6Bh,01E754E1Fh,0D2DDBC88h,0B79B4FA1h,0FAF8FAFAh\r
+ dd 0FAFAF5E4h,0EFBBB3E8h,0F8F5EEFAh,0D6F9F7FAh,0E8F7F0B4h,0E3E3F0FAh,0F1F8FAFAh,0D8D4EDECh\r
+ dd 0EEFAFAF1h,0EEF5F4F0h,0FAFAFAF7h,0EEF2F7F7h,0D9EFE3ECh,0E9E7E0E3h,0F5E7EFEBh,0D0CDE1F4h\r
+ dd 09BCBC0C1h,0BDC9D3A9h,0A6C1D4DBh,0283570ACh,010181E25h,05122151Ah,0A482665Bh,015164284h\r
+ dd 0211C2014h,0833A091Ch,0899D847Dh,0A5A4A297h,07F899AA0h,08E7F978Eh,09882928Fh,0605D8FA6h\r
+ dd 062816989h,0C3A3B385h,08E8892B7h,081878184h,0858C968Fh,0848E968Ch,07E7D8A8Bh,061687D73h\r
+ dd 07170717Fh,0736D636Eh,0A2A39A8Bh,099937F8Ch,0BA8172A9h,08E8F9AAEh,085878897h,0818C9A91h\r
+ dd 0797E818Bh,089938777h,09A98A38Eh,0949E9792h,0767A7482h,0ABA78781h,077628DA6h,07C7D7D8Eh\r
+ dd 058636970h,0836B5555h,07B6B7673h,07E757F84h,097989283h,08EA09694h,06B98778Fh,08B7F7E6Ch\r
+ dd 09DA4A39Ah,0A3A1A39Dh,07393A1A0h,0D6A09E89h,07E9B8CACh,07C856A5Dh,0877F7A7Ah,07A727582h\r
+ dd 0A6939C82h,07D887484h,06A7A7F82h,0564D7B58h,074872B65h,0DBF0D5A6h,0DC857197h,0E3F9FAFAh\r
+ dd 0DCE8F7D3h,0FAEFA09Bh,0FAFAFAFAh,07AF0FAFAh,0EBEEEC98h,0E8C0B1F8h,0F9F7F6FAh,0E1FAFAF4h\r
+ dd 0E3FAFAE7h,0EFEFEDE4h,0FAF9FAFAh,0F5F8F9FAh,0EDFAF4F2h,0EBECE8EFh,0F4F7EBEAh,0D0D7CEE6h\r
+ dd 0C6AEC9E0h,0C3B3BFD8h,0BACAE3D2h,02047C2B3h,02535382Eh,0252C3C30h,0541E1B27h,01F577460h\r
+ dd 021122113h,04003081Bh,0978E6C86h,097A1B5A0h,08982A2A1h,0A49B9A8Dh,0A978827Eh,06B8793AEh\r
+ dd 076637166h,08D887A69h,0908D8593h,0878B8C8Fh,083848B8Ch,08B899784h,078778180h,0676D7373h\r
+ dd 06E687972h,061755E5Fh,0827E785Fh,0727D6D7Ch,0936C716Bh,088847F88h,07C888185h,076878385h\r
+ dd 07375797Ch,05D77756Eh,0716C625Ah,07F776A6Bh,05666656Ch,063645E63h,058627766h,06C6B6369h\r
+ dd 054606A75h,07773604Eh,065566C8Bh,08C7E7F78h,09D988F8Eh,0899CA19Fh,065827690h,09B858170h\r
+ dd 0B5B1B1A6h,0B6C0B4A9h,0A49DB0B3h,0A6BBACC0h,096A1B0C8h,085757381h,0777C7A7Ah,07B847E80h\r
+ dd 0A89AC27Ah,0847E7D7Ch,082867C85h,0327B6572h,0B381373Bh,0C5DDCEBBh,0E3707E7Ch,0A1E2F5F2h\r
+ dd 0A1F1E4F3h,0F8F2DEA3h,0FAFAFAFAh,078CDF6F7h,0F8F4E6CBh,0DC845FC2h,0F2F8F7F4h,0E4E6F7F1h\r
+ dd 0F5F2E5F9h,0ECEFF4ECh,0FAF9FAF9h,0EEF8F9F7h,0E6FAF6E0h,0E9E7E5E5h,0DBDFEAEDh,0CFBFCFD5h\r
+ dd 0D8DAC9D0h,0DDD3CFDCh,0B6CECEC8h,0319597BEh,033292C14h,02A222225h,02228271Ch,03F310E07h\r
+ dd 020377E6Ah,0191A1A0Eh,08A89833Ah,0A5ADB790h,08F90ACACh,0A9939289h,0A081807Eh,08D717A95h\r
+ dd 09E738784h,0827A7884h,0888B768Ah,08B848C8Eh,08F949189h,094828F81h,07C899392h,06B778D94h\r
+ dd 075698082h,06F7F6F6Eh,07F736C6Fh,0A5907477h,098B3AA9Ch,09F9E8F90h,09195A493h,07E909397h\r
+ dd 0667B8388h,09182636Ah,08F7C688Ah,07B8D9684h,07089887Eh,08B8C877Dh,094818292h,096918B82h\r
+ dd 05E616B73h,0726E6054h,069606887h,08D787671h,09490898Dh,08F9C9595h,08C98A186h,08D999D8Fh\r
+ dd 0AB96A3A0h,096939EA3h,0A599ACA5h,0B6B2ABACh,0A1AC8AAAh,0646A7473h,080858282h,09B907887h\r
+ dd 0A686C19Dh,07684A196h,075777B6Bh,0557B6B76h,0A952231Ah,098C8AAAEh,0E5A89050h,0DBBFF1E8h\r
+ dd 089A8EBFAh,0F6E4E2CAh,0FAFAFAFAh,0C092E3F9h,0F3EBE7FAh,075557573h,0FAF9F4EBh,0E6F2FAFAh\r
+ dd 0FAF9F4F3h,0E8EBF9FAh,0F8F2F9ECh,0FAFAF6F5h,0D3F9E9F7h,0DFDDDDD7h,0DADAE6EEh,0D6CED7DBh\r
+ dd 0C0D3D7CAh,0B0CBD2DBh,0AEA09DA2h,0849B859Fh,022160C40h,01E172219h,030251C1Ch,0190D1827h\r
+ dd 0589B9647h,01C1F2B30h,09F9E4D22h,0969C9399h,08E758598h,0B193A0A0h,0A29B8D97h,08078767Fh\r
+ dd 096818A70h,07A828182h,09EA89894h,09FA5A8A7h,0ABA0A2A7h,0A38A959Ah,05C5D6E8Fh,06365887Eh\r
+ dd 063625F59h,07676695Eh,07D835E82h,09195A28Fh,0A6B47A6Dh,08F9396AEh,097877E92h,089949693h\r
+ dd 0687E8D95h,09E8D6065h,08C7A747Dh,089858586h,0788A7C84h,08787896Fh,09990817Dh,093908E81h\r
+ dd 04C555D5Ah,05A5E624Fh,069686478h,0747D6F64h,08F8A8779h,085918F8Dh,080857F7Ah,07C91937Dh\r
+ dd 0A0919693h,08E829094h,0808E9991h,092917D80h,07D929391h,075859277h,07D727980h,0958B777Ch\r
+ dd 0958F8BABh,077738893h,079777379h,08B64607Bh,098521E4Dh,086D0A2A1h,0E4CAD666h,0F5C0CBE9h\r
+ dd 0D38BD9F9h,0FAFAF1FAh,0F3FAFAFAh,0E784DDF6h,0D1E8E1FAh,06456BB62h,0F9F5F1DFh,0E5EAF5F9h\r
+ dd 0F9FAFAF0h,0F0F2F6F8h,0E4DEECF1h,0EEEAE2F0h,0CDEFE8E5h,0C3C2C2C7h,0D8CAC2CDh,0BEBED3DCh\r
+ dd 09BB1C5B6h,09BB0B0B5h,08C97A091h,08B8E8497h,01E173583h,0713A291Eh,0574A3A4Bh,0404A5259h\r
+ dd 07A7E241Ch,0336C8080h,078400D07h,0878A7778h,088787280h,093707B83h,08E8D857Ch,06D7D6077h\r
+ dd 09B9C8361h,093A4B297h,0B6B1A89Fh,0B3B2B5B8h,09A9EA7C3h,074839A8Ah,0896E748Eh,064707981h\r
+ dd 06E6E6A60h,06E6B6568h,074726172h,06D729585h,09E9D7461h,0707C7794h,073617580h,070747974h\r
+ dd 07166777Ah,0A1665F55h,087678076h,0837B7A8Fh,077848483h,076767C65h,08980817Bh,09A94808Bh\r
+ dd 051585E50h,054535457h,06562675Ch,075827E72h,074737079h,077697072h,058547790h,081626366h\r
+ dd 08E8A807Bh,088808F87h,07D797F7Dh,0948C6C70h,0879A9492h,09D92A48Eh,09D8D9C9Ah,08F959892h\r
+ dd 092AC9BA7h,07F8EB6A5h,08A897A7Ch,098687D79h,09885476Dh,076CBAE8Fh,0F0D29A83h,0F7F9BCEEh\r
+ dd 0FAC2B9E2h,0FAFAFAFAh,0FAFAFAFAh,0FA8B9EF9h,097DCEFFAh,03C45AF5Ch,0F6F5E6B6h,0E5F0F9FAh\r
+ dd 0F1F5F9FAh,0F2EEEAEFh,0EDF3EFEEh,0E5F0FAF5h,0D3F1EEE4h,0A5A8B4C9h,0CBB79FA9h,0B1A5B7CAh\r
+ dd 094A8AFB9h,0B7AD9E9Eh,0888CA1B0h,098A0AA95h,0292F98A0h,072292832h,0AFA5AEB2h,083938D95h\r
+ dd 04C4C3C72h,0B88D4833h,06D0734B7h,096AFBAB7h,0A7B8A48Fh,0A287A194h,08A8F9685h,070796F93h\r
+ dd 08F88756Bh,09DA0B195h,099928394h,0AFA8A49Dh,0A9A0A6B8h,08A898B8Ah,06E6F8587h,072708196h\r
+ dd 06A6C767Ah,06660676Dh,083746360h,082778F8Ah,09D8FA383h,0769490A5h,08C89987Fh,07F7C757Ch\r
+ dd 0746E7B7Eh,0926C6172h,08F6D7079h,078888F95h,06F78827Bh,0726F745Bh,07B6A797Fh,09C887E8Ah\r
+ dd 073505552h,0AA9D9299h,06F677B94h,08E858894h,099979697h,09B989396h,08E8AAEA1h,08D7197B3h\r
+ dd 08E8E8189h,086788982h,08688857Ch,09B966F75h,08D98C6CBh,0737F807Bh,0857B8C7Ch,08479828Eh\r
+ dd 090918B72h,0998C9A91h,074787DACh,0495E487Bh,0B0704347h,077CCB4B6h,0DCCB50A0h,0F9F6CDD1h\r
+ dd 0FAF59DB7h,0FAFAFAFAh,0F9FAFAFAh,0F9B168E0h,095FAF9F1h,03697C161h,0FAF3D18Dh,0F1F9FAFAh\r
+ dd 0FAEBE9F9h,0F4F9F8F9h,0E0EEDEE8h,0B4C0E0DCh,0E4F2E6C2h,0B0B8C5E5h,0B698A5B0h,0A5AAA9BCh\r
+ dd 07A7D8CA1h,0B09D989Ah,09C67658Bh,09C9C9C75h,02D828EA1h,01B2D2C19h,0B28A7430h,0AAAF9CA4h\r
+ dd 0B1536DA5h,07B5A85B3h,0131A7C9Ch,06E5C665Ch,092A3BE99h,0A28F9691h,09284937Fh,07B797485h\r
+ dd 0856D6B7Ch,0A5989989h,0A392A494h,09694979Eh,08D979691h,07288917Ah,09389948Bh,07965849Bh\r
+ dd 0766C7884h,0967D737Dh,08296A09Ah,0706B7E61h,078787A5Eh,062787E6Eh,08477617Bh,0807D787Bh\r
+ dd 0606E7379h,073775381h,070626A69h,06D717E72h,0696D7C74h,073717156h,075708270h,09D7D8283h\r
+ dd 0864E5F58h,093959490h,081929096h,093908683h,09C989C96h,088848493h,0AF8B9C92h,08583919Dh\r
+ dd 0A28F786Ah,0817E879Eh,0847C8581h,091847476h,095A3B7B9h,08088858Fh,09C857764h,089A7A595h\r
+ dd 09B98897Dh,07A847B91h,035385D64h,063482137h,054433D74h,07A8A7B71h,0C7BD5B85h,0CCEDF3ADh\r
+ dd 0FAF8C983h,0FAFAFAFAh,0F4FAFAFAh,0F9DB70A0h,044E3D6F9h,0399BA79Bh,0F9DEBF61h,0FAFAFAFAh\r
+ dd 0F2F3EFE4h,0F4F1EBEBh,0E5DEDDECh,0CBE5EFECh,0E1D0CDBEh,0CEB788D1h,0A68CA0D4h,09E9B968Dh\r
+ dd 0A798908Fh,0AC9B96A5h,0B7856C8Ch,0A9B79BA8h,07090A1A3h,0262A3136h,09E893E1Dh,0907C7A95h\r
+ dd 07D6AB6B9h,08979767Ch,053767888h,0635B695Bh,09C9EB193h,08480847Eh,07F898286h,086907B85h\r
+ dd 0828C8289h,087746F73h,0A481897Eh,0A79AA2A4h,08499A29Fh,09195828Ah,07B7B7676h,06C6A877Fh\r
+ dd 07B72767Eh,0726E767Ch,0767F8B80h,080877E76h,07F71848Fh,08E897270h,08B828F88h,064777880h\r
+ dd 08B8E847Eh,07C767780h,0717B8581h,071707677h,079757C72h,07E817B7Ch,0656E7F7Eh,0605C666Ah\r
+ dd 07D45585Eh,095908689h,090808393h,0858D8793h,09193838Eh,0949C9B8Eh,0AD82898Ch,092AAABADh\r
+ dd 09A888888h,07F8F96A0h,07C6E7F7Eh,08E866770h,09F829979h,0888A8A92h,07F7D6E94h,0808577A1h\r
+ dd 09B9A8277h,0A78B6E87h,019133EB8h,032222E2Dh,02E1B372Bh,02755987Bh,099AD2061h,06DD8D1ACh\r
+ dd 0F9EEDA81h,0FAFAFAFAh,0CDF4F9FAh,0FAF9B27Ch,03AA0E2FAh,04DA8BFA1h,0F6E4A036h,0ECFAFAF6h\r
+ dd 0EBEEEEE7h,0F0F0EBE7h,0E7E3E8E7h,0DFE3F6F5h,0B999AFCEh,0C5BC9896h,0AC82A5D3h,0AB97AAA9h\r
+ dd 0AA97AFAEh,0A18EA2BAh,07C815E8Ah,0BB9EA3ABh,0AFA0A8BEh,0381F1A64h,0954D1842h,0726E6267h\r
+ dd 08668847Eh,089777688h,06A669194h,07B8E8196h,0949BADA1h,0999B9891h,09A978D93h,07F8D9A95h\r
+ dd 07F8D7A7Fh,08A7B706Dh,09F9E866Ah,088A9948Fh,07A8D928Dh,082877B81h,05B74676Ah,063637270h\r
+ dd 06065666Dh,0716C6861h,0695D6B6Dh,05C858B82h,096827C51h,07A727D82h,081818089h,0798C857Bh\r
+ dd 09B8B8F8Eh,07D7F7992h,06F627B82h,0796B7476h,096868D7Fh,08990838Bh,05F83837Eh,08A818382h\r
+ dd 0775A6A80h,09E9F8683h,0948F9792h,0A194A89Ah,09597939Dh,092939892h,08C8A9B97h,0889BB0B2h\r
+ dd 0887C8C89h,08488868Bh,09E96A194h,0B98F7E97h,09686A289h,094A4A699h,083958391h,0899A8B99h\r
+ dd 0A2A4929Fh,0947E7C95h,0758389A9h,03E3F5067h,0D581613Dh,098BE99CCh,05F336456h,0456FC698h\r
+ dd 0FAF9F1ACh,0FAFAF7F5h,094E3F6FAh,0FAF9D778h,05F79E4F7h,080E2D098h,0F8DD7E41h,0F3E8F3FAh\r
+ dd 0E6EAE7DDh,0EFF0EDE8h,0E2E6EBE7h,0CBD1EFDDh,08D9F9DCFh,0ADCEBD7Eh,0B1849EB8h,09A878EABh\r
+ dd 0969D9F9Bh,093939A98h,0B480738Dh,0A4AFB7AEh,0949499A5h,0371D5EABh,0661D352Ch,097745E76h\r
+ dd 099817E7Bh,0908B8F9Eh,06F738390h,072877A65h,088959389h,0A3A19190h,08F8FA0A2h,08A969290h\r
+ dd 0878C7D8Ah,07D7B7B7Ch,09DA88B69h,0ACAE9383h,05A52628Fh,077705963h,07C81809Ah,05C758071h\r
+ dd 0655D4F64h,069615B5Eh,08B636259h,0606A8F7Dh,08F7A6260h,085655861h,07F817688h,07A7C8679h\r
+ dd 084757F95h,0717E7882h,06B8B7F6Ch,08D80817Ah,070859892h,094928473h,053717D7Fh,0888F825Ah\r
+ dd 07158596Ah,07A7B888Dh,07D898B84h,0889B8B98h,082798783h,08D949091h,089798288h,09692888Fh\r
+ dd 0928E9D94h,08289848Eh,0736C8388h,08C6C6480h,079778576h,071797679h,0747A797Ch,07E7A787Fh\r
+ dd 082796989h,08B856573h,07189847Eh,049434652h,0A0C3C790h,09ABED49Fh,08793ABB2h,0724E5367h\r
+ dd 0EBD7DAE0h,0F4F7F5F7h,07ED9F2F2h,0FAF3E898h,09C6CE0E8h,0759091B5h,0F6CE4646h,0F2F4F7FAh\r
+ dd 0F7F7F3E7h,0E9EBEDF2h,0F1F0DEDFh,0DFDDC0E4h,0A5B8B3ECh,0639094B6h,0A0929D8Fh,08F8E949Fh\r
+ dd 08A9B8E86h,08790998Dh,0B48A8C88h,0A5B595AFh,0808C9F9Ah,034777D89h,057274043h,0A79E8EAEh\r
+ dd 094958F9Fh,0A29B9198h,07E909998h,08E8E8B7Bh,0889A879Dh,0A096858Fh,0959DA5A4h,099979BA7h\r
+ dd 08281819Fh,08F767F84h,08295907Eh,08B9AB08Eh,08668718Ah,059545483h,08F858476h,068706F69h\r
+ dd 06E6A8B74h,0776E738Eh,0A5586A65h,0477EA383h,075726451h,07D69615Bh,07C79857Ah,0768C7875h\r
+ dd 0727E7C89h,07D6B6B6Eh,07E757A74h,080818886h,04E5D7E80h,085839B84h,079738887h,084888369h\r
+ dd 0555F6773h,08F706969h,079928179h,0837D768Ah,08A80917Fh,099918B78h,07E749E88h,07A898F86h\r
+ dd 09E96988Ah,082819F9Ch,086787B85h,0A3AD837Eh,0816D8480h,0857C8E70h,0797C728Ah,09499B199h\r
+ dd 07B8B909Fh,07B798588h,0264A819Bh,0C8694435h,0B687ADE8h,0CEBDBBE2h,07199CCC3h,07DA87782h\r
+ dd 0C69A594Fh,0F1EBEBE4h,08AA1E6D9h,0F8FAEFDFh,0905DBCE6h,0A8B19D9Dh,0DE69392Eh,0F9F8F8F2h\r
+ dd 0FAFAFAFAh,0D8DBE1F3h,0E4E5E7DDh,0DAD8E3E4h,0A3C9DEFAh,09EA9CDC9h,0D5C5BCAAh,0BBCCD0D6h\r
+ dd 0AE96ACBBh,0B2ABB8AFh,09D7EA3A3h,0DAB9AAB8h,098A7BBD7h,05C97A99Ah,03B2D261Fh,08EA59452h\r
+ dd 0859AA389h,0949CA684h,092A0958Fh,09A94A192h,0A8A7A099h,0929AA09Fh,07C76838Ah,0A5AFB197h\r
+ dd 093888D9Ah,071938E8Fh,08D878572h,070827B8Bh,05F78726Ah,0454B5B62h,07A6E656Bh,0635F6A7Bh\r
+ dd 075637C68h,08D8E8D9Eh,0877A8399h,0716D7E7Eh,06E6A7C8Ch,08C857E7Ch,07F7D8A8Ch,076788383h\r
+ dd 0767C8483h,0636C8B6Eh,07A7A6C66h,072777575h,079777F7Ch,08989827Dh,0727B8082h,07269716Eh\r
+ dd 05D675F60h,08171685Bh,06F7B6E80h,073617167h,087858272h,0A6A18F7Fh,08C8AAB92h,0917E8C8Fh\r
+ dd 097908A88h,08C8F867Dh,06564727Fh,06A7D8683h,0A87C8970h,086689178h,08079847Eh,0A1B2B3A3h\r
+ dd 090888BACh,092939FABh,02C2E298Fh,0C8C7733Dh,0B2BA7B92h,0EDDDB996h,07A3675CBh,0C8C5CEBAh\r
+ dd 07885DAAFh,0E7B78D76h,0B545CBDBh,0E2FAF5EDh,07A739AD7h,08D9B6495h,0A5601A8Eh,0F9F4F7E3h\r
+ dd 0F9F8F3ECh,0E2EBECF2h,0EAF1F7DDh,0C4EDF6E5h,09EC4C1D8h,0ACAEB3A5h,0E0C6BAA5h,0BEC6CFD4h\r
+ dd 0A48FB1BCh,0B38FA5A9h,0897C8C98h,0D0B1BFB1h,0A49FA9DCh,0959FAFA9h,02B26153Dh,07A933F13h\r
+ dd 07A878B7Dh,08A888E7Ch,09486928Eh,08B9C978Eh,08E898E89h,08486999Ah,0786C6D79h,099A9A88Ah\r
+ dd 0A9A4A7A2h,07C887A89h,07C8B847Ah,0786A6775h,07F8A8790h,0556D6C71h,067615A54h,05D585E6Dh\r
+ dd 068706E74h,07A807974h,0707E869Ch,06B747070h,06E686D7Eh,08B8D8078h,06D778084h,07573736Bh\r
+ dd 0716F7E7Dh,070517178h,0796F6B84h,077696B72h,068747A7Bh,0646E766Fh,086847C71h,075757E84h\r
+ dd 05962637Fh,07264665Ch,092756570h,086827C8Ah,07177656Bh,0968F8E7Fh,09989A27Ch,088668BA1h\r
+ dd 091837E7Eh,0856E7178h,075727066h,07D6D757Fh,04450837Dh,0659D8272h,093899A86h,0AFA7ABAFh\r
+ dd 08C857999h,051AAB394h,0343D3F28h,064B0BD75h,0889ECD8Ah,0BADEF0CAh,0BBB76277h,0B2DCE2BDh\r
+ dd 0CAC6E4D8h,0725987B7h,0A3475B73h,0D5FAF5E5h,08D746CC1h,0AA796965h,06637157Eh,0EDE9E9BCh\r
+ dd 0F7F4EFE9h,0E1EEF6F7h,0E7ECF1D6h,0F2E9E9E1h,0C6B0BDE5h,0A1ACC3C7h,0A8A58CA4h,0B8BCC9B0h\r
+ dd 09591ACBDh,0A78DA59Ch,08C8693ABh,0A9B9B99Eh,0B3BFC3C2h,09C8F96A3h,0210E22A6h,0803B1821h\r
+ dd 07B807D75h,07A7F7779h,098848780h,0858C7E7Fh,0947F7D83h,085868593h,077686B79h,0A6A9AD87h\r
+ dd 08F94AABDh,090958A85h,08A7D7A83h,07C7E9392h,065767893h,07F5B5462h,06A76807Eh,0705E5A5Fh\r
+ dd 070795661h,06E7E6C72h,083817F81h,0A4899A8Ah,08884739Ah,083877778h,07E87727Ah,07C71847Bh\r
+ dd 0727D7F7Dh,08E877E7Dh,09188918Ch,08D96918Eh,07C898B8Dh,08D949383h,09494938Ch,08788868Fh\r
+ dd 062786C81h,096717369h,08D666B89h,0849C867Fh,083A2887Bh,0A3A6A499h,08AAC9C76h,0816E6281h\r
+ dd 089919587h,08A6C8276h,07073877Ah,07D778F90h,0164E8C74h,0828D6224h,09D989B8Eh,0B6ADC0AAh\r
+ dd 0907E76AEh,020346D97h,08F2E3C2Ah,0906295BBh,0C97E70C0h,065A8C8E0h,0B9C8E590h,0AF96D7DEh\r
+ dd 02810AAF9h,0D8E39052h,08C4B6FA4h,0E3FAF7E2h,05C7A5EB4h,062935A5Bh,050213917h,0E6D8D291h\r
+ dd 0F6F6F5F1h,0E9E7EBF2h,0EDEDEEF1h,0FAFAE3ECh,0AAB6E0FAh,0B3CAD1A5h,08580B4ACh,0C2C0BCB5h\r
+ dd 09DA9B5C8h,0A5BBC99Ch,07D887B9Eh,0C6BFB5A7h,0A8C3C097h,09485737Fh,021196FADh,07C1C141Ch\r
+ dd 08795A3B0h,07F917980h,0847A877Ch,0948A8C87h,08F879886h,088848191h,07A6E6B80h,083909375h\r
+ dd 07E9A9BA3h,0917D9789h,08F867988h,08190988Dh,07B7F6F80h,07E817A77h,05B717E75h,073666975h\r
+ dd 06D847282h,0A1A3737Fh,08D706E90h,0A198948Eh,06F796D8Dh,0706E766Fh,076736B6Ch,086767879h\r
+ dd 066758481h,081806C78h,07D847A84h,081827F7Ch,0767E7D7Dh,08F8B827Ah,094969591h,076818294h\r
+ dd 073747375h,09B937171h,07E70907Dh,09797888Bh,0A99EA496h,074A9A496h,084807D7Eh,07E727F81h\r
+ dd 090B3A491h,0BB8C7C7Dh,0A6BBE0C5h,0ACBFA098h,02029A3ADh,0571D1330h,0809A7E7Dh,0939B99A4h\r
+ dd 0A67194BAh,02B1F2EA9h,0B9894149h,0C29979B6h,0D1CABB8Fh,0A67996B1h,0D0BDC2DBh,0BE8EC0D9h\r
+ dd 0A83A3D8Dh,0A4631377h,099ADB0B4h,0CFFAE5D0h,056867B9Bh,01C3E4856h,03E5CBC64h,0C1C79C54h\r
+ dd 0E5E6E6E4h,0F4D5F6E0h,0E7F3F1DCh,0F6EFE9F5h,0B7F0F5FAh,0A6B0B191h,09C8689A3h,0A8D0A4AEh\r
+ dd 08CA5908Eh,0C9AE98A1h,0A9A3A5C2h,0D5AFCD80h,0A2CCA1C1h,09C8E9093h,01C40A5A3h,04E18201Eh\r
+ dd 07B7C7C92h,0616C808Dh,05D626D62h,05774725Fh,0786F6444h,0707C6E72h,06D596656h,06B797A67h\r
+ dd 076558781h,0928C9788h,087959189h,0918F9D95h,07572898Eh,0746B6F75h,078727879h,0776D6A82h\r
+ dd 0758F7C6Fh,09D8D887Fh,08D6C7E9Dh,09480A589h,081647B8Bh,065646D6Fh,082797171h,07A7E8185h\r
+ dd 0657B7D7Ah,078707E82h,07A7C7879h,087858171h,087757383h,0848F8E6Ch,08F969988h,0806C6F71h\r
+ dd 06572755Eh,0848E7861h,071657B7Dh,07065696Ch,076637C76h,076887E78h,08F918780h,08792888Dh\r
+ dd 0747A757Dh,06056676Fh,057495B4Ch,06B707168h,0292C937Eh,0242E3234h,0A08C8C45h,0918A8798h\r
+ dd 09588A286h,02C2F1A68h,08DBB8242h,08ACBB081h,0DEC6ADCCh,0F0EBC3C5h,0F9FAF4DDh,0FAFAD2E7h\r
+ dd 080AA656Eh,091629CD9h,0D8CFC6B7h,0F1D7DBCBh,078A9925Bh,0994D5286h,050A6A6B2h,0CCB16250h\r
+ dd 0EEECE7E3h,0F9E9FAF2h,0F1F6F5ECh,0F8F0F1F5h,0E5E7E4FAh,0B0AEBFC8h,0899FCAC4h,0989A9BABh\r
+ dd 08282818Fh,0978B8F98h,0A9A68B8Eh,0BF9EA88Eh,0E1B4B5CDh,091A3ABBDh,01A7F9B89h,0221D2227h\r
+ dd 0897EB577h,0867F7486h,06E727B71h,043687773h,07F7F7A7Ch,0876D7577h,06D8584AAh,06E707669h\r
+ dd 07A51727Ah,0ADB69778h,08377839Ah,099908991h,08174828Ch,070768589h,0837E8178h,07E7A6D6Eh\r
+ dd 0788A8260h,0ACA1908Eh,083888FA4h,07F7A8F8Dh,08E70686Ch,074787D83h,084877477h,086868C85h\r
+ dd 079867C81h,08167768Dh,07E808A94h,086788195h,08989898Eh,07B828065h,0868A8982h,087767979h\r
+ dd 068689381h,04A566A67h,09A8B885Eh,088757481h,08D88A0A0h,090918F85h,0969D908Bh,08C879695h\r
+ dd 0AD979796h,09E93B6AFh,096A7B3A5h,087628BA5h,0402C9CB8h,01A2F3037h,08A89441Ah,097A1948Ah\r
+ dd 0A38FA0B0h,04342304Ch,07AA0BB73h,0AC83D1C3h,091D6F2E4h,0EDD7CB88h,0DFE2CBCDh,08BBDCDBBh\r
+ dd 094867A4Ch,05AAE7EB3h,0977C5C22h,08CD2AEAFh,05253492Bh,06D643321h,0409DAFB5h,0CA764520h\r
+ dd 0EEEAE4D7h,0F9EBF0ECh,0FAF6F6F9h,0F3F7FAFAh,0DED0E2FAh,0B8CCD6DAh,0D2CBB6B9h,08695B5CDh\r
+ dd 08788807Fh,09B939583h,0DFBA8F8Ch,0C88CB6D0h,0BDB0E6CDh,0B2A4C1D4h,044460442h,028312316h\r
+ dd 0A389AC3Ch,0797E92A7h,074777D6Dh,072917B7Ch,082878B5Dh,07B817D7Bh,07B877580h,058625068h\r
+ dd 051616A59h,08E7B7C4Ch,07BA8999Bh,06F817284h,06E697B77h,06F747F79h,07D7A7F70h,06A726B6Bh\r
+ dd 067858F75h,094928984h,081719089h,0909BA68Fh,069777F84h,083828B7Eh,07D838E8Fh,07F7E827Ch\r
+ dd 06569757Ch,097716B7Ch,0949B9699h,0707D8482h,0627A7B7Bh,053676A3Eh,0615C5C5Fh,0524F595Bh\r
+ dd 06B699C78h,05D5A6068h,0A29D8060h,05E63565Fh,0AAADA483h,09B8FA493h,08F97B69Ch,0918A9590h\r
+ dd 0AE97858Fh,08A84A798h,07F939189h,082686F88h,03C318F95h,02D393B43h,081522224h,09FABA4A2h\r
+ dd 093B1C0A7h,0704C3829h,0B98DABA1h,0EBB189CCh,0ACAAF7D9h,0C8D7DBD8h,0F7E2F278h,059B07F9Eh\r
+ dd 0919A964Dh,0869B946Ch,0560B0D58h,09BEBC998h,041AE6D25h,04725463Ah,0120A2C45h,09F603C1Ch\r
+ dd 0F1E9DED5h,0F7F7F6F7h,0FAFAFAFAh,0F3F9FAFAh,0D4D1DCFAh,0CDD6D1C5h,0ECDFCFCFh,08EAFCFF4h\r
+ dd 0897E7E7Ah,0988B9782h,0E3BF938Dh,0C19DB8C6h,0B1D6DFCFh,0D3C9DAD0h,02A274FD5h,02B262F27h\r
+ dd 09C996724h,07492A69Fh,06B69717Dh,087838173h,080878C8Ah,08476787Dh,09C919B91h,081786179h\r
+ dd 0606B7C7Fh,075637156h,07878606Dh,072666D72h,06B555B63h,069666B72h,071798173h,06D72717Ch\r
+ dd 07B85756Ah,092898588h,08C97A792h,0798B8D93h,08D937084h,089898D96h,082818E91h,086817A80h\r
+ dd 07983838Ah,07D746C7Eh,078868186h,07A767A78h,0807B737Bh,06975775Eh,070676672h,0837E8480h\r
+ dd 06F6A6A8Eh,068625A5Eh,0856D746Ch,06D776277h,0837B6B68h,08FA1AB97h,06C7E8E7Eh,08684818Dh\r
+ dd 09A9D888Fh,080809FA3h,08A838D78h,0807A839Bh,02B4B9FA0h,02D323837h,0281C4731h,0BEAAB879h\r
+ dd 052A8A8BAh,0C4673531h,0D1C78E82h,0D0F1C28Fh,0F7B27EE3h,0B4DED9F7h,0DBEEF8A4h,0AFEFCB88h\r
+ dd 05B5EE0AEh,0494B525Eh,013263A5Ch,03EC4691Bh,0427E7955h,0463D282Bh,037338E61h,0512D2815h\r
+ dd 0E4D7BD96h,0FAFAF7F2h,0F6FAFAFAh,0FAFAFAF9h,0D8DFF0FAh,0BBCEDDD6h,0CBC7B794h,0A1BEDCC5h\r
+ dd 0907D9AA2h,08D6D969Ch,0C39DA68Bh,0B5B6C7D4h,0D8D7CFC4h,0A3DCD8C4h,037385BC0h,030372D2Bh\r
+ dd 0AB8C2B21h,0829DA4A1h,07A767867h,06A848176h,08E919683h,07678848Eh,0786B7A79h,059667772h\r
+ dd 072744D71h,08A728978h,06C7F5180h,07883996Ch,06B6D678Ah,084466E59h,05F666966h,060565C57h\r
+ dd 089796B5Fh,0979A908Bh,0A7B9B19Bh,0A9ADC9B8h,0BBA8A7ABh,0847F829Bh,0887D7B99h,07E8E807Eh\r
+ dd 05F697B8Fh,08C788275h,08D867E91h,080877A7Eh,081838583h,064737E7Fh,0886E6D79h,08482817Eh\r
+ dd 06C695F6Bh,059546566h,07968786Ch,0777B939Ah,09CA5A183h,07594ACA0h,077647773h,08C7D7F89h\r
+ dd 09F94A0A3h,0A0A6A9ABh,093899FB4h,0A3948594h,02E39879Fh,02D343C3Fh,011558342h,0A19A551Dh\r
+ dd 04FABB4A9h,094836F81h,092DAA67Bh,0DDF6F0B5h,0FAE1C5B5h,094B5E7FAh,0C1F8E7EDh,09A4ADCACh\r
+ dd 07582EDD1h,05863626Dh,025343F5Dh,03227111Ch,02F5F6D5Eh,0E4A1835Fh,0207BD1BFh,0573B2E45h\r
+ dd 0D9D0A44Fh,0FAFAF8EDh,0F0F7FAFAh,0FAFAFAF1h,0EBEBF8FAh,0A6C5DEDDh,0D5B39D9Eh,0D2C4B8CEh\r
+ dd 09EA3A0B6h,0AA9C927Eh,0C8D2ACA5h,09BC7E7D1h,0F1DDECCFh,0B7F1C6C5h,00B8AB2A8h,0352C1C26h\r
+ dd 0964F133Eh,0819798A5h,06B697469h,07998666Ch,092829283h,06E6E7490h,0657F6E6Fh,0F0BACF8Dh\r
+ dd 0827776B0h,091707374h,0AE7F5F8Ah,0AE9370A7h,06C7887ADh,08853755Eh,05A5E666Eh,053525E60h\r
+ dd 08C89736Eh,0A59B9286h,0ADB2AFB6h,095ABA7B2h,08794A09Dh,09EA48F74h,098998BA5h,09385A797h\r
+ dd 075798096h,0948B8579h,0818E928Eh,07B86908Eh,0887E7D7Ch,0696D7A86h,07B796467h,06A626972h\r
+ dd 063726A61h,06C66625Ah,079766D74h,082798E98h,07F7C7F85h,076718C8Ch,078717A88h,08D817F77h\r
+ dd 08C7B96A0h,07D938B92h,08E767594h,0817C6D7Dh,0173C979Bh,025292824h,0468B9142h,074561E10h\r
+ dd 02788958Dh,092994737h,08294CA9Fh,0CBE9E2D5h,0ECEEF7CAh,0D691E0EAh,09AE4F6D7h,099498FE6h\r
+ dd 08E8CB091h,0A17E7C89h,0221B61ACh,050474347h,08C96A794h,0B9B9C3ABh,0519DACB0h,0463C4032h\r
+ dd 0C9975546h,0FAFAF2D8h,0F2FAFAFAh,0FAFAFAF3h,0FAF5F8FAh,0BACFCEE9h,0CFB18998h,0BBBCCBDAh\r
+ dd 0E0C3C8BCh,0BDA1AEC7h,0B0AAC0C1h,07EA2B4C9h,0E4BEB9A2h,0B8B4A1C7h,05E8E7896h,034272234h\r
+ dd 04F1D2F3Dh,084857388h,07C7D7E7Fh,09386626Fh,0906E7786h,068646B94h,07D767972h,0B59E9E8Eh\r
+ dd 086658788h,0807E7475h,09A716885h,0A985678Ah,0766A6E87h,076527674h,070666266h,0555B7279h\r
+ dd 07A624D58h,0A7979082h,0A9A398C0h,0A99BA6ABh,0909B91A5h,092988A73h,095A28D98h,09377B6A0h\r
+ dd 07D778291h,09B9C988Ah,09E92988Eh,0A18C949Bh,07B808795h,0897A787Ch,05A767289h,06C5D5D6Ah\r
+ dd 07C898676h,080726A6Dh,086897C8Bh,08C837B83h,09E9DAB96h,0A0A4A1A4h,08381798Ch,091948E8Ah\r
+ dd 08F919698h,0947B8591h,07F889395h,0968C9C99h,02E3D8394h,036393D3Dh,09A9B956Bh,03C262F69h\r
+ dd 04B58AF9Fh,0B7B67338h,0CD8EB3C0h,0D8E8E5E4h,0FAFAFAF1h,0F385C7F9h,0DAD0FAE4h,0B36D8EFAh\r
+ dd 0637E7783h,041584743h,03F352D3Ah,0A75A3A2Eh,0DAD6E7CAh,0CDC3AAB8h,0C2BEBAB2h,06A664C59h\r
+ dd 0A15F4B5Bh,0FAFAE6D3h,0F5FAFAFAh,0FAFAF2F6h,0F7F2F9F7h,0D5E7D8F3h,0A88CBFCBh,0D0E1DCCCh\r
+ dd 0D2D1BCB8h,0B09EB6B7h,0AEA8C8C1h,0D1A9A1C0h,0CAACA7BFh,0A29B9FBEh,04E9C9F8Ch,030292537h\r
+ dd 04017241Ah,0AAB0AD9Dh,08F9AC1A4h,0B1A09A95h,09F91909Ch,07B76809Ah,08877827Eh,08380858Dh\r
+ dd 08E757F8Eh,088727179h,0855A708Ah,08484927Ch,0918E957Ah,060517E93h,085847D76h,05159717Ah\r
+ dd 06E6F7970h,09692897Dh,09EB8ABA3h,0B199A6A7h,0A7998C9Fh,091957074h,088969A97h,08E8E9D94h\r
+ dd 0739A959Ch,0909D9B75h,09487878Dh,0888B8A8Dh,0958C8183h,077708B9Eh,06C69687Ch,06E6A6F77h\r
+ dd 0836F675Fh,088718485h,08F868C91h,07D777577h,0A198938Ch,0A4A5969Fh,08A797A7Dh,095939097h\r
+ dd 0978D8C8Ch,09E91A1AAh,0AAA0A6ABh,0A49A9789h,02654BFBAh,034293B3Dh,08F7F786Bh,00B13529Ah\r
+ dd 04341551Eh,0B2AB853Ch,0EDB376ADh,0DED7EBD3h,0ECDBD8D1h,0E4A67BDCh,0D8A6EEFAh,068AB88E3h\r
+ dd 071745715h,03A475969h,031162236h,0C0B15B03h,0C4CFD2B9h,0E4D4EEDCh,0D1C1D0C0h,04B525BC2h\r
+ dd 04B252A2Fh,0FAEBCA99h,0FAFAFAECh,0F6F5F7F7h,0F5F7FAF3h,0B6DEEDF4h,0959098ABh,0FAACAD94h\r
+ dd 0C1C0C9D8h,0CAB2EBE0h,09F9CA4C1h,0B7ADB0ABh,0AC91A19Fh,0B9B6AFAEh,08E9895A6h,02C2E241Fh\r
+ dd 03B373049h,0AFA99E8Ch,0C8CABAB8h,0AEB5B3AEh,0AB9FACA4h,0708AA1A1h,0696D7E7Bh,066748970h\r
+ dd 059575F62h,066534A4Ch,074787067h,051748C7Ch,057556F6Bh,06A566B5Bh,080878076h,06D746E75h\r
+ dd 07383906Dh,07E7E7F7Eh,075959186h,0928B7B71h,08B7B7587h,085919080h,08F889583h,0848F969Ah\r
+ dd 0738F8E8Ah,08181937Ch,07F7B7B84h,07F8E8580h,06B7F817Dh,0817E7D81h,0716E7681h,0515B656Ah\r
+ dd 092807A6Eh,08281909Ch,074958498h,059565A5Fh,0989E6F5Ch,0A5948981h,08884768Fh,08D867382h\r
+ dd 093848586h,09FA89592h,097B9AEAFh,0D0BB817Bh,02D58ACBEh,047323735h,06975887Eh,04D91A37Dh\r
+ dd 03A3C2221h,0B5A68865h,0C8C36E9Fh,0C4C2CDCFh,0EED8CCC1h,0D8C18CB1h,0E2A2E2F1h,03A9681C6h\r
+ dd 053602F34h,033473230h,03E293B4Dh,0ADB2B66Fh,0CAD2C2A2h,0C7B1CBCAh,0D5D9D0C1h,03B1F8FFAh\r
+ dd 03B282A36h,0D2E8A548h,0FAF8F6F6h,0F8F9FAFAh,0FAFAFAF7h,0C9DFF4F9h,0A59CA9BEh,0DEAFA39Eh\r
+ dd 0DAE0C6C7h,0CFDCCAC2h,099BAB2BFh,0BDA7B49Fh,0B699C4B3h,0C9ADC6D9h,0B1A0B4CEh,02E332951h\r
+ dd 02F2B252Eh,0AEB4B379h,0BCC2C9B3h,0B6C0A9C1h,098A3A7ADh,08BA1A5AFh,06D6C726Eh,07D797B6Ah\r
+ dd 07873797Eh,06D696472h,07D807E77h,08D7B8980h,091736B86h,078749490h,088857F7Ah,077876B6Fh\r
+ dd 061686A5Fh,067737B6Ah,07E8E857Ch,069696673h,060585464h,0565E6A57h,085826F59h,0878A8285h\r
+ dd 0648E8F87h,0929A865Ch,0968F8D90h,08E999494h,0758F8F8Eh,08F8B7B86h,08A647188h,07776818Ch\r
+ dd 0A0A49C8Ah,0808D83A2h,0697F72ACh,051565A68h,067675E4Fh,0A1867E70h,07E797DA6h,0978D8884h\r
+ dd 0A18C8F8Fh,0ADB18E92h,0A2AFAAAAh,0938585BDh,0216DC6BCh,06D2A3640h,03F33567Ch,0BCC18B62h\r
+ dd 031411B72h,0BDA79474h,0B8C99B9Eh,0BBC3C5BAh,0E3C8B1CBh,0D6D5B48Dh,0DFB1B7F6h,0ACB06993h\r
+ dd 0816D6C7Dh,04E4E4569h,0782D324Eh,0C1C8D6B3h,0CEBE5432h,0B8AFA1B4h,0B8CDA999h,021319FC9h\r
+ dd 034323940h,0C98B523Fh,0F8F5EBD2h,0FAFAFAFAh,0FAFAFAFAh,0EAE8F2F9h,093ACC4E1h,0B9A1848Eh\r
+ dd 0E2CB9EC9h,0C5AFAFCDh,0A5B5B9C4h,0D0ABA182h,0C2C9D9CCh,0ADC0D7CCh,0A49ACCC6h,03336319Ah\r
+ dd 05824273Ah,0BCC5BF82h,0A3A7B0BFh,0A598A9A2h,076A193AAh,07D9599A9h,066686A6Dh,07066675Eh\r
+ dd 070687275h,06E626272h,07E7D7973h,05D797779h,0746F7672h,0918D8E86h,0887E7F7Ch,0547A6A7Bh\r
+ dd 0756E5C66h,05B6F7466h,079897875h,061626863h,07064626Ah,07A78715Eh,084858A84h,087868E88h\r
+ dd 0718F8F8Ch,079887B60h,0818C837Ah,082807F83h,071847D81h,08996918Dh,088809585h,078676D7Fh\r
+ dd 0949D9885h,08D86848Bh,0778396A0h,065646866h,07065796Ah,09D848588h,088978EA6h,09D8F8482h\r
+ dd 0968D9F99h,08E867C8Bh,09280817Bh,094A38AA0h,02875919Dh,0752B3C46h,03C2B6599h,0A19A7240h\r
+ dd 0344A53B0h,0A1998352h,0AEAAB48Eh,0BBAEB4A2h,0AFD0F8C0h,0E2EBE3B6h,0C5D580E5h,0A3896E8Eh\r
+ dd 052344755h,02725335Ah,0A272382Bh,053CDFAD9h,0BABE6E25h,0C4C3ACB9h,0A6BCABA3h,01D8FB9A5h\r
+ dd 0393D4745h,052494E32h,0ECE9C9B4h,0FAFAFAFAh,0FAFAF8FAh,0DEE2F4FAh,093A7BBD7h,0AF959C8Bh\r
+ dd 0A8B399BCh,0A2C6C0AAh,0A6B8B0AEh,0B99C8C82h,0B3C5BFBAh,0AAD8C8A0h,08EA1C9A2h,02C30359Eh\r
+ dd 05557322Fh,08E918462h,08F91878Eh,08781A083h,067817F89h,06E929881h,073787D7Bh,0776F595Ch\r
+ dd 0726B7376h,06E6D686Fh,07F79726Eh,08075717Fh,08A8D817Dh,07F8B8D98h,0817E8C7Eh,082857173h\r
+ dd 06A5F525Eh,071726D67h,078816770h,0615F615Ah,070616F6Ch,08D827769h,082798C95h,08D8A8D89h\r
+ dd 0868A878Eh,078767679h,0867F8281h,0838B8D8Ch,079897684h,082939693h,09388878Eh,08374707Ch\r
+ dd 07F867F71h,0877C8978h,06B7C8079h,06F656964h,0848A807Dh,0958F837Eh,0818F9A9Bh,089787F7Ah\r
+ dd 08D9AA697h,086828485h,094908977h,0929B9691h,043829295h,05349453Eh,047689685h,0988F8F7Fh\r
+ dd 03E55748Fh,09D7E4427h,06F7989B0h,08B757B7Dh,0AAA0998Dh,0D1CAB3C5h,0BAEAA7DCh,098A77493h\r
+ dd 0677E80A9h,0513B3E4Ch,0C3C69262h,03658C2BBh,09C966C53h,0A0A397ADh,09EB6B7B3h,07ECFD0ADh\r
+ dd 03E444939h,04239363Bh,0D7BA8238h,0FAF8F9E4h,0FAFAF9FAh,0E4EEF7FAh,0D6E1CADCh,0B4AEACB4h\r
+ dd 0A9A1A5B0h,0DBC1A3A9h,0BBD3B2C1h,0A89DA6B7h,0B9C4BDB9h,0D4D0B6B3h,0A9C0D0A8h,0384047A6h\r
+ dd 063C66836h,0AAB1AD63h,0B3AEACA5h,095B8A3B5h,08A8F9E8Ah,07DA6A389h,0878B9382h,07D786070h\r
+ dd 07778717Ah,07779716Fh,08C758387h,082858D92h,08D91A99Ch,0768E96AFh,08386957Bh,08B80757Fh\r
+ dd 0675E565Ch,07C746870h,087855776h,0656E6E77h,068697763h,08F888273h,09083848Dh,09B8F8892h\r
+ dd 07D7F808Eh,093867D72h,069687C91h,07C78796Dh,08A887E86h,080898892h,07C9C9381h,0847F777Fh\r
+ dd 06C6E645Ch,0867C716Bh,07B6E8A8Ah,07E797B83h,08F8D9990h,08BA38884h,0809EA996h,07C7F8D8Ah\r
+ dd 08195B19Ah,0836C767Dh,0A09B8D79h,0C2B59C9Dh,06BC0D4BEh,0332B2D38h,051869351h,0A5AB9075h\r
+ dd 081BC6F96h,097332E27h,0AEA9B176h,0B9D9D7AEh,0E8EEDEB9h,0DCD3EEF8h,0D3E6A4A7h,092A55C93h\r
+ dd 0496D8A7Bh,03A3E2735h,0BCC7B46Bh,03F2A76CEh,08D6A5F3Fh,0B6B6B1C8h,0A5BFA6A9h,0CDC4B7ABh\r
+ dd 0482936A2h,032363124h,0763C3627h,0EAE2C2C9h,0FAFAFAF3h,0F2EBF2F9h,0E4ECF4F6h,0A39FBAD3h\r
+ dd 08F7775A5h,0C6ABA188h,0B9CEB7D1h,09CA999B6h,09BD6B1AFh,0CFE3CEADh,0B6E6C99Ch,02A353AB1h\r
+ dd 09BBD562Ch,0BCA9AC6Dh,0B5ACABB7h,098AEB2B1h,0959FB68Ah,07D809199h,0998D937Fh,06D706992h\r
+ dd 07A7A726Dh,0867B7A79h,06C757889h,090888179h,08194A6A1h,0608C8183h,0B4A48765h,08B827181h\r
+ dd 06F6D686Eh,05A675E6Ch,08EA5847Bh,0828C8296h,089948374h,0807B8897h,09A8D8476h,0784B689Ch\r
+ dd 0837C8788h,05E5C8482h,016443A42h,01F22161Ah,0927C4A2Eh,07F767E8Dh,093958165h,06F6F696Dh\r
+ dd 070625C5Dh,08F756F74h,091838FA3h,07D867077h,093849B8Bh,098BC9E88h,07DA28990h,08FA6A388h\r
+ dd 08597AB99h,085747A7Dh,08E988C7Ch,0959D9284h,06F85928Bh,04A312F2Bh,0A3AE842Ch,09BC4C5B9h\r
+ dd 0B7984D85h,01048267Fh,0C2AFAEA4h,0D8CCB6C3h,0FAF9E7D4h,0DCE5FAFAh,0D4E0CF90h,095A6448Ch\r
+ dd 0485A72AAh,03F6A5952h,0D2BFB2A0h,0433D2D89h,04D505749h,0BAC8C199h,0B6C29BB5h,0BFD2A57Fh\r
+ dd 02C41BCF8h,03D3D3031h,04449432Bh,0D2D1B86Eh,0FAFAFAF0h,0F6F3F7FAh,0E3E7FAFAh,09AACC1D5h\r
+ dd 0725D759Bh,0C297958Bh,0C3ABCAD3h,08D9D95B4h,0ACCCA4A1h,0BDBFA9AFh,0CDE0BB9Fh,03F1F64B0h\r
+ dd 0BAC15231h,0A4ABB9A9h,0B0A19F95h,094AFAFADh,09DA2A275h,0A5B59E99h,08A7B795Eh,06D756CA2h\r
+ dd 08D8C8470h,09C919090h,09F988D93h,08D908A91h,07D779096h,088958983h,07B7E8193h,0838C8586h\r
+ dd 05C5D685Fh,062696464h,07A6D7C71h,08B84777Dh,08E8F8483h,0948E8B8Dh,0999EA99Fh,02B18246Dh\r
+ dd 0979E8D6Ah,0243D5E7Bh,0252D2415h,01A181825h,02F111D25h,07D909C6Dh,07E7B7D78h,078717583h\r
+ dd 062555355h,07A717772h,097958487h,083877E6Ah,09780A593h,0A5B8AB84h,096AD8FBBh,08D958D70h\r
+ dd 07D99BCA4h,07D6E7173h,09377786Bh,09CA4A483h,0727D818Bh,0253E283Bh,0A78C4B28h,08FA4C3BDh\r
+ dd 0A68A5A6Eh,0303698C3h,0B69C7113h,0ECCABDB8h,0E7E0CEE6h,0C2F5FAFAh,0D4E4E08Bh,0A4B14C92h\r
+ dd 0514742A2h,0924A5266h,09B8CA5B6h,043402C45h,02D524E49h,0B4C49746h,0BEC7B1BFh,0CAA69F9Fh\r
+ dd 0428AB9BFh,0413A2C17h,03A2C2B36h,0DA913B37h,0F8FAF6DEh,0F7F6EFF0h,0E4FAF6F8h,097B2D5D7h\r
+ dd 06377739Bh,0AEAA91C7h,0B5ACCEA6h,0A4BBBABCh,090BA9EADh,0B0BBA6A0h,0B6B7B7ABh,0341590A7h\r
+ dd 096BE4631h,09AA5A594h,0B2A6A38Bh,096B2ABAEh,0979B936Eh,093C0A195h,090756985h,069719AB4h\r
+ dd 073766D66h,08C847A72h,099AB8F87h,091879B8Dh,086869193h,0B097AC9Fh,08F8F8195h,079868C86h\r
+ dd 0786F726Eh,093979C86h,06F3D5989h,091797484h,08C8C9A99h,08B8B8B81h,085BAA9B0h,023252E35h\r
+ dd 0547D7D61h,035412B31h,04A252F3Eh,0364C5542h,0180C102Bh,085855223h,0906A6F87h,0756C8297h\r
+ dd 06461605Dh,08477726Bh,08A988C8Eh,0897F8E83h,0B187999Eh,07CA9957Eh,09CA58F88h,08D8CA49Fh\r
+ dd 0839BB9AAh,081757677h,0878C8573h,0D4A89097h,098949CB5h,024302DA0h,0A26D2036h,07EA3A3A7h\r
+ dd 0B37C5095h,062959FC9h,0D9721E35h,0C9F1C9D3h,0DDDAC4C0h,0A2F8EEEFh,0CDDCE095h,075694ECFh\r
+ dd 04B533923h,0B67B6661h,063AAAFC6h,06021422Ah,03E544E55h,0A09F3C0Eh,0BEBDB99Dh,0C094A787h\r
+ dd 0A1ABADA5h,03F302555h,03E3A3543h,0773C5F42h,0E3EEEABBh,0FAF2DED9h,0FAFAFAFAh,0B2D1DDF0h\r
+ dd 0839486B9h,0CEBEAC8Ah,0AB82C5AAh,0A5D1DAC9h,09CC2A4AFh,0AAAE9FA3h,0B0D4B9B8h,02822B6AEh\r
+ dd 08FBC5E27h,0A1ADA1AAh,099919497h,08CA59692h,07A837A5Fh,09F6E967Eh,0866B5B7Dh,0706E9597h\r
+ dd 06F646A6Eh,08D75787Eh,09AAD948Eh,08E8F8794h,087808C90h,09397AA89h,08B8D7379h,085868479h\r
+ dd 07E787A8Ch,08C96A380h,003111C79h,0AD876E3Ch,099837FA4h,0838A837Dh,050A8A5B1h,05A502E25h\r
+ dd 0252D3F68h,060492D34h,064564167h,0908F8081h,034214277h,079442637h,07F5F6B79h,076667A93h\r
+ dd 05C5C5650h,07668645Eh,07A797F7Ch,092717885h,097859995h,085888480h,08B7C7B80h,0999EA59Fh\r
+ dd 0828F9F9Fh,0716D7D80h,0707C7877h,0B49F8381h,0B1ADBABAh,03753A1BEh,069263353h,0807B7B7Ch\r
+ dd 09F7C408Bh,0827F9086h,06D25497Dh,0B7BB90C7h,0D1C8B8B2h,0A6D1CAC8h,0BDBAB7ADh,0592783B8h\r
+ dd 06C7E755Ah,0A5AB637Eh,02F7EBB9Dh,044332A1Bh,044573E47h,07A5F4B49h,093BFB2B7h,0B09D8C86h\r
+ dd 07C988AB8h,0395C979Eh,04B585250h,0605E6B5Bh,0C4B19A60h,0E5D9E1D0h,0FAFAFAFAh,0D8D5E7F2h\r
+ dd 0B2AABBD5h,0B1ABA3B1h,0997A9D91h,0B1949FC5h,0B6C2B5BDh,0ADC4B1AEh,0B0B9C3AFh,03C73B3BBh\r
+ dd 095C3673Ch,0948D969Bh,0AEA69FA0h,0A8ABB09Bh,0979294A0h,0A87C858Dh,09E95A5A6h,0769D8593h\r
+ dd 08D887D82h,08C888489h,0AAA38F8Bh,082778D9Eh,06B7EA18Ch,082A19C7Dh,09C948F76h,089777E8Ch\r
+ dd 0777B8B8Ch,09483A082h,0130D2B83h,0908B5F22h,0907F8595h,0869D9384h,025529D90h,060744A2Bh\r
+ dd 02D1F1E41h,0A77B5536h,083858FA3h,097AA998Fh,031567B87h,0272E422Bh,0736A7062h,071696A8Ah\r
+ dd 076736151h,099857977h,092A1A8A9h,09A808E8Bh,0A69BA09Bh,08E878697h,0AAB6898Fh,0B8AEA3A0h\r
+ dd 0C7BFC8BDh,0BEB5C9D7h,0A8C0C0C1h,078A08F9Dh,0B79B9496h,07193A1A4h,0403D421Eh,09E99A689h\r
+ dd 0AF70638Eh,09B9C95B5h,01F6BB2ADh,0A2A29934h,0ABA29AB2h,09899969Fh,0BEC2BAB0h,04994C6CDh\r
+ dd 0D6CCDAC0h,0D1E59A91h,0445AADC8h,0413D5C4Eh,07EB85B3Bh,048514A53h,0E0D89964h,0E7CCABB8h\r
+ dd 0BDE4D0EBh,05A9EBFBAh,0292E1517h,03C3C1919h,054363937h,0E2AF7763h,0FAFAFAECh,0D7E5F9F9h\r
+ dd 0B7B6CACDh,0C8A2A3B3h,099C8B4C1h,0BBB6BADEh,0B2B6BDC0h,09CC7AD9Fh,0B2BCD4C0h,01B69B3B3h\r
+ dd 0B7D68A32h,0A7B2AEABh,0BCAFA19Bh,0B5B5BAB1h,0BAB7BAB6h,0A9859CABh,09A97999Dh,0777A7D95h\r
+ dd 08A866E70h,0896D6677h,08D988A82h,0A9918A93h,07E89B8B0h,08C9DA195h,0828E9272h,07F969890h\r
+ dd 087899E92h,0887A8A8Ah,021184781h,093884C3Bh,083767595h,083869086h,02A285287h,02955604Bh\r
+ dd 03B2E2522h,0A3909F76h,0A7949EADh,0A1918C9Bh,06E77869Ch,02C352B33h,05F6D651Ch,074716566h\r
+ dd 070736555h,0998C796Bh,07E8DB49Dh,082748D90h,09A9F9C80h,09A938B9Ah,0D0A38993h,09FB3B7CAh\r
+ dd 0B19CB5B6h,0CBC6C9C9h,0AFC2C9D1h,0A7B29F96h,0CBC0B1B3h,0A3A7A8ABh,02211125Ah,0B5B4B046h\r
+ dd 0A27B54B2h,09191A9E6h,088A0A8B1h,088571C37h,09BA2AC8Ch,0909CAA9Dh,0C0C1C5A4h,0A7AEC9C3h\r
+ dd 0D6CFB754h,0D0DBAA4Fh,0484A57E6h,0302E234Bh,0907D8D22h,045454769h,0DF975A4Fh,0E3C4C2E2h\r
+ dd 0B6CFDFD5h,090AAA3AEh,035192B60h,03849463Bh,03B2E3135h,0CC583034h,0F8EFEFE0h,0E0F8FAF7h\r
+ dd 0BED8D6D0h,0B0AAABABh,098C191ACh,0B6B8B9D0h,0A6AAC0B7h,0A4CFB19Bh,0C3D4D5D5h,02866B1C5h\r
+ dd 0A9BDA02Bh,0BFBFB09Dh,0B6AEA3B7h,0A79E9FAAh,0C1BEC0B6h,09E7DA1B4h,08B909495h,081746A87h\r
+ dd 0776D7A79h,0998B807Dh,08D989F97h,0857D8175h,095653D74h,096847F8Bh,07F7A8486h,0788A8181h\r
+ dd 081777772h,082818687h,033335885h,07A805F39h,077898C79h,09B94908Ah,042232566h,02A455B73h\r
+ dd 07F4D332Fh,0828494A1h,07FA49590h,07E8C8387h,07A847E7Dh,0331C4263h,0604F4139h,07F756A4Fh\r
+ dd 06E72604Bh,091917A66h,0777EA781h,0987F9B8Ah,08FA4A79Dh,09B8F8CA2h,0E0B08C98h,08A888CB9h\r
+ dd 092818987h,0B8B59D95h,0B6A0AFC1h,0A3AAC5AFh,0C8C6A899h,0A0CAA287h,0202371B8h,0A7B4681Dh\r
+ dd 0A96966A5h,096859595h,048789A9Ch,02C224844h,0A9AFAE66h,076789A9Eh,0CDB7A48Bh,0CDE0CDD0h\r
+ dd 0AF81429Ch,0DFB4D132h,06B1C3A70h,033352940h,05FA0E09Eh,045425A63h,06549494Dh,0D3909BB4h\r
+ dd 0CDF3FAFAh,08D8C929Bh,02D73858Ah,04E342A26h,032301C4Bh,0A7322E21h,0EEE2E7D3h,0E5FAFAF7h\r
+ dd 0A8C5D4D1h,09A8A98A1h,097BAA5C0h,0C0C3C2B6h,09490B9B3h,09CB7AEA0h,0C2DFB9D9h,02564ABAEh\r
+ dd 0AAA9B12Fh,0B4ADADA1h,0C0C1C0BDh,09F9DA9AAh,0C3BEC1ABh,08972A5BBh,07577777Dh,0807B6986h\r
+ dd 0645E8D89h,07D7F786Eh,07B698A85h,08BA6877Fh,0B48B6782h,0A97F79A1h,091878D87h,0879A7D70h\r
+ dd 0575C5E85h,02B373A41h,02D242A31h,09088501Fh,094907482h,089AAA0A9h,082452923h,037453962h\r
+ dd 087624D32h,09A7B8FA8h,08C8D7F88h,074728595h,067747765h,02D347273h,086410D2Dh,089848B81h\r
+ dd 0716F6B6Ah,0708F7974h,081899479h,0888E898Fh,0829AA298h,0A8969885h,08D8A9290h,07B749AAAh\r
+ dd 063787C89h,07D799E8Ah,0AA8F9C61h,0B294A6AFh,0ADB2BAB8h,097AB5E74h,01161C5A7h,0A6A04629h\r
+ dd 073529290h,0AD7D7D9Dh,02C78B79Eh,0544B392Eh,09A54473Ch,08598AEBDh,0A7988779h,0DCD9C2B9h\r
+ dd 03C63B7E0h,0A5ADBE7Dh,05C393341h,0965D303Fh,0A0C9D9AAh,0395090A6h,04B4F5E5Eh,0A99B8250h\r
+ dd 0DACAE5E4h,0878D90CEh,08FB9978Bh,03436233Ah,038363B31h,09E371D2Ah,0E0D6EEE0h,0D8E6F0EAh\r
+ dd 093C0D0D6h,0776E7882h,0A4CF9EA0h,096D3A0A1h,0B99CC4D2h,0C1C6BDD2h,0CBCDD1C2h,0397CBBCFh\r
+ dd 0A9B9AA3Ah,0C9C0C0A7h,0B2BDBBB7h,0B8AC93A5h,0B9B2A9B3h,0A0877EA1h,09CB2B69Dh,08B837D7Bh\r
+ dd 0825E858Eh,062638B75h,070716D7Bh,092926465h,08C87667Fh,0624E2F86h,04447545Ch,02439374Fh\r
+ dd 02E2D201Ch,03637332Bh,026222235h,088975E20h,0AE977B7Fh,03D84AAA5h,0978A5722h,038424751h\r
+ dd 0A49D6842h,0AE8D8A89h,08D7C6786h,07F8E8586h,07482857Fh,018627D7Eh,0560E2213h,0788B929Bh\r
+ dd 07A7C6B5Eh,0787F827Dh,08D5D748Eh,096928F96h,07F89A8A4h,0B7989E99h,087899CA3h,088A9BAA6h\r
+ dd 0A9AEA196h,0999D9EA1h,09D9B949Ch,0B8A6A5A1h,09AB8B5A8h,0D7AD7281h,061ADC5BAh,09752483Bh\r
+ dd 04973B1B8h,04B529186h,05095B6AFh,059525A35h,05E325350h,0B6979E9Fh,0C8BEAEB3h,0E5DEE7EFh\r
+ dd 03AADE2DFh,06DB3CF6Fh,051443538h,0A3AA604Dh,094ACB2AAh,0679C997Dh,04A4F4652h,0B48F4B40h\r
+ dd 0D9C9C2AEh,087959EC0h,092ADA174h,04B49758Ch,0665F6464h,0C2714E5Ch,0CBCFE9D8h,0C7E0E3D6h\r
+ dd 0B6D0C6BEh,09497A3ABh,0D3CA9376h,0CCDEAB9Dh,0B7A4C0CEh,0B19EB1CCh,0B2B6C4C9h,04B87BFBFh\r
+ dd 08FA4A239h,0A4979F94h,09AA19EA2h,0A0968F8Eh,0928F92A2h,082827985h,0737A8190h,08F91837Fh\r
+ dd 079768E91h,08269816Fh,06C725D74h,08A776462h,0957F7083h,02C30227Bh,024161E21h,0565D5B4Dh\r
+ dd 0706C6E80h,07B888275h,01B1E4A6Ch,08275582Ah,0998B9086h,01E337296h,073947444h,04C3A2E2Fh\r
+ dd 09687834Bh,09D9B9488h,07A64746Dh,0706F8187h,075888372h,04479837Fh,01E151A12h,0735F8077h\r
+ dd 0687A7C77h,06F6B7060h,07D91987Ch,084818478h,089849384h,0A4989292h,0AAA4A99Ah,0A69792A5h\r
+ dd 094A49492h,07D779A9Eh,088917C8Ah,08C839495h,099ABA491h,07F938B7Dh,0B79B7877h,0571F306Ch\r
+ dd 0498692ACh,0706D615Dh,09E9D5D39h,04447746Bh,03D4A4D48h,08E6F7E5Eh,0CAB0AF9Dh,0E8E1D4D1h\r
+ dd 04F8ED9DDh,0486D8F8Ch,04D523A54h,0B3A9A469h,0B0AB9EB1h,0989FA8A7h,0554C5491h,065454C4Ch\r
+ dd 0B5A8C4B2h,0A6B4C7C8h,08D807997h,046477FAEh,05B545B66h,0D39D5C5Dh,0E4EAF6E6h,0EEFAF6EAh\r
+ dd 0B3DBE8D8h,0A6AD9C9Fh,0D9BE8291h,0D0BEB8A7h,09C9DA9B7h,0B890BFC5h,0BFB6B8BEh,043A0ABCFh\r
+ dd 0A9B8AC3Dh,0B7A4A3B1h,0BCC1D2C5h,0B5B1BEC5h,0A2A2AAAAh,0B9C09A9Eh,0C4A3B5BCh,07E7D9CCAh\r
+ dd 0808F8589h,0677FA790h,07165687Bh,0836E6D5Fh,087979598h,04124377Bh,0702C1B2Ch,08084978Bh\r
+ dd 0796C6E80h,079827775h,0262F6070h,0806D4D25h,071584E69h,02F253563h,05A8C876Ch,05234352Ch\r
+ dd 07D6F885Fh,085888374h,073606C82h,074777472h,06F7D7D73h,069837F7Bh,01F201A3Dh,06D737F2Ah\r
+ dd 082807B7Ah,0785B7978h,08BA2A690h,0868A9A98h,082858175h,0B9A6A792h,093A6B9ACh,0AEACAD8Ch\r
+ dd 0838AA39Eh,0B1898480h,0A3859086h,0B5A1AAA9h,0B4B2C6D2h,07693B7A1h,087856B7Eh,03E282769h\r
+ dd 0618BAA83h,04C4C5640h,09F744F82h,0494E89ABh,034394A45h,07A759E70h,0BFC7A486h,0F4EBE9D8h\r
+ dd 06E78C0F8h,0424790CAh,046415337h,0A6958E7Fh,0AF9582A9h,0C2BAAEA9h,0432F59A0h,04D603B43h\r
+ dd 0C9D58844h,08C8AAD94h,0717A8D83h,051483248h,03C31374Ah,0D2BF6247h,0F2ECF1EDh,0F3F8F6F6h\r
+ dd 0C6E7E4DAh,09DBBA7A8h,0C3CB4AA2h,0E1C2BDB1h,0959EC8E2h,0C370A8B8h,0C3AEA8B0h,0309BAFD3h\r
+ dd 0B0B4A02Ah,0CFB4A1BCh,0C5CED5DFh,0B4A7ACBAh,0A09E9CA0h,073837088h,0F8D094A5h,072609CDDh\r
+ dd 06985828Eh,0766B948Dh,00A22467Fh,07F886214h,07C6E6E82h,03B395174h,075342C2Eh,070707E90h\r
+ dd 07D797A8Ch,07880827Eh,02A296473h,08C866433h,0637B7581h,05F441B35h,04D789186h,0574A2A31h\r
+ dd 0867A7C83h,07A858478h,082817F88h,0787D7A7Eh,0717D7E75h,07079737Ch,0282B2F5Fh,057625223h\r
+ dd 063848E8Eh,05065756Ch,087818A75h,0707E8478h,068657163h,098796B72h,07FA49199h,0B3B68379h\r
+ dd 07F829993h,095996D68h,0959F9993h,09C96928Fh,0A5A3BBD3h,083A4B7AAh,04A947C86h,027303531h\r
+ dd 09F668669h,04A295E5Fh,053435054h,046849DA2h,0404A4650h,092987741h,0D0CDC8ADh,0F2F8EBE5h\r
+ dd 07C5A9ED7h,03A4265E1h,097564637h,0958B9CB0h,0B58E7DA7h,09BB5A59Fh,03A87AFA3h,051484E37h\r
+ dd 09F4C4C5Ch,096C392B0h,02B67858Dh,039453633h,0442F3341h,0E3C4933Ch,0EEE6FAD6h,0EFF9F8FAh\r
+ dd 0E8FAEBD6h,09FC499C2h,0BE964ACAh,0DFB5C4DDh,0B4B5C9E4h,0CB74BDB7h,0B3CB9EC9h,020A4B2DCh\r
+ dd 09BA6A540h,0C4B7A897h,0A9D1CDC8h,07524557Ch,0B3A16068h,07192898Bh,0CBDFD1BBh,0B6A6AFC5h\r
+ dd 05D6B8784h,0664B8C8Ah,0401F5B65h,09E9F651Bh,07D737389h,04E47589Dh,07D33363Ch,073779AA6h\r
+ dd 0686A5C64h,04A55615Eh,027366D55h,078735C38h,04B989B77h,0926A2437h,05B90998Eh,056463A38h\r
+ dd 07D8B827Ah,07F85978Fh,0829198ADh,08789888Bh,07E897D72h,097847673h,0361B4B95h,07E923B29h\r
+ dd 05A86908Bh,0586D6E59h,08E909968h,0777C8385h,06B7E7E77h,0927C7F6Dh,09EA5859Ch,0AD958387h\r
+ dd 085839DA3h,088977C77h,08C909090h,0809D9D79h,0B3C0CD9Bh,0A1B3BFBAh,02C538094h,02D2F363Ah\r
+ dd 0A3AC833Fh,060546A80h,0353D555Ah,06094A745h,04D435445h,0AD955A48h,0D7C9C7ADh,0E0F4F8EEh\r
+ dd 0595162D1h,03432418Dh,0A6903622h,07471A3C2h,0AB8E5F62h,09E9E848Dh,0A1C3C29Eh,04F5A4754h\r
+ dd 03F263F63h,0B2C87A57h,0293F6E95h,03F493836h,02B633A4Ch,0E3D8BE5Ah,0ECEBF2DDh,0E7E9F4EFh\r
+ dd 0BDF0E2D8h,098949BB4h,0851E59B4h,0EFABC9D6h,0C6CED4C2h,0C087BABEh,0C2C479BEh,0349FA3C0h\r
+ dd 0096B9B2Eh,02D150902h,031364241h,0160A002Dh,0A05B0642h,095888B96h,0BDD8BBB7h,0B3A7B97Eh\r
+ dd 01C268DA1h,0859B9251h,01F21717Eh,0A9A45A23h,0717DA9B6h,0312C357Eh,068292426h,076798E98h\r
+ dd 06D626F87h,0675D5E6Eh,015327863h,0878B4E2Dh,0345EA780h,0A1824149h,04C859BADh,07551342Eh\r
+ dd 099A88C93h,05A688493h,08F868885h,07777817Dh,05170836Ah,08A786257h,01C427894h,08B863325h\r
+ dd 04E7599B3h,0494D5555h,093897C60h,097928B9Eh,08B9D8F79h,09991A891h,0B1A491A8h,0A49D9596h\r
+ dd 0877B7692h,0957A6C78h,0B4AFACAEh,0998FB1C6h,09E978383h,0ADB3A89Dh,0402B347Dh,03C32332Eh\r
+ dd 0ABBE524Eh,0907F6082h,05173608Bh,098654656h,050574649h,0BF94553Ah,0E5DCC8B7h,0CBEEEFEFh\r
+ dd 0615035B7h,01A172A5Dh,08D916C2Fh,08473A2AFh,08C8C5D59h,0967C6A78h,0A29D919Ah,0464A84B7h\r
+ dd 04B444661h,09A6E3B45h,02E315DB4h,0363E313Fh,033452E41h,0E1DDD499h,0E7E1E7EBh,0E6EEEDE3h\r
+ dd 0B2C5CED8h,0AF8D88ACh,06E2675BFh,0EFBAC0F2h,0B7B4CAE0h,0C1929FA9h,0CEC87DD3h,0379DACDDh\r
+ dd 080B28D4Dh,019243856h,03127141Ah,0AA984517h,08A6D2287h,0A380788Fh,07FA7B794h,09F778753h\r
+ dd 01A1969AEh,079935F26h,01C28757Eh,09E865C16h,07D86A4A6h,02F2C2070h,05C2A1F21h,07A7F8E9Bh\r
+ dd 0758C876Fh,080605163h,0163E807Bh,088956431h,0293F7C8Fh,0A28D6A50h,0468D8180h,084433C31h\r
+ dd 08787999Dh,07E848E8Eh,06D768185h,0796D5B83h,06888866Ah,06C615857h,0276F9E8Eh,0B9712430h\r
+ dd 04F6C92ACh,060646F67h,07B92986Bh,0978A9279h,086858381h,08F8E8A85h,0A8A59593h,0ADC0BDB0h\r
+ dd 0978D8A99h,0977B7C8Eh,0939794A1h,073928E95h,0A99EA391h,0758FA2ACh,03E433133h,055485351h\r
+ dd 0A6B54B2Fh,097AE717Ah,057595A75h,05C354B68h,0474B4971h,0AF895737h,0E6D9C7BFh,0D1C8E0DFh\r
+ dd 0664139A4h,034313D45h,05E678062h,06D7B7C70h,079796263h,088778182h,0857F768Ah,06EA6BAA4h\r
+ dd 04E5C5167h,0604C5357h,041687F5Eh,043504642h,08D50474Ch,0E4E5D1B6h,0E9CDBCEBh,0DCEFE9E2h\r
+ dd 0ADD2D3D6h,0A2979DAFh,02F3E94CBh,0B397C4B2h,0BAA5BAC9h,0DAA1A3BEh,0C7BE92C1h,04C9CA4CFh\r
+ dd 0A9CF915Dh,098A4B1A9h,049538894h,0B38C3A3Fh,08B953072h,080919596h,04B768997h,09C707456h\r
+ dd 0180C4C98h,06C84622Bh,020376680h,0816C571Ah,077768486h,02D2B0856h,04E2B1F24h,0767D777Dh\r
+ dd 075738C92h,07E7E8286h,028629886h,08D8D6A36h,04C31428Ah,06C6A8C6Dh,0449C9365h,09F5C3930h\r
+ dd 08E899096h,07C848890h,07D707B76h,07A65866Dh,05F656971h,0806E5F5Ah,036759AA0h,0A3774134h\r
+ dd 04F5D6F70h,04B3B3E4Ah,083605C57h,07385887Fh,0AD828070h,0A9B5ADADh,09C9C8E8Dh,0A8AA99A2h\r
+ dd 0A2928A9Dh,0C5B6A3A1h,092A4C0C0h,0A494A59Dh,0BFC4BEA9h,051C09FBBh,059554E4Fh,0484D5454h\r
+ dd 093714140h,0AB8974C3h,06D858D88h,081465857h,063584F7Dh,0AA805F5Bh,0E0D8CCCBh,0E9CDDEE6h\r
+ dd 05857505Ch,06D413936h,063617575h,06572696Dh,0715F6D66h,07C6B919Dh,074888E74h,0B3D188A5h\r
+ dd 0517655A8h,0514A4F57h,050544245h,044424C43h,0AA856451h,085B1B1B0h,0F3D56493h,0ECF8F4F9h\r
+ dd 0B2D7EAD4h,0C39BC49Bh,02D31A2C1h,08CB4FA9Ah,0F0B1D3BFh,0C5BCA8E8h,0CACCD08Bh,056A1B6DAh\r
+ dd 0B4E0A85Ah,0C6ACAFADh,0363F74B5h,0AEBAA260h,097AF3733h,06C998664h,0262978DAh,0C1B9843Ch\r
+ dd 02E174297h,0506F6F25h,014215D66h,08A6A4E12h,07E716F81h,033382760h,0542B1924h,0818B9376h\r
+ dd 094878189h,0897C707Ah,02859937Ch,08B80653Eh,05C294159h,083819182h,046A39789h,08C634C3Bh\r
+ dd 086958D90h,06F888695h,05E68746Ah,08980737Ah,06769877Bh,081876365h,0567E968Fh,09F412526h\r
+ dd 06A78888Dh,060514F60h,0926F7569h,091988F9Bh,0B098A391h,0B6C0C4B9h,09E947C95h,0B1BAB2B3h\r
+ dd 0C2CAB5AFh,0E1C5B6B3h,0C8DFD8CCh,0AEBDABB0h,0B3B5AFA9h,04C449AB0h,04842424Ah,04D4F3F4Eh\r
+ dd 09C475354h,09F916890h,044776C60h,083645647h,053595D91h,095715449h,0E6DED2BEh,0B7D8E9F3h\r
+ dd 040693953h,066584828h,069517458h,0706D7278h,09066767Ch,07574637Ah,073719279h,0A3B68597h\r
+ dd 05975A1DCh,0544B3D4Ah,049465144h,040424856h,0605D5548h,067676566h,0F6E4624Fh,0F1FAFAFAh\r
+ dd 0E5D7E5D3h,0C4BCBFBCh,06554BCC1h,08CD5FA74h,0FAEAFAE3h,0F8D7AEFAh,0E4BEBA93h,05CA4C0D7h\r
+ dd 0B6D69A45h,07EA39593h,0A87E4C35h,05CA3C0D5h,041C84912h,096A9781Bh,02A2C3A89h,08D7A703Dh\r
+ dd 05E4D4271h,06A6B6E45h,03A51716Ch,08E915A3Dh,080757C8Fh,0614B5C88h,06A4D384Dh,0817F9A93h\r
+ dd 0837E8E8Ah,0847E7D78h,02E6D8F8Eh,06C9B5C3Ah,0A1562536h,0938E99A1h,0438E738Eh,085774754h\r
+ dd 084948A82h,08286838Dh,0776B7A79h,07C837E6Ah,085746B69h,08A8D838Dh,05073908Bh,051202A33h\r
+ dd 07E83969Ah,08D847A7Dh,0928DAC94h,090898496h,0AB938D8Fh,0B6B0B4A8h,07A8A85ADh,0B1B4AF91h\r
+ dd 0BBC8ACADh,0EFC9B4ACh,0A4C8C7D4h,0D3A99398h,0A0B5B6BFh,04B334FA9h,055423B46h,0474B3A5Eh\r
+ dd 0C3394D3Fh,060546F98h,065406960h,04C453F42h,0555B6784h,07F716A5Dh,0DFD4C5A8h,093BCE4EDh\r
+ dd 027775753h,04B5F5A31h,083927157h,080697D8Bh,086727E8Ah,05173908Bh,068758078h,0B8B9917Eh\r
+ dd 08FBAE3B7h,042313F61h,04D4A4E44h,0484D4F52h,0604F4A4Bh,06653575Eh,0F3E3B75Ah,0F2FAFAFAh\r
+ dd 0D4D7E3D6h,0BFB0AEBAh,05F94D5C4h,06CDDD541h,0FAF2F7C7h,0F1DAAEF5h,0F1C3AD73h,05BA1C2CFh\r
+ dd 0CBC69B4Bh,0293B99C1h,0ABA9B693h,01670D3C3h,01265BD22h,068B6C447h,02A183D70h,07E7A6D52h\r
+ dd 03729274Bh,07273794Bh,02F1E6F84h,0936D2B33h,0B495868Eh,0713D377Dh,043382C4Fh,082899B85h\r
+ dd 096899484h,094AAA893h,034777D94h,031584333h,07C6E442Fh,089868B86h,033717F6Eh,08E914F38h\r
+ dd 0999E8C7Fh,088889395h,07065667Eh,0708A887Dh,086625E68h,08C8C93A3h,076859089h,04D0E1029h\r
+ dd 07C738185h,0A0A0978Bh,094A4C6A5h,094817D90h,0C0A89994h,0B7B2C8B7h,0718993C4h,0BFBDB188h\r
+ dd 0D9D8C9C2h,0ECD9ADB1h,0A196C0C9h,0AD8F8EA3h,0B6B4B0A8h,036483093h,083543A43h,04248434Ah\r
+ dd 069394040h,062719A7Ch,0817E7465h,040375894h,054677752h,07B726252h,0D1C2BDA2h,07DC6D9DFh\r
+ dd 01E49955Bh,04B505A5Fh,081754C56h,077717480h,077727667h,056465E7Ah,07375594Ch,0A6C7AF97h\r
+ dd 0A4BEB6ADh,0495880ADh,049493D38h,047464144h,06245474Ah,05B555263h,0F1D9CB9Fh,0F2FAF8F7h\r
+ dd 0C6EBE4D5h,0A8B4C0C2h,051BFC3B9h,095D3B64Bh,0BDCBBF9Dh,0CDC6A9CCh,0E5D0C77Ch,0529BBEC1h\r
+ dd 0C3C8A848h,0C063409Eh,0DDB3A3C4h,04C2575C3h,024345B9Dh,090C5B87Ah,03E1F4293h,0796F7A78h\r
+ dd 02F292240h,068727D5Ch,03837696Eh,0AC68333Dh,0867F8AA5h,06336364Eh,03D3F335Fh,08D8E9677h\r
+ dd 08F838484h,09CA29C8Dh,034799195h,016263E29h,0766E4538h,0A48C7880h,039A26784h,093884838h\r
+ dd 09F957D85h,0867E948Fh,08262587Ch,0608C8883h,083656154h,089918591h,072757E7Bh,04C070F48h\r
+ dd 090707D84h,0A7ABAEA3h,0ACB6C9A8h,0968B89A2h,0BAB8AB9Fh,0C1C5D8BEh,08B8A99C5h,0B6C4B39Eh\r
+ dd 0D3CCB8ABh,0DFE4BBB5h,0B09EC5C0h,0A4818CB2h,0AF9EAAA1h,049423E53h,0865B463Eh,046464235h\r
+ dd 05349413Bh,05F84A58Ch,0BCBA9D8Fh,05C4D79A7h,0495C6035h,054515149h,0D8C29572h,053B2D5E4h\r
+ dd 0635CB365h,062627598h,06C71656Ch,088757668h,056526962h,0473F5964h,0433E4038h,0C7E8A05Ah\r
+ dd 0B0DBBA9Ch,05F90C2B9h,04646413Eh,04F4D4944h,05C4B4A4Ah,0614A4D5Ah,0DCCAB5ABh,0EAF2F2E9h\r
+ dd 0CFF0DFD5h,0B0BBBCCDh,043ACA8B1h,0B8C87A5Ch,0CDE5CF8Bh,0C9D6A4DBh,0DAD2C76Fh,04993C1C2h\r
+ dd 05598A22Fh,0CBDCB659h,0ABC8C9BDh,0695A485Ah,031AF7551h,0D3B0B69Dh,0704F368Dh,0897F7A8Bh\r
+ dd 02D261A3Dh,0756B7C61h,02E1F669Dh,0A04F3931h,0896F899Ah,07125264Fh,02F31325Ah,08E869073h\r
+ dd 0A5918294h,093818796h,03175ABA2h,0291D1B1Fh,0536F6963h,06F6A7769h,02D8E8F77h,0AA844341h\r
+ dd 0A9978895h,0827F8989h,09B5E5C80h,083848B77h,071685E5Eh,082958A7Fh,05F5E6665h,04914194Ch\r
+ dd 08976878Ah,09B929588h,0A2A9B39Dh,0897B9697h,0A6A08685h,0B8C7D5BAh,0868A96B4h,0A9A29396h\r
+ dd 0B4BFA4A3h,0C7C9AD9Fh,0959EBFB0h,083727B75h,07B978D85h,040424237h,05A716C42h,03F3F3B33h\r
+ dd 04E3E4543h,04A7E9E6Eh,08BA1B498h,0523F6793h,063915C3Ah,054594F5Ch,0BCA4795Bh,05778B6C1h\r
+ dd 083919072h,063716E84h,08670725Ch,05A59645Fh,03B454951h,053424140h,0424C5250h,0CB7E4947h\r
+ dd 0C1B3AEA6h,099D9E5D3h,03B386270h,05A4F3E4Eh,0544E4D55h,0494A5354h,0D9C66E4Ch,0EAF3F8EEh\r
+ dd 0D4E2E1DDh,0C0DDC0D4h,055BBBABAh,0CBE74B71h,0E8F1BFA8h,0CBF3AFF0h,0E4EBE078h,06695C7CEh\r
+ dd 07B4D4767h,0C7D2C4C1h,04989C0AEh,0753C3239h,02F63D494h,0AEBAD9C1h,09C7B898Dh,0A4A88C9Dh\r
+ dd 0413E2D42h,0687E7355h,03E2A6E93h,0B44C3D32h,09675B38Eh,07D363A47h,0302E357Ch,087848E62h\r
+ dd 0A1B7A385h,08B929C95h,03F82998Bh,050191D2Ah,05C6B5472h,0827A806Fh,03F8BAB7Bh,09E654032h\r
+ dd 0A190878Bh,083808889h,0846C6076h,05F919982h,081645550h,06A73808Ah,05B617168h,0451E2762h\r
+ dd 0847F7C6Ch,096868471h,0B3ADA993h,08F9AACB0h,0A8B4A584h,0ACBDC7ACh,09987A7B0h,0B08E9C8Ch\r
+ dd 0C7BDB6BAh,0DEDECDC7h,0C0BFDAC7h,0B281A8ADh,0439BADBFh,03839493Bh,02C87853Ch,04A474139h\r
+ dd 0463C3E4Ah,0629DB94Ch,0A9ABAE86h,059496587h,062A9485Ch,0544C3F5Eh,094844F51h,06956B1ABh\r
+ dd 0869A8CA9h,0686A6278h,0838B745Eh,07767877Dh,0515A3C6Bh,038402F36h,03B404543h,05F3F4537h\r
+ dd 0D3DBCD97h,0C4C5B5E1h,04DA0E9E1h,046403A3Ch,04E4A474Ch,0494A4548h,0E4C17638h,0F5FAF6F2h\r
+ dd 0E2DDE7E5h,0D1D1D2F5h,099A1AEBEh,0CBC12A5Dh,0FAE89CDDh,0F1FAC1EBh,0CCFADF95h,05FA5DCCCh\r
+ dd 0B09F6652h,0BED2D3BBh,032537FC6h,0AD9C622Fh,0771087BCh,0B49EB9CDh,0A89BA0A2h,0B4AF8498h\r
+ dd 063724758h,06D5D6A67h,04B42607Fh,0AA4B4E42h,09BCC83C3h,0A33C2D45h,03A39276Dh,07C7F8757h\r
+ dd 07B86A69Eh,077767982h,0367E947Eh,05B2B272Ch,0757C657Bh,093978F85h,05C95A892h,096664640h\r
+ dd 093888388h,088748C8Ah,0917A727Fh,0787A8B92h,0837A736Fh,05C626E80h,077675C4Ch,054221A58h\r
+ dd 08269554Ch,09D8F9279h,0BCA98F92h,084B6BFCBh,0A7B2A27Dh,0B5BECAB3h,09681C1BDh,0CCC6B187h\r
+ dd 0CFBCACBBh,0D3C0BED1h,0AAB6C2CDh,097BAB5C3h,03760A4B3h,03F41444Bh,0197F9C55h,04C484034h\r
+ dd 052574651h,07EB69631h,06A9BAB49h,0514B515Ah,0769A4C54h,056454159h,06352515Eh,05B507B76h\r
+ dd 0768CB299h,05E575876h,075836A6Ah,06A6B5246h,0685E505Fh,0404D3E47h,0555B5751h,05A4B584Dh\r
+ dd 0CDB05349h,0B6BCB2B4h,0A4BFA9A7h,06E899B9Dh,0453D3660h,056503E3Eh,0DFBB7144h,0F8FAF4E8h\r
+ dd 0AFE4DFE7h,0D6E3CBB6h,0ABB2BDC4h,0D9814650h,0F9CEA0FAh,0E9FACADCh,0CBF5CF99h,0777ABAE1h\r
+ dd 0907E9994h,0D0C7E7D3h,074494F5Bh,0E9B1B0A0h,08E182CA6h,0A6A0CDC1h,0BAB9BEA2h,095A297A4h\r
+ dd 061575D62h,07A83A394h,0684D507Ch,087576255h,091858D83h,08A66634Ah,030425394h,07B7B7E43h\r
+ dd 07B818467h,08E8A908Fh,030558799h,070493437h,0818A8598h,0A2A69794h,0779D95A4h,08D644749h\r
+ dd 095848589h,095858987h,0A07D868Fh,07D7D718Fh,06E62616Ah,06C809386h,095878676h,061322771h\r
+ dd 075625D68h,088888B73h,0B69F797Eh,08CA6CCCAh,0A5AFA186h,0BBBBC3B4h,08895C1BCh,0D7E2B59Fh\r
+ dd 0E0E4B9BAh,0BDB0AABFh,0ACA7AAC9h,0B3A8BEC3h,0323490AFh,033444345h,01868A87Ah,049423E38h\r
+ dd 06A82544Dh,09BBF6C36h,068B88344h,0383B3942h,098784133h,04B35324Ah,05E56515Eh,067754F5Eh\r
+ dd 077929E37h,063685E70h,05251726Eh,0414A6257h,041537347h,0353A271Fh,03D474B50h,048313341h\r
+ dd 0863A473Fh,0A29DCCD6h,0B9848395h,092B5AFBEh,04C4D5153h,052465759h,0D9B35241h,0F4F8F2DDh\r
+ dd 0DAD8E4E3h,0B6C6B4D8h,0D9B7B7B0h,0EB475C8Dh,0F4AA9AE6h,0ADF7D1DFh,0DECCF0C5h,0B9C6E9DBh\r
+ dd 0BBA37779h,07AE9D6C1h,0B8A47E5Dh,0C8DAB1A8h,0A5480B60h,09B90A5B6h,0B7ADAC99h,07CC3B3B3h\r
+ dd 09257675Dh,093AD9CA0h,06A5E7D88h,05D54473Eh,0A9AE8A94h,0946D5248h,02F2C53A0h,082807637h\r
+ dd 088817E77h,04A6F898Eh,026182D30h,091452E2Dh,07F8586A3h,0A595999Fh,07C9490B0h,07C4D4345h\r
+ dd 093778A8Fh,07EA59684h,0626B5F61h,0968E5358h,0707E707Bh,06D829079h,0808E9772h,0642D1558h\r
+ dd 06A6C7380h,06E878C74h,0A3957964h,08CA3A9A9h,09CA7978Ch,0A8ABA7B3h,08E92C4AFh,0C7CFA79Ch\r
+ dd 0BCDBCDB9h,0D3B09BA2h,0A6A0B7CBh,0A8A6B7C1h,0493D62B2h,03C2D3B44h,0A2969883h,078616A8Ch\r
+ dd 08EDDC9A3h,0BBC3573Ch,0646F4C84h,041404456h,0C361444Bh,04B484D5Ah,07749565Ch,0A1807CABh\r
+ dd 0899D6150h,077777B79h,05759535Eh,05E4C4F5Eh,061586C54h,0302C4B3Fh,03E54473Eh,07B5A3934h\r
+ dd 0324C5271h,09EAA8B62h,0BFAEA196h,061B6C0A6h,05C553A2Eh,02C425055h,0C0804639h,0EFE9E0D1h\r
+ dd 0DCD1EDF0h,0A39DA6CDh,0E5DDC2AAh,0F65F89D5h,0E99EE1D6h,0A3D7B2DDh,0DBDFE4F3h,0AC8E99B5h\r
+ dd 0C0BFBEBEh,0C5CBCBBFh,0B9B5B6C7h,094D9C9AAh,090731553h,091A59591h,0AA8F9F90h,047B6B6AEh\r
+ dd 0955E6D50h,0C88D9295h,03E3C69ACh,047495F4Dh,092A18E78h,07E615244h,0201F509Ah,04252553Ch\r
+ dd 01F1C3543h,03825322Ch,01E10233Ah,0662F2D1Fh,0839CB5A6h,0B89C948Ch,0949B8BB0h,06849425Ah\r
+ dd 0937D8B91h,083939589h,07272787Eh,090625D7Dh,096B68C8Ah,0586B887Bh,06E817460h,06A232046h\r
+ dd 07D8C90AFh,0828F886Fh,0A7887672h,0A3A6AAA5h,0ACB3A5A3h,0BDA8A8BFh,0B4BAD0C9h,0AEC3BBBDh\r
+ dd 0ADC0BEACh,0C8AE9AA1h,0AD8F99BAh,0BE9895C1h,04C573EA0h,068344150h,094B0B0B6h,0B79EA9AFh\r
+ dd 0BABEB6BCh,0A1933F53h,0634B517Eh,04349526Bh,0A85A4946h,04A4B4666h,0B091634Ch,08BB6628Fh\r
+ dd 06B644F44h,058527986h,05946565Fh,05A585B51h,08E745245h,0B8536454h,0ACD2CFB4h,06F56393Eh\r
+ dd 07491CDABh,0C085453Ah,09F839BB9h,0356190C8h,05864524Ch,05A58564Fh,0B9724755h,0E9F0E5D8h\r
+ dd 0DFD8E8E6h,0AFD2EDF5h,0B7A99AB3h,09D5298D0h,093A9ECD3h,034DEADEAh,08379B0E4h,0CED0BFA3h\r
+ dd 0D0CAD2DEh,0DBDFE1D8h,0D2EBF0DFh,04A71CFE6h,0AEB09032h,0ABA89B9Ch,0C0C7BFB4h,05D9BCABBh\r
+ dd 0A17D6B37h,0A99DC5AFh,03F545DA4h,0283F756Eh,0879F7C59h,07D563E44h,02F2D7B9Eh,019203237h\r
+ dd 087693F1Ch,08F7C9597h,02C387194h,036393A32h,07F5D231Ah,09E9E9582h,08E87899Ah,046334075h\r
+ dd 0857B985Dh,0848EAC96h,07E73A39Ch,0626F7C95h,09E9F8875h,076767D8Fh,04F8F885Ah,0814A2525h\r
+ dd 07E9296A0h,08E7C6767h,08D78698Fh,0ABA2A197h,0AEB6A4AAh,0B7AAA3B9h,0CBCFBCC1h,0AEA8B6CAh\r
+ dd 0848CA5ACh,0C2CEAF93h,09FB0B9D9h,0A5A4A9ABh,04A5B4752h,0823D3D4Eh,0AC9A84A6h,0A2ACB5A7h\r
+ dd 0B4B3B9AEh,0AF893568h,04C466B9Dh,04A484C56h,072404C53h,05851547Ah,08AA89A6Dh,06975A76Dh\r
+ dd 072745D59h,0554F4252h,0444B4345h,02D2A3944h,086735C35h,0CB52375Bh,0C3D1CDD0h,0393C3564h\r
+ dd 0DBC8DF6Eh,0811A349Fh,04F5B5892h,0482E3437h,051395830h,05D5A8D8Eh,0CC988B79h,0F3F9F9EBh\r
+ dd 0ECF4E8ECh,0C6E6EEE9h,0D2C8C2C4h,0429EC2CCh,093AAC9C4h,0215AC09Ch,0CEBE678Ch,0C0B7BBD0h\r
+ dd 0E6E7D9C7h,0F7FAF5E5h,0ECCFD5ECh,03F28449Ah,0B09BAAA1h,08BA1B2B1h,0514D4B69h,0A4BBDD89h\r
+ dd 0937B6B66h,0D68FA994h,05B5259AFh,049416071h,076B59C5Fh,08E5E404Dh,02C4BB3ACh,0643B2F33h\r
+ dd 081788794h,09A7D8A8Ah,0447896A9h,0634F4449h,01A40586Fh,0A7754F24h,09B919BB3h,041397296h\r
+ dd 09B8D7336h,09D98AEA1h,0646796A3h,0727A7058h,08580857Eh,0606A7C94h,02C769672h,068823829h\r
+ dd 092AFC4AFh,0B8846B82h,08D9C9FCFh,0BAA8A499h,0B7C3ABB7h,0AFA0A1BBh,0DAE0C8C4h,0C6C5B5D6h\r
+ dd 08CA6B0ADh,0C8C39D85h,0A5A2A3D5h,05F8B9FB4h,04B3F5B2Ah,09F593A3Eh,0B2A59FACh,0B3B9AFB8h\r
+ dd 099CEE2ACh,0CF4E1B9Ah,03E4F75BFh,039414944h,07B4B4C3Dh,03F3D589Ch,0605D8F67h,05E556081h\r
+ dd 02D4F575Ah,06762643Fh,0313C5366h,0AE3B2335h,0423C2F4Dh,0C27F274Ch,0C6CCB9B6h,045493873h\r
+ dd 0BAAAB631h,0543990DAh,02D3A487Dh,037452028h,0976E474Ah,0D3C5CAB4h,0F1E3D1DFh,0FAFAF8F6h\r
+ dd 0FAF7EBF7h,0E0D9D7E6h,0E0D3E5C3h,08F9CC0B9h,0DABCCFD2h,03C273073h,0D8B9D6BAh,0C1C0CAE6h\r
+ dd 0EFEBE2D4h,0E2E6EEEDh,06ACEDFE9h,0C26C3042h,045386488h,02E3E3D34h,03E413D30h,0949E8153h\r
+ dd 09A724D6Bh,0D4C3CFA8h,0605076C0h,0595D6575h,04DABA953h,0A77A4C48h,04556A5A5h,0793F3749h\r
+ dd 08E93918Bh,084707A80h,0768F8C85h,0724B434Eh,07C90A49Eh,03A304C67h,09A947C63h,0266E9793h\r
+ dd 085682C2Bh,095979284h,0898D8990h,07C897581h,0656B7B7Eh,0626C6A7Fh,021255461h,0725D643Ch\r
+ dd 095B8B9ADh,0BF7B6A6Ch,08AAA9BD0h,0B79C8F84h,0CCB3C6B9h,0A99EAEB9h,0DDD4C9CAh,0B0B8B4AFh\r
+ dd 0C3B6ADB4h,0C1BCA2B1h,0B394B3D6h,0383D3C82h,047454540h,0A6883B3Dh,0B2A6A79Fh,0ACABC0B4h\r
+ dd 0ABB2B6A4h,0A14646C0h,0446D98D2h,039343C4Eh,07E345B45h,0343C5A9Bh,0595D6047h,07569524Bh\r
+ dd 06B4A6354h,04960675Dh,011344B5Ch,0D9C29C50h,029445149h,0BD9C3D44h,0C1B1ADA7h,04F36325Dh\r
+ dd 0CBAD8C4Eh,03E8EC1C5h,05D71391Dh,026322517h,09F865747h,0DCCBCAADh,0E2E2E2E3h,0F9FAFAF0h\r
+ dd 0FAF8ECF2h,0CDDEF5FAh,0D4ECD8C7h,0A899BBBBh,0B69CBBCEh,0E3593732h,0D2DDC1D3h,0CBF5EED5h\r
+ dd 0EFEBD6C8h,0E1E6E9E8h,04665C8DAh,03C4B4E5Fh,0282D3026h,03A352D2Ah,04F4A393Ah,09F465054h\r
+ dd 0ACA0AAB4h,0F1D9BCB4h,04F4D5BD2h,04B426970h,045AF8651h,0926A404Ch,02F6CAE8Fh,07A4F4C3Fh\r
+ dd 072839D80h,06A74636Ah,069AC8D76h,063322F3Dh,094948FA4h,06D90A398h,06D4D3E53h,05E9BB48Eh\r
+ dd 0662F363Fh,0A8ABB0A8h,07C988689h,0665A616Fh,0706A5D61h,05860637Eh,00904143Ch,04A455C37h\r
+ dd 0AFC1AE96h,0C27F7586h,093C2B8D8h,0A1885D77h,0CAC8D5B6h,09A9EADBEh,0BAC4C1AAh,0AFBDC4B5h\r
+ dd 0B1B3A8AFh,0CDBC8289h,0BBA9CEF0h,06377576Ch,052506B7Dh,097996150h,0BC9C9AA5h,0ADA3C5BBh\r
+ dd 0BAC1B89Dh,0940F9ACAh,0498ADFD4h,03F483440h,064454342h,024324499h,039433D2Bh,06952544Ch\r
+ dd 048587457h,0464D6854h,085453346h,0B6BEC8B1h,033464379h,0979F3448h,0B8AEA8A3h,042485A89h\r
+ dd 0C9AD816Dh,074CBAAD6h,083351F20h,03C1A207Bh,05B4B353Ah,0CBC0C18Fh,0E6D9D5D4h,0F5F8EBEAh\r
+ dd 0FAF7EAF1h,0DFF7FAFAh,0DEC2CCD3h,062AEEFF1h,09AB8B7D3h,0633D2EA1h,0D5EFD4A4h,0FAD9CCE6h\r
+ dd 0D8CCD6F2h,0ECE9E8DEh,0443E8EE9h,022242F40h,03433332Dh,03D3C3C38h,044423A3Dh,04F2B4444h\r
+ dd 0ABB2B6C7h,0D6E8E9C9h,0624D61D1h,05A547E8Ch,048966D41h,09B734655h,02A90BB94h,0834C5537h\r
+ dd 07D6B828Bh,06C746D9Ah,07AA89173h,048253746h,0938F8B91h,0A79FA59Ah,05388A8B0h,099835149h\r
+ dd 0252B4581h,0A0A29055h,08D928485h,06774808Ch,07A665A5Ch,02D4B5770h,036160515h,03E454F55h\r
+ dd 0D3C89366h,0B7889AB6h,096C8C5CEh,093876A7Bh,0DEE2D39Dh,0908497CAh,0BDB1D6B4h,0B1C0D1CAh\r
+ dd 0AAC4B4B2h,0D5C6B19Eh,0C5B4D8F7h,0A5BDAEA4h,0B4A8A1ACh,0B5968EBBh,0C1B0ACA5h,0BCC2B3BEh\r
+ dd 0BCC1C7BFh,08511A9BCh,091E4DCC2h,057464B31h,0513F3A4Ch,022435687h,038393622h,06B4C574Eh\r
+ dd 044536457h,0545E5753h,0A86A4C4Eh,0ABBFB6ADh,044573499h,0A8B95E38h,0C5BBB7B1h,03B4D7F92h\r
+ dd 0C2CE857Eh,0DBC1CBCCh,0582D31A6h,01C3D7E85h,057584A2Eh,07C727365h,0A9979B8Eh,0F6F7CFB4h\r
+ dd 0FAF9F5F8h,0F6FAFAFAh,0C9CBD4E6h,07BC1DBD8h,07F5FBCC7h,07978C0BFh,06F604758h,0D9BDA07Eh\r
+ dd 0B0D1F3E9h,0E1DED9C0h,05CA0CFDDh,055504843h,0524C4A50h,0474C5352h,03B3F4243h,0373C3A3Ah\r
+ dd 0A5A3B057h,0ECCADFD1h,0574350C2h,05F559990h,040865F47h,09679454Ch,03985AAA9h,086464537h\r
+ dd 0D776A397h,0827A5D8Eh,06A9A8E80h,04E263D51h,086878CA5h,0A3A29787h,0AAA8A8ACh,04C38769Dh\r
+ dd 04A6E7B5Fh,058422620h,092978A70h,0666F6E7Bh,078727E6Ah,019192C57h,04B401706h,03E484351h\r
+ dd 0DBC58858h,0AF8BA4C3h,097C2C5C5h,09780788Eh,0C7E0D097h,0958097C6h,0B7B2BEC4h,093A0B0A9h\r
+ dd 0ACB2A99Eh,0DEDCB3A1h,0EBBCD8F6h,092B8C7DBh,0878D8584h,094907F88h,095848994h,07F8E9589h\r
+ dd 0BA988A7Fh,06033B3E3h,0BDBEB3A8h,0565E566Fh,0956A6757h,05A566288h,07A64685Eh,0766F7374h\r
+ dd 082728159h,0738C5272h,07E755F57h,0BFB1B195h,06F501CE1h,0A8A38027h,0C1BAB4ADh,054398CACh\r
+ dd 0B9D7869Ah,0AAD4BFCDh,04C4F78C7h,095C5B888h,0545E5544h,04E545853h,08B62544Fh,0F2EED6A5h\r
+ dd 0F7EDF2F3h,0FAFAFAFAh,0E8EAE1EAh,0BFCCBAC5h,06D3943B6h,0AFD2EFC9h,06984DFF5h,05D384A63h\r
+ dd 0C3B48B7Ch,0D4D3D3C6h,04278A9D0h,0483C2D43h,04D494549h,03F4A4646h,02F363E3Bh,0444D282Ch\r
+ dd 0A7974C1Fh,0CBCDD4C7h,056552C82h,04E5F9D71h,0456D5353h,07A725058h,051779FA1h,069534230h\r
+ dd 0BD8FA38Fh,08B7270A9h,06AAF849Bh,04320364Dh,07F7B7E8Eh,097888F86h,0B6B1A6A8h,07F9D9CA2h\r
+ dd 055595C76h,01835646Ch,0613B2513h,0575D5D5Fh,02A2C4444h,02D091922h,04A573C34h,036444B43h\r
+ dd 09E8E676Eh,097959CA5h,0B2C1C7AFh,08A7F7C94h,0D3CFC89Ah,0BBC5C5D5h,0A9B6E4BAh,096909392h\r
+ dd 09E98A697h,0F3F4DFBAh,0F7F7FAFAh,0DFDBECF2h,086A8A7B6h,0C9CDC0AAh,0C4C8CBD9h,0A5AAAFB5h\r
+ dd 0BFB7B4ACh,06253DACFh,098ADB9BFh,043351D91h,0B5852944h,04945394Fh,0485F4257h,04C735B4Ch\r
+ dd 0669BA372h,0BC85317Ah,06E504341h,0C0B6AC8Dh,0473F45D6h,0BCC5B53Bh,0B1B5C1C9h,02B2E82A7h\r
+ dd 0C7E579A2h,0D2CECEDCh,02643B9C8h,0D8E08226h,0583C4B9Dh,04A3F533Ah,0CE8C4A42h,0FAFAF5E7h\r
+ dd 0FAFAF9FAh,0E5EFF8FAh,0E3E2D9EAh,095ACC4E5h,04A7C512Fh,0C0C6B882h,0C0ACD6CDh,0BEC6DAD8h\r
+ dd 0757E7B92h,077725D5Ah,085A08E86h,045446B7Eh,031465658h,03B261A21h,04D434847h,03B3B3D3Fh\r
+ dd 07E71313Ch,0A59C9893h,061554984h,058848C5Dh,0586B725Ah,09F925854h,068A4A3B1h,0724A4741h\r
+ dd 09B8B9082h,097818DA1h,074B9898Bh,046465558h,081918C85h,09C9F8F8Ch,0A193ADA6h,0808F9FAAh\r
+ dd 04B77848Eh,053656936h,02B333852h,01923282Ch,019141A12h,04D442D25h,056504E4Ah,0564E505Ah\r
+ dd 0A499787Fh,0AFC4BDB2h,0B9C8D7A5h,09B93919Fh,0E1CFC5A6h,0A9C8E5F1h,0CDD0E2BCh,0B7ACAEBBh\r
+ dd 09B9AA299h,0F4E6CCADh,0FAFAFAFAh,0CCE9F6FAh,09AB7D0CDh,0F8F2B794h,0CFEAD8E3h,0A2A2BDB3h\r
+ dd 0A8AAB7B7h,06274CDC1h,09198C283h,039236B96h,077A82E2Dh,050433C33h,09481765Eh,074C8C7AFh\r
+ dd 07E85A590h,075227D62h,038284096h,0C9A59C6Dh,02C207FCAh,0C8AEE240h,0ACB0BDC1h,02D9C88ACh\r
+ dd 0CBEB9791h,0D6C3BBCAh,02194D9E9h,0C89E342Bh,09BAEC4B4h,04E453D4Bh,0C9B6854Ch,0FAF9F3D4h\r
+ dd 0F9F8F3F8h,0E8EDF3F9h,0DED0EDE2h,06C628AC8h,06DB0C6B5h,0C0C9BD35h,0AFC8C0C9h,0EBD1DED2h\r
+ dd 0CEFAEDF9h,096C8E0E5h,07A657D8Ah,0B7B5B3A5h,0A7BFD2CDh,06E7A909Dh,02F46555Fh,03D3A192Fh\r
+ dd 076163B3Fh,0AF9EB0DDh,04B495399h,0486E5E47h,054635440h,0B9A15347h,074A3A5B5h,0734D403Ah\r
+ dd 08D8EA3A0h,093969084h,04A717090h,045303B2Dh,0A2A09687h,0A28190ABh,0ADA5A5C1h,06B7592ABh\r
+ dd 0929F9B89h,0454F7D85h,064697363h,03A304C5Dh,04837323Bh,0575D5C51h,092926A4Fh,051475C89h\r
+ dd 0B3B09496h,0C2B8AFB7h,0B5BECDC3h,08D8785A0h,0CFBBB095h,09DA9CDE3h,0A7BFC8B2h,0C7BBACA2h\r
+ dd 0AEA9AEA5h,0FAECD5BEh,0FAFAFAFAh,0D9F4FAFAh,0ADC4D2D0h,0E1D0C8B0h,0F2F2FAF5h,0D4DCC7D6h\r
+ dd 0B8AFAEA8h,03276C7CCh,09AAFC382h,02B3AB090h,065B16B28h,04D30262Eh,0CAAC6650h,058A8CBCCh\r
+ dd 0476B707Ch,02B5D694Ah,047476D5Bh,094897456h,03626C1ADh,0B9BFBDA5h,0ACB0B9BFh,04090A5B6h\r
+ dd 0D3DB8068h,0D4C5BDBAh,06FB5CEF0h,0B23E1724h,091E4BA9Eh,08C545538h,0C3C7DABAh,0FAFAD274h\r
+ dd 0F9F9F7FAh,0F7F4F8F9h,0929AB0F2h,0CBC9B27Eh,0A3C1BEB0h,0D2BC9A33h,0BABFC6CFh,0D7C3CCC8h\r
+ dd 0C7DEC1D4h,0D2F7F6F2h,0B6DAF0CCh,09A9A8C86h,0D6CBC2ABh,0D0D3D3D8h,07E9996B5h,0362A0A36h\r
+ dd 016353937h,0BEC0B994h,03D3F5CB1h,054554840h,0534A2F2Fh,09AB0815Ch,0629FB6B5h,05D3B2428h\r
+ dd 077696555h,0627A7669h,0457D5D5Fh,04A2B3238h,0AAA67C89h,07D5E6F93h,0A4A3AAB3h,0616D7496h\r
+ dd 0A8A28C70h,05B8DB0AAh,05839323Ch,0585D6C69h,06A645861h,060564E59h,089855B58h,04C5C6E8Ah\r
+ dd 0A8B6A8B1h,0AEA7A2ACh,0B0BCD2A8h,09A8A839Eh,0D1B5AEA9h,09BB7D3E8h,08CA3A288h,0B8BF9A94h\r
+ dd 0D5CDB7ABh,0FAEFE0D9h,0FAFAFAFAh,0F6FAFAFAh,0C4D6DBE0h,0DFD6CCA5h,0FAFAFAFAh,0BBC6BFCFh\r
+ dd 0AAA1A4A3h,0449CBDC2h,091BFBB79h,01E6599A4h,07A9F7B52h,066313D28h,0BF7B4964h,05E7CD6CFh\r
+ dd 0465C648Ch,05E4A7465h,033584329h,0986A553Dh,07237BBA0h,0B9AFB9DEh,0ACAFB4B8h,08A6CBEB8h\r
+ dd 0CAC19E46h,09CAFB8B9h,0DCB9A0A6h,0A8314E58h,0265CB3C2h,0D4825749h,08CCAD9DEh,0FAFAE48Bh\r
+ dd 0F3F6F1F7h,0E6F3F5F1h,0CE9475BFh,0A1BCE9EDh,0C3B3BEF9h,0F8C07968h,0C9CCCEDEh,0B9C6C6D8h\r
+ dd 0C8BEBABDh,07DB7D0CFh,0BFB6C086h,0B4C0D8D5h,0AB9FA2B3h,0C7C3D3C8h,0A9ABD3CEh,03E310E67h\r
+ dd 04C364242h,0C9B59C1Bh,0354565BDh,07F6F7952h,04544283Eh,099C89456h,06D8C9BA2h,03C2D2335h\r
+ dd 0726D6F5Eh,070777C74h,05A8E8672h,044273535h,0769A6379h,082746658h,0A5B4A29Eh,052427F95h\r
+ dd 0A9A29A72h,08198B0AAh,0383D3F76h,04E4A2620h,05567604Eh,0635B524Dh,08A817562h,04E687185h\r
+ dd 0B5B1B2B6h,0D0AFB6B8h,0BABCD0B1h,09B928FAEh,0D0C0ABA0h,0A7C9DBDCh,0A6AFAE96h,0D0D4C9B2h\r
+ dd 0E8DAC5C9h,0FAFAF5EDh,0FAFAFAFAh,0F4FAFAFAh,0C4E5F4F6h,0D9D2C2B1h,0FAF9F8F4h,0D2CFD9DBh\r
+ dd 0A5B3C1CCh,03196B2A1h,088B3AC7Dh,06F8BA38Bh,07184A4AFh,05B2D3345h,04F476993h,0654EAB8Ah\r
+ dd 064627794h,04F556F76h,06C3C4854h,07E6D3642h,06D99AB9Bh,0A0A6A881h,09C9EA5ADh,08494B8A3h\r
+ dd 085A08B3Bh,08A9EB5ABh,0D3A177A1h,05C402CC6h,0522F53ACh,0DFC89B47h,06AAFD8E8h,0FAFAECBAh\r
+ dd 0ECEEF3FAh,0DAE3E9ECh,0F2DAAB9Ch,08AE1E9EEh,0C1B7DAEAh,0F1E226DFh,0D2CED2E6h,0CBD4DCD0h\r
+ dd 0CBD3CACEh,0A3ABC2E1h,0B2C1B27Ch,0BBBAA0B6h,0CAE2E6DCh,0BAB6ACB6h,0ADB1BDBAh,0433D3B9Eh\r
+ dd 0404C3C48h,0D5B3433Fh,02E4670A2h,0A89BB071h,04A4B2665h,0B9EDB76Ah,05B757A86h,04134263Ch\r
+ dd 09A876B3Eh,0808D826Dh,0506E666Dh,04B32403Dh,07B8A6B7Ah,080665956h,0AB9DADB3h,0757B8AB1h\r
+ dd 07C6F7478h,05D7F9191h,05E96534Ah,01A082643h,064566936h,08C896353h,09C808F9Fh,061595E78h\r
+ dd 0AEA2919Ch,0A3A1AFB2h,092979F7Eh,08A8A9786h,0CFBCA083h,090A9CFD8h,0AEAE8388h,0D4CCC1B4h\r
+ dd 0FAF5E4DAh,0F7F8F9FAh,0FAFAFAFAh,0FAFAFAFAh,0D6F5FAFAh,0D7B7C5D2h,0F7EDE0D6h,0C7DEF7F7h\r
+ dd 0A8B1ACBDh,050A5A89Bh,0A3A4A15Fh,0A5B3AF9Ch,07F86A1A1h,063587476h,054678B85h,07A686061h\r
+ dd 046505475h,042454E4Bh,06865473Ch,04D5C5763h,0979D956Ch,0B8B0ADA2h,0A4A6ADB6h,07FCECAAFh\r
+ dd 0BED0B837h,0B4B3A9A8h,0A4A7958Ah,02F31B1CBh,03C3B41D9h,0E3CB9258h,06B78CCE6h,0F8FAF1CAh\r
+ dd 0F9F8F7F9h,0F6EDF5F9h,0F6E5D782h,09AEFF4F5h,0B3BCEACBh,0E9815ABFh,0C2D9E9FAh,0D7E8E5C7h\r
+ dd 0BDE3DAD0h,0789DB0ADh,0D5DEB67Dh,0C1D2CCC0h,0E4D7CCCDh,0CBD8D2E1h,0A5B3B2BDh,03D4992AEh\r
+ dd 0464E4444h,0D364364Fh,0524B68A6h,0BDAE9F6Ch,0533F3D97h,0BAF0CC76h,09F998B98h,044342F58h\r
+ dd 098737662h,0595E6F87h,05E728060h,02C353330h,0AC947069h,07A7B8297h,0B28E8A92h,091A3BECCh\r
+ dd 052587080h,05E5E635Dh,0AD8A554Bh,05E585C76h,047231233h,083757460h,08384887Dh,04D585D62h\r
+ dd 0A09EAB97h,0908496B5h,07888989Ah,0898C9669h,0D3CFB184h,0A8ABC2CBh,0ACBFAEB6h,0E4DACFB1h\r
+ dd 0FAFAEEEAh,0EAEFF9FAh,0FAFAFAF9h,0FAFAFAFAh,0E6F6FAFAh,0CFCAC5D0h,0FAF8EBE2h,0C2E5FAFAh\r
+ dd 09BBCCCAEh,080B7B3A5h,0A8858A5Ah,08099B6C6h,06258667Fh,0575B5152h,04A504C47h,0AA6C5D56h\r
+ dd 05D586A8Fh,030344A5Fh,057585249h,05D645F5Eh,097946D5Bh,0BEBCB5A1h,0A1A1ABB1h,040C0C0ABh\r
+ dd 0ADAAD379h,0C19D8F9Dh,0A39387A1h,03240C1B4h,0344346B7h,0E1CB9362h,050529AD5h,0F7FAE9B4h\r
+ dd 0F8F7F9FAh,0E8EBF4F8h,0F2DEEF7Ch,0C4F0F2F4h,0AAC8E699h,0DC1A8079h,0CECFE1FAh,0E9DDCFBCh\r
+ dd 0B7C3CFEEh,08CB6BDC4h,0D3BB7A60h,0CCCDC7CBh,0B3B4CFD6h,0CDE1CBCBh,0AEB9BCCAh,09DABCAB8h\r
+ dd 039476C95h,086394346h,058684EA6h,09091947Ah,0734B569Eh,0C0CCB375h,095A096A6h,04E434388h\r
+ dd 0A68C846Bh,08D8B92A6h,098BB8790h,04A385559h,08F859288h,093969C9Bh,08B999B98h,08593807Dh\r
+ dd 06F717C85h,08E85988Dh,0818D8991h,0727C7E77h,02C4B6680h,0575F4120h,065888263h,0484A4958h\r
+ dd 0A49FA1A3h,09D9B97AFh,09499ABBDh,0778798A0h,0BABE9965h,0947F90A8h,0CBD4EABEh,0F9F3E5D2h\r
+ dd 0FAFAFAFAh,0ECECF7FAh,0FAFAFAFAh,0FAFAFAF9h,0FAFAFAFAh,0F3F4F6F7h,0FAFAF5F4h,0D9EEFAFAh\r
+ dd 0A49BA4B9h,0CBC1BAB0h,0667394C6h,05A82A5ABh,06660757Eh,053504D54h,044454646h,0A37A4542h\r
+ dd 061475478h,05362696Eh,05A422E39h,06F3D4155h,0857B6C69h,0C2B5A695h,09CA0A5AFh,0237EB4A4h\r
+ dd 08DA5D494h,0AFA5ABAFh,0837A84BBh,0409A9774h,04842665Eh,0D1C39B54h,058535CB2h,0F9EFF4B6h\r
+ dd 0F6F5F8FAh,0AAF0F1F6h,0F6E1E9BFh,0E2EBF1F6h,0ADE0F98Bh,0444F737Bh,0CED2FAF3h,0C5C7D9DEh\r
+ dd 0C2C2BFCFh,0C2B5ABCCh,0AE96819Dh,0BFB7B7C3h,08B94C4C3h,0AFB29AA9h,0B996C1CBh,08F9DB6B8h\r
+ dd 03E4A759Bh,048293936h,05D3E3674h,0C1B39371h,0311C67BFh,0C3D0C155h,0B2A79DBCh,03F41418Ah\r
+ dd 035413734h,031303230h,0404B1B31h,02411302Eh,09A988F74h,091818A8Fh,090978C8Dh,089929186h\r
+ dd 06E828C8Dh,080859880h,09691988Eh,070859696h,075755F66h,029292551h,0466F5541h,0635B4C49h\r
+ dd 0A691858Ah,0B5B3C2C0h,097B8D1D0h,09497A89Fh,0C9C4B492h,0C1B7B7C6h,0EEEEE8D3h,0FAFAF8F1h\r
+ dd 0FAFAFAFAh,0F9F7FAFAh,0F6FAFAFAh,0F6F8F9F6h,0EBF7F9F9h,0F8DAF8EAh,0FAFAF9F9h,0EEF3FAFAh\r
+ dd 0A29EADF8h,0BBB9A1B0h,06ACDCBCDh,076A36946h,05C736E53h,0364C3D42h,045383B3Fh,07B654747h\r
+ dd 058525164h,055585C5Fh,030414859h,041464839h,0A8A57648h,0A897919Ch,0B0B9A9A6h,06E38B7C4h\r
+ dd 089B89E8Ch,0AAA1A8BAh,082838E9Ah,03B938E8Eh,059415F1Eh,0BEC9B062h,051454773h,0FAF2EBC0h\r
+ dd 0F5F9FAFAh,08AE8EBEDh,0FAF0EBE1h,0D7F2F9FAh,084C9E5BAh,05EA95E7Ch,0B0E5DDC9h,0DAD9D7D3h\r
+ dd 0C0C6C9D4h,0D6C9CFCEh,0799395E2h,0C1B1B8A3h,0B7A7B7BBh,0B5B0B1C7h,0C671B6C1h,0BDB7B8CBh\r
+ dd 037317EB8h,036364338h,0583E4444h,0BFB9BE7Fh,065537EB0h,0E9BDE370h,0A5CBD0CEh,02A30397Ah\r
+ dd 032432626h,02526282Ah,01D241E23h,0150B1B27h,07681897Bh,08D848077h,0807A8287h,09A958F8Ch\r
+ dd 08A8E9291h,084899494h,09F908F87h,06A7B8794h,0757D6763h,04554636Eh,049301124h,06971745Fh\r
+ dd 0B399847Bh,0CED0E1D3h,0ACC6D0DEh,0ABA9B4BAh,0D7D5D1B0h,0DECBCCD7h,0FAFAFAF0h,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0F5FAFAFAh,0FAF8F2EFh,0F2F9FAFAh,0F8D8F9E8h,0FAFAFAFAh,0F4F8FAFAh\r
+ dd 0B3BACBEEh,0C2C2ADC6h,0BDCCD4D8h,07B3A3F83h,05D6E5D70h,0464B5750h,04A414A41h,06061534Fh\r
+ dd 05454564Ch,04D515357h,05B7C835Ah,04D36353Eh,09E58304Ah,0989FB5B7h,0DDBAB79Ah,0B93D28BFh\r
+ dd 0A3918598h,09A95A4B7h,08F7D8A9Ah,086AEA499h,053396038h,0ADC4A465h,050484957h,0FAF8DEBDh\r
+ dd 0FAFAFAFAh,08CD8E1EBh,0FAF7F3E4h,0E4EDFAFAh,052A6D9C3h,09390778Eh,0C7B2DF4Bh,0E5E1E6D2h\r
+ dd 0C4C9D6E3h,0BED5CAC0h,066759DA1h,095B4AF8Ch,0B3BA919Eh,0A6ADC3ABh,0C97DB6C0h,0DAD3BFCCh\r
+ dd 03161D1CDh,0213A343Ah,0776E502Dh,0BD9CA678h,0C8BAD6E2h,0EBECFACBh,0B1CEC2D7h,0344F3669h\r
+ dd 03A40272Bh,04F565144h,03D342E45h,0291E253Ch,072707A77h,0827D7C77h,07783797Fh,096978982h\r
+ dd 08E999B9Ah,064729296h,08C887867h,06E8D8D8Ch,06D605D64h,06C595D6Eh,01B55787Fh,097796044h\r
+ dd 0CDCBCFD2h,0E8E2D7CCh,0BBCEDBF1h,0CEC4CEBAh,0E1E3E3D2h,0ECE0DAE1h,0FAFAFAF8h,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAF9FAFAh,0F1F7FAFAh,0FAFAEBE6h,0FAFAFAFAh,0FAF5FAF8h,0FAFAFAFAh,0F9FAFAFAh\r
+ dd 0A7C8E8EFh,0A4B19EAFh,096BAABA6h,05B98A3A1h,0A3AA9B68h,057558088h,03D405044h,0614C4B41h\r
+ dd 04242495Fh,04A444344h,0AC83644Bh,041336D93h,04A46494Dh,0A4B2A36Dh,079BCB9BCh,0DA863521h\r
+ dd 0CFC4D0CFh,0B3ADB4A5h,0A99590D5h,0566E879Dh,0412F761Dh,07EBD8B55h,0615A5541h,0FAF7E6C9h\r
+ dd 0F8FAFAFAh,097D3E5EEh,0FAF9F8ECh,0FAF9FAFAh,090AFEDD9h,0D7978EB3h,0B7FA8192h,0E4DDE4CAh\r
+ dd 0DFE7ECEEh,0D1BBCADAh,0B7B3ACE1h,08A897679h,0A9B08B96h,09AA9B79Dh,0D06EC0BEh,0CCC7BBDBh\r
+ dd 04DD4D8BCh,02C3E3B3Bh,066683C1Bh,09C7C9A7Dh,0C3C7CFCBh,0C9EDBCBFh,0ADCEB6C1h,06C946F8Ch\r
+ dd 076866661h,0A59D8876h,07D706EA7h,0625C566Ah,07E80867Ch,08B8C847Eh,0768A8B8Ch,0828E8F82h\r
+ dd 0749D8F90h,08B999E75h,077727075h,0748C857Dh,06A65686Fh,07D6A7B81h,0907D6E7Dh,051293254h\r
+ dd 0D3D6D1CFh,0E2E7E5D8h,0EBE5E4EAh,0EEE5EEEFh,0EDE7EDEDh,0F9F3ECF0h,0FAFAFAFAh,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0F4F1F4F9h,0FAFAF7F4h,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh\r
+ dd 0A3C5E1F3h,08E9DADAEh,0CCA6AC92h,0B4B2B2AAh,09A54377Dh,0714D5390h,04F4F4881h,068525150h\r
+ dd 05151506Fh,03F4E514Eh,0AA98624Eh,07099ACADh,0554A3C4Fh,0B6823D39h,01758CEBCh,0D4E3653Dh\r
+ dd 08B81AADAh,0395D7A79h,0293C3938h,0694B461Dh,02E30B676h,04E8C6944h,0594D4641h,0F4EED8C3h\r
+ dd 0F6F7F5F5h,0A2CEE6F2h,0FAF9F8F1h,0E9F3FAFAh,0AA97CDD8h,0A1ABCFB6h,0EB8C45D9h,0E6DCD2D8h\r
+ dd 0F1F4F1E7h,0D6E0DCE3h,0FAF2D5C7h,0BA8172ABh,0AB9287C2h,0C3DDDBC4h,0C762ADB5h,0D4D1C1D9h\r
+ dd 099F1C5CCh,03648513Fh,0575C3A23h,0A882A686h,0B3A6ADAEh,0C4DCACB8h,0879C999Fh,08295989Eh\r
+ dd 08C9D8489h,08B898989h,087918E8Fh,0867A6F73h,090959885h,08B8F9290h,07E8F918Dh,091968683h\r
+ dd 08E8C868Ah,09485A1A3h,076878B90h,091837E7Ah,0676F7C89h,0736B6F6Ch,087898078h,03A61797Ah\r
+ dd 0F1F7F1EEh,0F6F0EEEAh,0EFEEEFFAh,0F7F6F9EBh,0F4EFF4F7h,0F9EFF2F7h,0FAFAFAFAh,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0F5F6F7FAh,0FAF7FAF7h,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0F9F3F9F9h,0FAFAFAFAh\r
+ dd 0BBCACCE5h,07A84A7BCh,0C4BCA395h,0B1B3A8C4h,04860AABBh,0C682423Bh,04E4936B0h,044494D51h\r
+ dd 04E555243h,0464A4846h,083816F4Eh,0B6A48C78h,04E46749Fh,03A46443Eh,0392A3454h,05A8D7C3Ah\r
+ dd 020373A49h,03740342Ah,0605D492Fh,0ADB2AF7Fh,02A4FCC90h,03D4C443Fh,0604F3044h,0EEECE1C7h\r
+ dd 0F5F9F1EEh,0A7B8E5EDh,0FAF5F7EAh,0E9FAFAFAh,0B588B5E0h,07C90B0A5h,0B545B197h,0DACFCEEBh\r
+ dd 0FAF9F5E8h,0E4E8ECF5h,0D5C8DEDDh,0AC8C87CAh,0A4ADA6C3h,0B8C3B3AAh,0BE6EA8AAh,0C6D0C6CDh\r
+ dd 0D6C6C6CFh,04D4A5560h,0644B3C36h,09F879987h,0B0BBB79Bh,0DECBB7A6h,09E8F9DB4h,0A1979D8Ah\r
+ dd 082797393h,077717885h,072877984h,0877F6664h,084828786h,0979C9791h,085989D99h,0988C6F84h\r
+ dd 07581787Ah,07A908D77h,07B79808Ch,06C7D807Bh,085878176h,08B816E74h,080938D86h,06B6A6D7Dh\r
+ dd 0FAFAFAF7h,0FAF8F9F8h,0F1F3F4FAh,0FAFAFAF3h,0F1F6FAFAh,0FAF5EEEEh,0FAFAFAFAh,0F9FAF8F9h\r
+ dd 0F8F3F8F8h,0ECF3F1F9h,0CBC6E0F5h,0FAFAFAF3h,0FAFAFAFAh,0F4FAFAFAh,0E1E7FAF6h,0E7F7F8F9h\r
+ dd 0B7CAC6D6h,0839BA2B3h,0B6B4AC9Ch,0AE9F9DBCh,0ADC6CBC9h,0856A7985h,04F4E3250h,061415452h\r
+ dd 05E6C776Dh,059525053h,0948B726Ch,0BA8F7884h,09C9CB7A0h,050504854h,03F3A2B36h,0403C576Bh\r
+ dd 0666E5C3Fh,090917F68h,0AAA79D93h,0ACB5C5B9h,032649D9Ch,04341333Ah,05837483Fh,0F5F2E2B6h\r
+ dd 0EBF9F8F4h,0B9A5EDE8h,0FAF7F6E8h,0E5F7FAFAh,0A79698D7h,078A29A97h,05D808584h,0AEBBD9AFh\r
+ dd 0EDECE2D1h,0ECEFF3F0h,0E9EFF0E8h,0B5A6ADDDh,0AEC4C6D3h,0B1BFADBBh,0B87998B7h,0D0CFCBBEh\r
+ dd 0C5D7C1C4h,0484C4BB4h,05B4A3F38h,09A9EA27Fh,0ABA29D93h,0D1A0B2A6h,0B59588A9h,0969F8BA2h\r
+ dd 06C7D8979h,06E76887Ah,069788387h,087929362h,0877F6F8Dh,095959388h,082A29A97h,09A9C7A8Bh\r
+ dd 0858F8F6Bh,075808B89h,0787E7586h,06C777D77h,080877E73h,0616D7276h,06A82827Dh,063625F6Ch\r
+ dd 0FAFAFAF9h,0FAF8F6F8h,0FAFAFAF9h,0F3F7FAFAh,0F0F7F9F0h,0FAEFE6E8h,0EAEEFAFAh,0E9EADFE5h\r
+ dd 0EEEBE8EAh,0BFD3DFEBh,0B6948A98h,0FAFAFAF2h,0FAFAFAFAh,0EDF9FAFAh,0E9F1FAE9h,0E2EBE9F9h\r
+ dd 0BED7C7C6h,092AAB4BDh,0BFC7C9A8h,09EA3BCB8h,0C5CBC0C5h,06F7EA0D6h,04A48454Fh,07A4F5C52h\r
+ dd 05D64637Ah,0635A5857h,09B897470h,0B0806B8Dh,0BBA0ACABh,048808D96h,05C422830h,06B5B586Dh\r
+ dd 0E7C8B099h,0A8B7B9BFh,0A59FAB9Dh,0A7A2A4BFh,0357EC0A2h,0324F3F36h,05E3A2F28h,0EFE8D4A4h\r
+ dd 0E0EAF2F1h,0B491DDE5h,0EEEFEEE4h,0CBE5E9ECh,0A1AF99CBh,08AA09199h,093C58E86h,0D0D2E387h\r
+ dd 0DDCABDB3h,0DEE1E4E6h,0DAD8D8D9h,0B1B8D3D6h,0B0C2C4CAh,0ABA8A8B9h,0BD85A5BBh,0BFC3D7BDh\r
+ dd 0CBD3CCD5h,0434867D1h,04A55423Dh,091A7B596h,0A6A5A69Ch,0B8B4BDA4h,0E0BE96ABh,0B0A6ABC9h\r
+ dd 0896F88ABh,06D7B9396h,0766F7893h,087818C75h,08974688Ch,0857E818Bh,06B978788h,09B89857Fh\r
+ dd 07E738980h,07F7B8188h,0777E7A87h,081858074h,08D8E8680h,05360737Dh,0757B7568h,067666372h\r
+ dd 0EDF5F4EEh,0F6F3F2EBh,0F1F8FAFAh,0E2E9F1EBh,0E3E8E8DEh,0F6E8DEDEh,0D5D7FAFAh,0DEE2CED1h\r
+ dd 0ABC1D3D9h,0717A909Ch,0AD77797Ah,0F9FAFAF0h,0FAFAFAFAh,0EDECFAF9h,0C6DCEAF7h,0CFCBD3C9h\r
+ dd 0C1DBCAC5h,096BBBBBDh,0E3CCC1A3h,0C3C2C1C4h,08C9AB3C4h,0927D7891h,04B4E6385h,06F555F50h\r
+ dd 05F6B7270h,05C5D5556h,091767B63h,0AC917883h,09DA4B2AFh,0ABBC9896h,0A3A1ADB2h,08B9DADAFh\r
+ dd 0A2978EA4h,0A4A6AAB6h,08D8A9F96h,0928C9B99h,0B6B3A49Ch,08CB9A5B5h,0A8A29B89h,0F5E8ECD6h\r
+ dd 0ECF7F4F9h,0B79AE7F2h,0DEE9EAE1h,0C1DFE2E0h,09DABB4CFh,0CECEABA2h,0E8CCCFB1h,0CDF19AA4h\r
+ dd 0CAC0D3E3h,0EBEFF2E5h,0E2E1E3E7h,0D7E6EFEBh,0BFCAC6D2h,0ABA9A4BDh,0CD8AB5A9h,0ABA2C9BDh\r
+ dd 0ECC4ECE6h,03C38B7B2h,03C5D443Fh,09198AA91h,09C939498h,078A2B5A3h,0CBB7A699h,0A2A5DAE5h\r
+ dd 0A7927A9Dh,0727B8A95h,0827D837Fh,0938E7B5Dh,0816C6588h,0958E858Ah,0718D9395h,0909D8D8Ch\r
+ dd 06779916Fh,0697C8875h,08767737Bh,079797A78h,08D8D7F79h,06F6F6B74h,073737F7Ch,05C595865h\r
+ dd 0DEE5E6DFh,0EFECE6DFh,0E9EFF4F1h,0C7CDD3E4h,0C7C8C3C1h,0E7DECCC6h,0CAC9EBEFh,0ABB8CBCBh\r
+ dd 070827F93h,07B76776Ah,0D0978376h,0F9F2F6FAh,0FAFAFAF9h,0E3D9EDEBh,0AEBDBFDCh,0AFB2D8BBh\r
+ dd 0B4C9BBB9h,095C3BAB1h,0AEAEA58Fh,0B4B6AEBCh,04C395AA5h,03F454938h,05F716D5Dh,05B5A5554h\r
+ dd 06C7A7B58h,0715D575Dh,0AD92797Eh,098928A91h,07B97AA99h,0A0A69396h,0948698A8h,09A929F91h\r
+ dd 089BF8D91h,07F7498BDh,09B8A928Dh,0AEABABA9h,09FB5B7ACh,043948798h,045263629h,0F0E3DAB0h\r
+ dd 0ECF8ECF3h,0C99EE2E6h,0FAF3F6F0h,0E5EEF8FAh,08F8AB1D2h,0B6B3968Fh,0CAE49E9Ah,0F1A8A0EDh\r
+ dd 0DBE2E2DCh,0DBDBE2DDh,0D3D3D8D9h,0EFF6E8DEh,0ACB9C0D4h,0BEA0A8C3h,0BB90C0A4h,0A57EA196h\r
+ dd 0CFD3ECB7h,0456EE1BFh,03A4A3845h,0989DA44Dh,08E9B959Fh,0B9A2AFB0h,0CBA4AEA7h,09EB3CACDh\r
+ dd 077797E85h,0706F737Ch,08E707457h,076744F7Eh,0908B407Eh,0A59E9379h,0849498A0h,09F9B7C92h\r
+ dd 06D9D968Fh,06E869872h,07E7D7972h,07A726F6Fh,086938078h,068767973h,07A71817Dh,064666370h\r
+ dd 0D4D8D6D2h,0D7D4CFCFh,0BAC7CDD6h,0CFD0D1C5h,0BCBFC0CFh,09C9BA9B3h,06172899Fh,050555B61h\r
+ dd 05F635050h,05550565Dh,0C4776767h,0FAF8EFF6h,0FAFAFAFAh,0C6CBDEF9h,0A1B4B0C0h,0889EAE97h\r
+ dd 0B2CBDDACh,0AAB89893h,0CEC9AE93h,0B6ACB2C7h,0594B6F9Eh,03F3D5260h,04D344139h,051546750h\r
+ dd 068835C45h,04D3D3C4Ch,07D866857h,064828D8Fh,097A38778h,09B8E87A6h,08DC76780h,09B91999Eh\r
+ dd 0B5A5A9BDh,0AFB1AFD3h,0829EBC9Ch,04F9CCA98h,08B88AEA7h,0799172B6h,047402D27h,0F2ECECAEh\r
+ dd 0FAF7E5EEh,0C2B5F4F7h,0F1F8FAFAh,0D3E3F6F8h,09692B9D9h,0BBC3AAABh,0CED2AEB5h,0AE9FECE7h\r
+ dd 0BEC5D9DBh,0C5BEE4DFh,0DCDED5BAh,0D8D6D2D3h,0C8D3D9ECh,0D7D4D5CDh,0898FB2ABh,0B4A1937Bh\r
+ dd 0C4D0B7BAh,055B3E3C1h,03A4A4D57h,0CEBAAD4Ah,0B5C0A4AAh,0B6AEB4BFh,0AAB5C7B9h,0A7ABAFA5h\r
+ dd 0A5A1A5BCh,09A92A1A8h,096969AB1h,09F8FA09Eh,0A4A4A4A8h,09CAD9EA3h,094868F9Fh,097A1A29Eh\r
+ dd 09F9B9993h,09BA3AE99h,09787959Ah,08D87888Ch,0B29F8E7Eh,067687D8Ch,06D71726Eh,0818D6E73h\r
+ dd 0AEB3B7B8h,096A6B4B3h,08A7E718Bh,07B7E7F96h,055575D77h,0524F5051h,03D535154h,05E5A5643h\r
+ dd 04D564F55h,05C45484Bh,0C7846A6Fh,0FAFAEBE9h,0FAFAFAFAh,0C3C7D7F7h,08A989EB3h,093859F8Bh\r
+ dd 0BFBCC4B3h,0BBB1A8AFh,0C4DBB39Bh,0CAD6B3CCh,08B8388ACh,058747989h,05C4A6251h,05F524B65h\r
+ dd 0888C6561h,042454D6Dh,060695C49h,0A3908B6Eh,0ADBA9F97h,0B8B0ACB4h,0B296CFCDh,0B19F858Fh\r
+ dd 0A0A5B1B3h,09EB5B0C1h,08FA7A6A4h,019A4D8B1h,04F1F2523h,081935677h,0443D2A22h,0F6F0E4AAh\r
+ dd 0F7F1EDF4h,0AFB7E8EBh,0F1ECE4DDh,0C3E6F6F8h,09A92B5BEh,0D4C9B0AAh,0DCC5C4D6h,09EE6E0CDh\r
+ dd 0D6D5C8D3h,0DBE3F8DAh,0D0CFCBD6h,0D1CAC7CEh,0CADEDFE1h,0CCBDBCBEh,092929FA8h,08C718483h\r
+ dd 0CBDBADA8h,03CA5C7ACh,0312D2929h,09FB97F22h,0B9993F1Ah,0B8969BBAh,0B2CFC3B1h,0B1A59889h\r
+ dd 09C9D9FAEh,0888C9793h,08EA5A6A5h,0A794829Ah,0A6A2BFBBh,0ABABA1AFh,087718CA1h,0A2A3AD9Fh\r
+ dd 08F87A1A1h,09499AE98h,097846E86h,083858488h,0A39B8978h,061748381h,071586B69h,0656A5B6Ch\r
+ dd 064646A6Fh,0545A6063h,051504A4Dh,0494C4F43h,044454746h,04A494848h,048445349h,05E554743h\r
+ dd 04A4E3948h,045434C49h,0E08B6563h,0FAFAF2F0h,0F3FAFAFAh,0C7D2E7EFh,09F9A9BABh,0A47892ABh\r
+ dd 0B7ABA6C2h,0A18BAFA6h,0C1B19B8Ah,09AC1D6C3h,0889DAC9Dh,08A809FAEh,04195C4A3h,05A585538h\r
+ dd 0916F3853h,03F334985h,0594A4F41h,0A2758675h,0ADBBA3A6h,0AE9A9896h,09BB59A9Ch,0B49C8B99h\r
+ dd 0B0A3A1B6h,09FE5B7BAh,07B8EA1BAh,058BDD48Bh,033413F30h,01F393A1Fh,0403A3B24h,0EFE7DDA2h\r
+ dd 0F1E9EAF0h,090B7DEE1h,0EBE5E9D7h,0D5E3F2F3h,09E9BA69Dh,0C9BAB6A7h,0D4B8AFB5h,0CEC7BBD4h\r
+ dd 0D7E4C29Ch,0D4CDD2C3h,0BAB2BCC6h,0DACFC1CAh,0C0D7E0D3h,0CDBEC5BBh,083ABA7B6h,092A19078h\r
+ dd 0D1D2AD9Ch,0469AC0BAh,03C373C35h,0ABAF5722h,0913A1859h,0C88A90B2h,0D0DCBFB7h,0C0B893A8h\r
+ dd 0B2AE9F9Dh,0848B94A1h,09FA09787h,09C96B1A3h,0A7898B93h,0ACA2ACBCh,08B8E8595h,09EA19094h\r
+ dd 09E989B99h,08F95A59Ah,0858D9183h,07F817776h,07F7F9684h,08071877Fh,08F7C8076h,05F83A195h\r
+ dd 0453F4248h,046444246h,051463A45h,03E3D3E38h,039373B40h,0474D4843h,0494F5241h,067514237h\r
+ dd 0424D4E58h,056464A46h,0F3976F79h,0FAF8EFF3h,0E3FAFAFAh,098B3DBDCh,08296A597h,0AB8D8BA5h\r
+ dd 0ACA1B7A2h,0AA8CBFB4h,0D1C395B1h,0738B93D1h,04362605Dh,08D737B7Dh,0A6BAA598h,054545176h\r
+ dd 088454057h,03D4D72A7h,0483D483Ch,09A6D6D7Eh,0B0B3A7BDh,0C5A39586h,0B7929989h,0AC91A1A9h\r
+ dd 0C8CCA3B4h,09FCDA5C8h,09377909Eh,074B1B2ADh,041252E1Eh,02C313B2Eh,04A453F39h,0F1E8E7ACh\r
+ dd 0F1E9F0F3h,0ACCCDFDEh,0F4F0BB9Eh,0E4ECF9FAh,0AEB1CDE3h,0A99FB49Eh,0B6B6B0BAh,0B7B3B0A3h\r
+ dd 0C1D8B1C9h,0E0AE9988h,0C9CDBFCEh,0ECD9C1B8h,0DEE3D2C9h,0D8CDD7D3h,09F9DBFC7h,07D8C8599h\r
+ dd 0C0C1A692h,05FA8B6A6h,0303B302Dh,0AE882C24h,02B303FB8h,0AFA2C498h,0F9FAE6BEh,0CECD82B8h\r
+ dd 0A1B4B0B3h,09F938F97h,0B3A5A887h,0819DA496h,075717789h,0A89DA690h,07C848E91h,09BAC808Ah\r
+ dd 0999F9E95h,091949D8Ch,07D7A8085h,07C8F7671h,086717D75h,0616B716Ah,0878C7863h,073A0839Dh\r
+ dd 04E493D46h,040464945h,040434244h,03F40393Fh,03C3C3C33h,04041413Eh,052494E47h,059434755h\r
+ dd 04C575C50h,06C565149h,0F8C56D6Fh,0FAFAFAFAh,0DAF9FAFAh,096B6CAD9h,095A9959Fh,09B9085A0h\r
+ dd 0C2B9989Eh,0A8AAC0AFh,0D6AE87B9h,0A6828CCFh,08985799Ch,044484B67h,07D5B484Ah,0635A648Fh\r
+ dd 062535F63h,05274AAB5h,079716760h,08C8B887Ah,0B7A7A2A6h,0CDC4A7A5h,0B3AAA1A8h,0B7A7ABA7h\r
+ dd 092A5A1A4h,0A0ACAFA0h,0A9A8A4A3h,0C5C9B9B8h,05D75A665h,05446534Dh,05E5D7D60h,0F2E7EAB9h\r
+ dd 0F2EAF2F3h,0EDD5D1E5h,0F9F4F8D1h,0DEEFFAF7h,0C2DEEAD6h,0ABA8A9B5h,0A4A0A7BFh,0AC9EA2ABh\r
+ dd 0B3BBCED8h,0D0C2A2D5h,0A7BEDDDCh,0BFBAB7B4h,0C5DAD9CFh,0CCDFCCDBh,09EADB6DAh,092878E93h\r
+ dd 0B4A4948Dh,080A1B0A6h,03941503Eh,0A77E2932h,0362572B5h,0A6C28634h,0DBD2BEC5h,0D6CA9C98h\r
+ dd 0A2A0AEBBh,0AB9699ABh,09596AEA9h,0A6A4ACA9h,08897AAA1h,0A4878C74h,08D805D80h,0A09F9FA2h\r
+ dd 0989DAB9Ch,08F8999A0h,08484898Bh,05B797578h,07E787B77h,06C678491h,08D726B6Bh,0798C9295h\r
+ dd 04D4E4C51h,04B52534Bh,04242474Fh,04D4D4F46h,0514D484Fh,04E4F4749h,057565853h,053545C56h\r
+ dd 055515540h,0695E6563h,0FADA8672h,0FAFAFAFAh,0DCF5F7F9h,0A2BCCCD9h,0B4C4A7A1h,08E92807Bh\r
+ dd 08F8EA192h,099A2B5A4h,0AE9E8B96h,066788898h,0A58A725Ch,08994A5AFh,03E606C70h,04D454D44h\r
+ dd 0354F5352h,04B8E976Ch,057494D39h,07C68413Dh,0B7AFA58Ah,0AFB79092h,0B0A7B38Bh,0BAACA4A8h\r
+ dd 0A6B6ABB6h,092868FA6h,0A79AAC94h,05684A7A0h,08D747440h,046639088h,0615A4842h,0F9F6DB89h\r
+ dd 0F2F6F9FAh,0C6C5E4F6h,0FADCDEABh,0E2F1FAFAh,0BECAE0D5h,0BB9EADCAh,0B1738EBAh,0C3A8A7A4h\r
+ dd 093C9C4CDh,0C4B279DCh,0BAC8DBCDh,0ADA9B5B5h,0C6DCDFD8h,0CEECE3E1h,0998ED0D5h,0ACA29A92h\r
+ dd 0CABC9DA2h,09FB4B8AEh,0404F5652h,0996D2E39h,04044919Dh,0C0883D65h,0B2CED894h,0CCD4C1BEh\r
+ dd 0C0CCCFCDh,0848FA7BDh,0B381877Bh,0B49C89AAh,09893A3B4h,08A86A190h,09E8E7D77h,0A2A39B98h\r
+ dd 0969AA893h,088858F95h,08D979288h,07E8D9382h,08E8D8279h,08C8C9C9Eh,0816E6F7Dh,091918D90h\r
+ dd 04E4B4C46h,04B515351h,05F50444Fh,0736B676Bh,07B80887Ch,0948A8581h,09A986E84h,099949890h\r
+ dd 06D586074h,054483654h,0FAE09567h,0FAFAFAFAh,0D5F7F6F8h,0AEBDC3D0h,0A3C3B8B0h,08B897474h\r
+ dd 09C8E9B8Ah,0857E99ABh,08D8C8E8Fh,079816679h,03F535C5Bh,093836948h,06A819B9Bh,051535268h\r
+ dd 03D424247h,07DC36E3Eh,0554A534Dh,0625C4B52h,0AAB29A6Ah,0B9B09EA2h,0C5B2B3A8h,0BFA69ABEh\r
+ dd 0B9C7B5C9h,0B3B2B5BDh,0BAB0AAA8h,0413B649Ah,0624A4D4Fh,04A394C53h,05D514B4Ah,0F8EBF8ADh\r
+ dd 0EDF9F7F8h,0D1EFF3EAh,0F8EEF796h,0DEF7FAFAh,0CAC6D2CAh,0918C7FA5h,09F725D99h,0DDDFB7A7h\r
+ dd 071D6DDDCh,0CEB96497h,0B9BCC8CDh,0BAB4B6A9h,0C3D8D9D0h,0D8EAE7E1h,0B0AFEAD8h,0A7A4909Ah\r
+ dd 0F0BFA49Ch,0B4BA9FBAh,0445A4546h,0885C3340h,02369A085h,061234F7Ah,0FAE4ED75h,0B0D7DCF1h\r
+ dd 0AAAFAF79h,08293AFC1h,090887A80h,0A1909296h,0A098A6AFh,054616F72h,08A6D674Bh,0ACA2A192h\r
+ dd 09296A698h,09086808Ah,0748D8985h,07B888D7Eh,094867C8Ch,092969B94h,0706F7487h,09A9D99A1h\r
+ dd 05C504935h,07F736462h,0B9A78C8Dh,0C7CAC5B7h,0B1A8ABBBh,0BEBDB8B5h,0E6D9C0BEh,0E6DACACDh\r
+ dd 08BB4BBCBh,04A444D5Dh,0FAE7A462h,0FAFAFAFAh,0C9F8FAFAh,0AAB3B1B9h,085B7B2AFh,0C0C8A283h\r
+ dd 0C2BBB2CAh,0A6A3BDB7h,07971879Ah,04D56727Bh,061685750h,0656B7C67h,09E78466Dh,04D526EA4h\r
+ dd 045393E44h,0A57D4047h,0464E4E69h,05C3C354Ch,093906F5Ch,0ACBEA388h,0B0AEA9A5h,0B4AA8494h\r
+ dd 0B4C0AAC4h,094A9C4BBh,0629EB5A9h,0B77B3E2Fh,04577D7EAh,0494F5A46h,0AEEA8845h,0F7EDEAB1h\r
+ dd 0FAF7F9FAh,0DDE0E3F1h,0FAF1F0AAh,0EBFAFAFAh,0D0EDDCCCh,0A7B5B2B3h,0B9926997h,0CCC8DFBBh\r
+ dd 065D1EBCEh,0DBC36328h,0C0B9D2CCh,0CDC5C6B6h,0D0DAD3E9h,0E6F5E9E8h,0ACB9E1C9h,09FA891B3h\r
+ dd 0C6D0BC9Bh,0B5AA9B90h,03B4E4550h,085513940h,0337C9674h,025319054h,0C5ECC540h,0D1FAD9CAh\r
+ dd 0BEC2B1AAh,07C8FA7B2h,083878581h,0A8999389h,09D8CA1A9h,05F688587h,071656352h,0AD927B82h\r
+ dd 0908E9896h,088827481h,08C86807Ch,0867E8AA3h,0958E898Ah,098A0A198h,082919297h,0949E958Fh\r
+ dd 0B4AFADB0h,0CBC2BDB8h,0E4D8D7D2h,0EAEBF7E4h,0EDE5D5C7h,0E2E0D4DDh,0E0E3ECE6h,0FAECF2E9h\r
+ dd 066E1E7ECh,055586C68h,0F4EFA85Dh,0FAFAFAFAh,09FE0D7EBh,0ABC4B198h,08DBEB3A0h,0A8C1ADA1h\r
+ dd 0B8AB918Fh,09A9B9AA8h,059608A9Bh,04D475465h,06F635450h,0886C8079h,0495563ABh,0839C7D56h\r
+ dd 04A3F4440h,07F434E52h,058959CAFh,04639433Bh,0928A7358h,0B5ADA49Bh,0AD8C6C84h,0BEAF919Dh\r
+ dd 0A6CFA7C9h,0B69AA5A4h,03C5797A1h,0FAFAEC5Bh,0DCFAFAFAh,0833D4A73h,07BF9FAFAh,0ECF4E7A4h\r
+ dd 0E6EAF4EBh,0BCEBF0ECh,0E0CEB9C3h,0D4EED1D7h,0C9DFDDCCh,0A6A6A5AAh,099659B9Eh,066ACAEBCh\r
+ dd 076BBCCB8h,0958D6A3Fh,09AAB8091h,0B6999996h,0D3C7BDC1h,0C9E6EBDDh,0A5A1D0C3h,0A69F8799h\r
+ dd 0B3B1BE8Dh,0AEB0979Bh,04C504175h,082402B3Eh,04580919Bh,0088A8F29h,0B1B55820h,0ADBFC4AFh\r
+ dd 0C1DFC1C7h,07F83A0BEh,0A5918A8Bh,0A29CA89Eh,095969992h,0686B728Ch,07E80625Fh,09D999490h\r
+ dd 0969A9994h,08C88818Ch,074877471h,0987B6D89h,09A86938Dh,0939C9290h,0999CA0A2h,08C999A91h\r
+ dd 0DEE6E5E0h,0F6ECECE5h,0FAFAFAFAh,0E1F7FAFAh,0E8F9FAEDh,0DBD5D3D9h,0EAF6E4E2h,0FAFAFAEEh\r
+ dd 052DFE7EAh,0615D866Bh,0FAF5C27Ah,0FAFAFAFAh,097D0E0EFh,0C4BCABA3h,08FABB1BCh,09EB6BC9Bh\r
+ dd 0B6ADA3A6h,0BDAEA2B7h,05B556397h,04D444B5Eh,073735C56h,08E7B9480h,090B9A1ADh,09B5E3B5Bh\r
+ dd 057533587h,043455258h,087CBDC78h,05850545Dh,0948F7C67h,0A9A4958Eh,0A99797A3h,0AE9E8C9Bh\r
+ dd 0A6BB96A8h,08FA1A2A1h,07D4F5D57h,0FAFAF6E6h,0F9F6FAFAh,0FACBAFEFh,09FF3E0F7h,0C7BCBA90h\r
+ dd 0E5E4D7D3h,0CFE4E5E6h,0B685B8C9h,0D0D6CDD1h,0A8A8AFB5h,08C928588h,0A6798571h,083A6649Ah\r
+ dd 08489896Ah,095857F79h,06F7B739Fh,072866D7Eh,0B8ADBD90h,0DDEBE4D5h,0A9AAC0CAh,0ACB1A09Fh\r
+ dd 0A9BFC799h,0A09A8A8Ah,0424C4463h,070352F3Eh,03F7698A7h,079995238h,0BF520A57h,0CAC1ABD5h\r
+ dd 0A5D1AEABh,08F9AA3A6h,09C95978Bh,09E92A897h,0978E90A5h,081718192h,0827B5F88h,0A88F838Ah\r
+ dd 0879E9AA0h,07B7F8B82h,089907578h,08F988885h,092918E7Ch,09C989D99h,08A92999Ah,08093978Ah\r
+ dd 0F1F9FAF7h,0F9F9F8ECh,0F8F9F8F9h,0CCF4F9F8h,0D7DBE1E6h,0DED4CBCEh,0E5E6DFE0h,0F9F9FAF5h\r
+ dd 065D9E6E8h,07167766Ah,0FAFADB92h,0F3FAFAFAh,0A4C0C7DDh,0A49DA3BAh,09DA6B0A3h,08FB29DA6h\r
+ dd 09CA39680h,070828089h,06B686662h,06C74725Eh,079847665h,09790947Fh,09AA2CCADh,07764677Eh\r
+ dd 069646858h,06A6A6E6Ch,0B5DB8051h,0695E7293h,087817C71h,0B18D90A0h,090859592h,0B0B7AA9Eh\r
+ dd 0AAA4A7C7h,04087B6BAh,0FAB35F51h,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAF8h,0B3FAFAFAh,0F9EAD68Bh\r
+ dd 0E7E7F2F9h,0DBDCDCE3h,0A382CBD4h,0E4E4CEC0h,0DDDBD8D6h,0AF9FBDDCh,0848195A1h,0AD8F81A8h\r
+ dd 09AB5D8C1h,06C709099h,073735369h,077737671h,0AAB6CCB1h,0E9E0C3B3h,0C8B0C7E4h,0ACBCA6B8h\r
+ dd 094BBC09Eh,093948F7Fh,0444F4766h,075323A42h,05784A7AFh,06A84323Ah,0851C3F73h,0B2CBD1F5h\r
+ dd 093B38E8Bh,0898FA29Fh,0878A9091h,09B8A8B8Ch,08C92A593h,087939396h,07F7D807Bh,07B989687h\r
+ dd 0949C8B85h,07C82A1A0h,0828A6A6Ah,0798A9689h,087787C85h,0948E978Fh,08C939899h,08C989384h\r
+ dd 0D5D7DCDDh,0D7D2D3D4h,0D5E1D7DDh,0E4EAE3E7h,0C2CFDEF0h,0CFC8C6C2h,0D5D7C3CCh,0EEE9D5D8h\r
+ dd 064D8E7E9h,08192A484h,0FAFAE499h,0E1F9FAFAh,08BB0C4D2h,0B4B9A49Ch,0A49AB4B5h,0A6AD8D9Ah\r
+ dd 0969DA8A0h,073808D9Bh,0625C535Fh,0BBA37054h,0818B9BBAh,071776C78h,06D687070h,0496C5F68h\r
+ dd 03B3C4448h,05A383536h,0AD533D4Ch,05A769DB5h,064565A5Bh,064676B6Eh,07F7A6765h,0A29C938Dh\r
+ dd 0A1A3AEA8h,043476F9Fh,0FAFAE582h,0FAFAFAF5h,0FAFAFAFAh,0FAFAF3FAh,0A0F5FAFAh,0FAF1D677h\r
+ dd 0F7F6F9FAh,0F1F2F4F8h,0A2C0E2E3h,0E5DBC6C1h,0E2E3F2E5h,0ACD1E6DFh,0898F8CA9h,0B3C38CA7h\r
+ dd 0A39B9285h,07B696C87h,0796F7F71h,057A890A7h,0BCBFA5A7h,0EAD4CCB8h,0DCCBD7F2h,0A1ACABC0h\r
+ dd 080ACABA0h,0B6AAA87Dh,04038388Dh,0732B3032h,0657A8687h,099672C30h,02E357EB1h,0A6BBD5A6h\r
+ dd 07E92839Bh,0908C8B8Ch,091949397h,0A399A6A7h,08F8C9498h,066738994h,0A191786Ch,09392989Ah\r
+ dd 0979F9689h,07C868D8Eh,0806D8D88h,0656E7B88h,0827A816Ah,0918F8781h,08D92928Eh,07E828585h\r
+ dd 0DEDFE7CCh,0EAE9E7E6h,0ECD7F9FAh,0FAF9FAFAh,0D5F0F6FAh,0CDCCDED0h,0DDDCBAD6h,0F4D0DFE2h\r
+ dd 032CDF0FAh,05B49996Bh,0FAF9E7A4h,0CCE9F9FAh,092B5B8DDh,09195A09Dh,0A78EB3A0h,08E99ACA9h\r
+ dd 08E9EA6A6h,081668A92h,0636B6563h,0818F906Ch,03E2F474Dh,06A4C3747h,04C697D7Dh,066685E4Ch\r
+ dd 0382F432Dh,0473B3F41h,0524B4C4Ch,09CCA926Ah,0534F5D7Fh,05F69464Ah,082686052h,09889A19Ch\r
+ dd 0ABAED4A9h,079454E76h,0FAFAFAF8h,0FAFAFAFAh,0FAFAFAFAh,0EDECD5E4h,070C8E1E8h,0F9E0BE7Bh\r
+ dd 0FAFAFAF8h,0F1FAFAFAh,0C0D8F5EFh,0CFE8F2DFh,0F4FAFADAh,0D6CDD9EDh,089948EAAh,0D5C08A9Ah\r
+ dd 079727E7Ch,07C6B6B6Eh,0BDB6988Dh,08C87A987h,0A2928080h,0DBCBAEA2h,0C3DDEEE8h,09BB4B5B9h\r
+ dd 079AE9A98h,090AC9997h,047374498h,072243834h,06284775Bh,0AF3F2F37h,0377E999Eh,080A1632Ch\r
+ dd 0758B827Fh,09D946A7Eh,0877B8585h,092A19CA8h,0A87B91A4h,072747D82h,07877677Bh,0B2BB887Dh\r
+ dd 0BE946E8Bh,079A5A893h,08A9D8B78h,06B7A8687h,06F8E9875h,09D9C877Fh,07C94879Dh,088807E7Ch\r
+ dd 0F8E8ECF9h,0F6EEF2F5h,0DDE7FAFAh,0FAFAFAFAh,0DCEDF9FAh,0DEDAE6E2h,0E9D6B9DBh,0E5DBCFDAh\r
+ dd 034BDF0EEh,067557440h,0FAF9EBB1h,0DDE1F6FAh,092B2ACBCh,0A395A5ABh,09EA6AFA7h,09AB2ADA4h\r
+ dd 08DB5D3C3h,0806B8593h,0575E6666h,08B7C5F4Eh,0F4EBD2BDh,0F6F5F5F6h,0E5DDF4F6h,06C7B9CBBh\r
+ dd 0333B393Fh,046423930h,057414748h,09057595Fh,0404877A7h,04E616962h,07C625241h,0A099888Dh\r
+ dd 059AC9DB1h,0F5AB4448h,0FAFAFAFAh,0BCD1F2F5h,099A7B8AFh,04956849Bh,04E3E3F42h,0F0E9AF5Eh\r
+ dd 0FAFAFAF9h,0FAFAFAFAh,0DBF4EAFAh,0D1C9CCD5h,0F8F4F4D8h,0BBD1E0EBh,0CDA6AFC2h,0C1BD84B6h\r
+ dd 07E738C70h,0A491868Fh,0B09F927Bh,06A999F9Fh,0A4A1A07Bh,0D1C5BBADh,0BFDCE5DEh,0B796B1B9h\r
+ dd 072A8D1B3h,094A0918Dh,0402F3790h,073273631h,077666F83h,0801F272Dh,07799928Fh,08D96293Bh\r
+ dd 089999A9Eh,0A4B79B95h,0907A9394h,08CACAEACh,086899881h,08B9FA378h,0678C917Bh,0949895ABh\r
+ dd 0A07C7FA3h,0889FA38Dh,0919C8D82h,0757A7387h,065827565h,07CA49979h,082878B96h,057584865h\r
+ dd 0FAFAFAFAh,0FAF6FAF4h,0E7D1FAFAh,0FAFAF9FAh,0DFE8FAFAh,0E7E9EDEEh,0CBC1BED9h,0F6DACAC2h\r
+ dd 02862B2F5h,065545428h,0FAF3F5CAh,0BFD9EBF6h,09C9FAEC5h,0A7919FAEh,0BE9DA7ACh,0A79DA1C9h\r
+ dd 074A1C2A2h,07F72727Dh,055525E78h,0F3ED494Ch,0FAF9F8FAh,0FAFAF9FAh,0FAFAFAFAh,0D8FAFAF9h\r
+ dd 03C4D7CD6h,0484D3E34h,04245484Ah,03A415159h,0637D835Bh,044595664h,07B69534Ah,08D808674h\r
+ dd 04067A18Ah,0878B5E4Ah,055484861h,07D6C5856h,0BDAAA485h,0E6E9DED5h,098D9E9E8h,0D2C8C479h\r
+ dd 0F0F4FAF1h,0E5EAEDEDh,0F6E2E2DDh,0ADB1CDE8h,0F8F9F6D1h,0C1D6D3E3h,0C9D7D4B6h,07F828EB2h\r
+ dd 0947B6E6Ah,0A98A798Fh,0A093827Ch,08B968E99h,09A928E96h,0C6BAAE9Ch,0B5D1EAE3h,09C92AAAFh\r
+ dd 0888BBFABh,08B7E99AEh,03C403E8Fh,06332362Fh,0A1768095h,04C142947h,099A78D8Ch,0874C1C6Ch\r
+ dd 09294989Eh,0A2B1918Ch,08D849FA9h,096A09996h,0AE96918Ah,07B587F95h,0A08968B1h,09995877Bh\r
+ dd 094918893h,0959A9F8Eh,0956B7181h,08B767F9Eh,07075797Bh,0859B8275h,092849591h,0547F937Bh\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0E6BEF6FAh,0FAFAF9F6h,0F9FAFAF9h,0DFFAFAFAh,0D7D3AABEh,090B9CADFh\r
+ dd 04C58697Ch,0865A573Ah,0FAF5EED7h,0B9C7D6EAh,0C9A7BAC9h,0BBB9B6C6h,0B1A3B0A9h,09AA7BBB5h\r
+ dd 0829DB1A5h,06A746A7Bh,045525673h,0EDBA4B50h,0FAF9FAFAh,0FAFAF5FAh,0FAF7FAFAh,0F7FAFAFAh\r
+ dd 0A5C0F8FAh,06A415080h,085727470h,05A757D8Bh,09D744A5Dh,0738E8E9Eh,0706F6577h,07B7E9188h\r
+ dd 0908E8B9Dh,056364D6Fh,0DFB49088h,0FAFAEFF0h,0FAF9F9FAh,0FAFAF6F8h,0D3E7F5F9h,0E1CDA792h\r
+ dd 0F6F8FAF1h,0EFF1F2F6h,0EDE4EDE9h,0C7D6DDE8h,0D0C6A4B9h,0E7EDEADEh,0D4CCCACEh,0CDC8D1CBh\r
+ dd 0B0A8A8BCh,0A3B2AC9Bh,08C8B8891h,08B808290h,0A49EA391h,0C5D0D3B8h,0B3CECCD5h,08994A8ACh\r
+ dd 092B1C9AFh,09AA2A38Fh,03F3347A2h,08D413F32h,08E7E9298h,0272C297Ah,0A3A57663h,054215DA3h\r
+ dd 0958D9CAAh,07078788Ah,09881536Fh,0B2B7B8ADh,096A9C2A8h,094A19999h,0677D958Ch,0929EA092h\r
+ dd 07A998482h,08A92967Eh,091A09890h,0737C8F9Eh,05F6C7075h,084909082h,09392958Ah,05358818Fh\r
+ dd 0F8F0FAE8h,0FAF2F7F7h,0D9D7EAF9h,0FAFAEFDFh,0EEECEDFAh,0CBD9EDEAh,0D8CDC1CCh,0514B85B4h\r
+ dd 0815B806Fh,0A7875664h,0FAFAE7C8h,0B6B7CBEEh,0B7A9AA99h,0A88CA8ABh,08893A295h,09C92A1A5h\r
+ dd 08290A392h,0687A8882h,0465F5371h,0F49D7D61h,0F7FAF6FAh,0F9F8F8E8h,0F0F7E4F5h,0FAFAF3EFh\r
+ dd 0FAFAFAFAh,05A67CDF0h,05F5B5745h,04A4F5A5Bh,062445150h,089BBC196h,04142596Dh,07E755F53h\r
+ dd 082B1A274h,0415592A7h,0F89B4A32h,0FAFAF1F5h,0FAFAFAFAh,0FAFAFAFAh,0F9FAFAFAh,0F4E3ADA1h\r
+ dd 0F9F7FAFAh,0FAF9F5F5h,0FAF4F0FAh,0EEF4ECF6h,096BECDEDh,0E8F2E1B3h,0E0E7FAECh,0C9DFC9C8h\r
+ dd 0B3A6C4C1h,091A19584h,0A7AFBE8Ch,0908598ABh,0979DB0A3h,0C7C5D7B8h,0BDD4DEDFh,08FA4C8B7h\r
+ dd 0989AA8A2h,07D8398A0h,04D5C56A5h,082493D3Eh,0767A9A80h,02F4B297Eh,08A949886h,034407CA4h\r
+ dd 0A99DAF7Bh,0ABA4A19Dh,08D9F5684h,09197968Fh,07CA38F97h,0908D9690h,09B898B98h,0819D93A1h\r
+ dd 0859C8D8Ch,0A2A09C7Dh,08F878C8Eh,075838787h,07D757672h,092868085h,089847E7Ah,09393848Ah\r
+ dd 0F0F0F8F5h,0F1DCE5DEh,0DCDBEFE7h,0EFFAEAEFh,0EDE7DCE8h,0BEB3C9DEh,085A3C8CAh,0A5E0AF82h\r
+ dd 097B8BD90h,0D9BFC5A1h,0F6FAFAF0h,091B5CDE9h,09A92847Dh,06D7CA2D3h,06E6A7278h,0888F6D75h\r
+ dd 070757C7Ch,050586257h,03E564953h,0FA54766Bh,0F1F8FAFAh,0EAE8E1D7h,0E7F0F9F2h,0FAFAFAEFh\r
+ dd 0FAFAFAFAh,0D29EF4FAh,03F4F5C92h,053514855h,05C4B616Ah,0ACA3705Ah,0555D6771h,08B7D716Eh\r
+ dd 09BAE99A1h,080B3D0A9h,04825414Ah,0FAFAF7AAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0E1E0AED3h\r
+ dd 0FAFAFAE7h,0FAF9F1F5h,0FAF7F9FAh,0F8FAFAFAh,0D7FAF2F8h,0FAFAFADEh,0F8FAFAFAh,0D9D0CCDAh\r
+ dd 0ACAEBFADh,09FB1A880h,0B79DAC88h,0A08C91B9h,0A4A6A29Bh,0ACA6AAADh,0C5D2F6C1h,0ADAFD9B9h\r
+ dd 08F909791h,088969C9Ah,0565348B2h,0855E3639h,079838F73h,02F3E2C7Bh,0A8CDB683h,02E5C977Ah\r
+ dd 07D877A2Eh,097949B93h,0955B3768h,0B1A98590h,06FA9A5B4h,08DAAA186h,0A4A3A49Ah,0ACAAA8A6h\r
+ dd 07E7C76A6h,099919677h,0AA989689h,09792929Ch,089868D81h,09999938Ch,08E8C8A8Ah,09A958A8Ah\r
+ dd 0FAFAFAFAh,0F2DAE7DDh,0F3F1F9EDh,0F3ECFAFAh,0E3F9FAFAh,0E2D8B9D5h,0584477A8h,06B6B7370h\r
+ dd 0CBEDFAC3h,0C2B29498h,0F8F9FAE6h,07E8ABEE3h,091919392h,0D0867B9Ch,0AAB0ADAEh,0B6B8A2A4h\r
+ dd 0707B81A4h,04C443B3Bh,047555348h,0DC2F9984h,0DAE5FAFAh,0B5BEB8BBh,0F9F4ECC6h,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAB6F5FAh,06179D4FAh,056564555h,069686369h,04F50555Fh,06889836Fh,09A806B6Ah\r
+ dd 0B5B29A92h,0C5C5D1C4h,0365D98C4h,0FAD0543Bh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0ECAEAAF0h\r
+ dd 0FAF6F5DDh,0F8FAF7FAh,0ECE0DEEDh,0E4EAE8F0h,0E2E9E8EEh,0ECF4F7E4h,0F1F2F2F0h,0CBC2DCEFh\r
+ dd 09B95C1E0h,0B6BA9171h,0C9A5ABABh,0999198BFh,09FA9A19Ah,0A8A8A1ADh,0C2CACBB8h,0BEB0D0B2h\r
+ dd 0967D7796h,0C3C3B8ACh,04E4342D8h,07E533437h,0828C836Bh,036304291h,088D0BD88h,03B748D76h\r
+ dd 08B80281Eh,07E8E8C99h,0631E3555h,0BEAE766Fh,09AB4A4B8h,090A2B6A2h,09499A8B4h,0B193A197h\r
+ dd 07E7178AFh,08F7E8578h,093ACA48Eh,09C8D858Dh,08A818C7Eh,07B838E91h,0868C8F89h,0908C8780h\r
+ dd 0F9FAFAFAh,0FAE5EFE1h,0FAFAFAFAh,0FAEEDDF7h,0EDFAFAFAh,06793AFE7h,06159454Eh,0544C4D54h\r
+ dd 073B8DFAAh,0E6CAB068h,0DDF9FAF8h,07E8FB8C4h,09397AEA4h,09976A091h,0ADCBCC98h,0B6ADB7C8h\r
+ dd 05B74A7BCh,055454045h,06A575C4Eh,078479497h,099A7DAFAh,0817A8180h,0F6EAE8C1h,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAABEEFAh,0CEFAFAFAh,0595A5681h,0856C5E64h,051575069h,086795938h,090878384h\r
+ dd 0B1A59E86h,0AEB8ABB3h,0819FA8A3h,083473F3Eh,0FAFAFAE4h,0FAFAFAFAh,0FAFAFAFAh,0CF85C8FAh\r
+ dd 0F5EEE6EFh,0E3F1EDEFh,0D4CAC9DCh,0E6E4D4D7h,0DCD8E5DAh,0E0E2F0E9h,0E4DBD8DAh,0C1D3F0F1h\r
+ dd 0A6BABDB4h,09D9B7C6Fh,0AA9E97A7h,09BA7B69Ch,0A3CAD0A0h,0B5AC9CB5h,0C8C3D7E0h,08CC1D0B0h\r
+ dd 0A68E947Ah,09CB5AAB1h,04D5136A7h,07D4B373Dh,08696866Eh,03E354F92h,096B0B76Bh,0768D7789h\r
+ dd 09F652E58h,06F8F7E92h,0362E384Dh,09E9F866Dh,0AFC0AAA1h,09DA39F8Fh,09CA0ACBBh,0959A9A9Bh\r
+ dd 0897574A2h,0896D6F6Fh,07B949687h,0898B878Fh,086829892h,08992968Dh,09491908Eh,08E8E7C97h\r
+ dd 0F7FAFAFAh,0FAE4E7DFh,0F6FAFAFAh,0F9FAFAEEh,0E1FAF0F9h,0515160ADh,069524357h,0656B5354h\r
+ dd 0AA8BAEA2h,0ECDDE3D7h,0C9F7F9F6h,07E96ABADh,08782928Ch,0739499AEh,0D5937D8Fh,0A09A89B7h\r
+ dd 04266BFB3h,04F41444Eh,08C565D4Ch,0375994A1h,0859BD6D2h,08379786Fh,0D6D6D4C6h,0F9F5F3EAh\r
+ dd 0FAF9FAF7h,0F7B2E9FAh,0F9FAFAFAh,053695ED3h,06256656Ah,03A5B5654h,06F3C2B36h,0A3ABA691h\r
+ dd 0917B8397h,0958F8D94h,087898795h,041363692h,0FAE1904Ch,0FAFAF8F8h,0F8FAF9FAh,0796CCDF2h\r
+ dd 0E8E4C9D5h,0D5D0D7E0h,0B3BBD3E2h,0B7E0DAD0h,0D3DEDBAAh,0CECDD9D9h,0DFD6CDCDh,0D7DBE5EAh\r
+ dd 0B4B9C7D2h,0AB9F9399h,0AAA4A6BBh,0B2BCBCBDh,0A1ABA1A6h,0A0AF9EBAh,0C0B6C6B5h,0A6B3D0B2h\r
+ dd 0B29E798Eh,0A3DAC3BAh,0524E308Ah,09574343Dh,08BA9846Ch,0403C4E7Dh,0A0A7D452h,09C9B9093h\r
+ dd 0722C4C74h,06F8F829Bh,02D3E3D5Fh,0909EA451h,0BBCCC2A6h,095B0BBA7h,09C9AACA2h,0848D9099h\r
+ dd 0767082A9h,0896E6962h,07C7D8B8Dh,073848596h,08C819A94h,07E899490h,08D858081h,0959781B0h\r
+ dd 0FAFAFAFAh,0FAF7E1E2h,0F4FAFAFAh,0FAFAFAF6h,0609AD8F7h,065737463h,0675E6963h,08F696C6Dh\r
+ dd 0E9E5E0AAh,0FADFDFD9h,0B7F8F7EFh,0BEA2A9ADh,09378788Fh,07A8198A1h,09E96748Ah,0A2977C83h\r
+ dd 053628C8Ch,062584F4Ah,0AA6A5563h,066898BAFh,093ABD19Eh,0A9AC997Fh,0DCE9CCC2h,0D4D4F6EEh\r
+ dd 0F2ECE3D4h,0F3D4DAF4h,0F1FAFAFAh,07881A1F9h,0726D787Bh,062655F67h,06D685D5Ah,0C4CF9D6Ah\r
+ dd 08EA39494h,0A5B0AA88h,061757974h,05A6F8161h,099435F4Fh,0FAF9F0F1h,0F5FAFAFAh,0765973DDh\r
+ dd 0EAE3CAA3h,0E1ECF9F7h,0B9D2D5DDh,0C6D8CCC7h,0D9DCDED5h,0E1DCE0DFh,0F6EFECEDh,0EDD4F8FAh\r
+ dd 0B3B1C6D1h,09CA8A7AEh,0A1A0A993h,0BAB4B2ABh,0AFA09FC0h,0899E9FAFh,0AFBC9199h,084A7C5B0h\r
+ dd 0B3B08079h,0AAB3C0B4h,04A5B3A61h,099912C52h,05381958Fh,048443C42h,09AA7C43Bh,0A7B0A3ACh\r
+ dd 0434271B0h,09D8A7E96h,02E3E4973h,094B17A2Dh,09EABA7AEh,0969C9C96h,09497A797h,0AA979A94h\r
+ dd 074849CAFh,077767D77h,0828D939Bh,08F8D949Eh,0807B928Ch,084858582h,079747474h,07C7E8378h\r
+ dd 0ECF9F9F9h,0FAFAFAE9h,0ECF2F9FAh,0F2F9F9FAh,0634E5C98h,088867A7Ah,08D8E928Ch,0D7B99690h\r
+ dd 0FAFAF6E8h,0FAF5F2F6h,0A3DFFAFAh,0F7A4A3A0h,0BCB8B6B7h,0C4CEC7C1h,09BC1BDCEh,091A2A1A4h\r
+ dd 0736472A1h,0706E7069h,097615369h,082AB959Bh,0637DB478h,0908D7670h,0E3EAD9AAh,0DEE6E4D6h\r
+ dd 0FAFAF9F5h,0FAFADCFAh,0DFFAFAFAh,04951BFF4h,055535250h,0585A4D4Dh,044474C52h,05C6A4B5Fh\r
+ dd 09EA09A62h,0B398ABB0h,08DB0BBBEh,0B6B1848Fh,02B3C2970h,0F6EFBD5Dh,0408CD2EAh,05A33403Ah\r
+ dd 0D2D0AA6Dh,0F2EDE7DCh,0D5F6EFEEh,0DCE5D6DBh,0E1DEE0E4h,0F9F0EEE9h,0FAFAFAFAh,0F9D8F4F2h\r
+ dd 0BFCBE2F0h,0AFC6BBADh,0B0B7BDAFh,0B6B5AFA3h,0ABAAAABFh,092A6959Ah,0B8AC8676h,0A0CACDAFh\r
+ dd 0BAAC9888h,0BC9BBB93h,051675155h,0B6A95251h,054485896h,04B515859h,0A2BB9E4Eh,0A5A38F8Ah\r
+ dd 05A5BA1A7h,0B1909A72h,03C424672h,0A7863241h,095979298h,096959192h,09693928Eh,0A49F918Eh\r
+ dd 0AA9E96A0h,0979093A5h,082808A95h,07E79938Ah,076748283h,08B8D8576h,08486898Ah,0817B7A68h\r
+ dd 0F0E3D6D0h,0F7F3F9F8h,0E9DEF0FAh,060B1F6FAh,0878D5946h,0705B5960h,0A88F7B7Ah,0EEECDEC5h\r
+ dd 0FAF9F6F2h,0FAF4F8F7h,0D0C8DDE8h,0CDD1BFBFh,0DEDDE2BEh,0C9C9D0DAh,0908DA2CBh,0A7B2AC99h\r
+ dd 05E517CA8h,05C575255h,06E3D565Ah,07896A2A9h,0619EC44Fh,070604B5Ah,0AFABC59Ch,0D0C1CBB5h\r
+ dd 0F9F4F7EBh,0FAFAD9F5h,0CBF6FAFAh,05438D0FAh,04445474Fh,042505447h,0625C5754h,03A3C4543h\r
+ dd 0C4B55F3Dh,0ACBAC2AAh,099ACAA8Fh,09088967Ch,0396E8F8Bh,04847472Fh,0423B3E3Eh,052424249h\r
+ dd 0DAC37A4Ch,0F5F9F2E8h,0FAFAFAFAh,0F1E9E8F7h,0E7E6E2D6h,0FAF3F8F8h,0F4FAFAFAh,0FADDF2EFh\r
+ dd 0E7EDEFF9h,0CECCC2D1h,09FA19FAFh,095AEB798h,0A4AEA5A3h,085919091h,0C5AB946Fh,07B81AEB6h\r
+ dd 0A8987E73h,0A9A1B29Ah,04347413Ah,046AB5939h,046442C26h,03834323Ch,076AC6F33h,09A92837Fh\r
+ dd 04B5C8881h,0949F7531h,0373A3C6Fh,09834323Ch,091898B88h,07E7F7E8Ch,08E828C7Fh,087BC8685h\r
+ dd 09390978Fh,08C6D798Ch,093859D9Ah,08D87877Dh,08497979Ah,0939D8D7Ch,0979EA19Ch,079776B83h\r
+ dd 0F1EFF9F9h,0F5FAF8F5h,0EBE0F7F0h,0484D9BFAh,065664757h,0645E6056h,0E4CFA083h,0FAF7EBECh\r
+ dd 0F7F8FAFAh,0EBF9FAF7h,0EFF5DBE8h,0EDEDF0F3h,0D2A5B2D6h,0E6CFD9EBh,0B1B2E6E7h,0A5B7C7BFh\r
+ dd 072757D9Bh,052545A4Fh,03E51484Bh,0A29E9F8Bh,083E79437h,0593D3938h,099D6AB9Ch,0CBA3B095h\r
+ dd 0FAECF2E2h,0FAFAD1C7h,0F4B6FAF8h,04432D4FAh,054494342h,064645852h,0515B6674h,052615757h\r
+ dd 07B474845h,0B3A2B9B1h,0AB9099C9h,077748999h,08E8C8868h,051464364h,04D4A4253h,0555B3638h\r
+ dd 0CDA25E47h,0EEE7DEDEh,0F9FAFAFAh,0E5F2F9FAh,0EDE7DFE9h,0FAF4F5F1h,0FAFAFAFAh,0FAD4E9E3h\r
+ dd 0F1F6F3FAh,0A9BDC6D5h,0989FAB96h,071848998h,0A2A89699h,06B7A9590h,0AF9E8D60h,09198D0CAh\r
+ dd 0B2D28879h,083B398A4h,03C585133h,02A3E5B45h,03D353232h,030323B40h,08F913B3Ch,09590898Ch\r
+ dd 04E7A7F89h,08B99352Fh,02B2B2B74h,03D2C2D37h,0958E90A2h,06F837D8Ch,07F8B7968h,0A0ABA275h\r
+ dd 092A58B89h,098738C90h,08195A497h,079867A7Bh,078A29292h,0959F8261h,0979B9E92h,07E82927Fh\r
+ dd 0FAFAFAFAh,0F9F7FAFAh,0D5DFFAF9h,06138539Fh,03B505068h,096806F56h,0F5F0D7C3h,0FAFAFAF9h\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0F6EDFAF8h,0FAFAF9F9h,0F7F8C9FAh,0F3F7F6F9h,0AAC5E7F6h,0A6A7AFADh\r
+ dd 087BEA894h,055585B60h,03B504D55h,08B839C85h,0A5BA3C2Dh,0705D594Dh,0A5B09B9Ah,0CC8BA08Ch\r
+ dd 0D5DAE4CEh,0FAE2E195h,0FAC0C0F4h,05C62B5F6h,069666169h,06F686263h,0434F5E6Ch,064524542h\r
+ dd 02F2E3148h,0ADAC8351h,08E91ABB6h,0776B827Eh,06C8E7880h,062576D5Fh,07B515C6Ah,05C534525h\r
+ dd 0BE614D4Ch,0F1E6CECDh,0F0E7E8EBh,0DDEBF0F2h,0EDDED5D8h,0D9D4D8EAh,0FAF9D9C9h,0E3CFD7E9h\r
+ dd 0EAEBEEEDh,0E1E1F2F2h,097ABC5D1h,08186988Dh,0A888827Ch,0918C90ABh,0BAA3A496h,080B2C6BDh\r
+ dd 0A5CCB78Fh,073A7A5ACh,03E3C4D41h,038393A3Ch,032363A3Bh,038363431h,08E8D3F4Ah,0919C929Eh\r
+ dd 0847F8983h,0B4582440h,029282C70h,0302E202Dh,095939277h,08B8C82A0h,083817E84h,0929C937Bh\r
+ dd 099A3A095h,0837F9E93h,0949E9E93h,083888284h,06F9D9A8Fh,08F9F836Ah,099939690h,08B858F93h\r
+ dd 0FAFAFAFAh,0FAF9FAFAh,084CFFAFAh,05E5C5341h,04C4A4750h,0C8A17B71h,0F4F3DCDEh,0EFF4FAF8h\r
+ dd 0EBEFF6F2h,0FAF8F2EBh,0F1E9FAFAh,0ECF4FAFAh,0FAFAEEFAh,0FAFAF7F7h,0EAE5F0F8h,0B2CDE4EAh\r
+ dd 085B0B5A7h,04F4C5878h,041545454h,082699E53h,0B779324Ah,03C3C6E6Eh,09CAF5A58h,0A287A88Dh\r
+ dd 07C8C9390h,0E5F0D79Fh,0EDFABDD0h,0694AA7F6h,06D695E65h,06C6B696Ah,09288796Dh,0887A7D8Bh\r
+ dd 0616B667Bh,09E857270h,0AEAEAB9Fh,084839D9Fh,076628888h,08D633766h,080A5A19Eh,0516E6F4Fh\r
+ dd 07D6F9772h,0E8EAEBDEh,0EAF6EFECh,0E8F8FAF8h,0E7DEE0EFh,0DFD9D9E1h,0D9D7D9E1h,0E6E6E1D9h\r
+ dd 0FAFAF9FAh,0E8EFFAFAh,0B0C6D1D3h,093A0A99Dh,09F8A8177h,0A9907A94h,0B99980AAh,093A0B5C1h\r
+ dd 08099A19Eh,04BA5A8A0h,03B463747h,03A43403Eh,03A373B3Bh,0413D3D3Dh,0AD974155h,0A2A09899h\r
+ dd 0A0939E82h,093253289h,02F2E306Fh,0362B3433h,0A29D8841h,091928D99h,08E908B90h,0ADB09294h\r
+ dd 08E9A9AA1h,07E758477h,08D829093h,0A28B8686h,060838794h,09A968474h,092909794h,084867A92h\r
+ dd 0FAFAFAFAh,0F6FAFAFAh,04C71BAE7h,0475D5B56h,0535B3C43h,0BFBD9D6Fh,0F0EDCFC0h,0E4F1ECEFh\r
+ dd 0D5D1D8DBh,0FAFAFAE8h,0FAF3FAFAh,0F9FAFAFAh,0FADBEDF3h,0FAFAFAFAh,0CFCCE3F8h,0B6B6A8A1h\r
+ dd 09FB7B8B7h,07E76809Dh,072585F75h,08D987454h,0C5776DA5h,09A8C8FA3h,0CAC3C1B4h,0D4E8C7C8h\r
+ dd 0B6BBCBC4h,0D5EFDED8h,0F0E9EFCDh,06F7283EBh,08F8D786Ch,07A81888Bh,0585F6C74h,06465615Eh\r
+ dd 057656286h,064545761h,0A8886F5Ch,07E98A9BDh,076395D6Dh,0845A659Bh,077A496ACh,059627064h\r
+ dd 04178A696h,0EFE6E095h,0F4F4F1EFh,0EDEBE9ECh,0D9E3E6DCh,0CED0D4D8h,0E1CDC6C6h,0E5DDD9DDh\r
+ dd 0F8E9E3E2h,0EFEDF2F9h,0D4D5D7DFh,0A1A6BBCAh,09C7D879Ah,0CEC8C4C2h,0BFA7B4BEh,0ACA4B2C9h\r
+ dd 08F9AA5B3h,04E8EABBEh,04641496Dh,0484A4947h,044444A4Bh,041424545h,09D8F3C4Bh,0B5A29387h\r
+ dd 09B97A39Ch,052376B96h,03E393A4Fh,041304343h,086773D3Ch,0847E816Ah,07F7D8888h,08C858F88h\r
+ dd 08A84797Ch,0846C7778h,081818F93h,086878682h,091A19D92h,0969B989Fh,07D808F92h,082866E76h\r
+ dd 0CAD5E3EAh,0A9B4C5CCh,05D5169ADh,0707A7564h,0857C7366h,0D7E2D9C0h,0E7E3E7CDh,0DCD9E3E4h\r
+ dd 0D8D0CAC2h,0FAF8F4EAh,0E9E0F6FAh,0FAF9FAFAh,0F7F2F6F7h,0FAFAFAFAh,0C7D1EFFAh,07A8694B1h\r
+ dd 07392838Dh,07669676Fh,05E67645Fh,059783A57h,08A4852CFh,05F5865B1h,0786A5B61h,07D7C8783h\r
+ dd 0AB758E8Dh,0CDD3D6C1h,0F8F8FAF1h,06D683F95h,068737065h,061686E6Ch,05D616262h,07869626Bh\r
+ dd 058626597h,064615858h,066586265h,09EACAB8Bh,04B4C7683h,092706668h,05AB9B5ABh,05C796181h\r
+ dd 0624D4D68h,0DED4974Ah,0EFECE7E4h,0DCDCECF4h,08B9DBAD9h,081858783h,075616D79h,0CCBB9E89h\r
+ dd 0EFDCD5DAh,0ECEAECF5h,0D7D8E0DAh,0ADADBCD6h,0967A899Eh,0C6BBC7BEh,0BAA7B5D6h,0B3B3BFCBh\r
+ dd 06B8692A6h,04B809094h,0504D535Ah,04D4A4B4Eh,0524A4E4Fh,051505356h,084733369h,0BBA49F99h\r
+ dd 09E9FA3BBh,0354392A9h,03D39381Eh,042426043h,088473149h,076777278h,0757A6F77h,098997A63h\r
+ dd 0868B8881h,063787868h,075646666h,09285817Bh,08C908588h,07E978388h,07E7A7F7Ch,0516E7979h\r
+ dd 0D2F1E5F0h,0C6A7735Fh,064646E9Dh,05F5D5A67h,0AA77665Dh,0E0DED8D1h,0EAF7E7E2h,0D2DED8DFh\r
+ dd 0D9D7D8D4h,0FAF4EBDEh,0E2D3EAFAh,0FAF5E7E8h,0FAFAFAFAh,0FAFAFAFAh,09CB5DBEEh,0777A7672h\r
+ dd 0717E797Ch,05A606069h,0666D6669h,0A8865D72h,067576C94h,0655379B6h,0735D604Ch,07C74866Fh\r
+ dd 0BD958596h,0EEBBDFBFh,0B0FAFAFAh,08B705F4Dh,06F73757Bh,0505B5A5Dh,0675A5B66h,066545553h\r
+ dd 064506387h,05561594Ch,05B5D6759h,0755E5056h,069869786h,07654615Fh,06078BA9Bh,05D6B7469h\r
+ dd 04C50494Ah,0DC934B49h,0E7F2ECDFh,093C5DAE6h,058595A7Bh,0604E4F57h,0554E4D54h,089736B5Fh\r
+ dd 0CEC9AB93h,0EEE9E1D5h,0DADDE2EBh,0B5C8D0D5h,086978FB5h,0B8C1BF98h,0A58B8BC4h,0C5C8C1C7h\r
+ dd 0998C9FBAh,04E3FA979h,0595B4E4Fh,04D465756h,04B494E4Fh,0454C4845h,05A622750h,0A5969789h\r
+ dd 0A4AAAFACh,02A839EA1h,045413745h,051465341h,078333E3Dh,08C96AB91h,08B81887Fh,09B9B897Bh\r
+ dd 0A598876Bh,082829C92h,0A0989591h,08B948B91h,08C909292h,08B877F81h,07A7D7D7Bh,049678B74h\r
+ dd 0D0EDF9ECh,09ECFA775h,068676559h,05F5F616Dh,0CE9D6666h,0E1E8EADFh,0E6E9D3D8h,0F2E9DFE2h\r
+ dd 0E5E0D7DCh,0FAF7F0E9h,0ECF1F0F3h,0EEE4EFF8h,0FAFAFAF3h,0F3FAFAFAh,0A7BAD2D5h,08086898Ch\r
+ dd 06C7A806Fh,053586674h,0586C6B6Fh,06B715D5Fh,059588CAFh,06A457BA5h,06C5E5D67h,06F706973h\r
+ dd 0C2A07C58h,0F7DDC8AFh,061A6F3F4h,0DE77605Ch,063696787h,05B5A686Bh,05466665Eh,05A546066h\r
+ dd 0665F7871h,04D535E62h,050545358h,039404E54h,08C726044h,0947D9AA1h,0544D828Ah,06670897Bh\r
+ dd 047555557h,0C078635Ch,0CEEADFDEh,0525985B7h,0685E554Bh,09C8A7C74h,075829199h,05E545C60h\r
+ dd 0AE937D72h,0F2E9DBC5h,0E1E7EAEDh,0BDD3C6DAh,0809DA3BBh,0ABA18A75h,0A07D65A2h,0DABFCEB2h\r
+ dd 0A5A2A8C3h,04E4282B6h,05B594C4Eh,04E4F525Eh,04F4B4F50h,049534E4Dh,072633042h,09F8F8D8Dh\r
+ dd 0A9B5B3A9h,07097889Bh,04343412Ah,04051653Eh,03E304937h,08A9E8E9Ah,0928C7C70h,086948E88h\r
+ dd 0A2A26D8Eh,095957EA1h,0AA9CA09Eh,0948C8E9Ah,07384868Dh,085798482h,07A808587h,05472827Bh\r
+ dd 0CEEAFAEBh,0466B978Bh,050545B48h,06165746Bh,0D5C29F6Ch,0E2EDF2E3h,0DFD5C9CFh,0E8E7E5E4h\r
+ dd 0FAFAE8D5h,0FAFAFAFAh,0D6E1F4FAh,0E1D9C5CBh,0FAFAF9EBh,0D3F2FAFAh,08D94A6A6h,0848F9EAAh\r
+ dd 05F76877Bh,0687C8073h,0557A9A87h,059547067h,06A5E8183h,0734E7B99h,070676771h,06E6D6272h\r
+ dd 09B7C867Dh,0FAE5B298h,04F52ACEFh,0ED9E5F5Bh,0605869B6h,054525C64h,07A6C6554h,0D6BAA78Fh\r
+ dd 09D9DBBA9h,0A99D8E95h,0678289A7h,039466361h,051423A4Bh,065737460h,0655A3B46h,0777D717Bh\r
+ dd 060797073h,08D888273h,09DAAC8A7h,06E938D91h,0B3A9846Eh,09C9F9BA3h,0909FA49Dh,0AC97989Bh\r
+ dd 07B5E7FADh,0E8DFC9ABh,0EEF3F2E8h,0C6DFD7E4h,0939CA5B6h,0A3B0A690h,0A8A39AA0h,0DAC4B6BDh\r
+ dd 0928E9AB8h,0474B5EB7h,04C554849h,04146464Ah,0433E4343h,03E474341h,08B723646h,08A838B9Ah\r
+ dd 09DB5B4A7h,07BA48F82h,037393B29h,035626838h,028472E36h,07E919078h,093947F65h,083877D88h\r
+ dd 080A45569h,0747E8B99h,07F9E9F85h,0969C948Ah,07C828B93h,08A6F7581h,07C818585h,054837E67h\r
+ dd 0D2E9F5F4h,056547880h,065766463h,07668706Dh,0DEC5C19Ch,0DDE9EDEEh,0E8DFC1CDh,0E9E4EAEBh\r
+ dd 0FAF9EFEEh,0FAFAFAFAh,0C4E9F0F7h,0E2CEAEB3h,0F8FAFAF2h,0AFD8F6F9h,07068798Ch,08C86848Ah\r
+ dd 0687C7F84h,064787566h,0688C9888h,057587570h,056557E5Bh,0624D606Ch,06E655A4Dh,06972615Bh\r
+ dd 06D877772h,0D8B8C59Eh,06A5C658Fh,0E3E28C65h,0775557A0h,085856F6Fh,0BFA3BE94h,0B1B8C6C5h\r
+ dd 0A9A0B9BBh,09F9AA3ABh,08E95899Ah,098A8A398h,051546680h,068627F6Dh,061686863h,0625E7065h\r
+ dd 052586061h,05F565160h,0614C5C50h,0643F4954h,0B49EA79Fh,0A0A9A3A9h,0999C9D9Ah,0AE8D8785h\r
+ dd 0649ED2E9h,0D6B5835Bh,0EFF3E7E4h,0D5DDE9E6h,0798AA4B3h,0A7908779h,0BCA58793h,0AAADB1BCh\r
+ dd 082778596h,04B4B4580h,06E564B4Ch,043656D54h,043404545h,03D45413Fh,0937E2F53h,092858498h\r
+ dd 093B3B09Ch,0849FA98Eh,038353831h,03F8F883Fh,041473132h,094A68D36h,09C96A67Dh,07D7F909Ch\r
+ dd 05F56454Eh,0576A8666h,0968A926Fh,0957F929Ah,0808A9F9Eh,08686817Bh,07B7E7E7Bh,05B7A6464h\r
+ dd 0C2DCE2EAh,064684975h,067747C6Eh,0AC807975h,0D5CECEC8h,0B4C0DBDDh,0C8B5B2BAh,0F8FAE6D7h\r
+ dd 0F8F6E1E4h,0CBE0CFEBh,0A1B1B4BFh,0ECCEC1ABh,0F0F8F4EAh,0A0BDBDD4h,07489A59Ch,0728BA1A1h\r
+ dd 0A7A27964h,0A4897689h,08988A59Dh,094987891h,070707784h,05E807972h,060576C5Dh,091767171h\r
+ dd 0A9818072h,07FBCE8CDh,046586361h,0D8E4BD81h,0645B4664h,089A7A059h,07186AAA0h,0CCB5D1A0h\r
+ dd 0A2D5CEB5h,0716C7477h,0564C6990h,07C706959h,065947B86h,0645D4635h,0615B5C5Fh,052525E48h\r
+ dd 05F5C6860h,054565B76h,0545E5862h,0AA68334Eh,09E9AB9B5h,0B8B2AAA3h,09DB2C399h,0AF9696ABh\r
+ dd 0BDD0C9D2h,0A15A56A7h,0E6E8E1CBh,0D1D9E8FAh,0B7C2DAD8h,0BBB6B5A0h,0BDB6A7BEh,0C5CBBEB6h\r
+ dd 0A0A58ED2h,052685F75h,06B5F5C58h,0626E6E65h,056666566h,0776E5569h,09D8E7679h,0908D8F7Ch\r
+ dd 0818E9D9Bh,0988D8284h,059555644h,083919A4Eh,06A576E51h,0929C5B54h,07978747Dh,03E5F5B6Ch\r
+ dd 07C645443h,0748C8285h,085897784h,098908A8Ah,095969192h,0948F88A5h,0747A6B8Ch,07F7C7C78h\r
+ dd 087A8AB98h,06E8C7556h,095989696h,0D5B4848Ah,0C6C9D3DCh,0989BB0BCh,0A68D929Dh,0EDFAF3CFh\r
+ dd 0BABAD0E8h,0B1ADB6B9h,0B4C8C0B5h,0FAEED6B7h,0E0E7F5FAh,08BB9AAB1h,06E919896h,06F7C8A97h\r
+ dd 087857773h,0717A7D7Dh,08063657Bh,05973666Bh,044444D48h,042434247h,043434945h,076413B3Bh\r
+ dd 0A16C4D50h,03D5188B0h,06748473Dh,073F1D5A5h,0AA5A6948h,08881898Eh,07C7E999Ah,06F749568h\r
+ dd 07892987Bh,06F65686Ah,07B829994h,0726E6770h,06949586Bh,03251828Dh,050615D53h,066665657h\r
+ dd 047566E71h,052645354h,04E5A6761h,0B29C7351h,08A7A93B9h,0C2AE8F86h,09CAFBC9Bh,0A29984A4h\r
+ dd 0C1C8C8B8h,05291C0C5h,0EEC89A7Dh,0DADAE4EAh,0BFB4E0E2h,0D8D3B5AFh,0ADBEA9C9h,0B1CEA49Dh\r
+ dd 07C9D8CAAh,05B5C6468h,04D48555Dh,04E484B44h,04D4B4E4Fh,0396F4133h,05E608752h,07D8B896Ah\r
+ dd 08E84807Dh,09893838Dh,0303E4A39h,056879142h,0543D4531h,071615459h,087905D67h,0646A7079h\r
+ dd 08A776669h,08C8A868Ah,079775685h,094937864h,0989EA19Eh,05A5D729Bh,072756063h,08483807Fh\r
+ dd 07DB4F2F9h,06C687260h,06E5E7379h,0D7CDA779h,0CACBD1E2h,0A1A7BAC6h,0A99B9D96h,0EDFAEFD5h\r
+ dd 0C4A3C7ECh,0D0DAC8CBh,0C4D6D5D5h,0FAFAE4C7h,0E9E2DBF0h,095A6B8D5h,075BCC8B0h,06163758Ch\r
+ dd 085797978h,060757C7Bh,07F576276h,067643F65h,046455058h,058524748h,04F5A585Ah,081564E48h\r
+ dd 09CAA7460h,0554B5074h,0A94E4451h,05793F6CFh,097706B8Dh,0A7A0A29Fh,067688198h,053586445h\r
+ dd 0697B7556h,0716A776Eh,077746F97h,091877E7Bh,0747D9393h,0988D6573h,05E544350h,061605957h\r
+ dd 0666B7271h,0606E6775h,0655A6365h,090959994h,0705A81ADh,08488897Ch,093A09F90h,09D909B99h\r
+ dd 0BAB9B9A2h,0C0C4B1C3h,0B36F4E6Ch,0D5E1E9DBh,08196AACEh,0CAC5A974h,0BBBAAABBh,0BBC0AAB8h\r
+ dd 08E968CACh,04F5F5366h,0554A5153h,055484E4Dh,0464B4F54h,059363D4Ah,08C6B7F93h,071949781h\r
+ dd 093887B7Eh,08B8B7884h,02A374A2Dh,0729C8451h,03A403A39h,03625373Bh,08C87778Dh,063649793h\r
+ dd 09391836Eh,087888C8Fh,08D696471h,08B968B7Fh,09F9EA69Ch,060587B9Ah,080867D78h,08B8A8684h\r
+ dd 0677ADCFAh,08B676465h,077666974h,0DDCBC4A6h,0CFCED3E1h,091AEC0CCh,0BCAC9280h,0F2F9E0DEh\r
+ dd 0B0A2BAD8h,0CCC2AFB1h,0DCE8E0DCh,0F9FAFAECh,0B6C8CCD2h,0A6998EA3h,08494B0C8h,06F646162h\r
+ dd 082737367h,0717E8084h,084537681h,0746D83A2h,052525D59h,05E4D4F55h,04C75A985h,07145434Bh\r
+ dd 05FADAD83h,04C494141h,0D1A8624Ch,06B54B2DCh,0B7646684h,07AAAC8DBh,0585E6570h,06D655C56h\r
+ dd 0859F765Ah,070555857h,06F78789Fh,099919179h,098A0ABACh,07999938Eh,0405D9478h,05D705644h\r
+ dd 056545D5Eh,057696771h,09776545Bh,096A3898Ch,07E738E9Eh,08A959B8Ah,08D988C8Fh,0948E9890h\r
+ dd 09A9E9CA0h,0A897A693h,0807892BDh,0E3E0D8B7h,099B4C0E3h,0C2C2A377h,0B1B0BCB6h,0BBCF9BB3h\r
+ dd 0798A898Fh,056554355h,0615E5550h,0534B555Ah,03C42484Fh,0B5674030h,07788A0ACh,07488888Ah\r
+ dd 0918E7873h,08B7E6E78h,045384935h,080968365h,04A563740h,03E2F3B49h,08880909Bh,088816780h\r
+ dd 08F998A83h,08A89918Ch,07C776A6Bh,08F8D6D7Bh,0A2A2A79Dh,0725E8593h,07F7D8287h,0918F8D8Bh\r
+ dd 04F52A2F8h,08084725Ch,0876F6969h,0D5D8CFB5h,0BBC4D0D1h,074BCB4BDh,0A7AF9078h,0D7E6D8D7h\r
+ dd 0A6B1ACB7h,0C1B4A3A1h,0E7E6CED9h,0F8FAFAF4h,0AED8EBCDh,0A28798ADh,08498B2CBh,089847A82h\r
+ dd 092839985h,08B9D838Dh,06D778078h,05B6D8660h,04D4D4F53h,05256484Dh,02C4AD2AFh,082434C51h\r
+ dd 049559CA5h,0434B403Ah,0DCBFA95Eh,06144739Fh,0A1616F60h,0877CACB5h,073687983h,089918582h\r
+ dd 094948B7Eh,07E807367h,0585B6185h,0A4A4A675h,09E93ABB0h,0A79B94A4h,079918786h,07D73755Eh\r
+ dd 090878D6Ah,06A767C8Eh,07DA69C84h,091968670h,08B9AA193h,0A18B8C93h,0AEB0ADABh,0A5989795h\r
+ dd 0ACB3BAB0h,0C3B09DA2h,05097C6C9h,0D3D4C074h,0CCC0C6D8h,0B8BFB5A5h,0B5B5AAADh,0B8AD98B0h\r
+ dd 06C8490AEh,05D644D64h,0735F5D5Bh,0535D5C66h,031384051h,084979351h,0A7A1ACB7h,099989399h\r
+ dd 088979695h,08E7B7E71h,03E394D40h,0878E946Bh,0747A3847h,05F4C3352h,085848A88h,06A725D4Eh\r
+ dd 0948C8073h,0868B9195h,08070646Eh,09DA77674h,09BA4ACA6h,06E60849Eh,099857586h,0878B8E91h\r
+ dd 06A4C73DCh,06B75766Dh,0C6897177h,0C5C9C3CFh,0ABAAB4C2h,09987A8A7h,090A58F5Ah,0BFC8B7B2h\r
+ dd 0A6B4BAB3h,0C9BCA6A4h,0DCC2BDD4h,0EFF3F5DFh,0C2C4C9CAh,092A1ADB8h,0809FBEC5h,09690848Fh\r
+ dd 0A6909583h,0848B7B9Ah,09DB39E86h,0676B7870h,06F6F7075h,07576726Fh,0716E8989h,0B29E5D60h\r
+ dd 05D657379h,07E4D555Dh,0AFDAD2C7h,084627973h,09E82867Bh,06E73948Dh,0807F6773h,08A8D827Fh\r
+ dd 05B556C6Ch,058545553h,06C70676Ah,0A6967875h,0A192A3AFh,0BAA6A5ADh,09D7EA3A7h,0475B4F95h\r
+ dd 059564A4Bh,0535F5051h,07780AB6Bh,0826D6562h,0617F8880h,08B6A5E60h,0C8C5B29Dh,0A3ACA8AEh\r
+ dd 0AAAFB5ACh,0B6B0999Eh,095C9B6B7h,0D7C55D35h,0CEBFD3C9h,0C0BDAAAFh,0B6B7B0BAh,0BAC4B3BDh\r
+ dd 0A8A9B8B5h,05F684E84h,05A785D50h,054545E57h,07A594C53h,07A92A192h,0867C7880h,08F8E888Ch\r
+ dd 0A3AAA19Ah,0897E8A8Ch,054404C43h,08B818088h,05A5A3E5Ah,027324B67h,055745654h,03C3F423Ch\r
+ dd 0826E363Dh,088858687h,079616978h,09496868Ch,09C9F989Bh,06A6F8D9Bh,081795D5Bh,0797B8083h\r
+ dd 0816964A2h,075626B7Dh,0BEAB8273h,0B3C2C8BDh,08892A9B2h,09B859990h,08397A887h,08C92978Fh\r
+ dd 091948A80h,0AEA29292h,0C7C9C3C4h,0DBD4D3C7h,0B4B8ADD1h,0958B8FA1h,07B809CA5h,0CDD2C4A6h\r
+ dd 07B899FB0h,07A74757Dh,0818F9795h,07A786C7Dh,068686975h,077576568h,0626A6970h,07785645Eh\r
+ dd 04F59524Dh,0D6A45542h,06487B3E7h,04756704Dh,0AF5A5443h,0564D4D72h,065575969h,06D6B5E5Fh\r
+ dd 05B646C60h,067615D60h,06E73746Ch,0878C8A71h,0A4939692h,0C0ADB5B3h,07AAEB9BFh,04878958Dh\r
+ dd 069604B61h,06D505862h,068719CAAh,05C685E5Fh,0636C6965h,098806D62h,0BBACA19Eh,0B1AEA9C7h\r
+ dd 0ACAFAFADh,0B1AD9F9Dh,09EA7A6ABh,0BB5A4EA1h,0C3C1DBCAh,0ABA6A0BBh,0A9ADACACh,0A2B3BDB7h\r
+ dd 0B296818Eh,06C4E80B7h,07A73645Fh,052575E5Eh,0A9AA9A79h,0AAA89C9Eh,07F7A778Dh,08A877A73h\r
+ dd 096A19E98h,08D988783h,06344553Eh,08E808285h,0515F4E6Dh,055574F62h,07B473D7Eh,05B6E5959h\r
+ dd 07C7B5C4Eh,085878581h,0A89FA097h,072737590h,08B9497A0h,0837B808Ch,08B895B5Ch,07B7D7F7Fh\r
+ dd 0847C7380h,07F72727Ah,0C6D7C482h,0A1ACB2CBh,0A7A499ADh,08D8A808Eh,0A0A2A8B1h,093A39F99h\r
+ dd 0A094757Ch,0ABADA4A4h,0BABEC3C0h,0CACACEC6h,09CB6A4CEh,08F82808Bh,06F73AAC5h,0D8E0D7AAh\r
+ dd 0688085ADh,072767171h,088A39890h,0646F6E61h,054545353h,05C5B5354h,04759566Bh,03C55625Eh\r
+ dd 04B543F48h,0C0E7916Ah,05F487295h,0876D745Dh,083507E85h,041515859h,0675C6565h,0726A5C61h\r
+ dd 066735D5Fh,06E67646Ch,0897A706Fh,076777793h,0A298958Fh,0BEA2B0ABh,09BADA9C0h,06691A38Fh\r
+ dd 07263554Ch,0A25F606Eh,0756A7DA3h,0605F596Eh,064666268h,0A8A68D6Ch,0AFA8A29Fh,0B5AFBCC5h\r
+ dd 0ACB0AAB0h,0A3A4A4A1h,095AC95A5h,07B469E9Dh,0B3C1C5C9h,0919DA6BAh,0B1B3A799h,09D97BABAh\r
+ dd 0BEC99EA9h,04768ACB3h,041604A3Fh,088776357h,0ACAAAFA2h,0AEA9A5AAh,08C867389h,07C888682h\r
+ dd 092A3A5A4h,0819D8785h,07E3C4433h,0907E8A95h,050623379h,0233F4D53h,09D896186h,07C8D8245h\r
+ dd 087918266h,08F908C87h,09D999995h,0304DA4A0h,08D9C918Bh,096575885h,08B703069h,076767776h\r
+ dd 05B565550h,0858B7A5Ch,0DBDDE3B1h,0ACC3D8D7h,0878EA4A9h,0A8909893h,0ABA1A2B3h,09BA99EA0h\r
+ dd 0AC9E8285h,0A6A9ADA9h,0BBCDD0C2h,0BDC8D1C9h,0B8AEB2C7h,0B3B0C1BAh,09295C2C7h,0ECE9EFDEh\r
+ dd 0728787B4h,081918276h,0908C8C8Eh,0576D807Fh,054545A5Ah,04F5A5358h,04B485974h,04E4A5052h\r
+ dd 06B6E6560h,076918893h,0685F595Fh,08B856362h,075508895h,06556505Ch,0587B7E7Dh,07C70605Eh\r
+ dd 06C675869h,06C5F6870h,093958D6Ch,08081777Dh,097908980h,0C49D9699h,0969D98ADh,0929E7275h\r
+ dd 0736D453Eh,088986664h,06658714Ch,077685E70h,047525465h,06B8E6264h,09594B5A0h,0A1AE8B7Eh\r
+ dd 0ACA4A798h,08B86909Ch,094A2968Bh,04C6E8E8Dh,0BDC1BD8Fh,088A0B1CBh,0ACA49794h,07E76B1C2h\r
+ dd 0CBC2886Fh,084A6BDC0h,0B1848271h,0BACFD3DDh,0A7B6C1CAh,0A8ABA9A9h,0B08C758Ah,0A5B6B0A5h\r
+ dd 09F9BAFA5h,0749C909Ah,08E4D4637h,0847B8C8Bh,04C892F79h,027404B52h,097574A8Ch,0979F5839h\r
+ dd 08E9E7F85h,0908B8B88h,0A9949C97h,04A46A99Fh,09C95918Eh,08C334595h,07A540E71h,0797C7B7Dh\r
+ dd 0574E5354h,0A8897A67h,0E3E5EADEh,0A9B9D0D9h,0948C98A5h,0918D929Bh,09B94959Ah,0A09C9894h\r
+ dd 0AB96767Ch,0B09AA6A3h,0BACDD0C7h,094B7D1C6h,0D7A7ACAEh,0C084CEEFh,09EA2BACCh,0D7D4E6F2h\r
+ dd 073869AC7h,0768A7F7Dh,0AF91937Ch,05D76A995h,05F5E656Ah,05F685E5Fh,04F4B476Ah,0605B5861h\r
+ dd 0636D645Eh,0656B6570h,065565458h,07970525Eh,061536E78h,065554F58h,054737E81h,063585259h\r
+ dd 063425677h,064615B5Dh,0759CA666h,06E716C82h,0776D6C73h,0BB9A8983h,09AA9A0A6h,09C798B93h\r
+ dd 06A73587Fh,0979A8B5Bh,0838E8E86h,077807E8Ah,0997F7A73h,0AEABA595h,0B59DB1A6h,0859CACA6h\r
+ dd 0ABA3A699h,0C5C1B2ADh,0B0A0A6BFh,092ADAAAEh,0C9CC9D69h,09495B4BDh,0B9A2B59Fh,0A281B7CAh\r
+ dd 0B2A9AE98h,07D8FA2BCh,0B0ACA67Ch,0D7D0D0DCh,0ACE4CBBAh,0ABAAA7A1h,0B59E7D94h,0B5CDCFBBh\r
+ dd 0B29AB0B1h,074A48B90h,09870434Bh,070889E85h,04AA1616Dh,01C3A4260h,0813B5186h,0938C3A27h\r
+ dd 0919E5D7Ch,08D919289h,097979F97h,02F255EA1h,091858262h,08120468Fh,089451974h,079797F85h\r
+ dd 064595A59h,0CFA1867Ch,0E1E9E6E7h,08EA1BECBh,08C888F8Bh,0897F7480h,092A1A397h,0AE9C958Dh\r
+ dd 0BFA16D80h,0B8A6BCBEh,0B7D2D3CAh,0ABADBFC2h,0DE9D9DBAh,0A987BDE8h,09D8CB6C1h,0C5AEC1E0h\r
+ dd 094C7A4A6h,08D8B7971h,0BDA4A8ABh,0525C8797h,05A4C4854h,055575059h,0413A5665h,05443455Ch\r
+ dd 059605C51h,0646B5E67h,05553585Fh,098715C58h,0745E708Ah,07D74727Ah,087898082h,09C958980h\r
+ dd 07B7B798Ah,092908374h,09EB3B39Fh,0A3B1B29Dh,0B4BEC5ABh,0C7A3B8B4h,0A0BEC0CEh,07A6C7D8Ch\r
+ dd 0564A76A8h,05783A950h,04D494740h,044424645h,09A737F65h,09E8D9780h,08F7AA6A6h,086945E7Fh\r
+ dd 0A6AA9FBDh,0B3C8CCC8h,0BDB6B7B9h,0BABFB1CCh,0C592375Eh,0988EC0C6h,0BC9E997Fh,0A4A2BFBBh\r
+ dd 09F8494A3h,09293A8BBh,0B6B6B495h,0BFD6CDDAh,0A5D8CFAEh,09A9BA09Ch,0A49E898Dh,0A6B7C3B1h\r
+ dd 0AFA29BADh,05699AB8Eh,08C8F5445h,06E86937Eh,06452356Dh,020362A6Eh,04E195775h,0836E2C11h\r
+ dd 0A6AD576Dh,08E85848Fh,08C747A83h,021212C86h,095927946h,078195B95h,07D3A1D74h,07375767Ah\r
+ dd 06558544Bh,0DCC59679h,0DFEDF3D6h,08995A6CAh,083717380h,099978C8Fh,08BA1B49Eh,09494888Bh\r
+ dd 0C9AA7B7Fh,0BBAFC2C0h,0BCD6DBD0h,09FA7AFBEh,0E2B2A2ACh,099ACBBD6h,0998AB2ABh,0AEA2B2C8h\r
+ dd 0A6A886AEh,0919A9396h,0DDD3B2A9h,096A4A7CBh,09284828Fh,0848F939Eh,0908A848Ch,098778791h\r
+ dd 090807985h,082836E8Eh,08187817Eh,07EA89A8Ah,0897D7C9Ch,069697484h,062656270h,0787D786Dh\r
+ dd 0A68A6B89h,0BC9A8DABh,0CCC3B4C7h,0D2E1C3B6h,0C1BEBDD1h,0C892C3C5h,077A3B8C6h,072928270h\r
+ dd 074677F8Ah,072A1A16Ch,054575E53h,061584C52h,0785C8C6Bh,09EB27C92h,07181B3A8h,0817E9286h\r
+ dd 0B4A1AEC5h,0BBC3CDD2h,0AFC9B9C2h,0C6BCBCC3h,0A1575CA6h,0909DB0D5h,0B6A89388h,090A5A9ABh\r
+ dd 0A69C988Eh,09E9EA6AFh,0A49CACA6h,08FA7ABA6h,09693887Bh,08D939C98h,097919A9Bh,0979CAD95h\r
+ dd 09FA699A0h,0587FA98Dh,08B9C7364h,084828B8Ch,04F445A79h,02E474259h,05538435Ah,050462022h\r
+ dd 084704350h,08A858285h,090807E8Ch,0524F5777h,08A927F52h,08A458C90h,0845B4A98h,07B7B7A7Fh\r
+ dd 074595B61h,0CCC8A68Eh,0BECADDD5h,0969B9DAFh,086909989h,083928785h,07D838177h,086968889h\r
+ dd 0DAC4978Dh,0C5C4D1CEh,0B7CAD5D3h,0A29AB7CAh,0DEC8B8A9h,0ACB1CEECh,0C0E0D6C9h,0C5C1C7C5h\r
+ dd 0AAC4CBC6h,0A8BAB5B9h,0E0EADBB4h,074B4C8EBh,05C596268h,05B655D64h,0615E6260h,0844D504Ah\r
+ dd 069786777h,08291877Ch,08199887Ch,05B898D80h,076606398h,061646F79h,060655D60h,097776B70h\r
+ dd 077967D8Dh,0B2675C75h,0AEC1BBBCh,0DACC8FC2h,0D0D3CCD3h,0C59DC2C6h,06CB2C6BEh,06D8C9F73h\r
+ dd 05D8A7969h,072716A5Bh,04E4C516Fh,07A614A58h,08C73A171h,0A19C8686h,086B4A4A7h,0ADAC7778h\r
+ dd 0CCA1C4C5h,0B6C1BBC8h,0C4C4AF97h,0B7B5BFBCh,0634A9AB2h,06EA8C0C5h,09E8A8F80h,0ACB3BAB6h\r
+ dd 0B6C0B2A6h,0A6A7A3A5h,0B2ADAAA2h,07BB3B9A3h,07C99B46Dh,09B999886h,09EAC99A2h,0A8AAB89Eh\r
+ dd 0A5BAB5B0h,03B539A9Bh,086917D44h,08D7C8D93h,04B3B3E67h,02120202Fh,04D31635Dh,05A641C29h\r
+ dd 0644A4A5Fh,0826C6A72h,063676B87h,0272A1C37h,08F977127h,048328F83h,050172858h,07673757Bh\r
+ dd 07C7C6E6Ch,0D6D6C8AEh,0C3C3DED7h,0959B93B0h,0AC7E767Dh,0988B7FBCh,09E828AAAh,0B2ABA4A3h\r
+ dd 0DED0B0B2h,0CBC6D2DDh,0BACCD2D2h,08CAECFC4h,0DEB9B9A7h,0AEA5C1DEh,0BDD1D9C9h,0B9B4B7B0h\r
+ dd 0C2C7B3BEh,0D9C29C9Ch,0E8E2E1E3h,084B3BDE0h,06B63534Fh,0585A5C63h,051524A48h,07B45514Fh\r
+ dd 0756A7467h,081827A76h,08C897E7Eh,08D6C8375h,074646197h,0756B6C76h,07F7D7668h,082877979h\r
+ dd 089987995h,097748881h,0B5E8B5D1h,0AF889FCAh,0D8CABAABh,0C9AFDAE1h,081A3BBD5h,08782827Eh\r
+ dd 07DA3875Dh,0504A4A3Ah,04E404948h,0615E4E4Bh,0694A9564h,09F887659h,09F8099AFh,0A699776Bh\r
+ dd 0D0B8A6B4h,06592B4E4h,0A7AC9461h,0A6A2AAABh,041769797h,0AC8EB68Dh,0A9828DB0h,0B9C7ACAFh\r
+ dd 0C3C8B7B3h,0A5AAA0AAh,0BDEED6B0h,0A7A3AEC4h,0A8C2C1A4h,0999B9DA0h,0A6A89EA5h,08AAEBDA9h\r
+ dd 0A0C6C9CAh,035357C95h,096928054h,08192939Eh,03D32556Bh,015322A35h,069626070h,07C6C5C5Bh\r
+ dd 05E514559h,0826C7372h,08E796F8Eh,037404347h,083907722h,031339283h,04D173561h,06A677979h\r
+ dd 0A6866A6Fh,0D7D2D6D1h,0B9B4C9D6h,052969CB0h,04F453120h,0958F8880h,09D93949Ah,09E8E9699h\r
+ dd 0D2CFB9AEh,0B5B4D2DBh,0CFCEC9BEh,09C94AEBCh,0D8CEC297h,0C0B4B6D6h,0C1CDD3C5h,0DFC7C5C3h\r
+ dd 0C4D5CEDCh,0DCDFD8BBh,0DCD9D9D6h,094A5C4CDh,0595A5275h,05F5A635Eh,0515A6160h,0834D6256h\r
+ dd 07B73806Eh,074797377h,0908C8D75h,0AC8D8685h,07467668Ch,0654D4F6Ah,06D6E6C6Ah,0668B7580h\r
+ dd 08B917872h,065798082h,0D7CCA6DCh,0A5C0B8B8h,093858580h,0BCB7B9A8h,0B5B3D2D1h,07A7282BBh\r
+ dd 0808E7067h,05B584E4Dh,062556257h,06E706966h,07D6E8552h,0BD9F9586h,0889F9799h,091998890h\r
+ dd 0B4AC9DA6h,0B4AFA3B1h,0AB9998C9h,09297A5ACh,073A8AD96h,0B9A9A176h,0BCB49EB5h,0D0D8D1C7h\r
+ dd 0DACEC6CDh,0AFB290A8h,0CDCDCAB9h,0D0B4BCBDh,0CFCABCB6h,09BA4A2B4h,0A6A19DA2h,08AC1B59Bh\r
+ dd 0A5C4B7AEh,05829588Ch,086807A95h,08491929Ch,04D35696Fh,01B2D2F4Bh,055526E7Eh,05A5D6257h\r
+ dd 0481D0824h,07F696264h,08E887D8Bh,032545645h,07875612Eh,0283F927Fh,0452A616Fh,06E6C7264h\r
+ dd 0B6895962h,0CFD3D8DAh,0ACA5B7C9h,039A2A0A7h,06624381Fh,0969E95B4h,095979CA0h,0A59C998Fh\r
+ dd 0D6C6A7A7h,0D4C8C9D2h,0CDBCBEC9h,096AAB4C4h,0EBEBD89Dh,0BBB2ADE7h,0D2D6D6CBh,0D8CDD7D8h\r
+ dd 0C5C8D7CFh,0DBCACAD0h,0BCC6C9E6h,09B9B94A6h,0514D6B7Ch,062647272h,04549505Ch,06A304E45h\r
+ dd 08C738060h,07A858D98h,0A9A39882h,0A37C9583h,0454A525Fh,05D504E4Ah,0786D635Fh,0807A7F74h\r
+ dd 0604E4B6Ah,0393F4E4Eh,09FD1AD8Bh,0F7E4E1C8h,0B2CCE0EAh,0928C94A3h,0B4B6C5B1h,0A5808FBAh\r
+ dd 0BCA593A3h,09E839DADh,09194A996h,07D949B9Bh,08DB39EB5h,0C0B0A8ABh,0BC89B5BDh,09BAD929Ch\r
+ dd 0C1AD9AA6h,0BFA8B1C8h,0C3BFCFBEh,0B0BDC8B7h,075ACBAB8h,059654339h,05A524341h,0B8B9F1A8h\r
+ dd 0D3C5CDC3h,0ADAE8FABh,0BCC0D1C7h,0A99B929Dh,0A2CBC894h,0A2968C95h,0978E989Fh,0A2BF838Bh\r
+ dd 08D9B989Dh,06C313C6Ch,07B7F8092h,0778A938Bh,037316B5Bh,02A252437h,060606F70h,069708E78h\r
+ dd 0250D2335h,075696252h,07984797Eh,03076834Bh,07D685626h,04A598583h,0635E8A8Ch,0786D7060h\r
+ dd 0BD945760h,0D6E1E2DDh,09E95A1BFh,06A94A19Ah,065341A44h,0A69B8D98h,096777EAEh,09F948494h\r
+ dd 0D2BEB6B0h,0C1D0B4C0h,0C1BCB7B7h,07DA0ABBEh,0EFEFDEA1h,0C6BCA7ECh,0D0D9E7EAh,0D7DBE4DCh\r
+ dd 0B5CFD7DBh,0D4CAB4A4h,0ABBBC5D4h,0889B9791h,061615294h,06569796Bh,05B585466h,095715156h\r
+ dd 09B838371h,0AAB1AFA8h,0B7BCA7ADh,0B2B2C5ACh,0817D8469h,080717680h,09A908A8Fh,08D979D93h\r
+ dd 084789285h,08E707976h,0BE877F68h,0FAF2E7E2h,0F8FAFAFAh,0ACEDEEF4h,0A284657Dh,0D7C498ADh\r
+ dd 0C8BBD2C8h,092B0E0D7h,09084A08Ah,05C5E7A8Eh,0A68A5062h,0A9AFA3ADh,07278A9B8h,0B2B1756Fh\r
+ dd 0C4CCB3B0h,0E4B5BFC9h,0B7C2C7BAh,0ADC1C5ACh,084ABCBB8h,06E3C2439h,0997A75A3h,0B2CAE095h\r
+ dd 0CFC2B4ABh,08E908AAEh,088878885h,08A817E93h,09197A08Eh,0A48695A4h,0857C919Eh,098826C7Ah\r
+ dd 08FA8917Fh,07A4D365Fh,072726B76h,0767F7E7Eh,030447C66h,043393432h,048585A58h,0727C685Bh\r
+ dd 0080E2934h,07D4E4F34h,06D857F7Dh,03C90862Eh,06B705D23h,067808E7Ah,08A7F7878h,07D6B6E62h\r
+ dd 0C3AE976Bh,0C8D0D7DBh,0A5868FBBh,07D9BA7A6h,086467C73h,09DA0AD9Eh,0B2A498C3h,0BCA9BAB8h\r
+ dd 0C8C0B4ADh,0B2AEBDB6h,0B6CDB6B7h,09A9EB1BCh,0E7DFC8AEh,0B99FBAD9h,0B2BDC6D3h,0C2B1ACB4h\r
+ dd 0BCBDB2B9h,0E6CCA1A4h,0B4A1B0C3h,0A6AFA6A8h,091879F9Fh,088849384h,06C8D5F85h,05A615D6Ch\r
+ dd 04D4C6267h,0887F6962h,082656462h,06F959080h,06B4B5C41h,0807C7776h,0767C7577h,07973676Ch\r
+ dd 06E648D68h,070735F51h,0F6CA8B80h,0FAFAFAFAh,0FAFAFAFAh,0F8FAFAFAh,06984BAD4h,0C7CEC789h\r
+ dd 0B6A3C4C9h,086AFD0BEh,07D898477h,053465489h,096585254h,0B9BAA99Ch,0647088ADh,0BCA58D59h\r
+ dd 0BFBDB8AEh,0B9C4AFCBh,0B6BBCCCFh,0A7A29DBEh,0B7B3B9A8h,0833B3561h,0705D94C3h,0737C868Bh\r
+ dd 0988B7D70h,09BAF94A3h,0B7AAB098h,0A5ACB0BBh,0AAB3B1BFh,0B3A7A6C4h,092A8A2A6h,0A29F9A9Fh\r
+ dd 06A9D9FAEh,09273503Ch,086979089h,0A9AB9B93h,05862938Ah,062556857h,0646A6F80h,05E706762h\r
+ dd 05875764Eh,0888D8432h,075747B77h,047817264h,08D8D6C51h,06A6F9989h,0896E8975h,06B77658Ch\r
+ dd 0C9C3BBA1h,0A7B1BAC8h,07A7B809Ah,07C858F8Ch,0A4849C85h,098A68F96h,0999C9F95h,09C908794h\r
+ dd 0C8A59D96h,0A4A6B6BBh,0BCA19B9Dh,0A890A8BEh,0E2E4CAB1h,0A39BA9D1h,0BECCDEDEh,0A4B4BAB5h\r
+ dd 0A4A8A6ABh,0DFBD9393h,0C09CB6CFh,0B0B7C3D4h,06F76A398h,09B9A646Bh,04D6A7B7Ah,044596058h\r
+ dd 06F898060h,074626A76h,0817A7C96h,05F80A18Eh,0866A5D56h,0818F8074h,085837A7Eh,081706676h\r
+ dd 05D578173h,06B68615Eh,0F7FAD066h,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0BDE1DEF1h,0C7A97B88h\r
+ dd 0A2C9CEDBh,080D1E8E1h,07E7E7461h,059595172h,089585F51h,0A19E8085h,0606A9AA3h,0B1A6A97Dh\r
+ dd 0D0C8BEBFh,0C6C9B2D0h,0C3BBBABAh,0ABC0CFC5h,089849C99h,0453B3862h,069403247h,05B676B76h\r
+ dd 05D575F59h,07C876C6Fh,0986E8683h,0B9C1B8C5h,0B2BBB9C7h,0C199A4C6h,081A99CA3h,0AEACA1A1h\r
+ dd 07CA9B2A1h,07E846656h,07E8C8379h,08488837Eh,04B4A7782h,0462A463Ch,0807C6B86h,07298A49Eh\r
+ dd 06A887A2Ch,091854918h,03A466374h,0458C7E48h,0706C4C3Dh,06C758D7Ah,06D718C75h,057615B77h\r
+ dd 0CED6D4C8h,0A5B2BEC8h,07781849Ch,08B828A8Ch,092797892h,09395989Eh,073697E8Dh,08C839892h\r
+ dd 0BC93958Eh,09193C2C8h,06E93A6A2h,0967C88A5h,0DEE6C29Ah,0ADB1A7CFh,097A9D4E0h,09AA5A29Bh\r
+ dd 0807E8481h,0DDB2847Eh,0C4AABDE4h,0B3B7C9C5h,0889CB1A6h,095974B6Fh,04D586E77h,04D4B4153h\r
+ dd 0979F6A34h,0657389A9h,07975687Eh,04D40436Fh,070616061h,086938069h,082807A86h,0667B7873h\r
+ dd 055587169h,0734E6369h,0FAFAF7C3h,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0E9EBEAF5h,07E93CEF1h\r
+ dd 09BE1D586h,0AFE5D3BCh,070815E62h,057755B59h,06688825Fh,0A08E655Ah,09E7F8B95h,0BBA48690h\r
+ dd 0BFBAACBAh,0CCC3C0C5h,0C2D2D0CEh,05E7593B1h,0938D6561h,0A19D9193h,0C2B4AAA5h,0676D616Ah\r
+ dd 06A685A6Ch,084847275h,096839598h,0ABB9B8C3h,0A9BBAFB1h,0BEC1BFA4h,08A8BA7A9h,0A4A9A19Eh\r
+ dd 07B8BA7AEh,0807F7E7Bh,08B929590h,07E909286h,047488589h,0632B363Bh,06F5C696Ah,0799EA4A6h\r
+ dd 06B6B7F35h,06A502837h,030317577h,03D78544Ah,070624438h,08681767Ch,061758A87h,06B61555Ch\r
+ dd 0D4DAD2D0h,096A5B7C2h,07C7E888Eh,0877E8286h,09C8B617Ch,0909E8B96h,087988D86h,0A5B38797h\r
+ dd 0B497949Ch,0BF88D1D7h,080AAC9C2h,09CA4A48Ch,0DCE1BA93h,0A2B5A0D4h,08B92C7DFh,0B9A69096h\r
+ dd 06D758E93h,0C8A68B7Bh,0B8A1BBD5h,09EBBCFBBh,07CA1A5A8h,070795972h,04357567Ah,06A584D4Eh\r
+ dd 071765456h,041463F65h,05B555043h,04C3E3E53h,06D5B4B4Ch,0898A8C81h,0A6948389h,080969187h\r
+ dd 04A61766Fh,0B36E5A60h,0FAFAFADCh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0F7F8FAFAh,0E2FAF1F4h\r
+ dd 0BAA79CABh,0D6E2D0A8h,085866D8Dh,077836E63h,0738A8985h,090818A8Ch,0AFA7A2B8h,0B8A59C9Ch\r
+ dd 0BFB9B0CBh,0B8C9D5B9h,08396BCB7h,0A28F818Ch,0B2C1BFB3h,0A9A9B6C9h,0B9AAB2B1h,066664B75h\r
+ dd 0667EA190h,090827471h,0959EA5A6h,0BDBABCB2h,09DBEB2B7h,0BCABBDA2h,0A0A1A7B5h,09EABA6A3h\r
+ dd 08284838Bh,08F797A81h,073748893h,09CA69978h,04C5BB2B4h,064345450h,06C5D6E5Fh,069B2A4B2h\r
+ dd 073786C35h,07842254Dh,032418B88h,039635E4Eh,07B745A41h,06F7B788Fh,0484E4E5Eh,05A59626Bh\r
+ dd 0D2E0DED5h,097A4B2BFh,0837B9191h,07B7F747Ch,0A98E8E7Dh,092949CA9h,0999C9B8Ch,09CA69586h\r
+ dd 0C1AFA48Ch,0D5DBD4CCh,09075B6C1h,08A6B96A9h,0D8DABEA6h,0848FA8CCh,08C99CDC7h,0A7867A88h\r
+ dd 07B81B2B4h,0D8B7937Eh,0B893B5D9h,0ACC3A6B5h,075AAB592h,03D7F5478h,04F673E94h,07A553D38h\r
+ dd 0483A4B4Eh,0594E5D5Eh,0828A7467h,0546A8678h,067514943h,0AA908D7Fh,0717C7977h,0787C7779h\r
+ dd 05F6E8077h,0D5C67E71h,0FAFAF9E2h,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh\r
+ dd 085AFEFFAh,0C7C5CAA1h,08DA085B8h,06A878E8Dh,04345985Eh,057573A4Bh,0A3866162h,08463605Dh\r
+ dd 07678694Fh,063925483h,0726C4B4Ah,0C5B6A375h,0AAACB4C0h,0B3AFAEAAh,0B3AEB7B6h,0896B447Ch\r
+ dd 06F7A929Fh,088A79F85h,091897A91h,0BABFB5A5h,0BAC0BFB1h,0C8BBC38Ah,0958D8EBFh,09498AD9Ch\r
+ dd 068739188h,09C8F7476h,07867717Ah,075696875h,0483A907Dh,0764A4548h,05A4C5D64h,04F8D8680h\r
+ dd 06F826639h,066472C5Bh,045366A87h,047525E47h,083845053h,0807E8C8Fh,068536480h,06E617073h\r
+ dd 0C2D1D3D0h,0949BB2BAh,08E808F94h,07C838789h,0AAA18B87h,0A7A2B7B3h,091A39998h,0778A7989h\r
+ dd 0D5D4CD7Dh,0E8E1DDD7h,059489BCFh,08B71948Bh,0DCD9C49Dh,093807EBDh,05F70A6B4h,0B0877A9Eh\r
+ dd 0A5B5C3C1h,0C9AA8E85h,0B38CA7D2h,0BCBF9CACh,086A499A6h,091977482h,067737A9Eh,09A967E7Eh\r
+ dd 0928A9DA0h,0B69E9994h,0D2DFE4DCh,0A5B4D3C3h,06D97968Dh,093886185h,08083818Ch,07A75797Dh\r
+ dd 07E7E7C6Eh,0F2E6CA85h,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh\r
+ dd 07FD5FAFAh,09171604Eh,05D625F7Dh,02C575756h,04D3D6637h,052817659h,0A59E7F6Ch,07E69596Fh\r
+ dd 0978E6F6Bh,081667991h,0C1C5ACA5h,0C0BEBABFh,09DA5ACB0h,0AEAEA69Eh,0A6A4AAABh,0818A5D84h\r
+ dd 09291938Eh,0ACA99285h,09896A7A8h,0ADACA5A4h,09BA0A8B5h,0ADAEAFAFh,077818CA7h,08B7C8787h\r
+ dd 0938D9489h,095969CA0h,09785849Ch,0978B86A2h,07A5A9395h,08B6C6470h,05B4D626Eh,05E6C5A5Ch\r
+ dd 0979C7E56h,076406AA2h,07C54549Eh,0565D7188h,0706B5054h,06E7B6B66h,0786F6A62h,085877F64h\r
+ dd 0C9CCC5C0h,0929BB1C4h,0978B9C96h,0898F958Fh,08CABA298h,0A2888F7Fh,06378A09Eh,08A76666Ah\r
+ dd 0ACA7B294h,0BECAC6B7h,09D758FADh,0818E9F9Eh,0BCC3AD93h,0B2A89CB4h,0A8A9C3C3h,0C9CCAF9Dh\r
+ dd 0AEB7C4CBh,0CEB7A190h,0A5AAB4CFh,099A9B2B6h,09BB0AE99h,09CB5A196h,0676F8071h,0A96B6B7Ah\r
+ dd 07070ABC9h,0D2A8836Fh,0ECDCDBE3h,0489DD9D4h,0405E4E41h,06D7A5476h,0435D5841h,069505253h\r
+ dd 0696D8658h,0F1D3E8ACh,0FAFAFAF5h,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh\r
+ dd 0E2EDF7F8h,07F55589Dh,064596088h,0535C5956h,03D447C5Eh,09577A288h,088898294h,0B6676981h\r
+ dd 061535A84h,0EACCA265h,0CCDDD0DBh,0ADAEAAC2h,09FA4A9A7h,0B2B4AAA0h,0B6AAADAFh,0A095468Fh\r
+ dd 07E8F93A1h,06D89BA8Ch,0706C8768h,09790878Ch,089867890h,08D7E7CACh,09798968Dh,088909A92h\r
+ dd 095929597h,09DA49D97h,09793929Dh,0898498A2h,04F46897Ah,07C63423Fh,061485261h,05B8D8B78h\r
+ dd 0536B5637h,04741635Dh,0745B537Ch,0839C9297h,0917E6D65h,08078889Bh,03E444A5Bh,07965504Dh\r
+ dd 0C6C2BFBEh,096A3B3C0h,0947F7D91h,09F9C998Eh,0A1B3BAA3h,0CAD0CCACh,0BB9A9FA9h,0B09EA1B5h\r
+ dd 0C4AFB8AFh,0D0DFE1D9h,0BCB3A7C4h,0909BA2A4h,0CBBBA0ABh,0B59C8BB2h,0B3C5DAD4h,0E8D8AFA4h\r
+ dd 0A59AD1E7h,0D3B48A8Dh,0A199AFC9h,0867F8A9Ah,0B2AAB392h,06BAA8393h,05248494Bh,0924F585Ah\r
+ dd 06164D8F4h,0BB9A6E5Bh,0D6E1D8CFh,05277CFC9h,058754F5Ch,04B678C82h,049646148h,0895C5850h\r
+ dd 0AF75869Fh,0FAF9D9DFh,0FAFAF4FAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAF6F9FAh\r
+ dd 0F2F4F3F5h,04A7CACDFh,063667A53h,0645B5452h,05B5D7148h,083777154h,095927D7Ah,080776C58h\r
+ dd 09B6F5A52h,0F7FAF5D9h,0C3E4E1EFh,0B7B5B0ABh,0ACB2B5B7h,09FA1AAACh,0B1A1A3A0h,0A585589Bh\r
+ dd 071615777h,04853AF8Eh,060536543h,08A9E9B9Ah,06D75727Bh,0917E8A8Dh,09A94998Ah,089878D8Ch\r
+ dd 09E9EA1A9h,0A6A3969Dh,0989D9B90h,09088ADA7h,03F336E90h,0966E443Bh,07689828Dh,04B9A8C86h\r
+ dd 06562593Bh,051486C60h,09A4E467Ch,0789F989Eh,093785843h,070788A94h,070725C4Ch,06C573E45h\r
+ dd 0CCD0D5D5h,0B8B9C1C6h,0A39DA0ADh,0B9C0BFACh,0A5A87D95h,0C4D8D5B7h,0A99E9BC4h,0BBAFAE9Eh\r
+ dd 0D9D8CBC6h,0B9CCD0D5h,0C2B5A7AAh,06F707BC0h,0CAB59D91h,0AFBD89B8h,0ADC2B8B7h,0B5B9CAA2h\r
+ dd 0A8AECDD0h,0A1CB77A8h,08891A7DEh,0A47B8276h,0BCC2CBB0h,06F949EB7h,0485A5C5Ah,06E475668h\r
+ dd 0757FD0E0h,0AA8F7C6Ch,0BCCAC8B7h,06681BDE9h,04F656241h,037718073h,043444641h,0573A3E42h\r
+ dd 0D3B55B91h,0FAFAF2DCh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0FAFAFAFAh,0D7CDF6FAh,0DCD6E3E0h\r
+ dd 0E2DCD9E1h,0A3DDE0E2h,0555A5152h,060635F45h,0424E6A45h,056503E5Fh,076455B65h,060597A81h\r
+ dd 0E3CA8F6Eh,0F7F8F2E4h,0C8CEC8E1h,0A79AA2AEh,0B0ADB8AFh,090A0A4AFh,07E93A597h,0ACC54F8Eh\r
+ dd 05950617Dh,04B5BB097h,07E666955h,05A668BA1h,0646A8073h,07A897181h,0B1B79797h,089828390h\r
+ dd 0A9A994B3h,0979DA794h,0989FADB1h,09D8E9FAAh,04139508Ch,0B38C472Eh,09D98A6A2h,04D9C9897h\r
+ dd 05853664Ch,02A355967h,08F523F4Eh,085A2ABA9h,09E735F44h,05D77878Fh,04E5A834Ch,06650534Eh\r
+ dd 0D3DBE0E1h,0C3BFC1C9h,0ACAAA7C0h,0B2BAC8ABh,0ABBAC2B7h,0CEDBCCC5h,0B49E97C5h,0CAB8BFB4h\r
+ dd 0D8DAD2D3h,0A0BDC4CEh,0CEAFB2AEh,06476B2BBh,09EA27F73h,0BEB697A9h,0B4C6BCBCh,09CA9B1ADh\r
+ dd 0AEBACEC4h,0B7C28F9Fh,087A7B7C8h,0CEA37E81h,0B2C4B6B7h,063789D9Bh,053455B67h,049564C52h\r
+ dd 07A7CDCC2h,08D84736Ch,0CFD0CFC3h,0607DA3DBh,04E607163h,043466176h,040484E4Fh,03D464445h\r
+ dd 0E6CDA436h,0FAFAFAFAh,0FAFAE6FAh,0FAFAFAFAh,0FAFAFAFAh,0E4ECF3FAh,0D4D3E4EAh,0D1D2D0D5h\r
+ dd 0BDBEBEC7h,0CDCFC6BEh,0886A71B3h,0959E9EA3h,07D84988Eh,080898A96h,0AD948F85h,0A0736E87h\r
+ dd 0F9F7E7E1h,0FAFAF8F2h,0B5ABC1E3h,0B0AFB8BDh,0B09E95A4h,09B9B9AAAh,09AA59F9Bh,0B0C35895h\r
+ dd 05D60577Bh,05D7CA87Fh,08B837157h,0847A6F86h,067899566h,08895868Bh,08CB0AE89h,05E618F86h\r
+ dd 0A19A97A5h,0B5AD959Ch,0B1989698h,0756CA3B2h,03844487Bh,090845A2Dh,090868E9Bh,026877E8Bh\r
+ dd 04C5D7540h,028555D50h,082493A59h,08E9CB3ADh,098815E39h,062618B9Ch,057465139h,071604D4Ah\r
+ dd 0D7DDE1E1h,0C0C6CBCEh,0A1A4A2B6h,09DA29C99h,0B7DDCDA7h,0D7E1D9C4h,0BFA5A1D0h,0C6CEC6C8h\r
+ dd 0B4BFD2C6h,0A3AAA9ACh,0BDB2A8A1h,07A95C7C6h,0BBB1857Ah,0BABE9097h,0A0B1AAADh,0BDCEB79Ch\r
+ dd 0A8BAC9B7h,0C29FA0A8h,08FBDD7D4h,0B29A7790h,09D97AD9Eh,08F7E827Fh,03E4C6796h,0544B4A4Ah\r
+ dd 08382B88Fh,0A88A7272h,0B8CBC3C1h,077A2AAD0h,06F828080h,064645667h,07877746Dh,0687F7162h\r
+ dd 0F4C7D08Fh,0FAFAFAFAh,0FAF6DDF9h,0FAFAFAFAh,0FAFAFAFAh,0E1E2E9F9h,0DADDE4E4h,0BFC3C8D5h\r
+ dd 0B2B7B0BAh,0C4CBBAADh,07298C6C6h,0565A5F4Fh,03E47535Ah,057413939h,05A65584Eh,0E5AD715Ch\r
+ dd 0F5EEEEE8h,0F9FAF7F6h,0B6B5C2DAh,0ACA6A6B6h,0989B999Bh,0A59D9C9Ah,0A29F9FA5h,092924694h\r
+ dd 070636A7Bh,06D889D7Fh,0856F726Ah,06A83717Eh,0888C8262h,0687C8F9Dh,088769C61h,05E7E989Bh\r
+ dd 09C939A99h,0919B9599h,0AC9CA195h,05C60A493h,01E2C234Dh,04A5A5334h,058484A42h,011625665h\r
+ dd 050565F32h,042535A54h,07A6B5A6Ah,08DAAA397h,091795334h,0546C848Ch,0616B643Fh,06E5C4E67h\r
+ dd 0D2D8DBDBh,0C7CBD0D2h,0929499B7h,098A79793h,0D0E1B79Fh,0C9DCDED7h,0CBC3A8CAh,0C1C2C9CEh\r
+ dd 0A7B1BFC1h,090A3A1A2h,0CBD2B99Fh,08997B5C5h,0B6B1917Fh,0C5C29288h,0BBCDC9CFh,0CACAC4ACh\r
+ dd 0ACB9CABDh,0C3CDB2B8h,0A0A4B3B5h,0A7A79BAAh,0AD91A99Bh,0B3A8A193h,0AAAEA0B3h,0848D9DA5h\r
+ dd 0979D9E84h,0A6A7AA9Bh,0B7AFBAA8h,098DBBDC7h,082939895h,086887A85h,08C919592h,07B879384h\r
+ dd 0FAD8A2C6h,0C8DCF9FAh,0DADBD1CCh,0FAFAFAEAh,0DDE7F8FAh,0C1CECFD6h,0C2BEADB4h,0B1B1B9C1h\r
+ dd 0B4B1B0ADh,0C0B8B9B5h,097D0B1CAh,0675A4542h,05B5C5D5Bh,04833474Dh,058564C3Dh,0FAEEC988h\r
+ dd 0F9F9FAFAh,0FAFAFAFAh,0BBC2CAE2h,09C97A0AEh,09AA19B98h,0ABADAC9Fh,0A7ABA5A9h,0ABA43EADh\r
+ dd 0A18B8D9Ch,0969C9C93h,0A9979A92h,0989A94A9h,09CA7929Ah,0A0989EA0h,08A8CA297h,08B918C84h\r
+ dd 08A8A898Dh,094928E88h,0A3A3A1A2h,0A494A89Dh,0564A5057h,08A8D9D9Ah,09F9E918Eh,05D96A5AEh\r
+ dd 0A0AAAD75h,0577F97A2h,0857F774Dh,09382818Bh,079735958h,07C848376h,07F77677Ah,08C8E8E84h\r
+ dd 0D8D2D1D4h,0C8CACED5h,08D9392B8h,0868C8585h,0D2BEAF8Ch,0B7C0C6DAh,0C2BCB3B1h,0B5BCC4BFh\r
+ dd 0AAB0B6BAh,0A8979995h,0C7C2C1BEh,0A2A8BEC1h,0C4BFB0AFh,0BABCADB8h,0B9A6AABCh,0CABEB8B2h\r
+ dd 0B7B8C1D2h,0C8ACABB2h,0BFBDD2CFh,0BCC2A9BEh,0C3B6BAA8h,09BA1A697h,06E94B19Bh,0A2AA875Ah\r
+ dd 08D8A828Dh,06C7A8C84h,0928CA07Eh,06A6E8889h,05865836Ch,08F93867Ah,0A37F5A8Dh,0C4ADA7A9h\r
+ dd 0FAE6BDA1h,0D4CFE7FAh,0D1C5C8C4h,0FAFAF8D4h,0EBD8D7FAh,0A8BED8EAh,0C1BE9A99h,0B2BCB3BBh\r
+ dd 0AEAEA6A9h,0AFACACACh,0C8ACB9B6h,06C4C3974h,05E6D667Eh,07A4F6748h,08D818879h,0FAFAFAE9h\r
+ dd 0FAFAFAFAh,0F9FAFAFAh,0ABBED1E2h,0999FABA9h,09C9FA196h,0B0B2B2A4h,0A2ACAAB4h,0888D43BCh\r
+ dd 061848496h,0616C5C5Eh,08971636Eh,0A7B18DA8h,0A3A6B0A7h,089899EADh,093988272h,09FA89990h\r
+ dd 086918896h,0A8A48D88h,0A2B4BDA8h,0799D96A8h,055112135h,0A9A6A496h,0677C8D98h,037565B4Ah\r
+ dd 01D63401Fh,02D2D152Bh,05B726C1Dh,08575706Ah,06554345Ah,059676A6Ch,065565B5Ah,06D81795Dh\r
+ dd 0DFD8D6D9h,0DADEDFE2h,0A3A7A5CBh,0A7A39597h,0DCD4CBAFh,0B0C2C5D4h,0AD9FA29Dh,0C2BBB6B1h\r
+ dd 0B1B0B7BAh,0A7AFB4A6h,0CEDAB2A2h,0B6ACC0CEh,0C1D3C8BBh,0AFB1A1B3h,0A7A49FB7h,0A9AFB2B4h\r
+ dd 09DC0C1C3h,0CFBFAC84h,0B5B6C8CEh,0B9A2AAB1h,0AEA7B4ABh,0B3A2B6A8h,0727EACADh,0AFA57960h\r
+ dd 08287AEB0h,04A65716Ah,070686557h,06B605967h,06E6A806Dh,09B9A7E81h,08C76A196h,0A9E4A4B2h\r
+ dd 0F8F1E7AAh,0BCE2ECECh,0C6B3C1ABh,0FAFAEED7h,0E5DFDFEEh,09EAFBFD4h,0B3AB9A94h,0AFB2B1B2h\r
+ dd 0B1B3B3AFh,0B49D9DA7h,0B2ADB3B9h,05A3F84B2h,03844585Fh,0794E4E42h,0E99F7471h,0FAFAFAEEh\r
+ dd 0F0F7FAFAh,0EFF9E0E8h,0BAC0D6DFh,0ABADABB1h,0A5A1A1A5h,0B0B0B4AFh,0A6BBADB4h,0928651C3h\r
+ dd 07EA2B2A0h,0696C6E91h,09B62716Dh,0B0B89EB3h,0ACB6B4AAh,0BAB3B3B1h,09E978B7Dh,0A7A6B4A8h\r
+ dd 09AA09AA8h,0A0A8A7A4h,0ACA8B3A3h,050ADABAFh,07C3D2A3Dh,083969F90h,08CA7AE8Ah,0909D6E7Fh\r
+ dd 04D7D4762h,070A37F7Ah,06E6F934Dh,08A6F696Bh,0645B394Bh,06B7D7570h,05C44556Ah,074887657h\r
+ dd 0D8D3D3D3h,0D3D2D2D6h,09AA7AFC7h,09191898Ch,0D2D3C294h,097ADBBC8h,08872878Ah,0B6999E91h\r
+ dd 0C3C1B3ACh,0A696A3A8h,0D4D6C4B6h,0C4B0C6D3h,0C7D4D1BDh,0959497C1h,0788F89A3h,0C0C1AD99h\r
+ dd 09CA7BAC9h,0C9D2B999h,0B8C0CBD9h,0ADA2A6AFh,0A8AAAEAEh,08694ABACh,06E6CAD99h,0A3B19267h\r
+ dd 0A9B2C8A8h,04E515D70h,06971727Ch,061696158h,0625D6A61h,08EA5A189h,0A890B987h,09ED5C7A7h\r
+ dd 0E8F4FAE4h,0ADCEE4EDh,0B6AEC39Eh,0FAFAEFE5h,0CBD1DFEAh,0AFB6B8BFh,0B7B3AAAAh,0BABCAFB5h\r
+ dd 0B6B7B7B6h,0B4ACAEB3h,08EACB1B5h,03C86B2A6h,04C4D5428h,0525B3A46h,0D7DAB365h,0FAFAFAEBh\r
+ dd 0CFDCF0F4h,0CCE5CCC7h,0A59AAFC4h,0A69E9295h,0A7A29BA0h,08A8D96A0h,096998F8Ah,0C67B72BBh\r
+ dd 09BA796B2h,07B847CA8h,0986D636Fh,0A9B1A7A8h,09FA5AAABh,0B6B2B0AAh,09D939080h,0AD9F9798h\r
+ dd 09D93969Eh,0999FAAA7h,09E95A2A8h,0366BAD99h,09070315Bh,06A6D8B89h,0647D7F78h,075626F5Eh\r
+ dd 052785C63h,066846668h,05E909A30h,07F545E64h,06040345Dh,05F757172h,04D4E5C5Ch,07A8F774Dh\r
+ dd 0D1CECED0h,0DAD6D3D3h,09DA5AED2h,09D9B9294h,0DAE1C6A2h,0A3A9BECBh,0886E889Fh,0B1AA9A94h\r
+ dd 0D6C9B9AEh,0BCB0C5C7h,0CFD3D5D4h,0ABBACBD4h,0C7DFD6C1h,0B5A49EC1h,078818DB2h,0CAD0BD9Dh\r
+ dd 09EBDBB9Fh,0C9D3B8A0h,0ACBCBBDAh,0A7ABA49Eh,0ABB9ADA7h,0B3A28BA4h,0697BA2BEh,0A1A5614Ah\r
+ dd 0857B9B7Fh,0594E4F5Bh,0716E8490h,054667363h,07052605Dh,0C6BA958Ah,0ACAF9BB4h,09C7BBBB6h\r
+ dd 0D7F1FAFAh,09EABCBE6h,0929FC4A2h,0EBFAF4D3h,0B2B9C7D1h,0B8B3B8B7h,0ADADAFB7h,09297A4AAh\r
+ dd 09D978E8Dh,0B0A49E9Eh,09CB1B2B1h,07FB5A28Ah,086785145h,09E7D6E6Ch,0DDDCF5D8h,0FAFAFAFAh\r
+ dd 0D1D9E8EEh,0CBEFD6CAh,0B0B3BEC6h,0ACA69FADh,0B3B6B5AEh,0A6ADA7A8h,0B3ABB6A6h,0BF668CAAh\r
+ dd 0939B799Eh,08E8C638Bh,076896578h,09EBDA79Bh,098939EA9h,08D9BB0ABh,090909C7Ah,093948A9Ah\r
+ dd 0A2889698h,09C999A9Ch,09DA499A9h,0583B9D9Bh,08D9A6961h,0608A9C87h,0A98A9282h,0717294A6h\r
+ dd 0677B735Fh,06F8E7772h,060625709h,03812203Eh,06D462D47h,05A717379h,04D575E5Dh,07F8F7552h\r
+ dd 0D6D1CFCFh,0CFCFD0D3h,0809AB0C5h,09C90806Dh,0D4E4D2B3h,09EA2AEBAh,07E657B96h,0A4BD9391h\r
+ dd 0D6C2A8A1h,0C9BFCACBh,0C0D3C0BEh,0C9C4C8C8h,0D2D0D8D7h,0C2B3B7D3h,0746E84AFh,0C1CCB08Bh\r
+ dd 09D9DA6AEh,0C9CBA9AAh,0B2BCBDC3h,0B199ADA3h,09DBBB1A5h,0A09F8FADh,07D7EABAAh,0AD8E696Dh\r
+ dd 093778580h,07C6F6876h,0807A908Dh,06D727785h,06F6C7973h,06D797A83h,0838F7686h,0E7B5A5D2h\r
+ dd 0DDF8FAFAh,097B7E0D8h,09F9DC2AEh,0E7F4F3D5h,0998792C3h,0C2C2AA9Dh,0B9B2C0C1h,0BDBDB9BAh\r
+ dd 0BBBEC2BDh,09BACB2B9h,0A1A9A69Eh,0B1AFAEA4h,04A612D5Eh,0BE695242h,0EDC6DBD2h,0F7FAFAFAh\r
+ dd 0CCC8D8F0h,0B4D2B7B9h,0ABBBBFC5h,0ACA7A8AAh,0A3ABB2B4h,0A8ABA19Eh,0B09CB7A7h,0844D969Bh\r
+ dd 08D837E75h,07C7D5F7Ah,07B787366h,079898B99h,085807471h,073869B93h,0757B876Eh,081787E6Eh\r
+ dd 08D7E8583h,0A1A2978Ah,088B2ACAAh,05F2E3C76h,0777E6555h,08290A594h,07C987D91h,08B978987h\r
+ dd 07D808277h,07492947Fh,03E877624h,06B6B371Fh,078836568h,0757F7A7Dh,058575C76h,08086715Ah\r
+ dd 0D2D4C7BDh,0C8D0D8D3h,07C8483B9h,0A286767Dh,0C3D0D3CDh,09E9CA7B3h,08F7BA5A4h,0A1B3AAA2h\r
+ dd 0B9B1969Ah,0B7B8B7B9h,0C2B5B0B1h,0C2BDBBBFh,0BDA6C8C2h,0B6B4BFCDh,0817B86A6h,0AFBAC9BEh\r
+ dd 0B1A5999Fh,0B9C0B4BAh,0A9ADB7AFh,0C7B0AEAFh,0B09CA2A6h,0A4A0ACADh,09D988599h,077718CA3h\r
+ dd 0AC999191h,088979294h,086868E77h,08E947575h,054829294h,062686B6Ah,0AD5F6154h,0FAF4C8D2h\r
+ dd 0F7FAFAFAh,0A8D2EAE3h,0DBD8C0A6h,0BCCDCCCFh,0796281A7h,0ABB6AB93h,0B4B4AEA4h,0B4B6B4B4h\r
+ dd 0A4AAB0B3h,0A79F9EA2h,0AEAEADA9h,0A2929AA8h,0324A5697h,0DBD86C34h,0F2D6D4B9h,0E8F7FAFAh\r
+ dd 0B8A2A9D3h,0A4C5B4B3h,0B2BFCAB6h,0AFA9A4A7h,0A3AEB3B2h,09EA39E99h,0A79E9D9Ch,0997C87A2h\r
+ dd 0B4A8A699h,08B86A7ADh,0959C9978h,0A78F9396h,0877380A0h,08C8D8C8Dh,06F747E8Dh,078678586h\r
+ dd 07C82798Fh,09796958Ah,0A2ABAEA8h,03446506Ch,0737B7433h,0706F6F6Ch,0857B6970h,06A61777Ch\r
+ dd 06C68747Dh,08C90806Ch,03EA09345h,06B8E766Ah,062705C80h,0777C6467h,068625F65h,0736F735Fh\r
+ dd 0BEC2BDB7h,0B4BAC2C1h,0878D92A8h,0B2969283h,0B8C5CCCAh,096979DACh,0908B9798h,0A3A59F90h\r
+ dd 0A0A19FA9h,09A95979Ch,0A29C9A9Ah,0ADAFA7A4h,0B0A8B8B4h,0AEABAEB6h,0A596A8AFh,09DA5B2AFh\r
+ dd 09EA3A9AAh,0C8C7A6A2h,0B9B9C4C9h,0C7C8C6B6h,0A7ADA78Ah,096918D87h,096807998h,04C5E7A93h\r
+ dd 076746185h,06B5B5550h,0B1A6A97Dh,080845F6Fh,06B748B92h,061778187h,0C3634D52h,0FAFAE4BBh\r
+ dd 0FAFAFAFAh,0C5EACCECh,0BADADAD2h,0CEE1F2DCh,0CDC3C2C1h,0B6C7BDC9h,0B1B1ADAEh,0B4B6B1B1h\r
+ dd 0ADAFB0B3h,0AFB3B3B0h,0ADABABADh,0A5A2A6AAh,0456CAEC3h,0C9D69D4Fh,0DBDBE28Bh,0E1F5FAFAh\r
+ dd 0B5ADABC7h,0B0C7A6A8h,0ADB8CEBEh,0ACA7A1AAh,0A5ACADB1h,0A2ABA6A2h,0AA9D9C9Eh,0704D92A8h\r
+ dd 0ABB68B69h,0736481A6h,08C9F9D69h,0838B8383h,0A6A197A3h,09796999Bh,0A49F9996h,08D99AD98h\r
+ dd 0615D5774h,0797D8176h,07F999987h,03D5E7326h,04C524E50h,05B4D4849h,06E565757h,049625063h\r
+ dd 05D775B52h,077986670h,002526F2Ah,04A655764h,06E5A3E77h,07A7B4B59h,05E5D6368h,066665656h\r
+ dd 0CCBAA59Ah,0A5B2C0CAh,0A298959Bh,0C5CABCB1h,0B8BBC0CEh,0969193A2h,0808FA19Fh,0A2A7A293h\r
+ dd 0949795A2h,08D8D9192h,093919393h,09887878Eh,084867F93h,0A59F8D81h,0ADB4BAB0h,0A4AF9088h\r
+ dd 0AD9F95AAh,0C6DBBCACh,0B8B5B8C3h,08B8384A0h,0748C7B7Eh,0858187A7h,07F719395h,07E73837Dh\r
+ dd 054626D84h,073504E3Dh,0AD9CC9ABh,071835D67h,0717D7367h,05D665E71h,0C6B45B47h,0FAFAF4B4h\r
+ dd 0FAFAFAFAh,0E9E1DBF9h,0C7CFDBEFh,0CFD7E7E9h,0D9EEE9CCh,0A4C4CBDFh,0B6B6ADACh,0B4B6B6B6h\r
+ dd 0AFAEB0B3h,0B1B2B2B0h,0B3BDB7B4h,0C0ACADB3h,05790D1B6h,0D4B9AE5Ah,0D4E0D794h,0D0F1FAE7h\r
+ dd 0B3ADB4D3h,0B6C7B3B3h,0A6B7C5BBh,0ABA5A2A0h,0AFB0B2AEh,0A9AAA8ABh,0A696B1ACh,0AA6B96A9h\r
+ dd 0B3B0A8A5h,0A576827Dh,0B290A9A5h,0B0C4C3BBh,097A0A9A9h,0938F9498h,0A8AEB1AFh,097857DA7h\r
+ dd 072807485h,08085786Ch,0549B977Fh,05D8A8E24h,05D66637Dh,07B6F5B57h,07D798376h,06150656Eh\r
+ dd 07D72506Dh,0889D8F8Dh,02347902Eh,0627C6160h,06B8B6379h,059939C83h,064666662h,08680606Dh\r
+ dd 0C0C6CCD3h,090A0B3C0h,0A8A2A388h,0BAC99CBCh,098A5BBD5h,07A79868Fh,066858181h,09195A096h\r
+ dd 0868BA19Dh,07F868887h,089848887h,08C8F8A8Ah,07D838599h,0ABA68A7Ch,0A1C2B9ACh,09188A2A6h\r
+ dd 0B6BB99AFh,0CCE7C3A0h,0B1A7C0C9h,0999596A7h,09874BB93h,0928CBDB2h,083696CACh,07D768A85h\r
+ dd 067697B73h,0825D6556h,0A69ACDB6h,07C866A6Ch,07D908865h,0697A7583h,0C1CE8C80h,0FAFAF8CCh\r
+ dd 0FAFAFAFAh,0FAE5F9FAh,0E0D4F8CDh,0BEC7D5E3h,0DBF6DBB6h,0A1CBC8DDh,0BBBBC4B6h,0B3B5BABBh\r
+ dd 0ACADB0B3h,0A2AAACACh,0A59D9FA1h,09F999CA4h,08D9CAB96h,0C8BCAE51h,0AEB6927Ah,0CBD1E2CBh\r
+ dd 09797A8CDh,0A9A7949Bh,0A1B0B8BDh,09E9F9C92h,0A2A9A89Fh,09DA19F9Dh,0A08F9E9Dh,0994E95A5h\r
+ dd 0AEB99D98h,0A77DB85Eh,0B8C5B9B4h,0A4BAB2B1h,0A09EA6ACh,099959A9Fh,0BDC0BBB3h,09DB3C7B6h\r
+ dd 07B87869Fh,082858984h,065949792h,07D937554h,0686E6EB1h,07C786A65h,09D928D75h,0655C7086h\r
+ dd 0892A525Dh,08F948F87h,02844712Bh,082795068h,062908B81h,07B807782h,02E3B474Ah,0452F4735h\r
+ dd 0C6C6B4BBh,0969CA4ADh,0A7A5A795h,0BEB6B4A8h,093A8AEC2h,07B79797Ah,08384A590h,0999BA09Bh\r
+ dd 0858E9B97h,08B848282h,08179818Ah,0818A8887h,073707389h,094A3887Fh,067A3B1ABh,0827A686Bh\r
+ dd 0BFB8B69Eh,0C3D8CEC9h,08FC0CBB1h,0A38C917Bh,0A9938C8Bh,0868797A8h,083968F94h,05D718274h\r
+ dd 06E404D76h,067564D58h,09BA3C48Fh,05C798174h,06A948F90h,0706E6775h,0ABCCA072h,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0D4E4FAFAh,0ACA7ADCAh,0DCD9DF9Eh,0ACC2CECDh,0A3A1A4A4h,0A7A688A1h\r
+ dd 0B3B1ACAAh,0B1B6B6B6h,0A29A9FABh,0A8A6A6B8h,0B6AFB8B6h,0CFC7A084h,0D4B4C599h,0DCDED2D3h\r
+ dd 0ABACB7D3h,0B3BABBAEh,0AFB7B3B7h,0A6ADAFB5h,0B3ABA5A5h,0A9A6AEB7h,0B1B8B0ADh,0986999B4h\r
+ dd 0C9D0BD9Ah,0AD7C8A9Fh,0D3BEB5B5h,0AAC49BA7h,0ACA7B2AEh,08D8F99A3h,09995969Dh,092959594h\r
+ dd 086858B90h,08B8C8D8Bh,079898D8Ch,06E84956Ah,07A7F8F8Ch,08C80797Ch,09D968B87h,08B828A98h\r
+ dd 0791E5376h,068AA99A9h,0244B7A27h,0798D7E5Dh,04350686Eh,04B524941h,023262728h,033261F1Eh\r
+ dd 0B9B09997h,0B1B7B7B6h,0AAA29BAEh,0B2B3AFB0h,0929D8DAEh,088777474h,08A80A9ADh,09A969A8Eh\r
+ dd 08A8E969Ch,08C8B8987h,0958D9395h,06E7E898Dh,07B786F63h,09192767Dh,082A5A8B6h,08C8B8381h\r
+ dd 0AEB18C94h,0AEC1BAC3h,086899497h,0AB827175h,0B4AE8A95h,08A97AFAAh,0869C8993h,09B96937Eh\r
+ dd 091788795h,09089747Bh,0B2BBE2B0h,08A8F998Dh,08189B0A1h,0AE9F9AA0h,0E1D5EFA9h,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0E3E6FAFAh,0C5ABA9BDh,0F1EEEAD5h,0AFC8DFE2h,0B4B2B0ACh,0AFBBA4B3h\r
+ dd 0B7B7B3ABh,0BFBCBAB9h,0ACBFA8B0h,0ADBAB4B9h,0ACA0AEB1h,0D8A6598Ch,0C6B6CFACh,0EBEEE9EBh\r
+ dd 0AEADC2E9h,0BCBDB6AEh,0BFC7C6BDh,0B0B1B5B7h,0ADA7A5A6h,0A8A9ACB1h,0AAABA5A6h,0857D95B1h\r
+ dd 0A4A59DA7h,08D828B8Ah,0838C888Ch,08482918Dh,087849084h,094908884h,097959598h,08E989C9Ch\r
+ dd 098949EAAh,0908B8791h,095939493h,08CA2AF98h,094929C98h,08B8B9299h,099967E83h,08C898A95h\r
+ dd 0693F8286h,05EB0A99Ah,0688A9D60h,04A5A4955h,05F615D4Fh,0575B5958h,05F636155h,0634B495Ch\r
+ dd 0B0AEA9A2h,0BAB9B8B2h,0ABA9A5B3h,0B8BEB3A9h,0A491979Bh,0A9887797h,07B859FBEh,098989A81h\r
+ dd 08D8C8590h,093938F8Ch,082888589h,07A74827Bh,0928D715Fh,0A5AA8C94h,06B94A2B5h,08D7A8290h\r
+ dd 09F9E8992h,0B1BCC4B5h,0A097A5A1h,09DAEA39Ch,0B7B4C697h,0B4A3AFC2h,092A1A7BBh,0859B9485h\r
+ dd 07D809079h,0965A4C70h,09EBBD4CCh,05D5E6463h,07D5B5A5Dh,05A6E6B81h,0C899DF85h,0FAFAFAF5h\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0D5DBF3FAh,0D0A698A8h,0F3F4E4E4h,0A6C1E0E1h,0B1B2B4A8h,0B8C0ADB7h\r
+ dd 0C0BCBCB6h,0C4C7C3C1h,0B0B6CFC5h,0A8BBB0AFh,097A6AAACh,0FA9278A8h,0D1E1D1CEh,0F6F3ECEAh\r
+ dd 0ADB5CEF4h,0D5BFBCB9h,0E6E4E2E4h,0B5AFABD8h,0A6A4A6ADh,0ABADA9A5h,0B5B0A7AAh,0655AA1BFh\r
+ dd 0899F9B7Fh,08B94825Dh,0A9A39D8Dh,099919790h,0A5A1A894h,0A2A4A4A4h,093979C9Ch,08D959286h\r
+ dd 0A4A09085h,0ABABABA8h,0868C9FABh,095908D8Ch,09D969E9Ch,08C8D98A0h,0857F8A8Fh,08A8C8385h\r
+ dd 05C8D8C88h,02A3E574Ah,0456D7066h,05E443733h,0534C4251h,06F635F5Ah,08A7F777Ch,0867A7C86h\r
+ dd 09CA3A799h,0B5B5B2A7h,0B9B2ACB1h,09DB0C0B9h,0A2A69B8Fh,0908C7E8Ch,0797E8F8Fh,07C788E92h\r
+ dd 0989D9E8Bh,09BA39E98h,0A2C4A992h,08590A197h,09C868E8Eh,09AAD9CAAh,09E9484AAh,09694A196h\r
+ dd 0CDB2BCA4h,0BEACBCAEh,0A3A8BDC4h,0B8B7BEADh,0C0B3B3AAh,0ABA6B1C2h,0ACA7B2BCh,0739FB7ACh\r
+ dd 063827275h,0A983535Ch,0AAB1DAC5h,04E71645Eh,05E6B476Ch,07A5F5675h,0DF83CD9Ch,0FAFAFAF9h\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0CBDEE4FAh,0DAB194A8h,0F7FAEBE5h,0A4C3E2E1h,0B2B5BAABh,0B8B1BABCh\r
+ dd 0C1BEBFBFh,0C2C2C4C2h,0BBB4AEBEh,0B4BAAEABh,0959EA7B0h,0F886B1A8h,0DBD2DFEFh,0F0EBE7DEh\r
+ dd 0B0C1D4F3h,0E8D2BDB2h,0FAF7F4E4h,0BEBFBFF7h,0A4A7AAACh,0B1B1A6A4h,0BAC0B5B3h,0874C86B0h\r
+ dd 07466906Eh,0887E806Eh,0BAABA68Bh,09485AAA8h,0A39DA58Ch,09B9CA1A1h,08A979FA3h,085939284h\r
+ dd 0938B919Eh,0A49F9D9Bh,07885A4A8h,092837783h,0918E9692h,07B828D92h,085887682h,0828C7A7Fh\r
+ dd 084976A74h,05B443845h,03C5D8973h,04B513524h,0595C5F5Eh,07A696561h,0878E8D85h,0818A8B80h\r
+ dd 0989A95A1h,09494928Dh,08C8F9194h,09D9B9187h,0A29C9C91h,0616B6B79h,072717065h,0835A8285h\r
+ dd 09B98AA86h,09292929Ah,097A98689h,0A7AAA297h,0928E9095h,0958F9796h,0A5A09E94h,08F90959Ch\r
+ dd 09C8A8F89h,0AC948597h,0C3B1B99Dh,0C6CAB0C3h,0C0C1C0BFh,0C7B2B9BBh,09DA9B3BFh,073849C91h\r
+ dd 07B887B7Ch,0B47A7C8Eh,0AEC3E4D5h,059656F74h,06E5B4D51h,070877963h,0F09EBFB4h,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0D0EAE6F8h,0DECBB4BAh,0F0FAF7DDh,0B7BEE5D2h,0C0B0B19Ch,0C3C4AEBEh\r
+ dd 0BCC9C3C3h,0C3C9C5CCh,0A6C4C1BBh,0AFB0B2AFh,0A6B5B7B4h,0AF5CA5A5h,0F6DDCFDBh,0CCD9D5F0h\r
+ dd 0A6ADCDB8h,0E4D7D0B6h,0FAFAFAEEh,0ADB7A3E5h,0A9A4AEA8h,08F8D9192h,0A5AE9893h,0B66073B8h\r
+ dd 0A19EADAAh,0A79498A0h,0BAA5A59Eh,090A09B8Fh,09D9C9583h,0999C94AFh,07D87A699h,0848D888Dh\r
+ dd 08D919080h,08B989188h,071788690h,07F877E6Fh,0938C7E87h,08C93868Bh,093A09692h,0847F9992h\r
+ dd 07E87808Bh,06C5D4F74h,046686D70h,061645D3Ah,067707877h,07C757656h,078787874h,06F818271h\r
+ dd 09191948Ch,09C9A9899h,09593909Bh,0A0988A98h,0989FA99Dh,077707A7Fh,0717D6F78h,07B778D7Ch\r
+ dd 0ADA79E70h,0998B94ABh,09C988B97h,0A6B2959Fh,09EA1AF94h,09192868Eh,09A969294h,08E878E9Ch\r
+ dd 0898A9A91h,09187877Dh,0BEAEB4A6h,0AEB6C0BFh,0B2B5BCB8h,0B69DB3BCh,0849ABAA9h,0907E8B8Fh\r
+ dd 0867E899Bh,0AA6B638Bh,0AFC2E2C6h,05B606270h,0556C665Dh,073936F69h,0ED888FB4h,0F9FAF9F6h\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0C3DEE2F7h,0DACABCB5h,0F1FAF9E0h,0A0C9DAD3h,0B6B4ACAFh,0A8A9B6B5h\r
+ dd 09DAAA0A4h,0959E9EA8h,09DAA9E96h,0ABA4A49Fh,093ACB4B2h,0939CA2A1h,0EEEAE4DCh,0D6E9E4EEh\r
+ dd 0C8D0E7D4h,0EFE4DBC9h,0DCE6F4F7h,0B4BAB3C8h,0B9ADB4B0h,0A8A2AEAEh,098AEB7AFh,09C86627Dh\r
+ dd 0AEA5A090h,0ACA8B3B5h,09CBCABA4h,078929C93h,0A0AB868Eh,094A79BA3h,08594AA99h,08F958E8Ah\r
+ dd 08C949588h,099A19E93h,07E8C9496h,08988806Fh,08B888E8Fh,08F979596h,09296A89Ah,08F8E9895h\r
+ dd 0948E8C8Ah,06E737690h,0707E8E86h,070768960h,09794897Dh,0676B757Dh,07A7B7B73h,07C78736Bh\r
+ dd 09E968BA6h,0908B8889h,088868492h,09A98948Ah,089A58997h,0726C8166h,08D82626Ch,08C817581h\r
+ dd 0A2B59B8Fh,09B7DA6AFh,09EA39DA6h,0A1B79AA3h,099A7B396h,0969F948Dh,09E9A9796h,09C9298A6h\r
+ dd 0928E9689h,083838680h,0BDA2A09Dh,0A8A3B5C3h,0C5BBB2BBh,0C8CEC4C3h,09EA3A3A0h,0958281A2h\r
+ dd 080758595h,09E6E6588h,0AFB2DEBCh,0714F5773h,06B79796Dh,090978D8Bh,0D5A494B0h,0F6F8F6F2h\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0B6CCD9F6h,0E9D7C5B4h,0F9FAFAF3h,08AC8E4E1h,0B1BCA3A3h,0B3B7A8AAh\r
+ dd 0899BABAEh,0AC928993h,0AAB2A2A8h,0B0B5ABAAh,0A0A9BABAh,062B1AEAEh,0EBF3EFDDh,0D6EBF3F7h\r
+ dd 0D1DFF5EBh,0FAF4ECD4h,0CADCF7FAh,0A8ACB1C8h,0AC9BA2A3h,0A49DADABh,08699B1ABh,09995826Ch\r
+ dd 0A6B7B095h,09098A6A5h,08E9A8B92h,0768E7654h,08E997D94h,09AA19B8Ah,0838F9E9Bh,08B887F6Dh\r
+ dd 07E7A7467h,08C737281h,0787E909Fh,08382837Eh,08A808977h,095A89191h,09D9FA79Ch,0957C8B93h\r
+ dd 0A69B8791h,073596C8Bh,0637E7087h,05D617A5Ch,091847068h,06E7B7889h,0666B6E6Dh,07D8C8D7Dh\r
+ dd 092929DB0h,0918B878Ch,08F909495h,0948B868Fh,08192A398h,06C718877h,0A0848C7Dh,0B2AC8892h\r
+ dd 0B5A797ABh,0A0A9A5B0h,0A19C95A4h,099B6AEA4h,0A799A097h,0A29090A3h,09CA39D86h,094919391h\r
+ dd 09E8E9991h,095948F92h,0B3A1A996h,0A99CA7B6h,0B9B7B4A8h,0A797B5BCh,0A5ABAEABh,09C9A9E9Dh\r
+ dd 0B9BFB799h,0A89AADC7h,0BFACF0CEh,0958C90A1h,080838680h,0BB849F80h,0F8CEA0CDh,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0B4C3D5ECh,0F9DFBAC7h,0F8FAFAFAh,0A8ACDFE0h,0A8A4A6A7h,0A3A3A7A8h\r
+ dd 096A7A3A3h,0ABA4A1A6h,0A6B39CA8h,0ADB3A6A3h,0A0A1B7B8h,06AA6B797h,0FAFAF6E4h,0EAEFF6F6h\r
+ dd 0EEEDF6EAh,0FAFAFAECh,0C0D8F5FAh,0AAAEB8D1h,0A79AA4A6h,0A1A0AEA6h,08AADA3A2h,08C738B78h\r
+ dd 086A68C7Ch,08391937Eh,09A717491h,090A98C96h,09F9CA19Fh,0A191A898h,09E989195h,08E949B8Fh\r
+ dd 0968B8E8Bh,0A297939Fh,0A59D9899h,0A9A2A8ACh,08084A898h,07486848Eh,07E779482h,091796A76h\r
+ dd 0A6908A89h,082959E91h,0868A9081h,0818D8C87h,0908E8C8Dh,0869B8D96h,0767F898Ch,076787A78h\r
+ dd 09496ABA6h,0888F8C79h,09BA28995h,092968C8Ch,066788099h,070798879h,0909A8C82h,0908A8C8Dh\r
+ dd 0A2978896h,094A2AAAAh,0959C93A8h,08890969Bh,0817E8C93h,0A386A08Bh,07E909492h,0868A85B1h\r
+ dd 0BFA07C8Eh,09EA4A6ABh,09A9F9FA0h,09CC2AE93h,0B0ACBEA0h,09798AA9Fh,0B4A99797h,0AFB2C1BEh\r
+ dd 056C4B997h,067575A48h,09190ADB2h,054785189h,04D837F75h,0C163874Ah,0FAE995C2h,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0BFCAD0F6h,0F9E9D3B4h,0EBFAFAFAh,0A8C0D8E1h,0B0A2A3B7h,0B8B4B7B0h\r
+ dd 0C3B0B2B3h,0B3B9A7B1h,0AAAFB4B3h,0ABB1AFABh,09AA7BEBCh,066AFB4C1h,0F5EEEBB3h,0E2E8E8E2h\r
+ dd 0E9EEECE6h,0FAFAFAF1h,0BCCFE4F7h,0ABA6ABCBh,09997AC99h,0A5A6ADB1h,0859CA5A4h,0615F8392h\r
+ dd 06DBB7883h,08E59848Ah,06367518Dh,0707D7A64h,091939691h,074898C8Ah,07A757376h,07A999678h\r
+ dd 09CB3BE88h,0ABAEA8A6h,0A9A6A799h,0A4AD9EB0h,061696EA3h,083819C91h,0A89E8F96h,096A9B0A6h\r
+ dd 07E877E8Fh,079787292h,08E908160h,08D919095h,098908588h,092A4A69Ah,04F768784h,05A545D53h\r
+ dd 08B827072h,07DA08C63h,08383928Dh,08F908291h,08684718Ah,07776636Fh,093927F88h,0918D9F9Ch\r
+ dd 0989A9F97h,08D959595h,0B4AE9EA0h,0A1A3C0AFh,0718FADADh,09F9FB68Eh,038484994h,0409F7D36h\r
+ dd 0692A432Fh,0A79E9AB0h,09E949292h,0B0B8A9B1h,09B979FA2h,0787C888Ch,0B29A8A80h,0B8A8B1ACh\r
+ dd 043AAB2ABh,0234B8B22h,08875864Ch,0A0B4A275h,080ADA698h,0BB605D4Ch,0FAF9D1CDh,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0FAFAFAFAh,0D5CED0FAh,0F2EBE9E0h,0E7F9FAFAh,0A4C2E1E0h,0BDA9AAC1h,0BBB9B6BCh\r
+ dd 0C2B4ADB9h,0BFC4B5B9h,0AFB1B4BBh,0BCBEB5B0h,0A2A9C2C7h,04CB3BFB4h,0E6E4D9A3h,0D8DBDAD8h\r
+ dd 0D5DADBDAh,0E8E2DCD6h,0C2BFCCDFh,097A4A7C2h,08C989193h,0A4A5AD95h,06C8EA1A2h,0746A919Bh\r
+ dd 099D9978Ch,09872999Eh,07D736E86h,0A5988571h,09A968187h,0758A9295h,094897D77h,07B81878Eh\r
+ dd 0A0A4A46Eh,0B2B1ADB1h,0A9A7A8A5h,0B0A3AFADh,09AAF87A5h,0848B9A94h,08A877787h,08F7F8590h\r
+ dd 07F7E7E9Dh,08E888490h,0928A897Ah,0959B989Ah,098939796h,093A4A69Dh,061788087h,06758616Ch\r
+ dd 07E7A7DA2h,0848A867Bh,08A8E997Fh,0666E8E7Ah,08384917Dh,0877E7D86h,0A4AA8893h,09491A5A7h\r
+ dd 0A3A7948Ah,09A9E9D9Bh,0A2B1A39Dh,0B28895ACh,0788C9AA1h,0AFAF9D8Bh,0574360A3h,083AAA13Fh\r
+ dd 0733D697Eh,0ADA5A5B7h,08E8F9D92h,084819798h,08F8C8E8Ah,07373778Eh,0AF9E877Bh,0A7A8ACACh\r
+ dd 0B0B2ACA0h,0230E2F25h,035496335h,0A09FA675h,0B1AEA48Bh,0D1647598h,0FAF7E6DDh,0FAFAFAFAh\r
+ dd 0FAFAFAFAh,0F9FAFAFAh,0D2D1D9F9h,0EEE8DDDBh,0DDEDEFECh,0AFC5DAD7h,0BBC7C1D3h,0BEC5C9B6h\r
+ dd 0ABA9B5C1h,0A3ADA9A8h,0ABABA9A6h,0AC9AB4BBh,0AAB0BBB7h,0829AB1B8h,0DDDFD6B4h,0E2E2E6E8h\r
+ dd 0D0CFD3D7h,0DED7CDCCh,0A6B5CFDFh,0AFB09990h,094858F94h,0A4A2AAABh,08D9AA2A4h,0989E958Ah\r
+ dd 0A8A79E89h,09A7D7385h,07C736590h,0A68E9383h,099948B8Ch,0758A9497h,0827F7B7Ch,07589938Fh\r
+ dd 0AAB0B179h,0B0AAA8B3h,0A3A4A7A6h,0AE93ACA5h,0838D97A1h,0928E838Dh,06C7C919Fh,0827B8E83h\r
+ dd 08B828492h,077738189h,09C978971h,09B8F929Fh,09D9AA4A1h,091A1A69Eh,07B84848Eh,0636F6F6Eh\r
+ dd 085816E6Bh,07C87919Bh,08593967Ch,08A613759h,085707079h,081776C84h,0A9AE9295h,0A498A4A7h\r
+ dd 0A29C8E8Eh,0ABA1A4A5h,07FBDADA1h,097968589h,078798584h,0B4A97F84h,05A64859Ah,08E6B534Dh\r
+ dd 0B5644B5Dh,09DAAB2CDh,08887858Eh,08C8F868Ch,084858985h,09886819Ch,097A09E9Eh,09DA5A8A8h\r
+ dd 0D0AAB4A1h,068587A91h,08B807A79h,06FA58DA9h,0B1969279h,0B87F9BB0h,0E2C9CBBAh,0E3EBECE6h\r
+ dd 0E7E1DEDEh,0E3E8E5E3h,0E9F7FAE2h,0E5E2DBDEh,0E1F2F2E9h,0BAD3D4D5h,09CB4B1BBh,09EBAAB95h\r
+ dd 0AEB0ABA8h,0A6A8AAAAh,0AFAFACA9h,0AD95A9B3h,0B0B7BBB6h,0ADABAFAEh,0DACEB4A5h,0D4D3D7DEh\r
+ dd 0D3C9C9D1h,0CEC0B4C4h,099B3CED4h,0BEA2919Ch,09C9294A1h,0ACACACACh,0A7A3AEAFh,0897F9E9Bh\r
+ dd 09892B078h,09E8C887Bh,08A7E768Dh,07E879189h,0989B928Ch,0788A908Eh,077757379h,07377808Bh\r
+ dd 0A8B7B06Ch,0B3AAAAAFh,0AFB1B6AFh,0B09AA5B0h,0A1ACB3ACh,08C838DAAh,085878496h,088897B79h\r
+ dd 098888792h,087728888h,0969B8275h,09C96939Ch,0A2A19E9Dh,08B9EA59Eh,07A858181h,0586B6A6Fh\r
+end;\r
--- /dev/null
+unit TxtScrIO;\r
+interface\r
+\r
+const\r
+ Black = $00; DGray = $08;\r
+ Blue = $01; LBlue = $09;\r
+ Green = $02; LGreen = $0a;\r
+ Cyan = $03; LCyan = $0b;\r
+ Red = $04; LRed = $0c;\r
+ Magenta = $05; LMagenta = $0d;\r
+ Brown = $06; Yellow = $0e;\r
+ LGray = $07; White = $0f;\r
+ Blink = $80;\r
+\r
+procedure ShowStr(var dest; x,y: Byte; str: String; attr: Byte);\r
+procedure ShowVStr(var dest; x,y: Byte; str: String; attr: Byte);\r
+procedure ShowCStr(var dest; x,y: Byte; str: String; atr1,atr2: Byte);\r
+procedure ShowVCStr(var dest; x,y: Byte; str: String; atr1,atr2: Byte);\r
+procedure ShowC3Str(var dest; x,y: Byte; str: String; atr1,atr2,atr3: Byte);\r
+procedure ShowVC3Str(var dest; x,y: Byte; str: String; atr1,atr2,atr3: Byte);\r
+function CStrLen(str: String): Byte;\r
+function AbsPos(x,y: Byte): Word;\r
+function Color(fgnd,bgnd: Byte): Byte;\r
+procedure CleanScreen(var dest);\r
+procedure initialize;\r
+\r
+type\r
+ tCUSTOM_VIDEO_MODE = 0..52;\r
+\r
+procedure SetCustomVideoMode(vmode: tCUSTOM_VIDEO_MODE);\r
+\r
+type\r
+ tFRAME_SETTING = Record\r
+ shadow_enabled,\r
+ wide_range_type,\r
+ zooming_enabled,\r
+ update_area: Boolean;\r
+ end;\r
+const\r
+ fr_setting: tFRAME_SETTING =\r
+ (shadow_enabled: TRUE;\r
+ wide_range_type: FALSE;\r
+ zooming_enabled: FALSE;\r
+ update_area: TRUE);\r
+\r
+procedure Frame(var dest; x1,y1,x2,y2,atr1: Byte;\r
+ title: String; atr2: Byte; border: String);\r
+\r
+const\r
+ solid1 = ' ';\r
+ solid2 = 'ÛßÛÛÛÛÜÛ';\r
+ single = 'ÚÄ¿³³ÀÄÙ';\r
+ double = 'ÉÍ»ººÈͼ';\r
+ dbside = 'ÖÄ·ººÓĽ';\r
+ dbtop = 'Õ͸³³Ô;';\r
+\r
+var\r
+ MaxLn,MaxCol,\r
+ work_maxln,work_maxcol: Byte;\r
+ area_x1,area_y1,area_x2,area_y2: Byte;\r
+ v_mode: Byte;\r
+ DispPg: Byte;\r
+ v_seg,v_ofs: Longint;\r
+ CheckSnow: Boolean;\r
+\r
+function iEGA: Boolean;\r
+function iVGA: Boolean;\r
+function iPS2: Boolean;\r
+function iMDA: Boolean;\r
+function iCGA: Boolean;\r
+function iMCGA: Boolean;\r
+\r
+function WhereX: Byte;\r
+function WhereY: Byte;\r
+procedure GotoXY(x,y: Byte);\r
+procedure ResetMode;\r
+\r
+function GetCursor: Longint;\r
+procedure SetCursor(cursor: Longint);\r
+procedure ThinCursor;\r
+procedure WideCursor;\r
+procedure HideCursor;\r
+function GetCursorShape: Word;\r
+procedure SetCursorShape(shape: Word);\r
+\r
+type\r
+ tVIDEO_STATE = Record\r
+ font: Byte;\r
+ cursor: Longint;\r
+ MaxLn,MaxCol,v_mode: Byte;\r
+ v_ofs: Longint;\r
+ screen: array[0..PRED(8192)] of Byte;\r
+ data: array[0..PRED(4096)] of Byte;\r
+ end;\r
+\r
+procedure GetVideoState(var data: tVIDEO_STATE);\r
+procedure SetVideoState(var data: tVIDEO_STATE; restore_screen: Boolean);\r
+procedure GetRGBitem(color: Byte; var red,green,blue: Byte);\r
+procedure SetRGBitem(color: Byte; red,green,blue: Byte);\r
+procedure WaitRetrace;\r
+procedure GetPalette(var pal; first,last: Word);\r
+procedure SetPalette(var pal; first,last: Word);\r
+\r
+type\r
+ tFADE = (first,fadeOut,fadeIn);\r
+ tDELAY = (fast,delayed);\r
+\r
+type\r
+ tFADE_BUF = Record\r
+ action: tFADE;\r
+ pal0: array[0..255] of Record r,g,b: Byte end;\r
+ pal1: array[0..255] of Record r,g,b: Byte end;\r
+ end;\r
+\r
+const\r
+ fade_speed: Byte = 63;\r
+\r
+procedure VgaFade(var data: tFADE_BUF; fade: tFADE; delay: tDELAY);\r
+procedure RefreshEnable;\r
+procedure RefreshDisable;\r
+procedure Split2Static;\r
+procedure SplitScr(line: Integer);\r
+procedure SetSize(columns,lines: Integer);\r
+procedure SetTextDisp(x,y: Integer);\r
+\r
+implementation\r
+uses DPMI;\r
+\r
+var\r
+ absolute_pos: Word;\r
+\r
+procedure DupChar; assembler;\r
+asm\r
+ pushad { IN/ al -column }\r
+ xor ebx,ebx { ah -line }\r
+ xchg ax,bx { dl -character }\r
+ xor eax,eax { dh -attribute }\r
+ xchg ax,bx { ecx -count }\r
+ mov bl,al { edi -ptr. to write }\r
+ mov al,MaxCol\r
+ mul ah\r
+ add ax,bx\r
+ mov bl,MaxCol\r
+ sub ax,bx\r
+ dec ax\r
+ shl ax,1\r
+ jecxz @@1\r
+ add edi,eax\r
+ xchg ax,dx\r
+ rep stosw\r
+ xchg ax,dx\r
+@@1: mov absolute_pos,ax\r
+ popad\r
+end;\r
+\r
+procedure ShowStr(var dest; x,y: Byte; str: String; attr: Byte); assembler;\r
+asm\r
+ mov edi,[dest]\r
+ mov esi,[str]\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ lodsb\r
+ mov cl,al\r
+ jecxz @@2\r
+ add edi,edx\r
+ mov ah,attr\r
+@@1: lodsb\r
+ stosw\r
+ loop @@1\r
+@@2:\r
+end;\r
+\r
+procedure ShowVStr(var dest; x,y: Byte; str: String; attr: Byte); assembler;\r
+asm\r
+ mov al,MaxCol\r
+ dec al\r
+ xor ah,ah\r
+ xor ebx,ebx\r
+ mov bl,2\r
+ mul bl\r
+ mov bx,ax\r
+ mov edi,[dest]\r
+ mov esi,[str]\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ lodsb\r
+ mov cl,al\r
+ jecxz @@2\r
+ add edi,edx\r
+ mov ah,attr\r
+@@1: lodsb\r
+ stosw\r
+ add edi,ebx\r
+ loop @@1\r
+@@2:\r
+end;\r
+\r
+procedure ShowCStr(var dest; x,y: Byte; str: String; atr1,atr2: Byte); assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,[dest]\r
+ lodsb\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@3\r
+ push ecx\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ pop ecx\r
+ add edi,edx\r
+ mov ah,atr1\r
+ mov bh,atr2\r
+@@1: lodsb\r
+ cmp al,'~'\r
+ jz @@2\r
+ stosw\r
+ loop @@1\r
+ jmp @@3\r
+@@2: xchg ah,bh\r
+ loop @@1\r
+@@3:\r
+end;\r
+\r
+procedure ShowVCStr(var dest; x,y: Byte; str: String; atr1,atr2: Byte); assembler;\r
+asm\r
+ mov al,MaxCol\r
+ dec al\r
+ xor ah,ah\r
+ mov bl,2\r
+ mul bl\r
+ mov bx,ax\r
+ mov esi,[str]\r
+ mov edi,[dest]\r
+ lodsb\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@3\r
+ push ecx\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ pop ecx\r
+ add edi,edx\r
+ mov dx,bx\r
+ mov ah,atr1\r
+ mov bh,atr2\r
+@@1: lodsb\r
+ cmp al,'~'\r
+ jz @@2\r
+ stosw\r
+ add edi,edx\r
+ loop @@1\r
+ jmp @@3\r
+@@2: xchg ah,bh\r
+ loop @@1\r
+@@3:\r
+end;\r
+\r
+procedure ShowC3Str(var dest; x,y: Byte; str: String; atr1,atr2,atr3: Byte); assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,[dest]\r
+ lodsb\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@3\r
+ push ecx\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ pop ecx\r
+ add edi,edx\r
+ mov ah,atr1\r
+ mov bl,atr2\r
+ mov bh,atr3\r
+@@1: lodsb\r
+ cmp al,'~'\r
+ jz @@2\r
+ cmp al,'`'\r
+ jz @@3\r
+ stosw\r
+ loop @@1\r
+ jmp @@4\r
+@@2: xchg ah,bl\r
+ loop @@1\r
+ jmp @@4\r
+@@3: xchg ah,bh\r
+ loop @@1\r
+@@4:\r
+end;\r
+\r
+procedure ShowVC3Str(var dest; x,y: Byte; str: String; atr1,atr2,atr3: Byte); assembler;\r
+asm\r
+ mov al,MaxCol\r
+ dec al\r
+ xor ah,ah\r
+ mov bl,2\r
+ mul bl\r
+ mov bx,ax\r
+ mov esi,[str]\r
+ mov edi,[dest]\r
+ lodsb\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@4\r
+ push ecx\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ pop ecx\r
+ add edi,edx\r
+ mov dx,bx\r
+ mov ah,atr1\r
+ mov bl,atr2\r
+ mov bh,atr3\r
+@@1: lodsb\r
+ cmp al,'~'\r
+ jz @@2\r
+ cmp al,'`'\r
+ jz @@3\r
+ stosw\r
+ add edi,edx\r
+ loop @@1\r
+ jmp @@4\r
+@@2: xchg ah,bl\r
+ loop @@1\r
+ jmp @@4\r
+@@3: xchg ah,bh\r
+ loop @@1\r
+@@4:\r
+end;\r
+\r
+function CStrLen(str: String): Byte; assembler;\r
+asm\r
+ mov edi,[str]\r
+ xor ecx,ecx\r
+ mov cl,[edi]\r
+ inc edi\r
+ mov bx,cx\r
+ jecxz @@2\r
+ mov al,'~'\r
+@@1: repne scasb\r
+ jnz @@2\r
+ dec bx\r
+ jmp @@1\r
+@@2: mov ax,bx\r
+end;\r
+\r
+function AbsPos(x,y: Byte): Word; assembler;\r
+asm\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ mov ax,absolute_pos\r
+end;\r
+\r
+function Color(fgnd,bgnd: Byte): Byte; assembler;\r
+asm\r
+ mov al,bgnd\r
+ xor ah,ah\r
+ mov bh,16\r
+ mul bh\r
+ add al,fgnd\r
+end;\r
+\r
+procedure CleanScreen(var dest); assembler;\r
+asm\r
+ mov edi,[dest]\r
+ mov al,1\r
+ mov bh,1\r
+ mov cl,MaxCol\r
+ xor ch,ch\r
+@@1: mov ah,bh\r
+ mov dl,' '\r
+ mov dh,07h\r
+ call DupChar\r
+ inc bh\r
+ cmp bh,MaxLn\r
+ jle @@1\r
+end;\r
+\r
+procedure Frame(var dest; x1,y1,x2,y2,atr1: Byte;\r
+ title: String; atr2: Byte; border: String); assembler;\r
+var\r
+ xexp1,xexp2,xexp3,yexp1,yexp2: Byte;\r
+ offs: Longint;\r
+\r
+asm\r
+ cmp fr_setting.update_area,1\r
+ jnz @@0\r
+ mov al,x1\r
+ mov area_x1,al\r
+ mov al,y1\r
+ mov area_y1,al\r
+ mov al,x2\r
+ mov area_x2,al\r
+ mov al,y2\r
+ mov area_y2,al\r
+@@0: mov bl,fr_setting.wide_range_type\r
+ mov bh,fr_setting.shadow_enabled\r
+ mov esi,[border]\r
+ mov edi,[dest]\r
+ mov offs,edi\r
+ cmp bl,0\r
+ je @@1\r
+ mov xexp1,4\r
+ mov xexp2,-1\r
+ mov xexp3,7\r
+ mov yexp1,1\r
+ mov yexp2,2\r
+ jmp @@2\r
+@@1: mov xexp1,1\r
+ mov xexp2,2\r
+ mov xexp3,1\r
+ mov yexp1,0\r
+ mov yexp2,1\r
+ jmp @@4\r
+@@2: mov al,x1\r
+ sub al,3\r
+ mov ah,y1\r
+ dec ah\r
+ mov dl,' '\r
+ mov dh,atr1\r
+ xor ecx,ecx\r
+ mov cl,x2\r
+ sub cl,x1\r
+ add cl,7\r
+ call DupChar\r
+ mov ah,y2\r
+ inc ah\r
+ call DupChar\r
+ mov bl,y1\r
+@@3: mov al,x1\r
+ sub al,3\r
+ mov ah,bl\r
+ mov dl,' '\r
+ mov ecx,3\r
+ call DupChar\r
+ mov al,x2\r
+ inc al\r
+ mov dl,' '\r
+ mov ecx,3\r
+ call DupChar\r
+ inc bl\r
+ cmp bl,y2\r
+ jng @@3\r
+@@4: mov al,x1\r
+ mov ah,y1\r
+ mov dl,[esi+1]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ push edi\r
+ call DupChar\r
+ inc al\r
+ mov dl,[esi+2]\r
+ mov dh,atr1\r
+ mov cl,x2\r
+ sub cl,x1\r
+ dec cl\r
+ call DupChar\r
+ mov al,x2\r
+ mov dl,[esi+3]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ mov bl,y1\r
+@@5: inc bl\r
+ mov al,x1\r
+ mov ah,bl\r
+ mov dl,[esi+4]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ inc al\r
+ mov dl,' '\r
+ mov dh,atr1\r
+ mov cl,x2\r
+ sub cl,x1\r
+ dec cl\r
+ call DupChar\r
+ mov al,x2\r
+ mov dl,[esi+5]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ cmp bl,y2\r
+ jnge @@5\r
+ mov al,x1\r
+ mov ah,y2\r
+ mov dl,[esi+6]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ inc al\r
+ mov dl,[esi+7]\r
+ mov cl,x2\r
+ sub cl,x1\r
+ dec cl\r
+ call DupChar\r
+ mov al,x2\r
+ mov dl,[esi+8]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ mov esi,[title]\r
+ mov cl,[esi]\r
+ jecxz @@7\r
+ xor eax,eax\r
+ mov al,x2\r
+ sub al,x1\r
+ sub al,cl\r
+ mov bl,2\r
+ div bl\r
+ add al,x1\r
+ add al,ah\r
+ mov ah,y1\r
+ xor ecx,ecx\r
+ call DupChar\r
+ push eax\r
+ xor eax,eax\r
+ mov ax,absolute_pos\r
+ mov edi,offs\r
+ add edi,eax\r
+ pop eax\r
+ lodsb\r
+ mov cl,al\r
+ mov ah,atr2\r
+@@6: lodsb\r
+ stosw\r
+ loop @@6\r
+@@7: cmp bh,0\r
+ je @@11\r
+ mov bl,y1\r
+ sub bl,yexp1\r
+@@8: inc bl\r
+ mov al,x2\r
+ add al,xexp1\r
+ mov ah,bl\r
+ xor ecx,ecx\r
+ call DupChar\r
+ push eax\r
+ xor eax,eax\r
+ mov ax,absolute_pos\r
+ mov edi,offs\r
+ add edi,eax\r
+ pop eax\r
+ inc edi\r
+ mov al,07\r
+ stosb\r
+ cmp MaxLn,80\r
+ jae @@9\r
+ inc edi\r
+ stosb\r
+ cmp MaxCol,132\r
+ jna @@9\r
+ inc edi\r
+ stosb\r
+@@9: cmp bl,y2\r
+ jng @@8\r
+ mov al,x1\r
+ add al,xexp2\r
+ mov ah,y2\r
+ add ah,yexp2\r
+ xor ecx,ecx\r
+ call DupChar\r
+ push eax\r
+ xor eax,eax\r
+ mov ax,absolute_pos\r
+ mov edi,offs\r
+ add edi,eax\r
+ pop eax\r
+ inc edi\r
+ mov al,07\r
+ mov cl,x2\r
+ sub cl,x1\r
+ add cl,xexp3\r
+ cmp MaxLn,45\r
+ jb @@10\r
+ dec cl\r
+@@10: stosb\r
+ inc edi\r
+ loop @@10\r
+@@11:\r
+end;\r
+\r
+function iEGA: Boolean; assembler;\r
+asm\r
+ mov ax,01200h\r
+ mov bx,00010h\r
+ mov cx,0ffffh\r
+ int 10h\r
+ cmp cx,0ffffh\r
+ jz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function iVGA: Boolean; assembler;\r
+asm\r
+ mov ax,1a00h\r
+ int 10h\r
+ cmp al,1ah\r
+ jnz @@1\r
+ cmp bl,7\r
+ jb @@1\r
+ cmp bl,0ffh\r
+ jnz @@2\r
+@@1: xor al,al\r
+ jmp @@3\r
+@@2: mov al,1\r
+@@3:\r
+end;\r
+\r
+function iPS2: Boolean; assembler;\r
+asm\r
+ mov ax,1a00h\r
+ int 10h\r
+ and al,0ffh\r
+ cmp al,1ah\r
+ jnz @@1\r
+ and bl,0ffh\r
+ cmp bl,07h\r
+ jb @@1\r
+ cmp bl,0ch\r
+ ja @@1\r
+ cmp bl,09h\r
+ jz @@1\r
+ cmp bl,0ah\r
+ jz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function iMDA: Boolean; assembler;\r
+asm\r
+ cmp v_mode,07h\r
+ jnz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function iCGA: Boolean; assembler;\r
+asm\r
+ call iMDA\r
+ cmp al,0\r
+ jnz @@1\r
+ call iEGA\r
+ cmp al,0\r
+ jnz @@1\r
+ call iPS2\r
+ cmp al,0\r
+ jnz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function iMCGA: Boolean; assembler;\r
+asm\r
+ call iMDA\r
+ cmp al,0\r
+ jnz @@1\r
+ call iEGA\r
+ cmp al,0\r
+ jnz @@1\r
+ call iPS2\r
+ cmp al,1\r
+ jnz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function WhereX: Byte; assembler;\r
+asm\r
+ mov bh,DispPg\r
+ mov ah,03h\r
+ int 10h\r
+ inc dl\r
+ mov al,dl\r
+end;\r
+\r
+function WhereY: Byte; assembler;\r
+asm\r
+ mov bh,DispPg\r
+ mov ah,03h\r
+ int 10h\r
+ inc dh\r
+ mov al,dh\r
+end;\r
+\r
+procedure GotoXY(x,y: Byte); assembler;\r
+asm\r
+ mov dh,y\r
+ mov dl,x\r
+ dec dh\r
+ dec dl\r
+ mov bh,DispPg\r
+ mov ah,02h\r
+ int 10h\r
+end;\r
+\r
+procedure ResetMode; assembler;\r
+asm\r
+ xor ah,ah\r
+ mov al,v_mode\r
+ mov bh,DispPg\r
+ int 10h\r
+end;\r
+\r
+function GetCursor: Longint; assembler;\r
+asm\r
+ xor edx,edx\r
+ mov bh,DispPg\r
+ mov ah,03h\r
+ int 10h\r
+ shl edx,16\r
+ xor eax,eax\r
+ push edx\r
+ call GetCursorShape\r
+ pop edx\r
+ add edx,eax\r
+ mov eax,edx\r
+end;\r
+\r
+\r
+procedure SetCursor(cursor: Longint); assembler;\r
+asm\r
+ xor eax,eax\r
+ mov ax,word ptr [cursor]\r
+ push eax\r
+ call SetCursorShape\r
+ mov dx,word ptr [cursor+2]\r
+ mov bh,DispPg\r
+ mov ah,02h\r
+ int 10h\r
+end;\r
+\r
+procedure ThinCursor; assembler;\r
+asm\r
+ xor ecx,ecx\r
+ call iMDA\r
+ cmp al,1\r
+ jnz @@1\r
+ mov cx,0b0ch\r
+ jmp @@5\r
+@@1: call iCGA\r
+ cmp al,1\r
+ jnz @@2\r
+ mov cx,0708h\r
+ jmp @@5\r
+@@2: call iMCGA\r
+ cmp al,1\r
+ jnz @@3\r
+ mov cx,0708h\r
+ jmp @@5\r
+@@3: call iVGA\r
+ cmp al,1\r
+ jnz @@4\r
+ mov cx,0d0eh\r
+ jmp @@5\r
+@@4: mov cx,0b0ch\r
+@@5: push ecx\r
+ call SetCursorShape\r
+end;\r
+\r
+procedure WideCursor; assembler;\r
+asm\r
+ xor ecx,ecx\r
+ call iMDA\r
+ cmp al,1\r
+ jnz @@1\r
+ mov cx,010ch\r
+ jmp @@5\r
+@@1: call iCGA\r
+ cmp al,1\r
+ jnz @@2\r
+ mov cx,0107h\r
+ jmp @@5\r
+@@2: call iMCGA\r
+ cmp al,1\r
+ jnz @@3\r
+ mov cx,0107h\r
+ jmp @@5\r
+@@3: call iVGA\r
+ cmp al,1\r
+ jnz @@4\r
+ mov cx,010eh\r
+ jmp @@5\r
+@@4: mov cx,010ch\r
+@@5: push ecx\r
+ call SetCursorShape\r
+end;\r
+\r
+procedure HideCursor; assembler;\r
+asm\r
+ xor ecx,ecx\r
+ mov cx,1010h\r
+ push ecx\r
+ call SetCursorShape\r
+end;\r
+\r
+function GetCursorShape: Word; assembler;\r
+asm\r
+ mov dx,03d4h\r
+ mov al,0ah\r
+ out dx,al\r
+ inc dx\r
+ in al,dx\r
+ and al,1fh\r
+ mov ah,al\r
+ dec dx\r
+ mov al,0bh\r
+ out dx,al\r
+ inc dx\r
+ in al,dx\r
+ and al,1fh\r
+end;\r
+\r
+procedure SetCursorShape(shape: Word); assembler;\r
+asm\r
+ mov dx,03d4h\r
+ mov al,0ah\r
+ out dx,al\r
+ inc dx\r
+ in al,dx\r
+ mov ah,BYTE(shape)[1]\r
+ and al,0e0h\r
+ or al,ah\r
+ out dx,al\r
+ dec dx\r
+ mov al,0bh\r
+ out dx,al\r
+ inc dx\r
+ in al,dx\r
+ mov ah,BYTE(shape)[0]\r
+ and al,0e0h\r
+ or al,ah\r
+ out dx,al\r
+end;\r
+\r
+procedure initialize;\r
+begin\r
+ asm\r
+ mov ah,0fh\r
+ int 10h\r
+ and al,7fh\r
+ mov v_mode,al\r
+ mov DispPg,bh\r
+ end;\r
+\r
+ If (MEM[0:$449] = 7) then\r
+ begin\r
+ v_seg := $0b000;\r
+ MaxLn := 25;\r
+ end\r
+ else begin\r
+ v_seg := $0b800;\r
+ MaxLn := SUCC(MEM[0:$484]);\r
+ end;\r
+\r
+ v_ofs := MEM[0:$44e];\r
+ MaxCol := MEM[0:$44a];\r
+\r
+ work_MaxLn := MaxLn;\r
+ work_MaxCol := MaxCol;\r
+\r
+ If iCGA then CheckSnow := TRUE\r
+ else CheckSnow := FALSE;\r
+end;\r
+\r
+var\r
+ dos_seg: Word;\r
+ bios_data_backup: array[0..167] of Byte;\r
+ regs: tRmRegs;\r
+\r
+procedure GetVideoState(var data: tVIDEO_STATE);\r
+begin\r
+ Move(Ptr(v_seg,v_ofs)^,data.screen,SizeOf(data.screen));\r
+ data.cursor := GetCursor;\r
+ data.font := MEMW[0:$0485];\r
+ data.v_mode := v_mode;\r
+ data.MaxLn := MaxLn;\r
+ data.MaxCol := MaxCol;\r
+ data.v_ofs := v_ofs;\r
+ Move(MEM[$40:0],bios_data_backup,168);\r
+ dos_seg := DosMemoryAlloc(SizeOf(tVIDEO_STATE(data).data));\r
+ ClearRmRegs(regs);\r
+ regs.cx := 7;\r
+ regs.es := dos_seg;\r
+ regs.ax := $1c01;\r
+ RealModeInt($10,regs);\r
+ Move(bios_data_backup,MEM[$40:0],168);\r
+ Move(POINTER(DWORD(dos_seg)*16)^,tVIDEO_STATE(data).data,\r
+ SizeOf(tVIDEO_STATE(data).data));\r
+ DosMemoryFree(dos_seg);\r
+end;\r
+\r
+procedure SetVideoState(var data: tVIDEO_STATE; restore_screen: Boolean);\r
+begin\r
+ v_mode := data.v_mode;\r
+ ResetMode;\r
+ Move(MEM[$40:0],bios_data_backup,168);\r
+ dos_seg := DosMemoryAlloc(SizeOf(tVIDEO_STATE(data).data));\r
+ Move(tVIDEO_STATE(data).data,POINTER(DWORD(dos_seg)*16)^,\r
+ SizeOf(tVIDEO_STATE(data).data));\r
+ ClearRmRegs(regs);\r
+ regs.cx := 7;\r
+ regs.es := dos_seg;\r
+ regs.ax := $1c02;\r
+ RealModeInt($10,regs);\r
+ DosMemoryFree(dos_seg);\r
+ Move(bios_data_backup,MEM[$40:0],168);\r
+\r
+ MEM[0:$44e] := data.v_ofs;\r
+ MEM[0:$484] := PRED(data.MaxLn);\r
+ MEM[0:$44a] := data.MaxCol;\r
+\r
+ Case data.font of\r
+ 8: asm mov ax,1112h; xor bl,bl; int 10h end;\r
+ 14: asm mov ax,1111h; xor bl,bl; int 10h end;\r
+ else asm mov ax,1114h; xor bl,bl; int 10h end;\r
+ end;\r
+\r
+ initialize;\r
+ SetCursor(data.cursor);\r
+ If restore_screen then\r
+ Move(data.screen,Ptr(v_seg,v_ofs)^,SizeOf(data.screen));\r
+end;\r
+\r
+procedure GetRGBitem(color: Byte; var red,green,blue: Byte);\r
+begin\r
+ PORT[$3c7] := color;\r
+ red := PORT[$3c9];\r
+ green := PORT[$3c9];\r
+ blue := PORT[$3c9];\r
+end;\r
+\r
+procedure SetRGBitem(color: Byte; red,green,blue: Byte);\r
+begin\r
+ PORT[$3c8] := color;\r
+ PORT[$3c9] := red;\r
+ PORT[$3c9] := green;\r
+ PORT[$3c9] := blue;\r
+end;\r
+\r
+procedure WaitRetrace; assembler;\r
+asm\r
+ mov dx,3dah\r
+@@1: in al,dx\r
+ and al,08h\r
+ jnz @@1\r
+@@2: in al,dx\r
+ and al,08h\r
+ jz @@2\r
+end;\r
+\r
+procedure GetPalette(var pal; first,last: Word); assembler;\r
+asm\r
+ xor eax,eax\r
+ xor ecx,ecx\r
+ mov ax,first\r
+ mov cx,last\r
+ sub ecx,eax\r
+ inc ecx\r
+ mov dx,03c7h\r
+ out dx,al\r
+ add dx,2\r
+ mov edi,[pal]\r
+ add edi,eax\r
+ add edi,eax\r
+ add edi,eax\r
+ mov eax,ecx\r
+ add ecx,eax\r
+ add ecx,eax\r
+ rep insb\r
+end;\r
+\r
+procedure SetPalette(var pal; first,last: Word); assembler;\r
+asm\r
+ mov dx,03dah\r
+@@1: in al,dx\r
+ test al,8\r
+ jz @@1\r
+ xor eax,eax\r
+ xor ecx,ecx\r
+ mov ax,first\r
+ mov cx,last\r
+ sub ecx,eax\r
+ inc ecx\r
+ mov dx,03c8h\r
+ out dx,al\r
+ inc dx\r
+ mov esi,[pal]\r
+ add esi,eax\r
+ add esi,eax\r
+ add esi,eax\r
+ mov eax,ecx\r
+ add ecx,eax\r
+ add ecx,eax\r
+ rep outsb\r
+end;\r
+\r
+const\r
+ fade_first: Byte = 0;\r
+ fade_last: Byte = 255;\r
+\r
+procedure wait_ms; assembler;\r
+asm\r
+@@1: mov di,-1*1193*2\r
+ xor al,al\r
+ out 43h,al\r
+ in al,40h\r
+ mov bl,al\r
+ in al,40h\r
+ mov bh,al\r
+@@2: xor al,al\r
+ out 43h,al\r
+ in al,40h\r
+ mov ah,al\r
+ in al,40h\r
+ xchg ah,al\r
+ sub ax,bx\r
+ cmp ax,di\r
+ jnc @@2\r
+end;\r
+\r
+procedure VgaFade(var data: tFADE_BUF; fade: tFADE; delay: tDELAY);\r
+\r
+var\r
+ i,j: Byte;\r
+\r
+begin\r
+ If (fade = fadeOut) and (data.action in [first,fadeIn]) then\r
+ begin\r
+ GetPalette(data.pal0,fade_first,fade_last);\r
+ If delay = delayed then\r
+ For i := fade_speed downto 0 do\r
+ begin\r
+ For j := fade_first to fade_last do\r
+ begin\r
+ data.pal1[j].r := data.pal0[j].r * i DIV fade_speed;\r
+ data.pal1[j].g := data.pal0[j].g * i DIV fade_speed;\r
+ data.pal1[j].b := data.pal0[j].b * i DIV fade_speed;\r
+ end;\r
+ SetPalette(data.pal1,fade_first,fade_last);\r
+ wait_ms;\r
+ end\r
+ else\r
+ begin\r
+ FillChar(data.pal1,SizeOf(data.pal1),0);\r
+ SetPalette(data.pal1,fade_first,fade_last);\r
+ end;\r
+ data.action := fadeOut;\r
+ end;\r
+\r
+ If (fade = fadeIn) and (data.action = fadeOut) then\r
+ begin\r
+ If delay = delayed then\r
+ For i := 0 to fade_speed do\r
+ begin\r
+ For j := fade_first to fade_last do\r
+ begin\r
+ data.pal1[j].r := data.pal0[j].r * i DIV fade_speed;\r
+ data.pal1[j].g := data.pal0[j].g * i DIV fade_speed;\r
+ data.pal1[j].b := data.pal0[j].b * i DIV fade_speed;\r
+ end;\r
+ SetPalette(data.pal1,fade_first,fade_last);\r
+ wait_ms;\r
+ end\r
+ else\r
+ SetPalette(data.pal0,fade_first,fade_last);\r
+ data.action := fadeIn;\r
+ end;\r
+end;\r
+\r
+procedure RefreshEnable; assembler;\r
+asm mov ax,1200h; mov bl,36h; int 10h end;\r
+\r
+procedure RefreshDisable; assembler;\r
+asm mov ax,1201h; mov bl,36h; int 10h end;\r
+\r
+procedure Split2Static;\r
+\r
+var\r
+ temp: Byte;\r
+\r
+begin\r
+ temp := PORT[$3da];\r
+ PORT[$3c0] := $10 OR $20;\r
+ PORT[$3c0] := PORT[$3c1] OR $20;\r
+end;\r
+\r
+procedure SplitScr(line: Integer);\r
+\r
+var\r
+ temp: Byte;\r
+\r
+begin\r
+ PORT[$3d4] := $18;\r
+ PORT[$3d5] := LO(line);\r
+ PORT[$3d4] := $07;\r
+ temp := PORT[$3d5];\r
+\r
+ If (line < $100) then temp := temp AND $0ef\r
+ else temp := temp OR $10;\r
+\r
+ PORT[$3d5] := temp;\r
+ PORT[$3d4] := $09;\r
+ temp := PORT[$3d5];\r
+\r
+ If (line < $200) then temp := temp AND $0bf\r
+ else temp := temp OR $40;\r
+\r
+ PORT[$3d5] := temp;\r
+end;\r
+\r
+procedure SetSize(columns,lines: Integer);\r
+begin\r
+ PORT[$3d4] := $13;\r
+ PORT[$3d5] := columns SHR 1;\r
+ MEMW[$0000:$44a] := columns;\r
+ MEMW[$0000:$484] := lines-1;\r
+ MEMW[$0000:$44c] := columns*lines;\r
+end;\r
+\r
+procedure SetTextDisp(x,y: Integer);\r
+\r
+var\r
+ temp: Byte;\r
+\r
+begin\r
+ While (PORT[$3da] AND 1 = 1) do ;\r
+ While (PORT[$3da] AND 1 <> 1) do ;\r
+\r
+ PORT[$3d4] := $0c;\r
+ PORT[$3d5] := HI((y SHR 4)*MaxCol+(x DIV 9));\r
+ PORT[$3d4] := $0d;\r
+ PORT[$3d5] := LO((y SHR 4)*MaxCol+(x DIV 9));\r
+ PORT[$3d4] := $08;\r
+ PORT[$3d5] := (PORT[$3d5] AND $0e0) OR (y AND $0f);\r
+ temp := PORT[$3da];\r
+ PORT[$3c0] := $13 OR $20;\r
+ PORT[$3c0] := (x+9) MOD 9;\r
+end;\r
+\r
+procedure SetCustomVideoMode(vmode: tCUSTOM_VIDEO_MODE);\r
+\r
+const\r
+ vmode_data: array[0..52,0..63] of Byte = (\r
+\r
+{ 1..5 - BIOS variables,\r
+ 6..9 - Sequencer,\r
+ 10 - Miscellaneous Output,\r
+ 11..35 - CRTC,\r
+ 36..55 - Attribute,\r
+ 56..64 - Graphics }\r
+\r
+{ 0, Text 36x14, 9x14, complete }\r
+( 36, 13, 14, 0, 4, 8, 3, 0, 2, 99,\r
+ 40, 35, 36,138, 38,192,183, 31, 0,205, 11, 12, 0, 0, 0,\r
+ 0,148,134,135, 18, 31,142,177,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 1, Text 40x14, 8x14, complete }\r
+( 40, 13, 14, 0, 5, 9, 3, 0, 2, 99,\r
+ 45, 39, 40,144, 43,160,183, 31, 0,205, 11, 12, 0, 0, 0,\r
+ 0,148,134,135, 20, 31,142,177,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 2, Text 40x14, 9x14, complete }\r
+( 40, 13, 14, 0, 5, 8, 3, 0, 2, 103,\r
+ 45, 39, 40,144, 43,160,183, 31, 0,205, 11, 12, 0, 0, 0,\r
+ 0,148,134,135, 20, 31,142,177,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 3, Text 46x14, 8x14, complete }\r
+( 46, 13, 14, 0, 6, 9, 3, 0, 2, 103,\r
+ 52, 45, 46,151, 50,150,183, 31, 0,205, 11, 12, 0, 0, 0,\r
+ 0,148,134,135, 23, 31,142,177,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 4, Text 36x15, 9x16, complete }\r
+( 36, 14, 16, 0, 5, 8, 3, 0, 2, 227,\r
+ 40, 35, 36,138, 38,192, 11, 62, 0,207, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 18, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 5, Text 40x15, 8x16, complete }\r
+( 40, 14, 16, 0, 5, 9, 3, 0, 2, 227,\r
+ 45, 39, 40,144, 43,160, 11, 62, 0,207, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 20, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 6, Text 40x15, 9x16, complete }\r
+( 40, 14, 16, 0, 5, 8, 3, 0, 2, 231,\r
+ 45, 39, 40,144, 43,160, 11, 62, 0,207, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 20, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 7, Text 46x15, 8x16, complete }\r
+( 46, 14, 16, 0, 6, 9, 3, 0, 2, 231,\r
+ 52, 45, 46,151, 50,150, 11, 62, 0,207, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 23, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 8, Text 36x17, 9x14, complete }\r
+( 36, 16, 14, 0, 5, 8, 3, 0, 2, 227,\r
+ 40, 35, 36,138, 38,192, 7, 62, 0,205, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 18, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 9, Text 40x17, 8x14, complete }\r
+( 40, 16, 14, 0, 6, 9, 3, 0, 2, 227,\r
+ 45, 39, 40,144, 43,160, 7, 62, 0,205, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 20, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 10, Text 40x17, 9x14, complete }\r
+( 40, 16, 14, 0, 6, 8, 3, 0, 2, 231,\r
+ 45, 39, 40,144, 43,160, 7, 62, 0,205, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 20, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 11, Text 46x17, 9x14, complete }\r
+( 46, 16, 14, 0, 7, 9, 3, 0, 2, 231,\r
+ 52, 45, 46,151, 50,150, 7, 62, 0,205, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 23, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 12, Text 36x22, 9x16, complete }\r
+( 36, 21, 16, 0, 7, 8, 3, 0, 2, 163,\r
+ 40, 35, 36,138, 38,192,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 18, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 13, Text 40x22, 8x16, complete }\r
+( 40, 21, 16, 0, 7, 9, 3, 0, 2, 163,\r
+ 45, 39, 40,144, 43,160,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 20, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 14, Text 40x22, 9x16, complete }\r
+( 40, 21, 16, 0, 7, 8, 3, 0, 2, 167,\r
+ 45, 39, 40,144, 43,160,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 20, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 15, Text 46x22, 8x16, complete }\r
+( 46, 21, 16, 0, 8, 9, 3, 0, 2, 167,\r
+ 52, 45, 46,151, 50,150,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 23, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 16, Text 70x22, 9x16, complete }\r
+( 70, 21, 16, 0,13, 0, 3, 0, 2, 163,\r
+ 83, 69, 70,150, 75, 21,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 35, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 17, Text 80x22, 8x16, complete }\r
+( 80, 21, 16, 0,14, 1, 3, 0, 2, 163,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 40, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 18, Text 80x22, 9x16, complete }\r
+( 80, 21, 16, 0,14, 0, 3, 0, 2, 167,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 40, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 19, Text 90x22, 8x16, complete }\r
+( 90, 21, 16, 0,16, 1, 3, 0, 2, 167,\r
+ 107, 89, 90,142, 95,138,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 45, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 20, Text 36x25, 9x16, complete }\r
+( 36, 24, 16, 0, 8, 8, 3, 0, 2, 99,\r
+ 40, 35, 36,138, 38,192,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 18, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 21, Text 40x25, 8x16, complete }\r
+( 40, 24, 16, 0, 8, 9, 3, 0, 2, 99,\r
+ 45, 39, 40,144, 43,160,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 20, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 22, Text 40x25, 9x16, complete }\r
+( 40, 24, 16, 0, 8, 8, 3, 0, 2, 103,\r
+ 45, 39, 40,144, 43,160,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 20, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 23, Text 46x25, 8x16, complete }\r
+( 46, 24, 16, 0,10, 9, 3, 0, 2, 103,\r
+ 52, 45, 46,151, 50,150,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 23, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 24, Text 70x25, 9x16, complete }\r
+( 70, 24, 16, 0,14, 0, 3, 0, 2, 99,\r
+ 83, 69, 70,150, 75, 21,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 35, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 25, Text 80x25, 8x16, complete }\r
+( 80, 24, 16, 0,16, 1, 3, 0, 2, 99,\r
+ 95, 79, 80,130, 85,129,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 40, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 26, Text 80x25, 9x16, standard }\r
+( 80, 24, 16, 0,16, 0, 3, 0, 2, 103,\r
+ 95, 79, 80,130, 85,129,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 40, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 27, Text 90x25, 8x16, complete }\r
+( 90, 24, 16, 0, 18 , 1, 3, 0, 2, 103,\r
+ 107, 89, 90,142, 95,138,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 45, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 28, Text 46x29, 8x16, complete }\r
+( 46, 28, 14, 0,11, 9, 3, 0, 2, 103,\r
+ 52, 45, 46,151, 50,150,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 23, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 29, Text 70x29, 9x14, complete }\r
+( 70, 28, 14, 0, 16 , 0, 3, 0, 2, 99,\r
+ 83, 69, 70,150, 75, 21,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 35, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 30, Text 80x29, 8x14, complete }\r
+( 80, 28, 14, 0, 19 , 1, 3, 0, 2, 99,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 40, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 31, Text 80x29, 9x14, complete }\r
+( 80, 28, 14, 0, 19 , 0, 3, 0, 2, 103,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 40, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 32, Text 90x29, 8x14, complete }\r
+( 90, 28, 14, 0, 21 , 1, 3, 0, 2, 103,\r
+ 107, 89, 90,142, 95,138,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 45, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 33, Text 70x30, 9x16, complete }\r
+( 70, 29, 16, 0, 17 , 0, 3, 0, 2, 227,\r
+ 83, 69, 70,150, 75, 21, 11, 62, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 35, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 34, Text 80x30, 8x16, complete }\r
+( 80, 29, 16, 0, 19 , 1, 3, 0, 2, 227,\r
+ 95, 79, 80,130, 85,129, 11, 62, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 40, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 35, Text 80x30, 9x16, complete }\r
+( 80, 29, 16, 0, 19 , 0, 3, 0, 2, 231,\r
+ 95, 79, 80,130, 85,129, 11, 62, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 40, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 36, Text 90x30, 8x16 ,complete }\r
+( 90, 29, 16, 0, 22 , 1, 3, 0, 2, 231,\r
+ 107, 89, 90,142, 95,138, 11, 62, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 45, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 37, Text 70x34, 9x14, complete }\r
+( 70, 33, 14, 0, 19 , 0, 3, 0, 2, 227,\r
+ 83, 69, 70,150, 75, 21, 7, 62, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 35, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 38, Text 80x34, 8x14, complete }\r
+( 80, 33, 14, 0, 22 , 1, 3, 0, 2, 227,\r
+ 95, 79, 80,130, 85,129, 7, 62, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 40, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 39, Text 80x34, 9x14, complete }\r
+( 80, 33, 14, 0, 22 , 0, 3, 0, 2, 231,\r
+ 95, 79, 80,130, 85,129, 7, 62, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 40, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 40, Text 90x34, 8x14, complete }\r
+( 90, 33, 14, 0, 24 , 1, 3, 0, 2, 231,\r
+ 107, 89, 90,142, 95,138, 7, 62, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 45, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 41, Text 70x44, 9x8, complete }\r
+( 70, 43, 8, 0,25, 0, 3, 0, 2, 163,\r
+ 83, 69, 70,150, 75, 21,193, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,133,135, 95, 35, 15,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 42, Text 80x44, 8x8, complete }\r
+( 80, 43, 8, 0,28, 1, 3, 0, 2, 163,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,133,135, 95, 40, 15,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 43, Text 80x44, 9x8, complete }\r
+( 80, 43, 8, 0,28, 0, 3, 0, 2, 167,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,133,135, 95, 40, 15,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 44, Text 90x44, 8x8, complete }\r
+( 90, 43, 8, 0,31, 1, 3, 0, 2, 167,\r
+ 107, 89, 90,142, 95,138,193, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,133,135, 95, 45, 15,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 45, Text 70x50, 9x8, complete }\r
+( 70, 49, 8, 0,28, 0, 3, 0, 2, 99,\r
+ 83, 69, 70,150, 75, 21,191, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,156,142,143, 35, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 46, Text 80x50, 8x8, complete }\r
+( 80, 49, 8, 0,32, 1, 3, 0, 2, 99,\r
+ 95, 79, 80,130, 85,129,191, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,156,142,143, 40, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 47, Text 80x50, 9x8, standard }\r
+( 80, 49, 8, 0,32, 0, 3, 0, 2, 103,\r
+ 95, 79, 80,130, 85,129,191, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,156,142,143, 40, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 48, Text 90x50, 8x8, complete }\r
+( 90, 49, 8, 0, 36 , 1, 3, 0, 2, 103,\r
+ 107, 89, 90,142, 95,138,191, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,156,142,143, 45, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 49, Text 70x60, 9x8, complete }\r
+( 70, 59, 8, 0, 33 , 0, 3, 0, 2, 227,\r
+ 83, 69, 70,150, 75, 21, 11, 62, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,234,172,223, 35, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 50, Text 80x60, 8x8, complete }\r
+( 80, 59, 8, 0, 38 , 1, 3, 0, 2, 227,\r
+ 95, 79, 80,130, 85,129, 11, 62, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,234,172,223, 40, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 51, Text 80x60, 9x8, complete }\r
+( 80, 59, 8, 0, 38 , 0, 3, 0, 2, 231,\r
+ 95, 79, 80,130, 85,129, 11, 62, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,234,172,223, 40, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 52, Text 90x60, 8x8, complete }\r
+( 90, 59, 8,128, 42 , 1, 3, 0, 2, 231,\r
+ 107, 89, 90,142, 95,138, 11, 62, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,234,172,223, 45, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255)\r
+\r
+);\r
+\r
+begin\r
+ asm\r
+ movzx eax,vmode\r
+ shl eax,6\r
+ lea esi,[vmode_data]\r
+ add esi,eax\r
+ mov dx,3cch\r
+ in al,dx\r
+ mov dl,0d4h\r
+ test al,1\r
+ jnz @@1\r
+ mov dl,0b4h\r
+ @@1: add dx,6\r
+ in al,dx\r
+ xor al,al\r
+ mov dx,3c0h\r
+ out dx,al\r
+ mov ax,100h\r
+ mov dx,3c4h\r
+ out dx,ax\r
+ add esi,5\r
+ mov ecx,4\r
+ mov al,1\r
+ mov dx,3c4h\r
+ @@2: mov ah,[esi]\r
+ inc esi\r
+ out dx,ax\r
+ inc al\r
+ loop @@2\r
+ mov al,[esi]\r
+ inc esi\r
+ mov dx,3c2h\r
+ out dx,al\r
+ mov dx,3c4h\r
+ mov ax,300h\r
+ out dx,ax\r
+ mov dx,3cch\r
+ in al,dx\r
+ mov dl,0d4h\r
+ test al,1\r
+ jnz @@3\r
+ mov dl,0b4h\r
+ @@3: movzx edi,SEG0040\r
+ shl edi,4\r
+ add edi,63h\r
+ shl edi,4\r
+ mov [edi],dx\r
+ mov al,11h\r
+ out dx,al\r
+ inc dx\r
+ mov ah,al\r
+ in al,dx\r
+ dec dx\r
+ xchg al,ah\r
+ and ah,7fh\r
+ out dx,ax\r
+ mov ecx,25\r
+ xor al,al\r
+ @@4: mov ah,[esi]\r
+ inc esi\r
+ out dx,ax\r
+ inc al\r
+ loop @@4\r
+ add dx,6\r
+ in al,dx\r
+ xor ah,ah\r
+ mov ecx,20\r
+ mov dx,3c0h\r
+ @@5: mov al,ah\r
+ out dx,al\r
+ inc ah\r
+ mov al,[esi]\r
+ inc esi\r
+ out dx,al\r
+ loop @@5\r
+ xor al,al\r
+ mov ecx,9\r
+ mov dx,3ceh\r
+ @@6: mov ah,[esi]\r
+ inc esi\r
+ out dx,ax\r
+ inc al\r
+ loop @@6\r
+ mov dx,3c0h\r
+ mov al,32\r
+ out dx,al\r
+ end;\r
+\r
+ MEM[SEG0040:$4a] := vmode_data[vmode,0];\r
+ MEM[SEG0040:$84] := vmode_data[vmode,1];\r
+ MEM[SEG0040:$85] := vmode_data[vmode,2];\r
+ MEM[SEG0040:$4c] := vmode_data[vmode,3];\r
+ MEM[SEG0040:$4d] := vmode_data[vmode,4];\r
+ FillChar(MEM[SEG0040:$4e],17,0);\r
+\r
+ MEM[SEG0040:$60] := vmode_data[vmode,20];\r
+ MEM[SEG0040:$61] := vmode_data[vmode,21];\r
+ MEM[SEG0040:$62] := 0;\r
+\r
+ Case vmode_data[vmode,2] of\r
+ 8: asm mov ah,11h; mov al,2; xor bx,bx; int 10h end;\r
+ 14: asm mov ah,11h; mov al,1; xor bx,bx; int 10h end;\r
+ 16: asm mov ah,11h; mov al,4; xor bx,bx; int 10h end;\r
+ end;\r
+\r
+ initialize;\r
+ CleanScreen(Ptr(v_seg,v_ofs)^);\r
+end;\r
+\r
+begin\r
+ initialize;\r
+end.\r
--- /dev/null
+/* Output from p2c 1.21alpha-07.Dec.93, the Pascal-to-C translator */
+/* From input file "a2player.pas" */
+
+
+#include <p2c/p2c.h>
+
+
+#define A2PLAYER_G
+#include "a2player.h"
+
+
+unsigned short opl3port = 0x388;
+short error_code = 0;
+uchar current_order = 0, current_pattern = 0, current_line = 0, tempo = 50,
+ speed = 6;
+unsigned short macro_speedup = 1;
+boolean irq_mode = false;
+uchar max_patterns = 128;
+boolean fast_forward = false;
+uchar overall_volume = 63, global_volume = 63;
+unsigned short song_timer = 0, song_timer_tenths = 0;
+Void (*external_irq_hook) PV() = NULL;
+long _delay_counter = 0;
+unsigned short irq_freq = 50;
+boolean irq_initialized = false, timer_fix = true, pattern_break = false,
+ pattern_delay = false;
+uchar next_line = 0;
+tPLAY_STATUS play_status = isStopped;
+boolean replay_forbidden = true, force_macro_keyon = false;
+
+#ifndef TIMERINT_H
+#include "timerint.h"
+#endif
+
+#ifndef PARSERIO_H
+#include "parserio.h"
+#endif
+
+
+typedef unsigned short tTRACK_ADDR[20];
+
+
+#define keyoff_flag 0x80
+#define fixed_note_flag 0x90
+#define pattern_loop_flag 0xe0
+#define pattern_break_flag 0xf0
+
+
+typedef struct _REC_porta_table {
+ unsigned short freq;
+ uchar speed;
+} _REC_porta_table;
+
+typedef struct _REC_porta_table2 {
+ unsigned short freq;
+ uchar speed;
+} _REC_porta_table2;
+
+typedef struct _REC_arpgg_table {
+ uchar state, note, add1, add2;
+} _REC_arpgg_table;
+
+typedef struct _REC_arpgg_table2 {
+ uchar state, note, add1, add2;
+} _REC_arpgg_table2;
+
+typedef struct _REC_vibr_table {
+ uchar pos, speed, depth;
+ boolean fine;
+} _REC_vibr_table;
+
+typedef struct _REC_vibr_table2 {
+ uchar pos, speed, depth;
+ boolean fine;
+} _REC_vibr_table2;
+
+typedef struct _REC_trem_table {
+ uchar pos, speed, depth;
+ boolean fine;
+} _REC_trem_table;
+
+typedef struct _REC_trem_table2 {
+ uchar pos, speed, depth;
+ boolean fine;
+} _REC_trem_table2;
+
+typedef struct _REC_tremor_table {
+ short pos;
+ unsigned short volume;
+} _REC_tremor_table;
+
+typedef struct _REC_tremor_table2 {
+ short pos;
+ unsigned short volume;
+} _REC_tremor_table2;
+
+typedef struct _REC_macro_table {
+ unsigned short fmreg_pos, arpg_pos, vib_pos;
+ uchar fmreg_count, fmreg_duration, arpg_count, vib_count, vib_delay;
+ boolean vib_paused;
+ uchar fmreg_table, arpg_table, vib_table, arpg_note;
+ unsigned short vib_freq;
+} _REC_macro_table;
+
+
+Static uchar _panning[3] = {
+ 0x30, 0x10, 0x20
+};
+
+Static uchar _instr[12] = {
+ 0x20, 0x20, 0x40, 0x40, 0x60, 0x60, 0x80, 0x80, 0xe0, 0xe0, 0xc0, 0xbd
+};
+
+/* 01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 */
+
+Static tTRACK_ADDR _chmm_n = {
+ 0x3, 0, 0x4, 0x1, 0x5, 0x2, 0x6, 0x7, 0x8, 0x103, 0x100, 0x104, 0x101,
+ 0x105, 0x102, 0x106, 0x107, 0x108, BYTE_NULL, BYTE_NULL
+};
+
+Static tTRACK_ADDR _chmm_m = {
+ 0x8, 0, 0x9, 0x1, 0xa, 0x2, 0x10, 0x11, 0x12, 0x108, 0x100, 0x109, 0x101,
+ 0x10a, 0x102, 0x110, 0x111, 0x112, BYTE_NULL, BYTE_NULL
+};
+
+Static tTRACK_ADDR _chmm_c = {
+ 0xb, 0x3, 0xc, 0x4, 0xd, 0x5, 0x13, 0x14, 0x15, 0x10b, 0x103, 0x10c, 0x104,
+ 0x10d, 0x105, 0x113, 0x114, 0x115, BYTE_NULL, BYTE_NULL
+};
+
+/* BD SD TT TC HH */
+
+Static tTRACK_ADDR _chpm_n = {
+ 0x3, 0, 0x4, 0x1, 0x5, 0x2, 0x106, 0x107, 0x108, 0x103, 0x100, 0x104, 0x101,
+ 0x105, 0x102, 0x6, 0x7, 0x8, 0x8, 0x7
+};
+
+Static tTRACK_ADDR _chpm_m = {
+ 0x8, 0, 0x9, 0x1, 0xa, 0x2, 0x110, 0x111, 0x112, 0x108, 0x100, 0x109, 0x101,
+ 0x10a, 0x102, 0x10, 0x14, 0x12, 0x15, 0x11
+};
+
+Static tTRACK_ADDR _chpm_c = {
+ 0xb, 0x3, 0xc, 0x4, 0xd, 0x5, 0x113, 0x114, 0x115, 0x10b, 0x103, 0x10c,
+ 0x104, 0x10d, 0x105, 0x13, BYTE_NULL, BYTE_NULL, BYTE_NULL, BYTE_NULL
+};
+
+Static tTRACK_ADDR _chan_n, _chan_m, _chan_c;
+Static uchar def_vibtrem_speed_factor = 1, def_vibtrem_table_size = 32;
+
+Static uchar def_vibtrem_table[256] = {
+ 0, 24, 49, 74, 97, 120, 141, 161, 180, 197, 212, 224, 235, 244, 250, 253,
+ 255, 253, 250, 244, 235, 224, 212, 197, 180, 161, 141, 120, 97, 74, 49, 24,
+ 0, 24, 49, 74, 97, 120, 141, 161, 180, 197, 212, 224, 235, 244, 250, 253,
+ 255, 253, 250, 244, 235, 224, 212, 197, 180, 161, 141, 120, 97, 74, 49, 24,
+ 0, 24, 49, 74, 97, 120, 141, 161, 180, 197, 212, 224, 235, 244, 250, 253,
+ 255, 253, 250, 244, 235, 224, 212, 197, 180, 161, 141, 120, 97, 74, 49, 24,
+ 0, 24, 49, 74, 97, 120, 141, 161, 180, 197, 212, 224, 235, 244, 250, 253,
+ 255, 253, 250, 244, 235, 224, 212, 197, 180, 161, 141, 120, 97, 74, 49, 24,
+ 0, 24, 49, 74, 97, 120, 141, 161, 180, 197, 212, 224, 235, 244, 250, 253,
+ 255, 253, 250, 244, 235, 224, 212, 197, 180, 161, 141, 120, 97, 74, 49, 24,
+ 0, 24, 49, 74, 97, 120, 141, 161, 180, 197, 212, 224, 235, 244, 250, 253,
+ 255, 253, 250, 244, 235, 224, 212, 197, 180, 161, 141, 120, 97, 74, 49, 24,
+ 0, 24, 49, 74, 97, 120, 141, 161, 180, 197, 212, 224, 235, 244, 250, 253,
+ 255, 253, 250, 244, 235, 224, 212, 197, 180, 161, 141, 120, 97, 74, 49, 24,
+ 0, 24, 49, 74, 97, 120, 141, 161, 180, 197, 212, 224, 235, 244, 250, 253,
+ 255, 253, 250, 244, 235, 224, 212, 197, 180, 161, 141, 120, 97, 74, 49, 24
+/* p2c: a2player.pas, line 484:
+ * Note: Line breaker spent 0.0 seconds, 5000 tries on line 167 [251] */
+};
+
+Static uchar vibtrem_speed_factor, vibtrem_table_size;
+Static uchar vibtrem_table[256];
+
+Static tFM_PARAMETER_TABLE fmpar_table[20];
+Static boolean volume_lock[20];
+Static unsigned short volume_table[20];
+Static unsigned short vscale_table[20];
+Static boolean peak_lock[20];
+Static boolean pan_lock[20];
+Static tADTRACK2_EVENT event_table[20];
+Static uchar voice_table[20];
+Static uchar modulator_vol[20];
+Static uchar carrier_vol[20];
+Static unsigned short freq_table[20];
+Static unsigned short effect_table[20];
+Static unsigned short effect_table2[20];
+Static uchar fslide_table[20];
+Static uchar fslide_table2[20];
+Static unsigned short glfsld_table[20];
+Static unsigned short glfsld_table2[20];
+Static _REC_porta_table porta_table[20];
+Static _REC_porta_table2 porta_table2[20];
+Static _REC_arpgg_table arpgg_table[20];
+Static _REC_arpgg_table2 arpgg_table2[20];
+Static _REC_vibr_table vibr_table[20];
+Static _REC_vibr_table2 vibr_table2[20];
+Static _REC_trem_table trem_table[20];
+Static _REC_trem_table2 trem_table2[20];
+Static uchar retrig_table[20];
+Static uchar retrig_table2[20];
+Static _REC_tremor_table tremor_table[20];
+Static _REC_tremor_table2 tremor_table2[20];
+Static uchar panning_table[20];
+Static unsigned short last_effect[20];
+Static unsigned short last_effect2[20];
+Static uchar volslide_type[20];
+Static boolean event_new[20];
+Static uchar notedel_table[20];
+Static uchar notecut_table[20];
+Static short ftune_table[20];
+Static boolean keyoff_loop[20];
+Static _REC_macro_table macro_table[20];
+
+Static uchar loopbck_table[20];
+Static uchar loop_table[20][256];
+Static uchar misc_register;
+Static uchar current_tremolo_depth = 0, current_vibrato_depth = 0;
+
+Static boolean speed_update, lockvol, panlock, lockVP;
+Static uchar tremolo_depth, vibrato_depth;
+Static boolean volume_scaling, percussion_mode;
+Static uchar last_order;
+Static boolean reset_chan[20];
+/* p2c: a2player.pas, line 484:
+ * Warning: Expected BEGIN, found 'assembler' [227] */
+
+
+extern Void opl2out PP((int reg, int data));
+/* p2c: a2player.pas, line 485: Warning: Expected END, found 'asm' [227] */
+/* p2c: a2player.pas, line 504:
+ * Warning: Expected a '.', found PROCEDURE [227] */
+/* p2c: a2player.pas, line 504:
+ * Warning: Junk at end of input file ignored [277] */
+
+
+
+
+/* End. */
--- /dev/null
+/* Header for module A2player, generated by p2c 1.21alpha-07.Dec.93 */
+#ifndef A2PLAYER_H
+#define A2PLAYER_H
+
+
+#ifdef A2PLAYER_G
+# define vextern
+#else
+# define vextern extern
+#endif
+
+
+#define MAX_IRQ_FREQ 1000
+
+
+#define BYTE_NULL 0xff
+
+#define WORD_NULL 0xffffL
+/* p2c: typconst.inc, line 4: Warning: Mismatched '$' signs [241] */
+
+#define DWORD_NULL 0
+/* p2c: typconst.inc, line 4:
+ * Warning: Expected a semicolon, found 'ffffffff' [227] */
+
+
+typedef uchar tCHAR8x8[256][8];
+typedef uchar tCHAR8x16[256][16];
+
+
+typedef struct tRGB {
+ uchar r, g, b;
+} tRGB;
+
+typedef tRGB tRGB_PALETTE[256];
+
+
+#define ef_Arpeggio 0
+#define ef_FSlideUp 1
+#define ef_FSlideDown 2
+#define ef_TonePortamento 3
+#define ef_Vibrato 4
+#define ef_TPortamVolSlide 5
+#define ef_VibratoVolSlide 6
+#define ef_FSlideUpFine 7
+#define ef_FSlideDownFine 8
+#define ef_SetModulatorVol 9
+#define ef_VolSlide 10
+#define ef_PositionJump 11
+#define ef_SetInsVolume 12
+#define ef_PatternBreak 13
+#define ef_SetTempo 14
+#define ef_SetSpeed 15
+#define ef_TPortamVSlideFine 16
+#define ef_VibratoVSlideFine 17
+#define ef_SetCarrierVol 18
+#define ef_SetWaveform 19
+#define ef_VolSlideFine 20
+#define ef_RetrigNote 21
+#define ef_Tremolo 22
+#define ef_Tremor 23
+#define ef_ArpggVSlide 24
+#define ef_ArpggVSlideFine 25
+#define ef_MultiRetrigNote 26
+#define ef_FSlideUpVSlide 27
+#define ef_FSlideDownVSlide 28
+#define ef_FSlUpFineVSlide 29
+#define ef_FSlDownFineVSlide 30
+#define ef_FSlUpVSlF 31
+#define ef_FSlDownVSlF 32
+#define ef_FSlUpFineVSlF 33
+#define ef_FSlDownFineVSlF 34
+#define ef_Extended 35
+#define ef_Extended2 36
+#define ef_SetGlobalVolume 37
+#define ef_SwapArpeggio 38
+#define ef_SwapVibrato 39
+#define ef_ForceInsVolume 40
+#define ef_Extended3 41
+#define ef_ExtraFineArpeggio 42
+#define ef_ExtraFineVibrato 43
+#define ef_ExtraFineTremolo 44
+#define ef_SetCustomSpeedTab 45
+#define ef_GlobalFSlideUp 46
+#define ef_GlobalFSlideDown 47
+#define ef_ex_SetTremDepth 0
+#define ef_ex_SetVibDepth 1
+#define ef_ex_SetAttckRateM 2
+#define ef_ex_SetDecayRateM 3
+#define ef_ex_SetSustnLevelM 4
+#define ef_ex_SetRelRateM 5
+#define ef_ex_SetAttckRateC 6
+#define ef_ex_SetDecayRateC 7
+#define ef_ex_SetSustnLevelC 8
+#define ef_ex_SetRelRateC 9
+#define ef_ex_SetFeedback 10
+#define ef_ex_SetPanningPos 11
+#define ef_ex_PatternLoop 12
+#define ef_ex_PatternLoopRec 13
+#define ef_ex_MacroKOffLoop 14
+#define ef_ex_ExtendedCmd 15
+#define ef_ex_cmd_RSS 0
+#define ef_ex_cmd_ResetVol 1
+#define ef_ex_cmd_LockVol 2
+#define ef_ex_cmd_UnlockVol 3
+#define ef_ex_cmd_LockVP 4
+#define ef_ex_cmd_UnlockVP 5
+#define ef_ex_cmd_VSlide_mod 6
+#define ef_ex_cmd_VSlide_car 7
+#define ef_ex_cmd_VSlide_def 8
+#define ef_ex_cmd_LockPan 9
+#define ef_ex_cmd_UnlockPan 10
+#define ef_ex_cmd_VibrOff 11
+#define ef_ex_cmd_TremOff 12
+#define ef_ex_cmd_FVib_FGFS 13
+#define ef_ex_cmd_FTrm_XFGFS 14
+#define ef_ex_cmd_NoRestart 15
+#define ef_ex2_PatDelayFrame 0
+#define ef_ex2_PatDelayRow 1
+#define ef_ex2_NoteDelay 2
+#define ef_ex2_NoteCut 3
+#define ef_ex2_FineTuneUp 4
+#define ef_ex2_FineTuneDown 5
+#define ef_ex2_GlVolSlideUp 6
+#define ef_ex2_GlVolSlideDn 7
+#define ef_ex2_GlVolSlideUpF 8
+#define ef_ex2_GlVolSlideDnF 9
+#define ef_ex2_GlVolSldUpXF 10
+#define ef_ex2_GlVolSldDnXF 11
+#define ef_ex2_VolSlideUpXF 12
+#define ef_ex2_VolSlideDnXF 13
+#define ef_ex2_FreqSlideUpXF 14
+#define ef_ex2_FreqSlideDnXF 15
+#define ef_ex3_SetConnection 0
+#define ef_ex3_SetMultipM 1
+#define ef_ex3_SetKslM 2
+#define ef_ex3_SetTremoloM 3
+#define ef_ex3_SetVibratoM 4
+#define ef_ex3_SetKsrM 5
+#define ef_ex3_SetSustainM 6
+#define ef_ex3_SetMultipC 7
+#define ef_ex3_SetKslC 8
+#define ef_ex3_SetTremoloC 9
+#define ef_ex3_SetVibratoC 10
+#define ef_ex3_SetKsrC 11
+#define ef_ex3_SetSustainC 12
+
+
+#define ef_fix1 0x80
+#define ef_fix2 0x90
+
+
+
+typedef struct tFM_INST_DATA {
+ uchar AM_VIB_EG_modulator, AM_VIB_EG_carrier, KSL_VOLUM_modulator,
+ KSL_VOLUM_carrier, ATTCK_DEC_modulator, ATTCK_DEC_carrier,
+ SUSTN_REL_modulator, SUSTN_REL_carrier, WAVEFORM_modulator,
+ WAVEFORM_carrier, FEEDBACK_FM;
+} tFM_INST_DATA;
+
+
+typedef struct tADTRACK2_INS {
+ tFM_INST_DATA fm_data;
+ uchar panning;
+ short fine_tune;
+ uchar perc_voice;
+} tADTRACK2_INS;
+
+
+typedef struct tARPEGGIO_TABLE {
+ uchar length, speed, loop_begin, loop_length, keyoff_pos;
+ uchar data[255];
+} tARPEGGIO_TABLE;
+
+
+typedef struct tVIBRATO_TABLE {
+ uchar length, speed, delay, loop_begin, loop_length, keyoff_pos;
+ short data[255];
+} tVIBRATO_TABLE;
+
+
+typedef struct tREGISTER_TABLE_DEF {
+ tFM_INST_DATA fm_data;
+/* p2c: a2player.pas, line 192:
+ * Warning: Symbol 'SMALLINT' is not defined [221] */
+ long freq_slide;
+ uchar panning, duration;
+} tREGISTER_TABLE_DEF;
+
+typedef long Smallint;
+
+
+typedef struct tREGISTER_TABLE {
+ uchar length, loop_begin, loop_length, keyoff_pos, arpeggio_table,
+ vibrato_table;
+ tREGISTER_TABLE_DEF data[255];
+} tREGISTER_TABLE;
+
+
+typedef struct tMACRO_TABLE {
+ tARPEGGIO_TABLE arpeggio;
+ tVIBRATO_TABLE vibrato;
+} tMACRO_TABLE;
+
+
+typedef struct tFM_PARAMETER_TABLE {
+ struct {
+ uchar attck, dec, sustn, rel, wform;
+ } adsrw_car, adsrw_mod;
+ uchar connect, feedb, multipM, kslM, tremM, vibrM, ksrM, sustM, multipC,
+ kslC, tremC, vibrC, ksrC, sustC;
+} tFM_PARAMETER_TABLE;
+
+
+typedef struct tADTRACK2_EVENT {
+ uchar note, instr_def, effect_def, effect, effect_def2, effect2;
+} tADTRACK2_EVENT;
+
+
+typedef boolean tDIS_FMREG_COL[28];
+
+
+typedef struct tFIXED_SONGDATA {
+ Char songname[43];
+ Char composer[43];
+ Char instr_names[255][43];
+ tADTRACK2_INS instr_data[255];
+ tREGISTER_TABLE instr_macros[255];
+ tMACRO_TABLE macro_table[255];
+ uchar pattern_order[0x80];
+ uchar tempo, speed, common_flag;
+ unsigned short patt_len;
+ uchar nm_tracks;
+ unsigned short macro_speedup;
+ uchar flag_4op;
+ uchar lock_flags[20];
+ Char pattern_names[0x80][43];
+ tDIS_FMREG_COL dis_fmreg_col[255];
+} tFIXED_SONGDATA;
+
+
+typedef enum {
+ isPlaying, isPaused, isStopped
+} tPLAY_STATUS;
+
+
+typedef tADTRACK2_EVENT tVARIABLE_DATA[8][20][0x100];
+
+
+typedef tVARIABLE_DATA tPATTERN_DATA[16];
+
+
+typedef uchar tDUMMY_BUFF[655350L];
+
+
+typedef struct tOLD_ADTRACK2_INS {
+ tFM_INST_DATA fm_data;
+ uchar panning;
+ short fine_tune;
+} tOLD_ADTRACK2_INS;
+
+
+typedef struct tOLD_FIXED_SONGDATA {
+ Char songname[43];
+ Char composer[43];
+ Char instr_names[250][33];
+ tOLD_ADTRACK2_INS instr_data[250];
+ uchar pattern_order[0x80];
+ uchar tempo, speed, common_flag;
+} tOLD_FIXED_SONGDATA;
+
+
+typedef struct tOLD_CHUNK {
+ uchar note, instr_def, effect_def, effect;
+} tOLD_CHUNK;
+
+
+typedef tADTRACK2_EVENT tCHUNK;
+
+
+typedef tOLD_CHUNK tOLD_VARIABLE_DATA1[0x10][0x40][9];
+
+
+typedef tOLD_CHUNK tOLD_VARIABLE_DATA2[8][18][0x40];
+
+
+typedef long tByteSet[9];
+
+
+#define INSTRUMENT_SIZE (sizeof(tADTRACK2_INS))
+#define CHUNK_SIZE (sizeof(tADTRACK2_EVENT))
+#define PATTERN_SIZE (CHUNK_SIZE * 5120)
+
+
+typedef struct tDECAY_BAR {
+ short dir;
+ double lvl, max_lvl;
+} tDECAY_BAR;
+
+
+extern unsigned short opl3port;
+extern short error_code;
+extern uchar current_order, current_pattern, current_line, tempo, speed;
+extern unsigned short macro_speedup;
+extern boolean irq_mode;
+extern uchar max_patterns;
+extern boolean fast_forward;
+extern uchar overall_volume, global_volume;
+extern unsigned short song_timer, song_timer_tenths;
+
+vextern unsigned short timer_temp, timer_det;
+vextern long ticks, tick0, tickD, tickXF;
+vextern boolean limit_exceeded;
+
+vextern double time_playing;
+vextern tVARIABLE_DATA *pattdata;
+vextern tFIXED_SONGDATA songdata;
+vextern tOLD_FIXED_SONGDATA old_songdata;
+vextern tOLD_VARIABLE_DATA1 old_hash_buffer;
+vextern tOLD_VARIABLE_DATA2 hash_buffer;
+vextern uchar buffer[sizeof(tVARIABLE_DATA)];
+extern Void (*external_irq_hook) PV();
+extern long _delay_counter;
+extern unsigned short irq_freq;
+extern boolean irq_initialized, timer_fix, pattern_break, pattern_delay;
+extern uchar next_line;
+extern tPLAY_STATUS play_status;
+extern boolean replay_forbidden, force_macro_keyon;
+vextern tDECAY_BAR decay_bar[96];
+
+
+extern Void start_playing PV();
+extern Void set_overall_volume PP((int level));
+extern Void stop_playing PV();
+extern Void init_old_songdata PV();
+extern Void init_songdata PV();
+extern Void init_irq PV();
+extern Void done_irq PV();
+extern Void get_chunk PP((int pattern, int line, int channel,
+ tADTRACK2_EVENT *chunk));
+extern Void put_chunk PP((int pattern, int line, int channel,
+ tADTRACK2_EVENT chunk));
+extern Void count_order PP((uchar *entries));
+extern Void timer_poll_proc PV();
+extern Void opl3exp PP((int data));
+
+extern short calc_following_order PP((int order));
+extern Char *asciiz_string PP((Char *Result, Char *str));
+
+
+#undef vextern
+
+#endif /*A2PLAYER_H*/
+
+/* End. */
--- /dev/null
+unit A2player;
+interface
+
+const
+ MAX_IRQ_FREQ = 1000;
+
+{$i typconst.inc}
+
+const
+ ef_Arpeggio = 0;
+ ef_FSlideUp = 1;
+ ef_FSlideDown = 2;
+ ef_TonePortamento = 3;
+ ef_Vibrato = 4;
+ ef_TPortamVolSlide = 5;
+ ef_VibratoVolSlide = 6;
+ ef_FSlideUpFine = 7;
+ ef_FSlideDownFine = 8;
+ ef_SetModulatorVol = 9;
+ ef_VolSlide = 10;
+ ef_PositionJump = 11;
+ ef_SetInsVolume = 12;
+ ef_PatternBreak = 13;
+ ef_SetTempo = 14;
+ ef_SetSpeed = 15;
+ ef_TPortamVSlideFine = 16;
+ ef_VibratoVSlideFine = 17;
+ ef_SetCarrierVol = 18;
+ ef_SetWaveform = 19;
+ ef_VolSlideFine = 20;
+ ef_RetrigNote = 21;
+ ef_Tremolo = 22;
+ ef_Tremor = 23;
+ ef_ArpggVSlide = 24;
+ ef_ArpggVSlideFine = 25;
+ ef_MultiRetrigNote = 26;
+ ef_FSlideUpVSlide = 27;
+ ef_FSlideDownVSlide = 28;
+ ef_FSlUpFineVSlide = 29;
+ ef_FSlDownFineVSlide = 30;
+ ef_FSlUpVSlF = 31;
+ ef_FSlDownVSlF = 32;
+ ef_FSlUpFineVSlF = 33;
+ ef_FSlDownFineVSlF = 34;
+ ef_Extended = 35;
+ ef_Extended2 = 36;
+ ef_SetGlobalVolume = 37;
+ ef_SwapArpeggio = 38;
+ ef_SwapVibrato = 39;
+ ef_ForceInsVolume = 40;
+ ef_Extended3 = 41;
+ ef_ExtraFineArpeggio = 42;
+ ef_ExtraFineVibrato = 43;
+ ef_ExtraFineTremolo = 44;
+ ef_SetCustomSpeedTab = 45;
+ ef_GlobalFSlideUp = 46;
+ ef_GlobalFSlideDown = 47;
+ ef_ex_SetTremDepth = 0;
+ ef_ex_SetVibDepth = 1;
+ ef_ex_SetAttckRateM = 2;
+ ef_ex_SetDecayRateM = 3;
+ ef_ex_SetSustnLevelM = 4;
+ ef_ex_SetRelRateM = 5;
+ ef_ex_SetAttckRateC = 6;
+ ef_ex_SetDecayRateC = 7;
+ ef_ex_SetSustnLevelC = 8;
+ ef_ex_SetRelRateC = 9;
+ ef_ex_SetFeedback = 10;
+ ef_ex_SetPanningPos = 11;
+ ef_ex_PatternLoop = 12;
+ ef_ex_PatternLoopRec = 13;
+ ef_ex_MacroKOffLoop = 14;
+ ef_ex_ExtendedCmd = 15;
+ ef_ex_cmd_RSS = 0;
+ ef_ex_cmd_ResetVol = 1;
+ ef_ex_cmd_LockVol = 2;
+ ef_ex_cmd_UnlockVol = 3;
+ ef_ex_cmd_LockVP = 4;
+ ef_ex_cmd_UnlockVP = 5;
+ ef_ex_cmd_VSlide_mod = 6;
+ ef_ex_cmd_VSlide_car = 7;
+ ef_ex_cmd_VSlide_def = 8;
+ ef_ex_cmd_LockPan = 9;
+ ef_ex_cmd_UnlockPan = 10;
+ ef_ex_cmd_VibrOff = 11;
+ ef_ex_cmd_TremOff = 12;
+ ef_ex_cmd_FVib_FGFS = 13;
+ ef_ex_cmd_FTrm_XFGFS = 14;
+ ef_ex_cmd_NoRestart = 15;
+ ef_ex2_PatDelayFrame = 0;
+ ef_ex2_PatDelayRow = 1;
+ ef_ex2_NoteDelay = 2;
+ ef_ex2_NoteCut = 3;
+ ef_ex2_FineTuneUp = 4;
+ ef_ex2_FineTuneDown = 5;
+ ef_ex2_GlVolSlideUp = 6;
+ ef_ex2_GlVolSlideDn = 7;
+ ef_ex2_GlVolSlideUpF = 8;
+ ef_ex2_GlVolSlideDnF = 9;
+ ef_ex2_GlVolSldUpXF = 10;
+ ef_ex2_GlVolSldDnXF = 11;
+ ef_ex2_VolSlideUpXF = 12;
+ ef_ex2_VolSlideDnXF = 13;
+ ef_ex2_FreqSlideUpXF = 14;
+ ef_ex2_FreqSlideDnXF = 15;
+ ef_ex3_SetConnection = 0;
+ ef_ex3_SetMultipM = 1;
+ ef_ex3_SetKslM = 2;
+ ef_ex3_SetTremoloM = 3;
+ ef_ex3_SetVibratoM = 4;
+ ef_ex3_SetKsrM = 5;
+ ef_ex3_SetSustainM = 6;
+ ef_ex3_SetMultipC = 7;
+ ef_ex3_SetKslC = 8;
+ ef_ex3_SetTremoloC = 9;
+ ef_ex3_SetVibratoC = 10;
+ ef_ex3_SetKsrC = 11;
+ ef_ex3_SetSustainC = 12;
+
+const
+ ef_fix1 = $80;
+ ef_fix2 = $90;
+
+const
+ opl3port: Word = $388;
+ error_code: Integer = 0;
+ current_order: Byte = 0;
+ current_pattern: Byte = 0;
+ current_line: Byte = 0;
+ tempo: Byte = 50;
+ speed: Byte = 6;
+ macro_speedup: Word = 1;
+ irq_mode: Boolean = FALSE;
+ max_patterns: Byte = 128;
+ fast_forward: Boolean = FALSE;
+ overall_volume: Byte = 63;
+ global_volume: Byte = 63;
+
+const
+ song_timer: Word = 0;
+ song_timer_tenths: Word = 0;
+
+var
+ timer_temp,timer_det: Word;
+ ticks,tick0,tickD,
+ tickXF: Longint;
+ limit_exceeded: Boolean;
+
+type
+ tFM_INST_DATA = Record
+ AM_VIB_EG_modulator,
+ AM_VIB_EG_carrier,
+ KSL_VOLUM_modulator,
+ KSL_VOLUM_carrier,
+ ATTCK_DEC_modulator,
+ ATTCK_DEC_carrier,
+ SUSTN_REL_modulator,
+ SUSTN_REL_carrier,
+ WAVEFORM_modulator,
+ WAVEFORM_carrier,
+ FEEDBACK_FM: Byte;
+ end;
+type
+ tADTRACK2_INS = Record
+ fm_data: tFM_INST_DATA;
+ panning: Byte;
+ fine_tune: Shortint;
+ perc_voice: Byte;
+ end;
+type
+ tARPEGGIO_TABLE = Record
+ length,
+ speed,
+ loop_begin,
+ loop_length,
+ keyoff_pos: Byte;
+ data: array[1..255] of Byte;
+ end;
+type
+ tVIBRATO_TABLE = Record
+ length,
+ speed,
+ delay,
+ loop_begin,
+ loop_length,
+ keyoff_pos: Byte;
+ data: array[1..255] of Shortint;
+ end;
+type
+ tREGISTER_TABLE_DEF = Record
+ fm_data: tFM_INST_DATA;
+ freq_slide: Smallint;
+ panning: Byte;
+ duration: Byte;
+ end;
+type
+ tREGISTER_TABLE = Record
+ length,
+ loop_begin,
+ loop_length,
+ keyoff_pos,
+ arpeggio_table,
+ vibrato_table: Byte;
+ data: array[1..255] of tREGISTER_TABLE_DEF;
+ end;
+type
+ tMACRO_TABLE = Record
+ arpeggio: tARPEGGIO_TABLE;
+ vibrato: tVIBRATO_TABLE;
+ end;
+type
+ tFM_PARAMETER_TABLE = Record
+ adsrw_car,
+ adsrw_mod: Record
+ attck,dec,sustn,rel,
+ wform: Byte;
+ end;
+ connect,
+ feedb,
+ multipM,kslM,tremM,vibrM,ksrM,sustM,
+ multipC,kslC,tremC,vibrC,ksrC,sustC: Byte;
+ end;
+type
+ tADTRACK2_EVENT = Record
+ note,
+ instr_def,
+ effect_def,
+ effect,
+ effect_def2,
+ effect2: Byte;
+ end;
+
+type
+ tDIS_FMREG_COL = array[0..27] of Boolean;
+
+type
+ tFIXED_SONGDATA = Record
+ songname: String[42];
+ composer: String[42];
+ instr_names: array[1..255] of String[42];
+ instr_data: array[1..255] of tADTRACK2_INS;
+ instr_macros: array[1..255] of tREGISTER_TABLE;
+ macro_table: array[1..255] of tMACRO_TABLE;
+ pattern_order: array[0..$7f] of Byte;
+ tempo: Byte;
+ speed: Byte;
+ common_flag: Byte;
+ patt_len: Word;
+ nm_tracks: Byte;
+ macro_speedup: Word;
+ flag_4op: Byte;
+ lock_flags: array[1..20] of Byte;
+ pattern_names: array[0..$7f] of String[42];
+ dis_fmreg_col: array[1..255] of tDIS_FMREG_COL;
+ end;
+type
+ tPLAY_STATUS = (isPlaying,isPaused,isStopped);
+
+type
+ tVARIABLE_DATA = array[0..7] of
+ array[1..20] of
+ array[0..$0ff] of tADTRACK2_EVENT;
+type
+ tPATTERN_DATA = array[0..15] of tVARIABLE_DATA;
+
+type
+ tDUMMY_BUFF = array[0..PRED(655350)] of Byte;
+
+type
+ tOLD_ADTRACK2_INS = Record
+ fm_data: tFM_INST_DATA;
+ panning: Byte;
+ fine_tune: Shortint;
+ end;
+type
+ pOLD_FIXED_SONGDATA = ^tOLD_FIXED_SONGDATA;
+ tOLD_FIXED_SONGDATA = Record
+ songname: String[42];
+ composer: String[42];
+ instr_names: array[1..250] of String[32];
+ instr_data: array[1..250] of tOLD_ADTRACK2_INS;
+ pattern_order: array[0..$7f] of Byte;
+ tempo: Byte;
+ speed: Byte;
+ common_flag: Byte;
+ end;
+type
+ tOLD_CHUNK = Record
+ note: Byte;
+ instr_def: Byte;
+ effect_def: Byte;
+ effect: Byte;
+ end;
+type
+ tCHUNK = tADTRACK2_EVENT;
+
+type
+ tOLD_VARIABLE_DATA1 = array[0..$0f] of array[0..$3f] of
+ array[1..9] of tOLD_CHUNK;
+type
+ tOLD_VARIABLE_DATA2 = array[0..7] of array[1..18] of
+ array[0..$3f] of tOLD_CHUNK;
+type
+ tByteSet = Set of Byte;
+
+const
+ INSTRUMENT_SIZE = SizeOf(tADTRACK2_INS);
+ CHUNK_SIZE = SizeOf(tCHUNK);
+ PATTERN_SIZE = 20*256*CHUNK_SIZE;
+
+var
+ time_playing: Real;
+ pattdata: ^tPATTERN_DATA;
+ songdata: tFIXED_SONGDATA;
+ old_songdata: tOLD_FIXED_SONGDATA;
+ old_hash_buffer: tOLD_VARIABLE_DATA1;
+ hash_buffer: tOLD_VARIABLE_DATA2;
+ buffer: array[0..PRED(SizeOf(tVARIABLE_DATA))] of Byte;
+
+const
+ external_irq_hook: procedure = NIL;
+ _delay_counter: Longint = 0;
+ irq_freq: Word = 50;
+ irq_initialized: Boolean = FALSE;
+ timer_fix: Boolean = TRUE;
+ pattern_break: Boolean = FALSE;
+ pattern_delay: Boolean = FALSE;
+ next_line: Byte = 0;
+ play_status: tPLAY_STATUS = isStopped;
+ replay_forbidden: Boolean = TRUE;
+ force_macro_keyon: Boolean = FALSE;
+
+type
+ tDECAY_BAR = Record
+ dir: Integer;
+ lvl,max_lvl: Real;
+ end;
+var
+ decay_bar: array[1..96] of tDECAY_BAR;
+
+procedure start_playing;
+procedure set_overall_volume(level: Byte);
+procedure stop_playing;
+procedure init_old_songdata;
+procedure init_songdata;
+procedure init_irq;
+procedure done_irq;
+procedure get_chunk(pattern,line,channel: Byte; var chunk: tADTRACK2_EVENT);
+procedure put_chunk(pattern,line,channel: Byte; chunk: tADTRACK2_EVENT);
+procedure count_order(var entries: Byte);
+procedure timer_poll_proc;
+procedure opl3exp(data: Word);
+
+function calc_following_order(order: Byte): Integer;
+function asciiz_string(str: String): String;
+
+implementation
+uses DOS,TimerInt,ParserIO;
+
+const
+ _panning: array[0..2] of Byte = ($30,$10,$20);
+
+const
+ _instr: array[0..11] of Byte = ($20, $20,
+ $40, $40,
+ $60, $60,
+ $80, $80,
+ $0e0,$0e0,
+ $0c0,
+ $0bd);
+type
+ tTRACK_ADDR = array[1..20] of Word;
+
+const { 01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 }
+ _chmm_n: tTRACK_ADDR = ($003,$000,$004,$001,$005,$002,$006,$007,$008,$103,$100,$104,$101,$105,$102,$106,$107,$108,BYTE_NULL,BYTE_NULL);
+ _chmm_m: tTRACK_ADDR = ($008,$000,$009,$001,$00a,$002,$010,$011,$012,$108,$100,$109,$101,$10a,$102,$110,$111,$112,BYTE_NULL,BYTE_NULL);
+ _chmm_c: tTRACK_ADDR = ($00b,$003,$00c,$004,$00d,$005,$013,$014,$015,$10b,$103,$10c,$104,$10d,$105,$113,$114,$115,BYTE_NULL,BYTE_NULL);
+ { BD SD TT TC HH }
+ _chpm_n: tTRACK_ADDR = ($003,$000,$004,$001,$005,$002,$106,$107,$108,$103,$100,$104,$101,$105,$102,$006,$007,$008,$008,$007);
+ _chpm_m: tTRACK_ADDR = ($008,$000,$009,$001,$00a,$002,$110,$111,$112,$108,$100,$109,$101,$10a,$102,$010,$014,$012,$015,$011);
+ _chpm_c: tTRACK_ADDR = ($00b,$003,$00c,$004,$00d,$005,$113,$114,$115,$10b,$103,$10c,$104,$10d,$105,$013,BYTE_NULL,BYTE_NULL,BYTE_NULL,BYTE_NULL);
+
+var
+ _chan_n: tTRACK_ADDR;
+ _chan_m: tTRACK_ADDR;
+ _chan_c: tTRACK_ADDR;
+
+const
+ keyoff_flag = $080;
+ fixed_note_flag = $090;
+ pattern_loop_flag = $0e0;
+ pattern_break_flag = $0f0;
+
+const
+ def_vibtrem_speed_factor: Byte = 1;
+ def_vibtrem_table_size: Byte = 32;
+ def_vibtrem_table: array[0..255] of Byte = (
+ 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255,
+ 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24,
+ 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255,
+ 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24,
+ 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255,
+ 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24,
+ 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255,
+ 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24,
+ 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255,
+ 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24,
+ 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255,
+ 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24,
+ 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255,
+ 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24,
+ 0,24,49,74,97,120,141,161,180,197,212,224,235,244,250,253,255,
+ 253,250,244,235,224,212,197,180,161,141,120,97,74,49,24);
+
+var
+ vibtrem_speed_factor: Byte;
+ vibtrem_table_size: Byte;
+ vibtrem_table: array[0..255] of Byte;
+
+var
+ fmpar_table: array[1..20] of tFM_PARAMETER_TABLE;
+ volume_lock: array[1..20] of Boolean;
+ volume_table: array[1..20] of Word;
+ vscale_table: array[1..20] of Word;
+ peak_lock: array[1..20] of Boolean;
+ pan_lock: array[1..20] of Boolean;
+ event_table: array[1..20] of tADTRACK2_EVENT;
+ voice_table: array[1..20] of Byte;
+ modulator_vol: array[1..20] of Byte;
+ carrier_vol: array[1..20] of Byte;
+ freq_table: array[1..20] of Word;
+ effect_table: array[1..20] of Word;
+ effect_table2: array[1..20] of Word;
+ fslide_table: array[1..20] of Byte;
+ fslide_table2: array[1..20] of Byte;
+ glfsld_table: array[1..20] of Word;
+ glfsld_table2: array[1..20] of Word;
+ porta_table: array[1..20] of Record freq: Word; speed: Byte; end;
+ porta_table2: array[1..20] of Record freq: Word; speed: Byte; end;
+ arpgg_table: array[1..20] of Record state,note,add1,add2: Byte; end;
+ arpgg_table2: array[1..20] of Record state,note,add1,add2: Byte; end;
+ vibr_table: array[1..20] of Record pos,speed,depth: Byte; fine: Boolean; end;
+ vibr_table2: array[1..20] of Record pos,speed,depth: Byte; fine: Boolean; end;
+ trem_table: array[1..20] of Record pos,speed,depth: Byte; fine: Boolean; end;
+ trem_table2: array[1..20] of Record pos,speed,depth: Byte; fine: Boolean; end;
+ retrig_table: array[1..20] of Byte;
+ retrig_table2: array[1..20] of Byte;
+ tremor_table: array[1..20] of Record pos: Integer; volume: Word; end;
+ tremor_table2: array[1..20] of Record pos: Integer; volume: Word; end;
+ panning_table: array[1..20] of Byte;
+ last_effect: array[1..20] of Word;
+ last_effect2: array[1..20] of Word;
+ volslide_type: array[1..20] of Byte;
+ event_new: array[1..20] of Boolean;
+ notedel_table: array[1..20] of Byte;
+ notecut_table: array[1..20] of Byte;
+ ftune_table: array[1..20] of Shortint;
+ keyoff_loop: array[1..20] of Boolean;
+ macro_table: array[1..20] of Record
+ fmreg_pos,arpg_pos,vib_pos: Word;
+ fmreg_count,fmreg_duration,arpg_count,
+ vib_count,vib_delay: Byte;
+ vib_paused: Boolean;
+ fmreg_table,arpg_table,vib_table: Byte;
+ arpg_note: Byte;
+ vib_freq: Word;
+ end;
+
+ loopbck_table: array[1..20] of Byte;
+ loop_table: array[1..20,0..255] of Byte;
+ misc_register: Byte;
+
+const
+ current_tremolo_depth: Byte = 0;
+ current_vibrato_depth: Byte = 0;
+
+var
+ speed_update,lockvol,panlock,lockVP: Boolean;
+ tremolo_depth,vibrato_depth: Byte;
+ volume_scaling,percussion_mode: Boolean;
+ last_order: Byte;
+ reset_chan: array[1..20] of Boolean;
+
+procedure opl2out(reg,data: Word); assembler;
+asm
+ mov ax,reg
+ mov dx,word ptr [opl3port]
+ or ah,ah
+ jz @@1
+ add dx,2
+@@1: out dx,al
+ mov ecx,6
+@@2: in al,dx
+ loop @@2
+ inc dl
+ mov ax,data
+ out dx,al
+ dec dl
+ mov ecx,36
+@@3: in al,dx
+ loop @@3
+end;
+
+procedure opl3out(reg,data: Word); assembler;
+asm
+ mov ax,reg
+ mov dx,word ptr [opl3port]
+ or ah,ah
+ jz @@1
+ add dx,2
+@@1: out dx,al
+ inc dl
+ mov ax,data
+ out dx,al
+ dec dl
+ mov ecx,26
+@@2: in al,dx
+ loop @@2
+end;
+
+procedure opl3exp(data: Word); assembler;
+asm
+ mov ax,data
+ mov dx,word ptr [opl3port]
+ add dx,2
+ out dx,al
+ mov ecx,6
+@@1: in al,dx
+ loop @@1
+ inc dl
+ mov al,ah
+ out dx,al
+ mov ecx,36
+@@2: in al,dx
+ loop @@2
+end;
+
+const
+ FreqStart = $156;
+ FreqEnd = $2ae;
+ FreqRange = FreqEnd-FreqStart;
+
+function nFreq(note: Byte): Word; assembler;
+
+const
+ Fnum: array[0..11] of Word = (
+ $157,$16b,$181,$198,$1b0,$1ca,$1e5,$202,$220,$241,$263,$287);
+
+asm
+ push ebx
+ push ecx
+ xor ebx,ebx
+ mov al,[note]
+ xor ah,ah
+ cmp ax,12*8
+ jae @@1
+ push eax
+ mov bl,12
+ div bl
+ mov bl,ah
+ xor bh,bh
+ shl bx,1
+ pop eax
+ mov cl,12
+ div cl
+ xor ah,ah
+ shl ax,10
+ add ax,word ptr [Fnum+ebx]
+ jmp @@2
+@@1: mov ax,7
+ shl ax,10
+ add ax,FreqEnd
+@@2: pop ecx
+ pop ebx
+end;
+
+function calc_freq_shift_up(freq,shift: Word): Word; assembler;
+asm
+ push ebx
+ push ecx
+ push edx
+ mov cx,freq
+ mov ax,shift
+ mov bx,cx
+ and bx,0000001111111111b
+ mov dx,cx
+ and dx,0001110000000000b
+ add bx,ax
+ and cx,1110000000000000b
+ shr dx,10
+ cmp bx,FreqEnd
+ jb @@2
+ cmp dx,7
+ jnz @@1
+ mov bx,FreqEnd
+ jmp @@2
+@@1: sub bx,FreqRange
+ inc dx
+@@2: mov ax,cx
+ shl dx,10
+ add ax,dx
+ add ax,bx
+ pop edx
+ pop ecx
+ pop ebx
+end;
+
+function calc_freq_shift_down(freq,shift: Word): Word; assembler;
+asm
+ push ebx
+ push ecx
+ push edx
+ mov cx,freq
+ mov ax,shift
+ mov bx,cx
+ and bx,0000001111111111b
+ mov dx,cx
+ and dx,0001110000000000b
+ sub bx,ax
+ and cx,1110000000000000b
+ shr dx,10
+ cmp bx,FreqStart
+ ja @@2
+ or dx,dx
+ jnz @@1
+ mov bx,FreqStart
+ jmp @@2
+@@1: add bx,FreqRange
+ dec dx
+@@2: mov ax,cx
+ shl dx,10
+ add ax,dx
+ add ax,bx
+ pop edx
+ pop ecx
+ pop ebx
+end;
+
+function calc_vibtrem_shift(depth,position: Byte;
+ var direction: Byte): Word; assembler;
+asm
+ push ebx
+ push ecx
+ push edx
+ push edi
+ xor ebx,ebx
+ mov al,depth
+ xor ah,ah
+ mov bl,position
+ xor bh,bh
+ mov dh,bl
+ mov cl,vibtrem_table_size
+ dec cl
+ and bl,cl
+ lea edi,[vibtrem_table]
+ add edi,ebx
+ mov dl,byte ptr [edi]
+ mul dl
+ rol ax,1
+ xchg ah,al
+ and ah,1
+ mov ebx,[direction]
+ mov cl,1
+ mov [ebx],cl
+ mov dl,vibtrem_table_size
+ test dh,dl
+ jne @@1
+ mov cl,0
+ mov [ebx],cl
+@@1: pop edi
+ pop edx
+ pop ecx
+ pop ebx
+end;
+
+procedure change_freq(chan: Byte; freq: Word); assembler;
+asm
+ push ebx
+ push edx
+ xor ebx,ebx
+ mov bl,chan
+ dec ebx
+ shl ebx,1
+ mov ax,freq
+ and ax,1fffh
+ mov dx,word ptr [freq_table+ebx]
+ and dx,NOT 1fffh
+ add ax,dx
+ mov word ptr [freq_table+ebx],ax
+ xor edx,edx
+ mov dx,word ptr [_chan_n+ebx]
+ add dx,0a0h
+ push edx
+ xor edx,edx
+ mov dl,al
+ push edx
+ mov dx,word ptr [_chan_n+ebx]
+ add dx,0b0h
+ push edx
+ xor edx,edx
+ mov dl,ah
+ push edx
+ call opl3out
+ call opl3out
+ pop edx
+ pop ebx
+end;
+
+function ins_parameter(ins,param: Byte): Byte; assembler;
+asm
+ push ebx
+ push esi
+ xor ebx,ebx
+ lea esi,[songdata.instr_data]
+ mov bl,ins
+ dec ebx
+ mov eax,INSTRUMENT_SIZE
+ mul ebx
+ add esi,eax
+ mov bl,param
+ add esi,ebx
+ lodsb
+ pop esi
+ pop ebx
+end;
+
+function min(value: Word; minimum: Word): Word; assembler;
+asm
+ mov ax,value
+ cmp ax,minimum
+ jae @@1
+ mov ax,minimum
+@@1:
+end;
+
+function max(value: Word; maximum: Word): Word; assembler;
+asm
+ mov ax,value
+ cmp ax,maximum
+ jbe @@1
+ mov ax,maximum
+@@1:
+end;
+
+function asciiz_string(str: String): String;
+begin
+ If (Pos(#0,str) <> 0) then asciiz_string := Copy(str,1,Pos(#0,str)-1)
+ else asciiz_string := '';
+end;
+
+function concw(lo,hi: Byte): Word;
+begin
+ concw := lo+(hi SHL 8);
+end;
+
+procedure synchronize_song_timer;
+begin
+ song_timer := TRUNC(time_playing);
+ song_timer_tenths := TRUNC(time_playing*100) MOD 100;
+ timer_temp := song_timer_tenths;
+end;
+
+procedure change_frequency(chan: Byte; freq: Word);
+begin
+ macro_table[chan].vib_paused := TRUE;
+ change_freq(chan,freq);
+ macro_table[chan].vib_count := 1;
+ macro_table[chan].vib_pos := 0;
+ macro_table[chan].vib_freq := freq;
+ macro_table[chan].vib_paused := FALSE;
+end;
+
+function _macro_speedup: Word; assembler;
+asm
+ mov ax,macro_speedup
+ or ax,ax
+ jnz @@1
+ inc ax
+@@1:
+end;
+
+procedure update_timer(Hz: Longint);
+begin
+ _debug_str_ := 'A2PLAYER.PAS:update_timer';
+ If (Hz = 0) then begin TimerSetup(18); EXIT end
+ else tempo := Hz;
+ If (tempo = 18) and timer_fix then IRQ_freq := TRUNC((tempo+0.2)*20)
+ else IRQ_freq := 250;
+ While (IRQ_freq MOD (tempo*_macro_speedup) <> 0) do Inc(IRQ_freq);
+ If (IRQ_freq > MAX_IRQ_FREQ) then IRQ_freq := MAX_IRQ_FREQ;
+ TimerSetup(IRQ_freq);
+end;
+
+procedure key_off(chan: Byte);
+begin
+ freq_table[chan] := LO(freq_table[chan])+
+ (HI(freq_table[chan]) AND NOT $20) SHL 8;
+ change_freq(chan,freq_table[chan]);
+ event_table[chan].note := event_table[chan].note OR keyoff_flag;
+end;
+
+procedure release_sustaining_sound(chan: Byte);
+begin
+ opl3out(_instr[02]+_chan_m[chan],63);
+ opl3out(_instr[03]+_chan_c[chan],63);
+
+ FillChar(fmpar_table[chan].adsrw_car,
+ SizeOf(fmpar_table[chan].adsrw_car),0);
+ FillChar(fmpar_table[chan].adsrw_mod,
+ SizeOf(fmpar_table[chan].adsrw_mod),0);
+
+ opl3out($0b0+_chan_n[chan],0);
+ opl3out(_instr[04]+_chan_m[chan],BYTE_NULL);
+ opl3out(_instr[05]+_chan_c[chan],BYTE_NULL);
+ opl3out(_instr[06]+_chan_m[chan],BYTE_NULL);
+ opl3out(_instr[07]+_chan_c[chan],BYTE_NULL);
+
+ key_off(chan);
+ event_table[chan].instr_def := 0;
+ reset_chan[chan] := TRUE;
+end;
+
+function scale_volume(volume,scale_factor: Byte): Byte;
+begin
+ scale_volume := 63-Round((63-volume)/63*
+ (63-scale_factor));
+end;
+
+procedure set_ins_volume(modulator,carrier,chan: Byte);
+
+var
+ temp: Byte;
+
+begin
+{$IFNDEF __TMT__}
+ // ** OPL3 emulation workaround **
+ // force muted instrument volume with missing ADSR instrument data
+ // when there is additionally no FM-reg macro defined for the instrument
+ If is_ins_adsr_data_empty(voice_table[chan]) and
+ NOT (songdata.instr_macros[voice_table[chan]].length <> 0) and
+ NOT replay_forbidden then
+ begin
+ modulator := 63;
+ carrier := 63;
+ end;
+{$ENDIF}
+
+ If (modulator <> BYTE_NULL) then
+ begin
+ temp := modulator;
+ If volume_scaling then
+ If (ins_parameter(voice_table[chan],10) AND 1 = 1) or
+ (percussion_mode and (chan in [17..20])) then
+ modulator := scale_volume(ins_parameter(voice_table[chan],2) AND $3f,modulator);
+ If (ins_parameter(voice_table[chan],10) AND 1 = 1) or
+ (percussion_mode and (chan in [17..20])) then
+ opl3out(_instr[02]+_chan_m[chan],
+ scale_volume(scale_volume(modulator,63-global_volume),63-overall_volume)+LO(vscale_table[chan]))
+ else
+ opl3out(_instr[02]+_chan_m[chan],
+ temp+LO(vscale_table[chan]));
+ volume_table[chan] := concw(temp,HI(volume_table[chan]));
+ If (ins_parameter(voice_table[chan],10) AND 1 = 1) or
+ (percussion_mode and (chan in [17..20])) then
+ modulator_vol[chan] := 63-scale_volume(modulator,63-global_volume)
+ else modulator_vol[chan] := 63-modulator;
+ end;
+
+ If (carrier <> BYTE_NULL) then
+ begin
+ temp := carrier;
+ If volume_scaling then
+ carrier := scale_volume(ins_parameter(voice_table[chan],3) AND $3f,carrier);
+ opl3out(_instr[03]+_chan_c[chan],
+ scale_volume(scale_volume(carrier,63-global_volume),63-overall_volume)+HI(vscale_table[chan]));
+ volume_table[chan] := concw(LO(volume_table[chan]),temp);
+ carrier_vol[chan] := 63-scale_volume(carrier,63-global_volume);
+ end;
+end;
+
+procedure reset_ins_volume(chan: Byte);
+begin
+ If NOT volume_scaling then
+ set_ins_volume(ins_parameter(voice_table[chan],2) AND $3f,
+ ins_parameter(voice_table[chan],3) AND $3f,chan)
+ else If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ set_ins_volume(ins_parameter(voice_table[chan],2) AND $3f,0,chan)
+ else set_ins_volume(0,0,chan);
+end;
+
+procedure set_global_volume;
+
+var
+ chan: Byte;
+
+begin
+ For chan := 1 to songdata.nm_tracks do
+ If NOT ((carrier_vol[chan] = 0) and
+ (modulator_vol[chan] = 0)) then
+ If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ set_ins_volume(BYTE_NULL,HI(volume_table[chan]),chan)
+ else set_ins_volume(LO(volume_table[chan]),HI(volume_table[chan]),chan);
+end;
+
+procedure set_overall_volume(level: Byte);
+begin
+ overall_volume := max(level,63);
+ set_global_volume;
+end;
+
+procedure init_macro_table(chan,note,ins: Byte; freq: Word);
+begin
+ macro_table[chan].fmreg_count := 1;
+ macro_table[chan].fmreg_pos := 0;
+ macro_table[chan].fmreg_duration := 0;
+ macro_table[chan].fmreg_table := ins;
+ macro_table[chan].arpg_count := 1;
+ macro_table[chan].arpg_pos := 0;
+ macro_table[chan].arpg_table := songdata.instr_macros[ins].arpeggio_table;
+ macro_table[chan].arpg_note := note;
+ macro_table[chan].vib_count := 1;
+ macro_table[chan].vib_paused := FALSE;
+ macro_table[chan].vib_pos := 0;
+ macro_table[chan].vib_table := songdata.instr_macros[ins].vibrato_table;
+ macro_table[chan].vib_freq := freq;
+ macro_table[chan].vib_delay := songdata.macro_table[macro_table[chan].vib_table].vibrato.delay;
+end;
+
+procedure set_ins_data(ins,chan: Byte);
+
+var
+ old_ins: Byte;
+
+begin
+ If (ins <> event_table[chan].instr_def) or reset_chan[chan] then
+ begin
+ opl3out(_instr[02]+_chan_m[chan],63);
+ opl3out(_instr[03]+_chan_c[chan],63);
+
+ If NOT pan_lock[chan] then
+ panning_table[chan] := ins_parameter(ins,11)
+ else panning_table[chan] := songdata.lock_flags[chan] AND 3;
+
+ opl3out(_instr[00]+_chan_m[chan],ins_parameter(ins,0));
+ opl3out(_instr[01]+_chan_c[chan],ins_parameter(ins,1));
+ opl3out(_instr[04]+_chan_m[chan],ins_parameter(ins,4));
+ opl3out(_instr[05]+_chan_c[chan],ins_parameter(ins,5));
+ opl3out(_instr[06]+_chan_m[chan],ins_parameter(ins,6));
+ opl3out(_instr[07]+_chan_c[chan],ins_parameter(ins,7));
+ opl3out(_instr[08]+_chan_m[chan],ins_parameter(ins,8));
+ opl3out(_instr[09]+_chan_c[chan],ins_parameter(ins,9));
+ opl3out(_instr[10]+_chan_n[chan],ins_parameter(ins,10) OR _panning[panning_table[chan]]);
+
+ fmpar_table[chan].connect := ins_parameter(ins,10) AND 1;
+ fmpar_table[chan].feedb := ins_parameter(ins,10) SHR 1 AND 7;
+ fmpar_table[chan].multipM := ins_parameter(ins,0) AND $0f;
+ fmpar_table[chan].kslM := ins_parameter(ins,2) SHR 6;
+ fmpar_table[chan].tremM := ins_parameter(ins,0) SHR 7;
+ fmpar_table[chan].vibrM := ins_parameter(ins,0) SHR 6 AND 1;
+ fmpar_table[chan].ksrM := ins_parameter(ins,0) SHR 4 AND 1;
+ fmpar_table[chan].sustM := ins_parameter(ins,0) SHR 5 AND 1;
+ fmpar_table[chan].multipC := ins_parameter(ins,1) AND $0f;
+ fmpar_table[chan].kslC := ins_parameter(ins,3) SHR 6;
+ fmpar_table[chan].tremC := ins_parameter(ins,1) SHR 7;
+ fmpar_table[chan].vibrC := ins_parameter(ins,1) SHR 6 AND 1;
+ fmpar_table[chan].ksrC := ins_parameter(ins,1) SHR 4 AND 1;
+ fmpar_table[chan].sustC := ins_parameter(ins,1) SHR 5 AND 1;
+
+ fmpar_table[chan].adsrw_car.attck := ins_parameter(ins,5) SHR 4;
+ fmpar_table[chan].adsrw_mod.attck := ins_parameter(ins,4) SHR 4;
+ fmpar_table[chan].adsrw_car.dec := ins_parameter(ins,5) AND $0f;
+ fmpar_table[chan].adsrw_mod.dec := ins_parameter(ins,4) AND $0f;
+ fmpar_table[chan].adsrw_car.sustn := ins_parameter(ins,7) SHR 4;
+ fmpar_table[chan].adsrw_mod.sustn := ins_parameter(ins,6) SHR 4;
+ fmpar_table[chan].adsrw_car.rel := ins_parameter(ins,7) AND $0f;
+ fmpar_table[chan].adsrw_mod.rel := ins_parameter(ins,6) AND $0f;
+ fmpar_table[chan].adsrw_car.wform := ins_parameter(ins,9) AND $07;
+ fmpar_table[chan].adsrw_mod.wform := ins_parameter(ins,8) AND $07;
+
+ If NOT reset_chan[chan] then
+ keyoff_loop[chan] := FALSE;
+
+ If reset_chan[chan] then
+ begin
+ voice_table[chan] := ins;
+ reset_ins_volume(chan);
+ reset_chan[chan] := FALSE;
+ end;
+
+ If (event_table[chan].note AND $7f in [1..12*8+1]) then
+ init_macro_table(chan,event_table[chan].note AND $7f,ins,freq_table[chan])
+ else init_macro_table(chan,0,ins,freq_table[chan]);
+ end;
+
+ vscale_table[chan] := concw(fmpar_table[chan].kslM SHL 6,
+ fmpar_table[chan].kslC SHL 6);
+ voice_table[chan] := ins;
+ old_ins := event_table[chan].instr_def;
+ event_table[chan].instr_def := ins;
+
+ If NOT volume_lock[chan] or
+ (ins <> old_ins) then reset_ins_volume(chan);
+end;
+
+procedure update_modulator_adsrw(chan: Byte);
+begin
+ opl3out(_instr[04]+_chan_m[chan],
+ fmpar_table[chan].adsrw_mod.attck SHL 4+
+ fmpar_table[chan].adsrw_mod.dec);
+ opl3out(_instr[06]+_chan_m[chan],
+ fmpar_table[chan].adsrw_mod.sustn SHL 4+
+ fmpar_table[chan].adsrw_mod.rel);
+ opl3out(_instr[08]+_chan_m[chan],
+ fmpar_table[chan].adsrw_mod.wform);
+end;
+
+procedure update_carrier_adsrw(chan: Byte);
+begin
+ opl3out(_instr[05]+_chan_c[chan],
+ fmpar_table[chan].adsrw_car.attck SHL 4+
+ fmpar_table[chan].adsrw_car.dec);
+ opl3out(_instr[07]+_chan_c[chan],
+ fmpar_table[chan].adsrw_car.sustn SHL 4+
+ fmpar_table[chan].adsrw_car.rel);
+ opl3out(_instr[09]+_chan_c[chan],
+ fmpar_table[chan].adsrw_car.wform);
+end;
+
+procedure update_fmpar(chan: Byte);
+begin
+ opl3out(_instr[00]+_chan_m[chan],fmpar_table[chan].multipM+
+ fmpar_table[chan].ksrM SHL 4+
+ fmpar_table[chan].sustM SHL 5+
+ fmpar_table[chan].vibrM SHL 6+
+ fmpar_table[chan].tremM SHL 7);
+ opl3out(_instr[01]+_chan_c[chan],fmpar_table[chan].multipC+
+ fmpar_table[chan].ksrC SHL 4+
+ fmpar_table[chan].sustC SHL 5+
+ fmpar_table[chan].vibrC SHL 6+
+ fmpar_table[chan].tremC SHL 7);
+
+ opl3out(_instr[10]+_chan_n[chan],(fmpar_table[chan].connect+
+ fmpar_table[chan].feedb SHL 1) OR
+ _panning[panning_table[chan]]);
+
+ vscale_table[chan] := concw(fmpar_table[chan].kslM SHL 6,
+ fmpar_table[chan].kslC SHL 6);
+ set_ins_volume(LO(volume_table[chan]),
+ HI(volume_table[chan]),chan);
+end;
+
+function is_4op_chan(chan: Byte): Boolean; assembler;
+asm
+ mov al,byte ptr [songdata.flag_4op]
+ mov ah,chan
+ test al,1
+ jz @@1
+ cmp ah,1
+ jb @@1
+ cmp ah,2
+ ja @@1
+ mov al,TRUE
+ jmp @@7
+@@1: test al,2
+ jz @@2
+ cmp ah,3
+ jb @@2
+ cmp ah,4
+ ja @@2
+ mov al,TRUE
+ jmp @@7
+@@2: test al,4
+ jz @@3
+ cmp ah,5
+ jb @@3
+ cmp ah,6
+ ja @@3
+ mov al,TRUE
+ jmp @@7
+@@3: test al,8
+ jz @@4
+ cmp ah,10
+ jb @@4
+ cmp ah,11
+ ja @@4
+ mov al,TRUE
+ jmp @@7
+@@4: test al,10h
+ jz @@5
+ cmp ah,12
+ jb @@5
+ cmp ah,13
+ ja @@5
+ mov al,TRUE
+ jmp @@7
+@@5: test al,20h
+ jz @@6
+ cmp ah,14
+ jb @@6
+ cmp ah,15
+ ja @@6
+ mov al,TRUE
+ jmp @@7
+@@6: mov al,FALSE
+@@7:
+end;
+
+procedure output_note(note,ins,chan: Byte; restart_macro: Boolean);
+
+var
+ pos: Byte;
+ freq: Word;
+
+begin
+ If (note = 0) and (ftune_table[chan] = 0) then EXIT;
+ If NOT (note in [1..12*8+1]) then freq := freq_table[chan]
+ else begin
+ freq := nFreq(note-1)+SHORTINT(ins_parameter(ins,12));
+ If NOT (is_4op_chan(chan) and (chan in [1,3,5,10,12,14])) then
+ opl3out($0b0+_chan_n[chan],0);
+
+ freq_table[chan] := concw(LO(freq_table[chan]),
+ HI(freq_table[chan]) OR $20);
+
+ pos := Round(25/(12*8+1)*note);
+ If (decay_bar[pos].lvl <> 0) then
+ If (pos > 1) and
+ (decay_bar[pos-1].dir <> 1) then
+ Dec(pos)
+ else If (pos < 25) and
+ (decay_bar[pos+1].lvl <> 1) then
+ Inc(pos);
+
+ If is_4op_chan(chan) then
+ If (chan in [2,4,6,11,13,15]) then
+ begin
+ decay_bar[pos].dir := 1;
+ If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ decay_bar[pos].max_lvl :=
+ (carrier_vol[PRED(chan)]+carrier_vol[chan]) DIV 2
+ else decay_bar[pos].max_lvl :=
+ (carrier_vol[PRED(chan)]+modulator_vol[PRED(chan)]+
+ carrier_vol[chan]+modulator_vol[chan]) DIV 4;
+ end
+ else
+ else
+ begin
+ decay_bar[pos].dir := 1;
+ If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ decay_bar[pos].max_lvl :=
+ carrier_vol[chan]
+ else decay_bar[pos].max_lvl :=
+ (carrier_vol[chan]+modulator_vol[chan]) DIV 2;
+ end;
+ end;
+
+ If (ftune_table[chan] = -127) then ftune_table[chan] := 0;
+ freq := freq+ftune_table[chan];
+
+ If NOT (is_4op_chan(chan) and (chan in [1,3,5,10,12,14])) then
+ change_frequency(chan,freq);
+
+ If (note <> 0) then
+ begin
+ event_table[chan].note := note;
+ If restart_macro then
+ With event_table[chan] do
+ If NOT (((effect_def = ef_Extended) and
+ (effect DIV 16 = ef_ex_ExtendedCmd) and
+ (effect MOD 16 = ef_ex_cmd_NoRestart)) or
+ ((effect_def2 = ef_Extended) and
+ (effect2 DIV 16 = ef_ex_ExtendedCmd) and
+ (effect2 MOD 16 = ef_ex_cmd_NoRestart))) then
+ init_macro_table(chan,note,ins,freq)
+ else macro_table[chan].arpg_note := note;
+ end;
+end;
+
+procedure output_note_NR(note,ins,chan: Byte; restart_macro: Boolean);
+
+var
+ pos: Byte;
+ freq: Word;
+
+begin
+ If (note = 0) and (ftune_table[chan] = 0) then EXIT;
+ If NOT (note in [1..12*8+1]) then freq := freq_table[chan]
+ else begin
+ freq := nFreq(note-1)+SHORTINT(ins_parameter(ins,12));
+ freq_table[chan] := concw(LO(freq_table[chan]),
+ HI(freq_table[chan]) OR $20);
+
+ pos := Round(25/(12*8+1)*note);
+ If (decay_bar[pos].lvl <> 0) then
+ If (pos > 1) and
+ (decay_bar[pos-1].dir <> 1) then
+ Dec(pos)
+ else If (pos < 25) and
+ (decay_bar[pos+1].lvl <> 1) then
+ Inc(pos);
+
+ If is_4op_chan(chan) then
+ If (chan in [2,4,6,11,13,15]) then
+ begin
+ decay_bar[pos].dir := 1;
+ If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ decay_bar[pos].max_lvl :=
+ (carrier_vol[PRED(chan)]+carrier_vol[chan]) DIV 2
+ else decay_bar[pos].max_lvl :=
+ (carrier_vol[PRED(chan)]+modulator_vol[PRED(chan)]+
+ carrier_vol[chan]+modulator_vol[chan]) DIV 4;
+ end
+ else
+ else
+ begin
+ decay_bar[pos].dir := 1;
+ If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ decay_bar[pos].max_lvl :=
+ carrier_vol[chan]
+ else decay_bar[pos].max_lvl :=
+ (carrier_vol[chan]+modulator_vol[chan]) DIV 2;
+ end;
+ end;
+
+ If (ftune_table[chan] = -127) then ftune_table[chan] := 0;
+ freq := freq+ftune_table[chan];
+
+ If NOT (is_4op_chan(chan) and (chan in [1,3,5,10,12,14])) then
+ change_frequency(chan,freq);
+
+ If (note <> 0) then
+ begin
+ event_table[chan].note := note;
+ If restart_macro then
+ With event_table[chan] do
+ If NOT (((effect_def = ef_Extended) and
+ (effect DIV 16 = ef_ex_ExtendedCmd) and
+ (effect MOD 16 = ef_ex_cmd_NoRestart)) or
+ ((effect_def2 = ef_Extended) and
+ (effect2 DIV 16 = ef_ex_ExtendedCmd) and
+ (effect2 MOD 16 = ef_ex_cmd_NoRestart))) then
+ init_macro_table(chan,note,ins,freq)
+ else macro_table[chan].arpg_note := note;
+ end;
+end;
+
+procedure generate_custom_vibrato(value: Byte);
+
+const
+ vibtab_size: array[0..15] of Byte = (
+ 16,16,16,16,32,32,32,32,64,64,64,64,128,128,128,128);
+
+var
+ mul_r: Real;
+ mul_b: Byte;
+ idx,idx2: Byte;
+
+function min0(value: Longint): Longint;
+begin
+ If (value >= 0) then min0 := value
+ else min0 := 0;
+end;
+
+begin
+ Case value of
+ // set default speed table
+ 0: begin
+ vibtrem_table_size := def_vibtrem_table_size;
+ Move(def_vibtrem_table,vibtrem_table,SizeOf(vibtrem_table));
+ end;
+
+ // set custom speed table (fixed size = 32)
+ 1..239:
+ begin
+ vibtrem_table_size := def_vibtrem_table_size;
+ mul_r := value/16;
+ For idx2 := 0 to 7 do
+ begin
+ vibtrem_table[idx2*32] := 0;
+ For idx := 1 to 16 do
+ vibtrem_table[idx2*32+idx] := ROUND(idx*mul_r);
+ For idx := 17 to 31 do
+ vibtrem_table[idx2*32+idx] := ROUND((32-idx)*mul_r);
+ end;
+ end;
+
+ // set custom speed table (speed factor = 1-4)
+ 240..255:
+ begin
+ vibtrem_speed_factor := SUCC((value-240) MOD 4);
+ vibtrem_table_size := 2*vibtab_size[value-240];
+ mul_b := 256 DIV (vibtab_size[value-240]);
+ For idx2 := 0 to PRED(128 DIV vibtab_size[value-240]) do
+ begin
+ vibtrem_table[2*vibtab_size[value-240]*idx2] := 0;
+ For idx := 1 to vibtab_size[value-240] do
+ vibtrem_table[2*vibtab_size[value-240]*idx2+idx] :=
+ min0(idx*mul_b-1);
+ For idx := vibtab_size[value-240]+1 to
+ 2*vibtab_size[value-240]-1 do
+ vibtrem_table[2*vibtab_size[value-240]*idx2+idx] :=
+ min0((2*vibtab_size[value-240]-idx)*mul_b-1);
+ end;
+ end;
+ end;
+end;
+
+procedure update_fine_effects(chan: Byte); forward;
+procedure play_line;
+
+var
+ chan,idx: Byte;
+ event: array[1..20] of tCHUNK;
+ eLo,eHi,eLo2,eHi2: array[1..20] of Byte;
+
+function no_loop(current_chan,current_line: Byte): Boolean;
+
+var
+ result: Boolean;
+ chan: Byte;
+
+begin
+ result := TRUE;
+ For chan := 1 to PRED(current_chan) do
+ If (loop_table[chan][current_line] <> 0) and
+ (loop_table[chan][current_line] <> BYTE_NULL) then
+ begin
+ result := FALSE;
+ BREAK;
+ end;
+ no_loop := result;
+end;
+
+function get_event(pattern,line,channel: Byte): tCHUNK;
+begin
+ asm
+ mov esi,[pattdata]
+ mov edi,@result
+ mov al,pattern
+ inc al
+ cmp al,max_patterns
+ jbe @@1
+ mov ecx,CHUNK_SIZE
+ xor al,al
+ rep stosb
+ jmp @@2
+@@1: xor eax,eax
+ mov al,line
+ mov ebx,CHUNK_SIZE
+ mul ebx
+ mov ecx,eax
+ xor eax,eax
+ mov al,channel
+ dec eax
+ mov ebx,256*CHUNK_SIZE
+ mul ebx
+ add ecx,eax
+ xor eax,eax
+ mov al,pattern
+ mov ebx,8
+ div ebx
+ push eax
+ mov eax,edx
+ mov ebx,20*256*CHUNK_SIZE
+ mul ebx
+ add ecx,eax
+ pop eax
+ mov ebx,8*20*256*CHUNK_SIZE
+ mul ebx
+ add ecx,eax
+ add esi,ecx
+ mov ecx,CHUNK_SIZE
+ rep movsb
+@@2:
+ end;
+end;
+
+begin
+ _debug_str_ := 'A2PLAYER.PAS:play_line';
+ If (current_line = 0) and
+ (current_order = calc_following_order(0)) then
+ time_playing := 0;
+
+ If NOT (pattern_break and (next_line AND $0f0 = pattern_loop_flag)) and
+ (current_order <> last_order) then
+ begin
+ FillChar(loopbck_table,SizeOf(loopbck_table),BYTE_NULL);
+ FillChar(loop_table,SizeOf(loop_table),BYTE_NULL);
+ last_order := current_order;
+ end;
+
+ For chan := 1 to songdata.nm_tracks do
+ begin
+ event[chan] := get_event(current_pattern,current_line,chan);
+ If (effect_table[chan] <> 0) then last_effect[chan] := effect_table[chan];
+ If (glfsld_table[chan] <> 0) then effect_table[chan] := glfsld_table[chan]
+ else effect_table[chan] := effect_table[chan] AND $0ff00;
+ If (effect_table2[chan] <> 0) then last_effect2[chan] := effect_table2[chan];
+ If (glfsld_table2[chan] <> 0) then effect_table2[chan] := glfsld_table2[chan]
+ else effect_table2[chan] := effect_table2[chan] AND $0ff00;
+ ftune_table[chan] := 0;
+
+ If (event[chan].note = BYTE_NULL) then
+ event[chan].note := event_table[chan].note OR keyoff_flag
+ else If (event[chan].note in [fixed_note_flag+1..fixed_note_flag+12*8+1]) then
+ event[chan].note := event[chan].note-fixed_note_flag;
+
+ If (event[chan].note <> 0) or
+ (event[chan].effect_def <> 0) or
+ (event[chan].effect_def2 <> 0) or
+ ((event[chan].effect_def = 0) and (event[chan].effect <> 0)) or
+ ((event[chan].effect_def2 = 0) and (event[chan].effect2 <> 0)) then
+ event_new[chan] := TRUE
+ else event_new[chan] := FALSE;
+
+ If (event[chan].note <> 0) or
+ (event[chan].instr_def <> 0) or
+ (event[chan].effect_def+event[chan].effect <> 0) or
+ (event[chan].effect_def2+event[chan].effect2 <> 0) then
+ begin
+ event_table[chan].effect_def := event[chan].effect_def;
+ event_table[chan].effect := event[chan].effect;
+ event_table[chan].effect_def2 := event[chan].effect_def2;
+ event_table[chan].effect2 := event[chan].effect2;
+ end;
+
+ If (event[chan].instr_def <> 0) then
+ If NOT Empty(songdata.instr_data[event[chan].instr_def],
+ INSTRUMENT_SIZE) then
+ set_ins_data(event[chan].instr_def,chan)
+ else begin
+ release_sustaining_sound(chan);
+ set_ins_data(event[chan].instr_def,chan);
+ end;
+
+ If NOT (event[chan].effect_def in [ef_Vibrato,ef_ExtraFineVibrato,
+ ef_VibratoVolSlide,ef_VibratoVSlideFine]) then
+ FillChar(vibr_table[chan],SizeOf(vibr_table[chan]),0);
+
+ If NOT (event[chan].effect_def2 in [ef_Vibrato,ef_ExtraFineVibrato,
+ ef_VibratoVolSlide,ef_VibratoVSlideFine]) then
+ FillChar(vibr_table2[chan],SizeOf(vibr_table2[chan]),0);
+
+ If NOT (event[chan].effect_def in [ef_RetrigNote,ef_MultiRetrigNote]) then
+ FillChar(retrig_table[chan],SizeOf(retrig_table[chan]),0);
+
+ If NOT (event[chan].effect_def2 in [ef_RetrigNote,ef_MultiRetrigNote]) then
+ FillChar(retrig_table2[chan],SizeOf(retrig_table2[chan]),0);
+
+ If NOT (event[chan].effect_def in [ef_Tremolo,ef_ExtraFineTremolo]) then
+ FillChar(trem_table[chan],SizeOf(trem_table[chan]),0);
+
+ If NOT (event[chan].effect_def2 in [ef_Tremolo,ef_ExtraFineTremolo]) then
+ FillChar(trem_table2[chan],SizeOf(trem_table2[chan]),0);
+
+ If NOT (((event[chan].effect_def = ef_Arpeggio) and (event[chan].effect <> 0)) or
+ (event[chan].effect_def = ef_ExtraFineArpeggio)) and
+
+
+
+
+
+ (arpgg_table[chan].note <> 0) and (arpgg_table[chan].state <> 1) then
+ begin
+ arpgg_table[chan].state := 1;
+ change_frequency(chan,nFreq(arpgg_table[chan].note-1)+
+ SHORTINT(ins_parameter(event_table[chan].instr_def,12)));
+ end
+ else If NOT (((event[chan].effect_def2 = ef_Arpeggio) and (event[chan].effect2 <> 0)) or
+ (event[chan].effect_def2 = ef_ExtraFineArpeggio)) and
+ (arpgg_table2[chan].note <> 0) and (arpgg_table2[chan].state <> 1) then
+ begin
+ arpgg_table2[chan].state := 1;
+ change_frequency(chan,nFreq(arpgg_table2[chan].note-1)+
+ SHORTINT(ins_parameter(event_table[chan].instr_def,12)));
+ end;
+ end;
+
+ For chan := 1 to songdata.nm_tracks do
+ begin
+ If (tremor_table[chan].pos <> 0) and
+ (event[chan].effect_def <> ef_Tremor) then
+ begin
+ tremor_table[chan].pos := 0;
+ set_ins_volume(LO(tremor_table[chan].volume),
+ HI(tremor_table[chan].volume),chan);
+ end;
+
+ If (tremor_table2[chan].pos <> 0) and
+ (event[chan].effect_def2 <> ef_Tremor) then
+ begin
+ tremor_table2[chan].pos := 0;
+ set_ins_volume(LO(tremor_table2[chan].volume),
+ HI(tremor_table2[chan].volume),chan);
+ end;
+
+ eLo[chan] := LO(last_effect[chan]);
+ eHi[chan] := HI(last_effect[chan]);
+ eLo2[chan] := LO(last_effect2[chan]);
+ eHi2[chan] := HI(last_effect2[chan]);
+ end;
+
+ For chan := 1 to songdata.nm_tracks do
+ Case event[chan].effect_def of
+
+ ef_Arpeggio,
+ ef_ExtraFineArpeggio,
+ ef_ArpggVSlide,
+ ef_ArpggVSlideFine:
+ If (event[chan].effect_def <> ef_Arpeggio) or
+ (event[chan].effect <> 0) then
+ begin
+ Case event[chan].effect_def of
+ ef_Arpeggio:
+ effect_table[chan] := concw(ef_Arpeggio+ef_fix1,event[chan].effect);
+
+ ef_ExtraFineArpeggio:
+ effect_table[chan] := concw(ef_ExtraFineArpeggio,event[chan].effect);
+
+ ef_ArpggVSlide,
+ ef_ArpggVSlideFine:
+ If (event[chan].effect <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,event[chan].effect)
+ else If (eLo[chan] in [ef_ArpggVSlide,ef_ArpggVSlideFine]) and
+ (eHi[chan] <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,eHi[chan])
+ else effect_table[chan] := effect_table[chan] AND $0ff00;
+ end;
+
+ If (event[chan].note AND $7f in [1..12*8+1]) then
+ begin
+ arpgg_table[chan].state := 0;
+ arpgg_table[chan].note := event[chan].note AND $7f;
+ If (event[chan].effect_def in [ef_Arpeggio,ef_ExtraFineArpeggio]) then
+ begin
+ arpgg_table[chan].add1 := event[chan].effect DIV 16;
+ arpgg_table[chan].add2 := event[chan].effect MOD 16;
+ end;
+ end
+ else If (event[chan].note = 0) and
+ (event_table[chan].note AND $7f in [1..12*8+1]) then
+ begin
+ If NOT (eLo[chan] in [ef_Arpeggio+ef_fix1,ef_ExtraFineArpeggio,
+ ef_ArpggVSlide,ef_ArpggVSlideFine]) then
+ arpgg_table[chan].state := 0;
+
+ arpgg_table[chan].note := event_table[chan].note AND $7f;
+ If (event[chan].effect_def in [ef_Arpeggio,ef_ExtraFineArpeggio]) then
+ begin
+ arpgg_table[chan].add1 := event[chan].effect DIV 16;
+ arpgg_table[chan].add2 := event[chan].effect MOD 16;
+ end;
+ end
+ else effect_table[chan] := 0;
+ end;
+
+ ef_FSlideUp,
+ ef_FSlideDown,
+ ef_FSlideUpFine,
+ ef_FSlideDownFine:
+ begin
+ effect_table[chan] := concw(event[chan].effect_def,event[chan].effect);
+ fslide_table[chan] := event[chan].effect;
+ end;
+
+ ef_GlobalFSlideUp,
+ ef_GlobalFSlideDown:
+ begin
+ If (event[chan].effect_def = ef_GlobalFSlideUp) then
+ begin
+ If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 = ef_ex_ExtendedCmd*16+ef_ex_cmd_FTrm_XFGFS) then
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_FreqSlideUpXF,
+ event[chan].effect)
+ else If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 = ef_ex_ExtendedCmd*16+ef_ex_cmd_FVib_FGFS) then
+ effect_table[chan] := concw(ef_FSlideUpFine,event[chan].effect)
+ else effect_table[chan] := concw(ef_FSlideUp,event[chan].effect);
+ end
+ else
+ begin
+ If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 = ef_ex_ExtendedCmd*16+ef_ex_cmd_FTrm_XFGFS) then
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_FreqSlideDnXF,
+ event[chan].effect)
+ else If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 = ef_ex_ExtendedCmd*16+ef_ex_cmd_FVib_FGFS) then
+ effect_table[chan] := concw(ef_FSlideDownFine,event[chan].effect)
+ else effect_table[chan] := concw(ef_FSlideDown,event[chan].effect);
+ end;
+ For idx := chan to songdata.nm_tracks do
+ begin
+ fslide_table[idx] := event[chan].effect;
+ glfsld_table[idx] := effect_table[chan];
+ end;
+ end;
+
+ ef_FSlideUpVSlide,
+ ef_FSlUpVSlF,
+ ef_FSlideDownVSlide,
+ ef_FSlDownVSlF,
+ ef_FSlUpFineVSlide,
+ ef_FSlUpFineVSlF,
+ ef_FSlDownFineVSlide,
+ ef_FSlDownFineVSlF:
+ If (event[chan].effect <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,event[chan].effect)
+ else If (eLo[chan] in [ef_FSlideUpVSlide,ef_FSlUpVSlF,ef_FSlideDownVSlide,
+ ef_FSlDownVSlF,ef_FSlUpFineVSlide,ef_FSlUpFineVSlF,
+ ef_FSlDownFineVSlide,ef_FSlDownFineVSlF]) and
+ (eHi[chan] <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,eHi[chan])
+ else effect_table[chan] := effect_table[chan] AND $0ff00;
+
+ ef_TonePortamento:
+ If (event[chan].note in [1..12*8+1]) then
+ begin
+ If (event[chan].effect <> 0) then
+ effect_table[chan] := concw(ef_TonePortamento,event[chan].effect)
+ else If (eLo[chan] = ef_TonePortamento) and
+ (eHi[chan] <> 0) then
+ effect_table[chan] := concw(ef_TonePortamento,eHi[chan])
+ else effect_table[chan] := ef_TonePortamento;
+
+ porta_table[chan].speed := HI(effect_table[chan]);
+ porta_table[chan].freq := nFreq(event[chan].note-1)+
+ SHORTINT(ins_parameter(event_table[chan].instr_def,12));
+ end
+ else If (eLo[chan] = ef_TonePortamento) then
+ begin
+ If (event[chan].effect <> 0) then
+ effect_table[chan] := concw(ef_TonePortamento,event[chan].effect)
+ else If (eLo[chan] = ef_TonePortamento) and
+ (eHi[chan] <> 0) then
+ effect_table[chan] := concw(ef_TonePortamento,eHi[chan])
+ else effect_table[chan] := ef_TonePortamento;
+ porta_table[chan].speed := HI(effect_table[chan]);
+ end;
+
+ ef_TPortamVolSlide,
+ ef_TPortamVSlideFine:
+ If (event[chan].effect <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,event[chan].effect)
+ else If (eLo[chan] in [ef_TPortamVolSlide,ef_TPortamVSlideFine]) and
+ (eHi[chan] <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,eHi[chan])
+ else effect_table[chan] := effect_table[chan] AND $0ff00;
+
+ ef_Vibrato,
+ ef_ExtraFineVibrato:
+ begin
+ If (event[chan].effect <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,event[chan].effect)
+ else If (eLo[chan] in [ef_Vibrato,ef_ExtraFineVibrato]) and
+ (eHi[chan] <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,eHi[chan])
+ else effect_table[chan] := event[chan].effect_def;
+
+ If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 = ef_ex_ExtendedCmd*16+ef_ex_cmd_FVib_FGFS) then
+ vibr_table[chan].fine := TRUE;
+
+ vibr_table[chan].speed := HI(effect_table[chan]) DIV 16;
+ vibr_table[chan].depth := HI(effect_table[chan]) MOD 16;
+ end;
+
+ ef_Tremolo,
+ ef_ExtraFineTremolo:
+ begin
+ If (event[chan].effect <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,event[chan].effect)
+ else If (eLo[chan] in [ef_Tremolo,ef_ExtraFineTremolo]) and
+ (eHi[chan] <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,eHi[chan])
+ else effect_table[chan] := event[chan].effect_def;
+
+ If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 = ef_ex_ExtendedCmd*16+ef_ex_cmd_FTrm_XFGFS) then
+ trem_table[chan].fine := TRUE;
+
+ trem_table[chan].speed := HI(effect_table[chan]) DIV 16;
+ trem_table[chan].depth := HI(effect_table[chan]) MOD 16;
+ end;
+
+ ef_VibratoVolSlide,
+ ef_VibratoVSlideFine:
+ begin
+ If (event[chan].effect <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,event[chan].effect)
+ else If (eLo[chan] in [ef_VibratoVolSlide,ef_VibratoVSlideFine]) and
+ (HI(effect_table[chan]) <> 0) then
+ effect_table[chan] := concw(event[chan].effect_def,HI(effect_table[chan]))
+ else effect_table[chan] := effect_table[chan] AND $0ff00;
+
+ If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 = ef_ex_ExtendedCmd*16+ef_ex_cmd_FVib_FGFS) then
+ vibr_table[chan].fine := TRUE;
+ end;
+
+ ef_SetCarrierVol:
+ set_ins_volume(BYTE_NULL,63-event[chan].effect,chan);
+
+ ef_SetModulatorVol:
+ set_ins_volume(63-event[chan].effect,BYTE_NULL,chan);
+
+ ef_SetInsVolume:
+ If percussion_mode and (chan in [17..20]) then
+ set_ins_volume(63-event[chan].effect,BYTE_NULL,chan)
+ else If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ set_ins_volume(BYTE_NULL,63-event[chan].effect,chan)
+ else set_ins_volume(63-event[chan].effect,63-event[chan].effect,chan);
+
+ ef_ForceInsVolume:
+ If percussion_mode and (chan in [17..20]) then
+ set_ins_volume(63-event[chan].effect,BYTE_NULL,chan)
+ else If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ set_ins_volume(scale_volume(ins_parameter(voice_table[chan],2) AND $3f,63-event[chan].effect),63-event[chan].effect,chan)
+ else set_ins_volume(63-event[chan].effect,63-event[chan].effect,chan);
+
+ ef_PositionJump:
+ If no_loop(chan,current_line) then
+ begin
+ pattern_break := TRUE;
+ next_line := pattern_break_flag+chan;
+ end;
+
+ ef_PatternBreak:
+ If no_loop(chan,current_line) then
+ begin
+ pattern_break := TRUE;
+ next_line := max(event[chan].effect,PRED(songdata.patt_len));
+ end;
+
+ ef_SetSpeed:
+ speed := event[chan].effect;
+
+ ef_SetTempo:
+ update_timer(event[chan].effect);
+
+ ef_SetWaveform:
+ begin
+ If (event[chan].effect DIV 16 in [0..7]) then
+ begin
+ fmpar_table[chan].adsrw_car.wform := event[chan].effect DIV 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ If (event[chan].effect MOD 16 in [0..7]) then
+ begin
+ fmpar_table[chan].adsrw_mod.wform := event[chan].effect MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+ end;
+
+ ef_VolSlide:
+ effect_table[chan] := concw(ef_VolSlide,event[chan].effect);
+
+ ef_VolSlideFine:
+ effect_table[chan] := concw(ef_VolSlideFine,event[chan].effect);
+
+ ef_RetrigNote:
+ If (event[chan].effect <> 0) then
+ begin
+ If NOT (eLo[chan] in [ef_RetrigNote,ef_MultiRetrigNote]) then
+ retrig_table[chan] := 1;
+ effect_table[chan] := concw(ef_RetrigNote,event[chan].effect);
+ end;
+
+ ef_SetGlobalVolume:
+ begin
+ global_volume := event[chan].effect;
+ set_global_volume;
+ end;
+
+ ef_MultiRetrigNote:
+ If (event[chan].effect DIV 16 <> 0) then
+ begin
+ If NOT (eLo[chan] in [ef_RetrigNote,ef_MultiRetrigNote]) then
+ retrig_table[chan] := 1;
+ effect_table[chan] := concw(ef_MultiRetrigNote,event[chan].effect);
+ end;
+
+ ef_Tremor:
+ If (event[chan].effect DIV 16 <> 0) and
+ (event[chan].effect MOD 16 <> 0) then
+ begin
+ If (eLo[chan] <> ef_Tremor) then
+ begin
+ tremor_table[chan].pos := 0;
+ tremor_table[chan].volume := volume_table[chan];
+ end;
+ effect_table[chan] := concw(ef_Tremor,event[chan].effect);
+ end;
+
+ ef_Extended:
+ Case (event[chan].effect DIV 16) of
+ ef_ex_SetTremDepth:
+ Case (event[chan].effect MOD 16) of
+ 0: begin
+ opl3out(_instr[11],misc_register AND $07f);
+ current_tremolo_depth := 0;
+ end;
+
+ 1: begin
+ opl3out(_instr[11],misc_register OR $080);
+ current_tremolo_depth := 1;
+ end;
+ end;
+
+ ef_ex_SetVibDepth:
+ Case (event[chan].effect MOD 16) of
+ 0: begin
+ opl3out(_instr[11],misc_register AND $0bf);
+ current_vibrato_depth := 0;
+ end;
+
+ 1: begin
+ opl3out(_instr[11],misc_register OR $040);
+ current_vibrato_depth := 1;
+ end;
+ end;
+
+ ef_ex_SetAttckRateM:
+ begin
+ fmpar_table[chan].adsrw_mod.attck := event[chan].effect MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+
+ ef_ex_SetDecayRateM:
+ begin
+ fmpar_table[chan].adsrw_mod.dec := event[chan].effect MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+
+ ef_ex_SetSustnLevelM:
+ begin
+ fmpar_table[chan].adsrw_mod.sustn := event[chan].effect MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+
+ ef_ex_SetRelRateM:
+ begin
+ fmpar_table[chan].adsrw_mod.rel := event[chan].effect MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+
+ ef_ex_SetAttckRateC:
+ begin
+ fmpar_table[chan].adsrw_car.attck := event[chan].effect MOD 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ ef_ex_SetDecayRateC:
+ begin
+ fmpar_table[chan].adsrw_car.dec := event[chan].effect MOD 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ ef_ex_SetSustnLevelC:
+ begin
+ fmpar_table[chan].adsrw_car.sustn := event[chan].effect MOD 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ ef_ex_SetRelRateC:
+ begin
+ fmpar_table[chan].adsrw_car.rel := event[chan].effect MOD 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ ef_ex_SetFeedback:
+ begin
+ fmpar_table[chan].feedb := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex_SetPanningPos:
+ begin
+ panning_table[chan] := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex_PatternLoop,
+ ef_ex_PatternLoopRec:
+ If (event[chan].effect MOD 16 = 0) then
+ loopbck_table[chan] := current_line
+ else If (loopbck_table[chan] <> BYTE_NULL) then
+ begin
+ If (loop_table[chan][current_line] = BYTE_NULL) then
+ loop_table[chan][current_line] := event[chan].effect MOD 16;
+ If (loop_table[chan][current_line] <> 0) then
+ begin
+ pattern_break := TRUE;
+ next_line := pattern_loop_flag+chan;
+ end
+ else If (event[chan].effect DIV 16 = ef_ex_PatternLoopRec) then
+ loop_table[chan][current_line] := BYTE_NULL;
+ end;
+
+ ef_ex_MacroKOffLoop:
+ If (event[chan].effect MOD 16 <> 0) then
+ keyoff_loop[chan] := TRUE
+ else keyoff_loop[chan] := FALSE;
+
+ ef_ex_ExtendedCmd:
+ Case (event[chan].effect MOD 16) of
+ ef_ex_cmd_RSS: release_sustaining_sound(chan);
+ ef_ex_cmd_ResetVol: reset_ins_volume(chan);
+ ef_ex_cmd_LockVol: volume_lock [chan] := TRUE;
+ ef_ex_cmd_UnlockVol: volume_lock [chan] := FALSE;
+ ef_ex_cmd_LockVP: peak_lock [chan] := TRUE;
+ ef_ex_cmd_UnlockVP: peak_lock [chan] := FALSE;
+ ef_ex_cmd_VSlide_def: volslide_type[chan] := 0;
+ ef_ex_cmd_LockPan: pan_lock [chan] := TRUE;
+ ef_ex_cmd_UnlockPan: pan_lock [chan] := FALSE;
+ ef_ex_cmd_VibrOff: change_frequency(chan,freq_table[chan]);
+ ef_ex_cmd_TremOff: set_ins_volume(LO(volume_table[chan]),
+ HI(volume_table[chan]),chan);
+ ef_ex_cmd_VSlide_car:
+ If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 = ef_ex_ExtendedCmd*16+
+ ef_ex_cmd_VSlide_mod) then
+ volslide_type[chan] := 3
+ else volslide_type[chan] := 1;
+
+ ef_ex_cmd_VSlide_mod:
+ If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 = ef_ex_ExtendedCmd*16+
+ ef_ex_cmd_VSlide_car) then
+ volslide_type[chan] := 3
+ else volslide_type[chan] := 2;
+ end;
+ end;
+
+ ef_Extended2:
+ Case (event[chan].effect DIV 16) of
+ ef_ex2_PatDelayFrame,
+ ef_ex2_PatDelayRow:
+ begin
+ pattern_delay := TRUE;
+ If (event[chan].effect DIV 16 = ef_ex2_PatDelayFrame) then
+ tickD := (event[chan].effect MOD 16)
+ else tickD := speed*(event[chan].effect MOD 16);
+ end;
+
+ ef_ex2_NoteDelay:
+ begin
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_NoteDelay,0);
+ notedel_table[chan] := event[chan].effect MOD 16;
+ end;
+
+ ef_ex2_NoteCut:
+ begin
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_NoteCut,0);
+ notecut_table[chan] := event[chan].effect MOD 16;
+ end;
+
+ ef_ex2_FineTuneUp:
+ Inc(ftune_table[chan],event[chan].effect MOD 16);
+
+ ef_ex2_FineTuneDown:
+ Dec(ftune_table[chan],event[chan].effect MOD 16);
+
+ ef_ex2_GlVolSlideUp:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSlideUp,
+ event[chan].effect MOD 16);
+ ef_ex2_GlVolSlideDn:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSlideDn,
+ event[chan].effect MOD 16);
+ ef_ex2_GlVolSlideUpF:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSlideUpF,
+ event[chan].effect MOD 16);
+ ef_ex2_GlVolSlideDnF:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSlideDnF,
+ event[chan].effect MOD 16);
+ ef_ex2_GlVolSldUpXF:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSldUpXF,
+ event[chan].effect MOD 16);
+ ef_ex2_GlVolSldDnXF:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSldDnXF,
+ event[chan].effect MOD 16);
+ ef_ex2_VolSlideUpXF:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_VolSlideUpXF,
+ event[chan].effect MOD 16);
+ ef_ex2_VolSlideDnXF:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_VolSlideDnXF,
+ event[chan].effect MOD 16);
+ ef_ex2_FreqSlideUpXF:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_FreqSlideUpXF,
+ event[chan].effect MOD 16);
+ ef_ex2_FreqSlideDnXF:
+ effect_table[chan] := concw(ef_extended2+ef_fix2+ef_ex2_FreqSlideDnXF,
+ event[chan].effect MOD 16);
+ end;
+
+ ef_Extended3:
+ Case (event[chan].effect DIV 16) of
+ ef_ex3_SetConnection:
+ begin
+ fmpar_table[chan].connect := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetMultipM:
+ begin
+ fmpar_table[chan].multipM := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetKslM:
+ begin
+ fmpar_table[chan].kslM := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetTremoloM:
+ begin
+ fmpar_table[chan].tremM := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetVibratoM:
+ begin
+ fmpar_table[chan].vibrM := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetKsrM:
+ begin
+ fmpar_table[chan].ksrM := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetSustainM:
+ begin
+ fmpar_table[chan].sustM := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetMultipC:
+ begin
+ fmpar_table[chan].multipC := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetKslC:
+ begin
+ fmpar_table[chan].kslC := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetTremoloC:
+ begin
+ fmpar_table[chan].tremC := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetVibratoC:
+ begin
+ fmpar_table[chan].vibrC := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetKsrC:
+ begin
+ fmpar_table[chan].ksrC := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetSustainC:
+ begin
+ fmpar_table[chan].sustC := event[chan].effect MOD 16;
+ update_fmpar(chan);
+ end;
+ end;
+ end;
+
+ For chan := 1 to songdata.nm_tracks do
+ Case event[chan].effect_def2 of
+ ef_Arpeggio,
+ ef_ExtraFineArpeggio,
+ ef_ArpggVSlide,
+ ef_ArpggVSlideFine:
+ If (event[chan].effect_def2 <> ef_Arpeggio) or
+ (event[chan].effect2 <> 0) then
+ begin
+ Case event[chan].effect_def2 of
+ ef_Arpeggio:
+ effect_table2[chan] := concw(ef_Arpeggio+ef_fix1,event[chan].effect2);
+
+ ef_ExtraFineArpeggio:
+ effect_table2[chan] := concw(ef_ExtraFineArpeggio,event[chan].effect2);
+
+ ef_ArpggVSlide,
+ ef_ArpggVSlideFine:
+ If (event[chan].effect2 <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,event[chan].effect2)
+ else If (eLo2[chan] in [ef_ArpggVSlide,ef_ArpggVSlideFine]) and
+ (eHi2[chan] <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,eHi2[chan])
+ else effect_table2[chan] := effect_table2[chan] AND $0ff00;
+ end;
+
+ If (event[chan].note AND $7f in [1..12*8+1]) then
+ begin
+ arpgg_table2[chan].state := 0;
+ arpgg_table2[chan].note := event[chan].note AND $7f;
+ If (event[chan].effect_def2 in [ef_Arpeggio,ef_ExtraFineArpeggio]) then
+ begin
+ arpgg_table2[chan].add1 := event[chan].effect2 DIV 16;
+ arpgg_table2[chan].add2 := event[chan].effect2 MOD 16;
+ end;
+ end
+ else If (event[chan].note = 0) and
+ (event_table[chan].note AND $7f in [1..12*8+1]) then
+ begin
+ If NOT (eLo2[chan] in [ef_Arpeggio+ef_fix1,ef_ExtraFineArpeggio,
+ ef_ArpggVSlide,ef_ArpggVSlideFine]) then
+ arpgg_table2[chan].state := 0;
+
+ arpgg_table2[chan].note := event_table[chan].note AND $7f;
+ If (event[chan].effect_def2 in [ef_Arpeggio,ef_ExtraFineArpeggio]) then
+ begin
+ arpgg_table2[chan].add1 := event[chan].effect2 DIV 16;
+ arpgg_table2[chan].add2 := event[chan].effect2 MOD 16;
+ end;
+ end
+ else effect_table2[chan] := 0;
+ end;
+
+ ef_FSlideUp,
+ ef_FSlideDown,
+ ef_FSlideUpFine,
+ ef_FSlideDownFine:
+ begin
+ effect_table2[chan] := concw(event[chan].effect_def2,event[chan].effect2);
+ fslide_table2[chan] := event[chan].effect2;
+ end;
+
+ ef_GlobalFSlideUp,
+ ef_GlobalFSlideDown:
+ begin
+ If (event[chan].effect_def2 = ef_GlobalFSlideUp) then
+ begin
+ If (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect = ef_ex_ExtendedCmd*16+ef_ex_cmd_FTrm_XFGFS) then
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_FreqSlideUpXF,
+ event[chan].effect2)
+ else If (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect = ef_ex_ExtendedCmd*16+ef_ex_cmd_FVib_FGFS) then
+ effect_table2[chan] := concw(ef_FSlideUpFine,event[chan].effect2)
+ else effect_table2[chan] := concw(ef_FSlideUp,event[chan].effect2);
+ end
+ else
+ begin
+ If (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect = ef_ex_ExtendedCmd*16+ef_ex_cmd_FTrm_XFGFS) then
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_FreqSlideDnXF,
+ event[chan].effect2)
+ else If (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect = ef_ex_ExtendedCmd*16+ef_ex_cmd_FVib_FGFS) then
+ effect_table2[chan] := concw(ef_FSlideDownFine,event[chan].effect2)
+ else effect_table2[chan] := concw(ef_FSlideDown,event[chan].effect2);
+ end;
+ For idx := chan to songdata.nm_tracks do
+ begin
+ fslide_table2[idx] := event[chan].effect2;
+ glfsld_table2[idx] := effect_table2[chan];
+ end;
+ end;
+
+ ef_FSlideUpVSlide,
+ ef_FSlUpVSlF,
+ ef_FSlideDownVSlide,
+ ef_FSlDownVSlF,
+ ef_FSlUpFineVSlide,
+ ef_FSlUpFineVSlF,
+ ef_FSlDownFineVSlide,
+ ef_FSlDownFineVSlF:
+ If (event[chan].effect2 <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,event[chan].effect2)
+ else If (eLo2[chan] in [ef_FSlideUpVSlide,ef_FSlUpVSlF,ef_FSlideDownVSlide,
+ ef_FSlDownVSlF,ef_FSlUpFineVSlide,ef_FSlUpFineVSlF,
+ ef_FSlDownFineVSlide,ef_FSlDownFineVSlF]) and
+ (eHi2[chan] <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,eHi2[chan])
+ else effect_table2[chan] := effect_table2[chan] AND $0ff00;
+
+ ef_TonePortamento:
+ If (event[chan].note in [1..12*8+1]) then
+ begin
+ If (event[chan].effect2 <> 0) then
+ effect_table2[chan] := concw(ef_TonePortamento,event[chan].effect2)
+ else If (eLo2[chan] = ef_TonePortamento) and
+ (eHi2[chan] <> 0) then
+ effect_table2[chan] := concw(ef_TonePortamento,eHi2[chan])
+ else effect_table2[chan] := ef_TonePortamento;
+
+ porta_table2[chan].speed := HI(effect_table2[chan]);
+ porta_table2[chan].freq := nFreq(event[chan].note-1)+
+ SHORTINT(ins_parameter(event_table[chan].instr_def,12));
+ end
+ else If (eLo2[chan] = ef_TonePortamento) then
+ begin
+ If (event[chan].effect2 <> 0) then
+ effect_table2[chan] := concw(ef_TonePortamento,event[chan].effect2)
+ else If (eLo2[chan] = ef_TonePortamento) and
+ (eHi2[chan] <> 0) then
+ effect_table2[chan] := concw(ef_TonePortamento,eHi2[chan])
+ else effect_table2[chan] := ef_TonePortamento;
+ porta_table2[chan].speed := HI(effect_table2[chan]);
+ end;
+
+ ef_TPortamVolSlide,
+ ef_TPortamVSlideFine:
+ If (event[chan].effect2 <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,event[chan].effect2)
+ else If (eLo2[chan] in [ef_TPortamVolSlide,ef_TPortamVSlideFine]) and
+ (eHi2[chan] <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,eHi2[chan])
+ else effect_table2[chan] := effect_table2[chan] AND $0ff00;
+
+ ef_Vibrato,
+ ef_ExtraFineVibrato:
+ begin
+ If (event[chan].effect2 <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,event[chan].effect2)
+ else If (eLo2[chan] in [ef_Vibrato,ef_ExtraFineVibrato]) and
+ (eHi2[chan] <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,eHi2[chan])
+ else effect_table2[chan] := event[chan].effect_def2;
+
+ If (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect = ef_ex_ExtendedCmd*16+ef_ex_cmd_FVib_FGFS) then
+ vibr_table2[chan].fine := TRUE;
+
+ vibr_table2[chan].speed := HI(effect_table2[chan]) DIV 16;
+ vibr_table2[chan].depth := HI(effect_table2[chan]) MOD 16;
+ end;
+
+ ef_Tremolo,
+ ef_ExtraFineTremolo:
+ begin
+ If (event[chan].effect2 <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,event[chan].effect2)
+ else If (eLo2[chan] in [ef_Tremolo,ef_ExtraFineTremolo]) and
+ (eHi2[chan] <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,eHi2[chan])
+ else effect_table2[chan] := event[chan].effect_def2;
+
+ If (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect = ef_ex_ExtendedCmd*16+ef_ex_cmd_FTrm_XFGFS) then
+ trem_table2[chan].fine := TRUE;
+
+ trem_table2[chan].speed := HI(effect_table2[chan]) DIV 16;
+ trem_table2[chan].depth := HI(effect_table2[chan]) MOD 16;
+ end;
+
+ ef_VibratoVolSlide,
+ ef_VibratoVSlideFine:
+ begin
+ If (event[chan].effect2 <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,event[chan].effect2)
+ else If (eLo2[chan] in [ef_VibratoVolSlide,ef_VibratoVSlideFine]) and
+ (HI(effect_table2[chan]) <> 0) then
+ effect_table2[chan] := concw(event[chan].effect_def2,HI(effect_table2[chan]))
+ else effect_table2[chan] := effect_table2[chan] AND $0ff00;
+
+ If (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect = ef_ex_ExtendedCmd*16+ef_ex_cmd_FVib_FGFS) then
+ vibr_table2[chan].fine := TRUE;
+ end;
+
+ ef_SetCarrierVol:
+ set_ins_volume(BYTE_NULL,63-event[chan].effect2,chan);
+
+ ef_SetModulatorVol:
+ set_ins_volume(63-event[chan].effect2,BYTE_NULL,chan);
+
+ ef_SetInsVolume:
+ If percussion_mode and (chan in [17..20]) then
+ set_ins_volume(63-event[chan].effect2,BYTE_NULL,chan)
+ else If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ set_ins_volume(BYTE_NULL,63-event[chan].effect2,chan)
+ else set_ins_volume(63-event[chan].effect2,63-event[chan].effect2,chan);
+
+ ef_ForceInsVolume:
+ If percussion_mode and (chan in [17..20]) then
+ set_ins_volume(63-event[chan].effect2,BYTE_NULL,chan)
+ else If (ins_parameter(voice_table[chan],10) AND 1 = 0) then
+ set_ins_volume(scale_volume(ins_parameter(voice_table[chan],2) AND $3f,63-event[chan].effect2),63-event[chan].effect2,chan)
+ else set_ins_volume(63-event[chan].effect2,63-event[chan].effect2,chan);
+
+ ef_PositionJump:
+ If no_loop(chan,current_line) then
+ begin
+ pattern_break := TRUE;
+ next_line := pattern_break_flag+chan;
+ end;
+
+ ef_PatternBreak:
+ If no_loop(chan,current_line) then
+ begin
+ pattern_break := TRUE;
+ next_line := max(event[chan].effect2,PRED(songdata.patt_len));
+ end;
+
+ ef_SetSpeed:
+ speed := event[chan].effect2;
+
+ ef_SetTempo:
+ update_timer(event[chan].effect2);
+
+ ef_SetWaveform:
+ begin
+ If (event[chan].effect2 DIV 16 in [0..7]) then
+ begin
+ fmpar_table[chan].adsrw_car.wform := event[chan].effect2 DIV 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ If (event[chan].effect2 MOD 16 in [0..7]) then
+ begin
+ fmpar_table[chan].adsrw_mod.wform := event[chan].effect2 MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+ end;
+
+ ef_VolSlide:
+ effect_table2[chan] := concw(ef_VolSlide,event[chan].effect2);
+
+ ef_VolSlideFine:
+ effect_table2[chan] := concw(ef_VolSlideFine,event[chan].effect2);
+
+ ef_RetrigNote:
+ If (event[chan].effect2 <> 0) then
+ begin
+ If NOT (eLo2[chan] in [ef_RetrigNote,ef_MultiRetrigNote]) then
+ retrig_table2[chan] := 1;
+ effect_table2[chan] := concw(ef_RetrigNote,event[chan].effect2);
+ end;
+
+ ef_SetGlobalVolume:
+ begin
+ global_volume := event[chan].effect2;
+ set_global_volume;
+ end;
+
+ ef_MultiRetrigNote:
+ If (event[chan].effect2 DIV 16 <> 0) then
+ begin
+ If NOT (eLo2[chan] in [ef_RetrigNote,ef_MultiRetrigNote]) then
+ retrig_table2[chan] := 1;
+ effect_table2[chan] := concw(ef_MultiRetrigNote,event[chan].effect2);
+ end;
+
+ ef_Tremor:
+ If (event[chan].effect2 DIV 16 <> 0) and
+ (event[chan].effect2 MOD 16 <> 0) then
+ begin
+ If (eLo2[chan] <> ef_Tremor) then
+ begin
+ tremor_table2[chan].pos := 0;
+ tremor_table2[chan].volume := volume_table[chan];
+ end;
+ effect_table2[chan] := concw(ef_Tremor,event[chan].effect2);
+ end;
+
+ ef_Extended:
+ Case (event[chan].effect2 DIV 16) of
+ ef_ex_SetTremDepth:
+ Case (event[chan].effect2 MOD 16) of
+ 0: begin
+ opl3out(_instr[11],misc_register AND $07f);
+ current_tremolo_depth := 0;
+ end;
+
+ 1: begin
+ opl3out(_instr[11],misc_register OR $080);
+ current_tremolo_depth := 1;
+ end;
+ end;
+
+ ef_ex_SetVibDepth:
+ Case (event[chan].effect2 MOD 16) of
+ 0: begin
+ opl3out(_instr[11],misc_register AND $0bf);
+ current_vibrato_depth := 0;
+ end;
+
+ 1: begin
+ opl3out(_instr[11],misc_register OR $040);
+ current_vibrato_depth := 1;
+ end;
+ end;
+
+ ef_ex_SetAttckRateM:
+ begin
+ fmpar_table[chan].adsrw_mod.attck := event[chan].effect2 MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+
+ ef_ex_SetDecayRateM:
+ begin
+ fmpar_table[chan].adsrw_mod.dec := event[chan].effect2 MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+
+ ef_ex_SetSustnLevelM:
+ begin
+ fmpar_table[chan].adsrw_mod.sustn := event[chan].effect2 MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+
+ ef_ex_SetRelRateM:
+ begin
+ fmpar_table[chan].adsrw_mod.rel := event[chan].effect2 MOD 16;
+ update_modulator_adsrw(chan);
+ end;
+
+ ef_ex_SetAttckRateC:
+ begin
+ fmpar_table[chan].adsrw_car.attck := event[chan].effect2 MOD 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ ef_ex_SetDecayRateC:
+ begin
+ fmpar_table[chan].adsrw_car.dec := event[chan].effect2 MOD 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ ef_ex_SetSustnLevelC:
+ begin
+ fmpar_table[chan].adsrw_car.sustn := event[chan].effect2 MOD 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ ef_ex_SetRelRateC:
+ begin
+ fmpar_table[chan].adsrw_car.rel := event[chan].effect2 MOD 16;
+ update_carrier_adsrw(chan);
+ end;
+
+ ef_ex_SetFeedback:
+ begin
+ fmpar_table[chan].feedb := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex_SetPanningPos:
+ begin
+ panning_table[chan] := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex_PatternLoop,
+ ef_ex_PatternLoopRec:
+ If (event[chan].effect2 MOD 16 = 0) then
+ loopbck_table[chan] := current_line
+ else If (loopbck_table[chan] <> BYTE_NULL) then
+ begin
+ If (loop_table[chan][current_line] = BYTE_NULL) then
+ loop_table[chan][current_line] := event[chan].effect2 MOD 16;
+ If (loop_table[chan][current_line] <> 0) then
+ begin
+ pattern_break := TRUE;
+ next_line := pattern_loop_flag+chan;
+ end
+ else If (event[chan].effect2 DIV 16 = ef_ex_PatternLoopRec) then
+ loop_table[chan][current_line] := BYTE_NULL;
+ end;
+
+ ef_ex_MacroKOffLoop:
+ If (event[chan].effect2 MOD 16 <> 0) then
+ keyoff_loop[chan] := TRUE
+ else keyoff_loop[chan] := FALSE;
+
+ ef_ex_ExtendedCmd:
+ Case (event[chan].effect2 MOD 16) of
+ ef_ex_cmd_RSS: release_sustaining_sound(chan);
+ ef_ex_cmd_ResetVol: reset_ins_volume(chan);
+ ef_ex_cmd_LockVol: volume_lock [chan] := TRUE;
+ ef_ex_cmd_UnlockVol: volume_lock [chan] := FALSE;
+ ef_ex_cmd_LockVP: peak_lock [chan] := TRUE;
+ ef_ex_cmd_UnlockVP: peak_lock [chan] := FALSE;
+ ef_ex_cmd_VSlide_def: volslide_type[chan] := 0;
+ ef_ex_cmd_LockPan: pan_lock [chan] := TRUE;
+ ef_ex_cmd_UnlockPan: pan_lock [chan] := FALSE;
+ ef_ex_cmd_VibrOff: change_frequency(chan,freq_table[chan]);
+ ef_ex_cmd_TremOff: set_ins_volume(LO(volume_table[chan]),
+ HI(volume_table[chan]),chan);
+ ef_ex_cmd_VSlide_car:
+ If NOT ((event[chan].effect_def = ef_Extended) and
+ (event[chan].effect = ef_ex_ExtendedCmd*16+
+ ef_ex_cmd_VSlide_mod)) then
+ volslide_type[chan] := 1;
+
+ ef_ex_cmd_VSlide_mod:
+ If NOT ((event[chan].effect_def = ef_Extended) and
+ (event[chan].effect = ef_ex_ExtendedCmd*16+
+ ef_ex_cmd_VSlide_car)) then
+ volslide_type[chan] := 2;
+ end;
+ end;
+
+ ef_Extended2:
+ Case (event[chan].effect2 DIV 16) of
+ ef_ex2_PatDelayFrame,
+ ef_ex2_PatDelayRow:
+ begin
+ pattern_delay := TRUE;
+ If (event[chan].effect2 DIV 16 = ef_ex2_PatDelayFrame) then
+ tickD := (event[chan].effect2 MOD 16)
+ else tickD := speed*(event[chan].effect2 MOD 16);
+ end;
+
+ ef_ex2_NoteDelay:
+ begin
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_NoteDelay,0);
+ notedel_table[chan] := event[chan].effect2 MOD 16;
+ end;
+
+ ef_ex2_NoteCut:
+ begin
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_NoteCut,0);
+ notecut_table[chan] := event[chan].effect2 MOD 16;
+ end;
+
+ ef_ex2_FineTuneUp:
+ Inc(ftune_table[chan],event[chan].effect2 MOD 16);
+
+ ef_ex2_FineTuneDown:
+ Dec(ftune_table[chan],event[chan].effect2 MOD 16);
+
+ ef_ex2_GlVolSlideUp:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSlideUp,
+ event[chan].effect2 MOD 16);
+ ef_ex2_GlVolSlideDn:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSlideDn,
+ event[chan].effect2 MOD 16);
+ ef_ex2_GlVolSlideUpF:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSlideUpF,
+ event[chan].effect2 MOD 16);
+ ef_ex2_GlVolSlideDnF:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSlideDnF,
+ event[chan].effect2 MOD 16);
+ ef_ex2_GlVolSldUpXF:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSldUpXF,
+ event[chan].effect2 MOD 16);
+ ef_ex2_GlVolSldDnXF:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_GlVolSldDnXF,
+ event[chan].effect2 MOD 16);
+ ef_ex2_VolSlideUpXF:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_VolSlideUpXF,
+ event[chan].effect2 MOD 16);
+ ef_ex2_VolSlideDnXF:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_VolSlideDnXF,
+ event[chan].effect2 MOD 16);
+ ef_ex2_FreqSlideUpXF:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_FreqSlideUpXF,
+ event[chan].effect2 MOD 16);
+ ef_ex2_FreqSlideDnXF:
+ effect_table2[chan] := concw(ef_extended2+ef_fix2+ef_ex2_FreqSlideDnXF,
+ event[chan].effect2 MOD 16);
+ end;
+
+ ef_Extended3:
+ Case (event[chan].effect2 DIV 16) of
+ ef_ex3_SetConnection:
+ begin
+ fmpar_table[chan].connect := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetMultipM:
+ begin
+ fmpar_table[chan].multipM := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetKslM:
+ begin
+ fmpar_table[chan].kslM := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetTremoloM:
+ begin
+ fmpar_table[chan].tremM := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetVibratoM:
+ begin
+ fmpar_table[chan].vibrM := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetKsrM:
+ begin
+ fmpar_table[chan].ksrM := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetSustainM:
+ begin
+ fmpar_table[chan].sustM := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetMultipC:
+ begin
+ fmpar_table[chan].multipC := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetKslC:
+ begin
+ fmpar_table[chan].kslC := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetTremoloC:
+ begin
+ fmpar_table[chan].tremC := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetVibratoC:
+ begin
+ fmpar_table[chan].vibrC := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetKsrC:
+ begin
+ fmpar_table[chan].ksrC := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+
+ ef_ex3_SetSustainC:
+ begin
+ fmpar_table[chan].sustC := event[chan].effect2 MOD 16;
+ update_fmpar(chan);
+ end;
+ end;
+ end;
+
+ For chan := 1 to songdata.nm_tracks do
+ begin
+ If (event[chan].effect_def+event[chan].effect = 0) then
+ If (glfsld_table[chan] = 0) then effect_table[chan] := 0
+ else begin
+ event_table[chan].effect_def := event[chan].effect_def;
+ event_table[chan].effect := event[chan].effect;
+ end;
+
+ If (event[chan].effect_def2+event[chan].effect2 = 0) then
+ If (glfsld_table2[chan] = 0) then effect_table2[chan] := 0
+ else begin
+ event_table[chan].effect_def2 := event[chan].effect_def2;
+ event_table[chan].effect2 := event[chan].effect2;
+ end;
+
+ If (event[chan].note = event[chan].note OR keyoff_flag) then key_off(chan)
+ else If NOT (LO(effect_table[chan]) in [ef_TonePortamento,
+ ef_TPortamVolSlide,
+ ef_TPortamVSlideFine,
+ ef_extended2+ef_fix2+ef_ex2_NoteDelay]) and
+ NOT (LO(effect_table2[chan]) in [ef_TonePortamento,
+ ef_TPortamVolSlide,
+ ef_TPortamVSlideFine,
+ ef_extended2+ef_fix2+ef_ex2_NoteDelay]) then
+ If NOT (((event[chan].effect_def2 = ef_SwapArpeggio) or
+ (event[chan].effect_def2 = ef_SwapVibrato)) and
+ (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect DIV 16 = ef_ex_ExtendedCmd) and
+ (event[chan].effect MOD 16 = ef_ex_cmd_NoRestart)) and
+ NOT (((event[chan].effect_def = ef_SwapArpeggio) or
+ (event[chan].effect_def = ef_SwapVibrato)) and
+ (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 DIV 16 = ef_ex_ExtendedCmd) and
+ (event[chan].effect2 MOD 16 = ef_ex_cmd_NoRestart)) then
+ output_note(event[chan].note,voice_table[chan],chan,TRUE)
+ else output_note_NR(event[chan].note,voice_table[chan],chan,TRUE)
+ else If (event[chan].note <> 0) and
+ (event_table[chan].note = event_table[chan].note OR keyoff_flag) and
+ ((event[chan].effect_def in [ef_TonePortamento,
+ ef_TPortamVolSlide,
+ ef_TPortamVSlideFine]) or
+ (event[chan].effect_def2 in [ef_TonePortamento,
+ ef_TPortamVolSlide,
+ ef_TPortamVSlideFine])) then
+ output_note(event_table[chan].note AND NOT keyoff_flag,voice_table[chan],chan,FALSE)
+ else If (event[chan].note <> 0) then
+ event_table[chan].note := event[chan].note;
+
+ Case event[chan].effect_def of
+ ef_SwapArpeggio:
+ begin
+ If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 DIV 16 = ef_ex_ExtendedCmd) and
+ (event[chan].effect2 MOD 16 = ef_ex_cmd_NoRestart) then
+ begin
+ If (macro_table[chan].arpg_pos >
+ songdata.macro_table[event[chan].effect].arpeggio.length) then
+ macro_table[chan].arpg_pos :=
+ songdata.macro_table[event[chan].effect].arpeggio.length;
+ macro_table[chan].arpg_table := event[chan].effect;
+ end
+ else begin
+ macro_table[chan].arpg_count := 1;
+ macro_table[chan].arpg_pos := 0;
+ macro_table[chan].arpg_table := event[chan].effect;
+ macro_table[chan].arpg_note := event_table[chan].note;
+ end;
+ end;
+
+ ef_SwapVibrato:
+ begin
+ If (event[chan].effect_def2 = ef_Extended) and
+ (event[chan].effect2 DIV 16 = ef_ex_ExtendedCmd) and
+ (event[chan].effect2 MOD 16 = ef_ex_cmd_NoRestart) then
+ begin
+ If (macro_table[chan].vib_table >
+ songdata.macro_table[event[chan].effect].vibrato.length) then
+ macro_table[chan].vib_pos :=
+ songdata.macro_table[event[chan].effect].vibrato.length;
+ macro_table[chan].vib_table := event[chan].effect;
+ end
+ else begin
+ macro_table[chan].vib_count := 1;
+ macro_table[chan].vib_pos := 0;
+ macro_table[chan].vib_table := event[chan].effect;
+ macro_table[chan].vib_delay := songdata.macro_table[macro_table[chan].vib_table].vibrato.delay;
+ end;
+ end;
+
+ ef_SetCustomSpeedTab:
+ generate_custom_vibrato(event[chan].effect);
+ end;
+
+ Case event[chan].effect_def2 of
+ ef_SwapArpeggio:
+ begin
+ If (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect DIV 16 = ef_ex_ExtendedCmd) and
+ (event[chan].effect MOD 16 = ef_ex_cmd_NoRestart) then
+ begin
+ If (macro_table[chan].arpg_pos >
+ songdata.macro_table[event[chan].effect2].arpeggio.length) then
+ macro_table[chan].arpg_pos :=
+ songdata.macro_table[event[chan].effect2].arpeggio.length;
+ macro_table[chan].arpg_table := event[chan].effect2;
+ end
+ else begin
+ macro_table[chan].arpg_count := 1;
+ macro_table[chan].arpg_pos := 0;
+ macro_table[chan].arpg_table := event[chan].effect2;
+ macro_table[chan].arpg_note := event_table[chan].note;
+ end;
+ end;
+
+ ef_SwapVibrato:
+ begin
+ If (event[chan].effect_def = ef_Extended) and
+ (event[chan].effect DIV 16 = ef_ex_ExtendedCmd) and
+ (event[chan].effect MOD 16 = ef_ex_cmd_NoRestart) then
+ begin
+ If (macro_table[chan].vib_table >
+ songdata.macro_table[event[chan].effect2].vibrato.length) then
+ macro_table[chan].vib_pos :=
+ songdata.macro_table[event[chan].effect2].vibrato.length;
+ macro_table[chan].vib_table := event[chan].effect2;
+ end
+ else begin
+ macro_table[chan].vib_count := 1;
+ macro_table[chan].vib_pos := 0;
+ macro_table[chan].vib_table := event[chan].effect2;
+ macro_table[chan].vib_delay := songdata.macro_table[macro_table[chan].vib_table].vibrato.delay;
+ end;
+ end;
+
+ ef_SetCustomSpeedTab:
+ generate_custom_vibrato(event[chan].effect2);
+ end;
+
+ update_fine_effects(chan);
+ end;
+
+ If pattern_delay then
+ begin
+ time_playing := time_playing+1/tempo*tickD;
+ If (time_playing > 3600-1) then time_playing := 0;
+ end
+ else begin
+ time_playing := time_playing+1/tempo*speed;
+ If (time_playing > 3600-1) then time_playing := 0;
+ end;
+end;
+
+procedure portamento_up(chan: Byte; slide: Word; limit: Word);
+
+var
+ freq: Word;
+
+begin
+ freq := calc_freq_shift_up(freq_table[chan] AND $1fff,slide);
+ If (freq <= limit) then change_frequency(chan,freq)
+ else change_frequency(chan,limit);
+end;
+
+procedure portamento_down(chan: Byte; slide: Word; limit: Word);
+
+var
+ freq: Word;
+
+begin
+ freq := calc_freq_shift_down(freq_table[chan] AND $1fff,slide);
+ If (freq >= limit) then change_frequency(chan,freq)
+ else change_frequency(chan,limit);
+end;
+
+procedure macro_vibrato__porta_up(chan: Byte; depth: Byte);
+
+var
+ freq: Word;
+
+begin
+ freq := calc_freq_shift_up(macro_table[chan].vib_freq AND $1fff,depth);
+ If (freq <= nFreq(12*8+1)) then change_freq(chan,freq)
+ else change_freq(chan,nFreq(12*8+1));
+end;
+
+procedure macro_vibrato__porta_down(chan: Byte; depth: Byte);
+
+var
+ freq: Word;
+
+begin
+ freq := calc_freq_shift_down(macro_table[chan].vib_freq AND $1fff,depth);
+ If (freq >= nFreq(0)) then change_freq(chan,freq)
+ else change_freq(chan,nFreq(0));
+end;
+
+procedure tone_portamento(chan: Byte);
+begin
+ If (freq_table[chan] AND $1fff > porta_table[chan].freq) then
+ portamento_down(chan,porta_table[chan].speed,porta_table[chan].freq)
+ else If (freq_table[chan] AND $1fff < porta_table[chan].freq) then
+ portamento_up(chan,porta_table[chan].speed,porta_table[chan].freq);
+end;
+
+procedure tone_portamento2(chan: Byte);
+begin
+ If (freq_table[chan] AND $1fff > porta_table2[chan].freq) then
+ portamento_down(chan,porta_table2[chan].speed,porta_table2[chan].freq)
+ else If (freq_table[chan] AND $1fff < porta_table2[chan].freq) then
+ portamento_up(chan,porta_table2[chan].speed,porta_table2[chan].freq);
+end;
+
+procedure slide_volume_up(chan,slide: Byte);
+
+var
+ temp: Word;
+ limit1,limit2,vLo,vHi: Byte;
+
+procedure slide_carrier_volume_up;
+begin
+ vLo := LO(temp);
+ vHi := HI(temp);
+ If (vHi-slide >= limit1) then temp := concw(vLo,vHi-slide)
+ else temp := concw(vLo,limit1);
+ set_ins_volume(BYTE_NULL,HI(temp),chan);
+ volume_table[chan] := temp;
+end;
+
+procedure slide_modulator_volume_up;
+begin
+ vLo := LO(temp);
+ vHi := HI(temp);
+ If (vLo-slide >= limit2) then temp := concw(vLo-slide,vHi)
+ else temp := concw(limit2,vHi);
+ set_ins_volume(LO(temp),BYTE_NULL,chan);
+ volume_table[chan] := temp;
+end;
+
+begin
+ If NOT peak_lock[chan] then limit1 := 0
+ else limit1 := ins_parameter(event_table[chan].instr_def,3) AND $3f;
+
+ If NOT peak_lock[chan] then limit2 := 0
+ else limit2 := ins_parameter(event_table[chan].instr_def,2) AND $3f;
+ temp := volume_table[chan];
+
+ Case volslide_type[chan] of
+ 0: begin
+ slide_carrier_volume_up;
+ If (ins_parameter(voice_table[chan],10) AND 1 = 1) or
+ (percussion_mode and (chan in [17..20])) then
+ slide_modulator_volume_up;
+ end;
+ 1: slide_carrier_volume_up;
+ 2: slide_modulator_volume_up;
+ 3: begin
+ slide_carrier_volume_up;
+ slide_modulator_volume_up;
+ end;
+ end;
+end;
+
+procedure slide_volume_down(chan,slide: Byte);
+
+var
+ temp: Word;
+ vLo,vHi: Byte;
+
+procedure slide_carrier_volume_down;
+begin
+ vLo := LO(temp);
+ vHi := HI(temp);
+ If (vHi+slide <= 63) then temp := concw(vLo,vHi+slide)
+ else temp := concw(vLo,63);
+ set_ins_volume(BYTE_NULL,HI(temp),chan);
+ volume_table[chan] := temp;
+end;
+
+procedure slide_modulator_volume_down;
+begin
+ vLo := LO(temp);
+ vHi := HI(temp);
+ If (vLo+slide <= 63) then temp := concw(vLo+slide,vHi)
+ else temp := concw(63,vHi);
+ set_ins_volume(LO(temp),BYTE_NULL,chan);
+ volume_table[chan] := temp;
+end;
+
+begin
+ temp := volume_table[chan];
+ Case volslide_type[chan] of
+ 0: begin
+ slide_carrier_volume_down;
+ If (ins_parameter(voice_table[chan],10) AND 1 = 1) or
+ (percussion_mode and (chan in [17..20])) then
+ slide_modulator_volume_down;
+ end;
+ 1: slide_carrier_volume_down;
+ 2: slide_modulator_volume_down;
+ 3: begin
+ slide_carrier_volume_down;
+ slide_modulator_volume_down;
+ end;
+ end;
+end;
+
+procedure volume_slide(chan,up_speed,down_speed: Byte);
+begin
+ If (up_speed <> 0) then slide_volume_up(chan,up_speed)
+ else If (down_speed <> 0) then slide_volume_down(chan,down_speed);
+end;
+
+procedure global_volume_slide(up_speed,down_speed: Byte);
+begin
+ If (up_speed <> BYTE_NULL) then
+ global_volume := max(global_volume+up_speed,63);
+ If (down_speed <> BYTE_NULL) then
+ If (global_volume >= down_speed) then Dec(global_volume,down_speed)
+ else global_volume := 0;
+ set_global_volume;
+end;
+
+procedure arpeggio(chan: Byte);
+
+const
+ arpgg_state: array[0..2] of Byte = (1,2,0);
+
+var
+ freq: Word;
+
+begin
+ Case arpgg_table[chan].state of
+ 0: freq := nFreq(arpgg_table[chan].note-1);
+ 1: freq := nFreq(arpgg_table[chan].note-1 +arpgg_table[chan].add1);
+ 2: freq := nFreq(arpgg_table[chan].note-1 +arpgg_table[chan].add2);
+ end;
+
+ arpgg_table[chan].state := arpgg_state[arpgg_table[chan].state];
+ change_frequency(chan,freq+
+ SHORTINT(ins_parameter(event_table[chan].instr_def,12)));
+end;
+
+procedure arpeggio2(chan: Byte);
+
+const
+ arpgg_state: array[0..2] of Byte = (1,2,0);
+
+var
+ freq: Word;
+
+begin
+ Case arpgg_table2[chan].state of
+ 0: freq := nFreq(arpgg_table2[chan].note-1);
+ 1: freq := nFreq(arpgg_table2[chan].note-1 +arpgg_table2[chan].add1);
+ 2: freq := nFreq(arpgg_table2[chan].note-1 +arpgg_table2[chan].add2);
+ end;
+
+ arpgg_table2[chan].state := arpgg_state[arpgg_table2[chan].state];
+ change_frequency(chan,freq+
+ SHORTINT(ins_parameter(event_table[chan].instr_def,12)));
+end;
+
+procedure vibrato(chan: Byte);
+
+var
+ freq,old_freq: Word;
+ direction: Byte;
+
+begin
+ Inc(vibr_table[chan].pos,vibr_table[chan].speed*vibtrem_speed_factor);
+ freq := calc_vibtrem_shift(vibr_table[chan].depth,
+ vibr_table[chan].pos,direction);
+ old_freq := freq_table[chan];
+ If (direction = 0) then portamento_down(chan,freq,nFreq(0))
+ else portamento_up(chan,freq,nFreq(12*8+1));
+ freq_table[chan] := old_freq;
+end;
+
+procedure vibrato2(chan: Byte);
+
+var
+ freq,old_freq: Word;
+ direction: Byte;
+
+begin
+ Inc(vibr_table2[chan].pos,vibr_table2[chan].speed*vibtrem_speed_factor);
+ freq := calc_vibtrem_shift(vibr_table2[chan].depth,
+ vibr_table2[chan].pos,direction);
+ old_freq := freq_table[chan];
+ If (direction = 0) then portamento_down(chan,freq,nFreq(0))
+ else portamento_up(chan,freq,nFreq(12*8+1));
+ freq_table[chan] := old_freq;
+end;
+
+procedure tremolo(chan: Byte);
+
+var
+ vol,old_vol: Word;
+ direction: Byte;
+
+begin
+ Inc(trem_table[chan].pos,trem_table[chan].speed*vibtrem_speed_factor);
+ vol := calc_vibtrem_shift(trem_table[chan].depth,
+ trem_table[chan].pos,direction);
+ old_vol := volume_table[chan];
+ If (direction = 0) then slide_volume_down(chan,vol)
+ else slide_volume_up(chan,vol);
+ volume_table[chan] := old_vol;
+end;
+
+procedure tremolo2(chan: Byte);
+
+var
+ vol,old_vol: Word;
+ direction: Byte;
+
+begin
+ Inc(trem_table2[chan].pos,trem_table2[chan].speed*vibtrem_speed_factor);
+ vol := calc_vibtrem_shift(trem_table2[chan].depth,
+ trem_table2[chan].pos,direction);
+ old_vol := volume_table[chan];
+ If (direction = 0) then slide_volume_down(chan,vol)
+ else slide_volume_up(chan,vol);
+ volume_table[chan] := old_vol;
+end;
+
+procedure update_effects;
+
+var
+ chan,eLo,eHi,
+ eLo2,eHi2: Byte;
+
+function chanvol(chan: Byte): Byte;
+begin
+ If (ins_parameter(voice_table[chan],10) AND 1 = 0) then chanvol := 63-HI(volume_table[chan])
+ else chanvol := 63-Round((LO(volume_table[chan])+HI(volume_table[chan]))/2);
+end;
+
+begin
+ For chan := 1 to songdata.nm_tracks do
+ begin
+ eLo := LO(effect_table[chan]);
+ eHi := HI(effect_table[chan]);
+ eLo2 := LO(effect_table2[chan]);
+ eHi2 := HI(effect_table2[chan]);
+
+ Case eLo of
+ ef_Arpeggio+ef_fix1:
+ arpeggio(chan);
+
+ ef_ArpggVSlide:
+ begin
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+ arpeggio(chan);
+ end;
+
+ ef_ArpggVSlideFine:
+ arpeggio(chan);
+
+ ef_FSlideUp:
+ portamento_up(chan,eHi,nFreq(12*8+1));
+
+ ef_FSlideDown:
+ portamento_down(chan,eHi,nFreq(0));
+
+ ef_FSlideUpVSlide:
+ begin
+ portamento_up(chan,fslide_table[chan],nFreq(12*8+1));
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+ end;
+
+ ef_FSlUpVSlF:
+ portamento_up(chan,fslide_table[chan],nFreq(12*8+1));
+
+ ef_FSlideDownVSlide:
+ begin
+ portamento_down(chan,fslide_table[chan],nFreq(0));
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+ end;
+
+ ef_FSlDownVSlF:
+ portamento_down(chan,fslide_table[chan],nFreq(0));
+
+ ef_FSlUpFineVSlide:
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+
+ ef_FSlDownFineVSlide:
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+
+ ef_TonePortamento:
+ tone_portamento(chan);
+
+ ef_TPortamVolSlide:
+ begin
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+ tone_portamento(chan);
+ end;
+
+ ef_TPortamVSlideFine:
+ tone_portamento(chan);
+
+ ef_Vibrato:
+ If NOT vibr_table[chan].fine then
+ vibrato(chan);
+
+ ef_Tremolo:
+ If NOT trem_table[chan].fine then
+ tremolo(chan);
+
+ ef_VibratoVolSlide:
+ begin
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+ If NOT vibr_table[chan].fine then
+ vibrato(chan);
+ end;
+
+ ef_VibratoVSlideFine:
+ If NOT vibr_table[chan].fine then
+ vibrato(chan);
+
+ ef_VolSlide:
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+
+ ef_RetrigNote:
+ If (retrig_table[chan] >= eHi) then
+ begin
+ retrig_table[chan] := 0;
+ output_note(event_table[chan].note,
+ event_table[chan].instr_def,chan,TRUE);
+ end
+ else Inc(retrig_table[chan]);
+
+ ef_MultiRetrigNote:
+ If (retrig_table[chan] >= eHi DIV 16) then
+ begin
+ Case eHi MOD 16 of
+ 0,8: ;
+
+ 1: slide_volume_down(chan,1);
+ 2: slide_volume_down(chan,2);
+ 3: slide_volume_down(chan,4);
+ 4: slide_volume_down(chan,8);
+ 5: slide_volume_down(chan,16);
+
+ 9: slide_volume_up(chan,1);
+ 10: slide_volume_up(chan,2);
+ 11: slide_volume_up(chan,4);
+ 12: slide_volume_up(chan,8);
+ 13: slide_volume_up(chan,16);
+
+
+ 6: slide_volume_down(chan,chanvol(chan)-
+ Round(chanvol(chan)*2/3));
+ 7: slide_volume_down(chan,chanvol(chan)-
+ Round(chanvol(chan)*1/2));
+
+ 14: slide_volume_up(chan,max(Round(chanvol(chan)*3/2)-
+ chanvol(chan),63));
+ 15: slide_volume_up(chan,max(Round(chanvol(chan)*2)-
+ chanvol(chan),63));
+ end;
+
+ retrig_table[chan] := 0;
+ output_note(event_table[chan].note,
+ event_table[chan].instr_def,chan,TRUE);
+ end
+ else Inc(retrig_table[chan]);
+
+ ef_Tremor:
+ If (tremor_table[chan].pos >= 0) then
+ begin
+ If (SUCC(tremor_table[chan].pos) <= eHi DIV 16) then
+ Inc(tremor_table[chan].pos)
+ else begin
+ slide_volume_down(chan,63);
+ tremor_table[chan].pos := -1;
+ end;
+ end
+ else If (PRED(tremor_table[chan].pos) >= -(eHi MOD 16)) then
+ Dec(tremor_table[chan].pos)
+ else begin
+ set_ins_volume(LO(tremor_table[chan].volume),
+ HI(tremor_table[chan].volume),chan);
+ tremor_table[chan].pos := 1;
+ end;
+
+ ef_extended2+ef_fix2+ef_ex2_NoteDelay:
+ If (notedel_table[chan] = 0) then
+ begin
+ notedel_table[chan] := BYTE_NULL;
+ output_note(event_table[chan].note,
+ event_table[chan].instr_def,chan,TRUE);
+ end
+ else Dec(notedel_table[chan]);
+
+ ef_extended2+ef_fix2+ef_ex2_NoteCut:
+ If (notecut_table[chan] = 0) then
+ begin
+ notecut_table[chan] := BYTE_NULL;
+ key_off(chan);
+ end
+ else Dec(notecut_table[chan]);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSlideUp:
+ global_volume_slide(eHi,BYTE_NULL);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSlideDn:
+ global_volume_slide(BYTE_NULL,eHi);
+ end;
+
+ Case eLo2 of
+ ef_Arpeggio+ef_fix1:
+ arpeggio2(chan);
+
+ ef_ArpggVSlide:
+ begin
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+ arpeggio2(chan);
+ end;
+
+ ef_ArpggVSlideFine:
+ arpeggio2(chan);
+
+ ef_FSlideUp:
+ portamento_up(chan,eHi2,nFreq(12*8+1));
+
+ ef_FSlideDown:
+ portamento_down(chan,eHi2,nFreq(0));
+
+ ef_FSlideUpVSlide:
+ begin
+ portamento_up(chan,fslide_table2[chan],nFreq(12*8+1));
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+ end;
+
+ ef_FSlUpVSlF:
+ portamento_up(chan,fslide_table2[chan],nFreq(12*8+1));
+
+ ef_FSlideDownVSlide:
+ begin
+ portamento_down(chan,fslide_table2[chan],nFreq(0));
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+ end;
+
+ ef_FSlDownVSlF:
+ portamento_down(chan,fslide_table2[chan],nFreq(0));
+
+ ef_FSlUpFineVSlide:
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+
+ ef_FSlDownFineVSlide:
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+
+ ef_TonePortamento:
+ tone_portamento2(chan);
+
+ ef_TPortamVolSlide:
+ begin
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+ tone_portamento2(chan);
+ end;
+
+ ef_TPortamVSlideFine:
+ tone_portamento2(chan);
+
+ ef_Vibrato:
+ If NOT vibr_table2[chan].fine then
+ vibrato2(chan);
+
+ ef_Tremolo:
+ If NOT trem_table2[chan].fine then
+ tremolo2(chan);
+
+ ef_VibratoVolSlide:
+ begin
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+ If NOT vibr_table2[chan].fine then
+ vibrato2(chan);
+ end;
+
+ ef_VibratoVSlideFine:
+ If NOT vibr_table2[chan].fine then
+ vibrato2(chan);
+
+ ef_VolSlide:
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+
+ ef_RetrigNote:
+ If (retrig_table2[chan] >= eHi2) then
+ begin
+ retrig_table2[chan] := 0;
+ output_note(event_table[chan].note,
+ event_table[chan].instr_def,chan,TRUE);
+ end
+ else Inc(retrig_table2[chan]);
+
+ ef_MultiRetrigNote:
+ If (retrig_table2[chan] >= eHi2 DIV 16) then
+ begin
+ Case eHi2 MOD 16 of
+ 0,8: ;
+
+ 1: slide_volume_down(chan,1);
+ 2: slide_volume_down(chan,2);
+ 3: slide_volume_down(chan,4);
+ 4: slide_volume_down(chan,8);
+ 5: slide_volume_down(chan,16);
+
+ 9: slide_volume_up(chan,1);
+ 10: slide_volume_up(chan,2);
+ 11: slide_volume_up(chan,4);
+ 12: slide_volume_up(chan,8);
+ 13: slide_volume_up(chan,16);
+
+
+ 6: slide_volume_down(chan,chanvol(chan)-
+ Round(chanvol(chan)*2/3));
+ 7: slide_volume_down(chan,chanvol(chan)-
+ Round(chanvol(chan)*1/2));
+
+ 14: slide_volume_up(chan,max(Round(chanvol(chan)*3/2)-
+ chanvol(chan),63));
+ 15: slide_volume_up(chan,max(Round(chanvol(chan)*2)-
+ chanvol(chan),63));
+ end;
+
+ retrig_table2[chan] := 0;
+ output_note(event_table[chan].note,
+ event_table[chan].instr_def,chan,TRUE);
+ end
+ else Inc(retrig_table2[chan]);
+
+ ef_Tremor:
+ If (tremor_table2[chan].pos >= 0) then
+ begin
+ If (SUCC(tremor_table2[chan].pos) <= eHi2 DIV 16) then
+ Inc(tremor_table2[chan].pos)
+ else begin
+ slide_volume_down(chan,63);
+ tremor_table2[chan].pos := -1;
+ end;
+ end
+ else If (PRED(tremor_table2[chan].pos) >= -(eHi2 MOD 16)) then
+ Dec(tremor_table2[chan].pos)
+ else begin
+ set_ins_volume(LO(tremor_table2[chan].volume),
+ HI(tremor_table2[chan].volume),chan);
+ tremor_table2[chan].pos := 1;
+ end;
+
+ ef_extended2+ef_fix2+ef_ex2_NoteDelay:
+ If (notedel_table[chan] = 0) then
+ begin
+ notedel_table[chan] := BYTE_NULL;
+ output_note(event_table[chan].note,
+ event_table[chan].instr_def,chan,TRUE);
+ end
+ else Dec(notedel_table[chan]);
+
+ ef_extended2+ef_fix2+ef_ex2_NoteCut:
+ If (notecut_table[chan] = 0) then
+ begin
+ notecut_table[chan] := BYTE_NULL;
+ key_off(chan);
+ end
+ else Dec(notecut_table[chan]);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSlideUp:
+ global_volume_slide(eHi2,BYTE_NULL);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSlideDn:
+ global_volume_slide(BYTE_NULL,eHi2);
+ end;
+ end;
+end;
+
+procedure update_fine_effects(chan: Byte);
+
+var
+ eLo,eHi,
+ eLo2,eHi2: Byte;
+
+begin
+ eLo := LO(effect_table[chan]);
+ eHi := HI(effect_table[chan]);
+ eLo2 := LO(effect_table2[chan]);
+ eHi2 := HI(effect_table2[chan]);
+
+ Case eLo of
+ ef_ArpggVSlideFine:
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+
+ ef_FSlideUpFine:
+ portamento_up(chan,eHi,nFreq(12*8+1));
+
+ ef_FSlideDownFine:
+ portamento_down(chan,eHi,nFreq(0));
+
+ ef_FSlUpVSlF:
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+
+ ef_FSlDownVSlF:
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+
+ ef_FSlUpFineVSlide:
+ portamento_up(chan,fslide_table[chan],nFreq(12*8+1));
+
+ ef_FSlUpFineVSlF:
+ begin
+ portamento_up(chan,fslide_table[chan],nFreq(12*8+1));
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+ end;
+
+ ef_FSlDownFineVSlide:
+ portamento_down(chan,fslide_table[chan],nFreq(0));
+
+ ef_FSlDownFineVSlF:
+ begin
+ portamento_down(chan,fslide_table[chan],nFreq(0));
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+ end;
+
+ ef_TPortamVSlideFine:
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+
+ ef_Vibrato:
+ If vibr_table[chan].fine then
+ vibrato(chan);
+
+ ef_Tremolo:
+ If trem_table[chan].fine then
+ tremolo(chan);
+
+ ef_VibratoVolSlide:
+ If vibr_table[chan].fine then
+ vibrato(chan);
+
+ ef_VibratoVSlideFine:
+ begin
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+ If vibr_table[chan].fine then
+ vibrato(chan);
+ end;
+
+ ef_VolSlideFine:
+ volume_slide(chan,eHi DIV 16,eHi MOD 16);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSlideUpF:
+ global_volume_slide(eHi,BYTE_NULL);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSlideDnF:
+ global_volume_slide(BYTE_NULL,eHi);
+ end;
+
+ Case eLo2 of
+ ef_ArpggVSlideFine:
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+
+ ef_FSlideUpFine:
+ portamento_up(chan,eHi2,nFreq(12*8+1));
+
+ ef_FSlideDownFine:
+ portamento_down(chan,eHi2,nFreq(0));
+
+ ef_FSlUpVSlF:
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+
+ ef_FSlDownVSlF:
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+
+ ef_FSlUpFineVSlide:
+ portamento_up(chan,fslide_table2[chan],nFreq(12*8+1));
+
+ ef_FSlUpFineVSlF:
+ begin
+ portamento_up(chan,fslide_table2[chan],nFreq(12*8+1));
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+ end;
+
+ ef_FSlDownFineVSlide:
+ portamento_down(chan,fslide_table2[chan],nFreq(0));
+
+ ef_FSlDownFineVSlF:
+ begin
+ portamento_down(chan,fslide_table2[chan],nFreq(0));
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+ end;
+
+ ef_TPortamVSlideFine:
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+
+ ef_Vibrato:
+ If vibr_table2[chan].fine then
+ vibrato2(chan);
+
+ ef_Tremolo:
+ If trem_table2[chan].fine then
+ tremolo2(chan);
+
+ ef_VibratoVolSlide:
+ If vibr_table2[chan].fine then
+ vibrato2(chan);
+
+ ef_VibratoVSlideFine:
+ begin
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+ If vibr_table2[chan].fine then
+ vibrato2(chan);
+ end;
+
+ ef_VolSlideFine:
+ volume_slide(chan,eHi2 DIV 16,eHi2 MOD 16);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSlideUpF:
+ global_volume_slide(eHi2,BYTE_NULL);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSlideDnF:
+ global_volume_slide(BYTE_NULL,eHi2);
+ end;
+end;
+
+procedure update_extra_fine_effects;
+
+var
+ chan,eLo,eHi,
+ eLo2,eHi2: Byte;
+
+begin
+ For chan := 1 to songdata.nm_tracks do
+ begin
+ eLo := LO(effect_table[chan]);
+ eHi := HI(effect_table[chan]);
+ eLo2 := LO(effect_table2[chan]);
+ eHi2 := HI(effect_table2[chan]);
+
+ Case eLo of
+ ef_extended2+ef_fix2+ef_ex2_GlVolSldUpXF:
+ global_volume_slide(eHi,BYTE_NULL);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSldDnXF:
+ global_volume_slide(BYTE_NULL,eHi);
+
+ ef_extended2+ef_fix2+ef_ex2_VolSlideUpXF:
+ volume_slide(chan,eHi,0);
+
+ ef_extended2+ef_fix2+ef_ex2_VolSlideDnXF:
+ volume_slide(chan,0,eHi);
+
+ ef_extended2+ef_fix2+ef_ex2_FreqSlideUpXF:
+ portamento_up(chan,eHi,nFreq(12*8+1));
+
+ ef_extended2+ef_fix2+ef_ex2_FreqSlideDnXF:
+ portamento_down(chan,eHi,nFreq(0));
+
+ ef_ExtraFineArpeggio:
+ arpeggio(chan);
+
+ ef_ExtraFineVibrato:
+ If NOT vibr_table[chan].fine then
+ vibrato(chan);
+
+ ef_ExtraFineTremolo:
+ If NOT trem_table[chan].fine then
+ tremolo(chan);
+ end;
+
+ Case eLo2 of
+ ef_extended2+ef_fix2+ef_ex2_GlVolSldUpXF:
+ global_volume_slide(eHi2,BYTE_NULL);
+
+ ef_extended2+ef_fix2+ef_ex2_GlVolSldDnXF:
+ global_volume_slide(BYTE_NULL,eHi2);
+
+ ef_extended2+ef_fix2+ef_ex2_VolSlideUpXF:
+ volume_slide(chan,eHi2,0);
+
+ ef_extended2+ef_fix2+ef_ex2_VolSlideDnXF:
+ volume_slide(chan,0,eHi2);
+
+ ef_extended2+ef_fix2+ef_ex2_FreqSlideUpXF:
+ portamento_up(chan,eHi2,nFreq(12*8+1));
+
+ ef_extended2+ef_fix2+ef_ex2_FreqSlideDnXF:
+ portamento_down(chan,eHi2,nFreq(0));
+
+ ef_ExtraFineArpeggio:
+ arpeggio2(chan);
+
+ ef_ExtraFineVibrato:
+ If NOT vibr_table2[chan].fine then
+ vibrato2(chan);
+
+ ef_ExtraFineTremolo:
+ If NOT trem_table2[chan].fine then
+ tremolo2(chan);
+ end;
+ end;
+end;
+
+function calc_following_order(order: Byte): Integer;
+
+var
+ result: Integer;
+ index,jump_count: Byte;
+
+begin
+ _debug_str_ := 'A2PLAYER.PAS:calc_following_order';
+ result := -1;
+ index := order;
+ jump_count := 0;
+
+ Repeat
+ If (songdata.pattern_order[index] < $80) then result := index
+ else begin
+ index := songdata.pattern_order[index]-$80;
+ Inc(jump_count);
+ end;
+ until (jump_count > $7f) or
+ (result <> -1);
+
+ calc_following_order := result;
+end;
+
+function calc_order_jump: Integer;
+
+var
+ temp: Byte;
+ result: Integer;
+
+begin
+ _debug_str_ := 'A2PLAYER.PAS:calc_order_jump';
+ result := 0;
+ temp := 0;
+
+ Repeat
+ If (songdata.pattern_order[current_order] > $7f) then
+ current_order := songdata.pattern_order[current_order]-$80;
+ Inc(temp);
+ until (temp > $7f) or (songdata.pattern_order[current_order] < $80);
+
+ If (temp > $7f) then begin stop_playing; result := -1; end;
+ calc_order_jump := result;
+end;
+
+procedure update_song_position;
+
+var
+ temp: Byte;
+
+begin
+ _debug_str_ := 'A2PLAYER.PAS:update_song_position';
+ If (current_line < PRED(songdata.patt_len)) and NOT pattern_break then Inc(current_line)
+ else begin
+ If NOT (pattern_break and (next_line AND $0f0 = pattern_loop_flag)) and
+ (current_order < $7f) then
+ begin
+ FillChar(loopbck_table,SizeOf(loopbck_table),BYTE_NULL);
+ FillChar(loop_table,SizeOf(loop_table),BYTE_NULL);
+ Inc(current_order);
+ end;
+
+ If pattern_break and (next_line AND $0f0 = pattern_loop_flag) then
+ begin
+ temp := next_line-pattern_loop_flag;
+ next_line := loopbck_table[temp];
+ If (loop_table[temp][current_line] <> 0) then
+ Dec(loop_table[temp][current_line]);
+ end
+ else If pattern_break and (next_line AND $0f0 = pattern_break_flag) then
+ begin
+ current_order := event_table[next_line-pattern_break_flag].effect;
+ pattern_break := FALSE;
+ end
+ else If (current_order > $7f) then
+ current_order := 0;
+
+ If (songdata.pattern_order[current_order] > $7f) then
+ If (calc_order_jump = -1) then EXIT;
+
+ current_pattern := songdata.pattern_order[current_order];
+ If NOT pattern_break then current_line := 0
+ else begin
+ pattern_break := FALSE;
+ current_line := next_line;
+ end;
+ end;
+
+ For temp := 1 to songdata.nm_tracks do
+ begin
+ glfsld_table[temp] := 0;
+ glfsld_table2[temp] := 0;
+ end;
+
+ If (current_line = 0) and
+ (current_order = calc_following_order(0)) and speed_update then
+ begin
+ tempo := songdata.tempo;
+ speed := songdata.speed;
+ update_timer(tempo);
+ end;
+end;
+
+procedure poll_proc;
+
+var
+ temp: Byte;
+
+var
+ _debug_str_bak_: String;
+
+begin
+ _debug_str_bak_ := _debug_str_;
+ _debug_str_ := 'A2PLAYER.PAS:_poll_proc';
+
+ If (NOT pattern_delay and (ticks-tick0+1 >= speed)) or
+ fast_forward then
+ begin
+ If (songdata.pattern_order[current_order] > $7f) then
+ If (calc_order_jump = -1) then EXIT;
+
+ current_pattern := songdata.pattern_order[current_order];
+ play_line;
+ If NOT fast_forward then update_effects
+ else For temp := 1 to speed do
+ begin
+ update_effects;
+ If (temp MOD 4 = temp) then
+ update_extra_fine_effects;
+ Inc(ticks);
+ end;
+
+ If fast_forward or NOT pattern_delay then
+ update_song_position;
+
+ tick0 := ticks;
+ If fast_forward then
+ If NOT pattern_delay then synchronize_song_timer;
+
+ If fast_forward and pattern_delay then
+ begin
+ tickD := 0;
+ pattern_delay := FALSE;
+ end;
+
+ If fast_forward then fast_forward := FALSE;
+ end
+ else
+ begin
+ update_effects;
+ Inc(ticks);
+ If pattern_delay and (tickD > 1) then Dec(tickD)
+ else begin
+ If pattern_delay then
+ begin
+ tick0 := ticks;
+ update_song_position;
+ end;
+ pattern_delay := FALSE;
+ end;
+ end;
+
+ Inc(tickXF);
+ If (tickXF MOD 4 = 0) then
+ begin
+ update_extra_fine_effects;
+ Dec(tickXF,4);
+ end;
+ _debug_str_ := _debug_str_bak_;
+end;
+
+procedure macro_poll_proc;
+
+const
+ IDLE = $0fff;
+ FINISHED = $0ffff;
+
+var
+ chan: Byte;
+ finished_flag: Word;
+
+var
+ _debug_str_bak_: String;
+
+function _ins_adsr_data_empty(ins: Byte): Boolean;
+begin
+ _ins_adsr_data_empty :=
+ (ins_parameter(ins,5) SHR 4 = 0) and
+ (ins_parameter(ins,4) SHR 4 = 0) and
+ (ins_parameter(ins,5) AND $0f = 0) and
+ (ins_parameter(ins,4) AND $0f = 0) and
+ (ins_parameter(ins,7) SHR 4 = 0) and
+ (ins_parameter(ins,6) SHR 4 = 0) and
+ (ins_parameter(ins,7) AND $0f = 0) and
+ (ins_parameter(ins,6) AND $0f = 0);
+end;
+
+begin
+ _debug_str_bak_ := _debug_str_;
+ _debug_str_ := 'ADT2UNIT.PAS:macro_poll_proc';
+ For chan := 1 to songdata.nm_tracks do
+ begin
+ If NOT keyoff_loop[chan] then finished_flag := FINISHED
+ else finished_flag := IDLE;
+
+ With macro_table[chan] do
+ begin
+ With songdata.instr_macros[fmreg_table] do
+ If (fmreg_table <> 0) and (speed <> 0) then
+ If (fmreg_duration > 1) then Dec(fmreg_duration)
+ else begin
+ fmreg_count := 1;
+ If (fmreg_pos <= length) then
+ If (loop_begin <> 0) and (loop_length <> 0) then
+ If (fmreg_pos = loop_begin+PRED(loop_length)) then
+ fmreg_pos := loop_begin
+ else If (fmreg_pos < length) then Inc(fmreg_pos)
+ else fmreg_pos := finished_flag
+ else If (fmreg_pos < length) then Inc(fmreg_pos)
+ else fmreg_pos := finished_flag
+ else fmreg_pos := finished_flag;
+
+ If (freq_table[chan] OR $2000 = freq_table[chan]) and
+ (keyoff_pos <> 0) and
+ (fmreg_pos >= keyoff_pos) then
+ fmreg_pos := IDLE
+ else If (freq_table[chan] OR $2000 <> freq_table[chan]) and
+ (fmreg_pos <> 0) and (keyoff_pos <> 0) and
+ ((fmreg_pos < keyoff_pos) or (fmreg_pos = IDLE)) then
+ fmreg_pos := keyoff_pos;
+
+ If (fmreg_pos <> 0) and
+ (fmreg_pos <> IDLE) and (fmreg_pos <> finished_flag) then
+ begin
+ fmreg_duration := data[fmreg_pos].duration;
+ If (fmreg_duration <> 0) then
+ With data[fmreg_pos] do
+ begin
+ // force KEY-ON with missing ADSR instrument data
+ force_macro_keyon := FALSE;
+ If (fmreg_pos = 1) then
+ If _ins_adsr_data_empty(voice_table[chan]) and
+ NOT (songdata.dis_fmreg_col[fmreg_table][0] and
+ songdata.dis_fmreg_col[fmreg_table][1] and
+ songdata.dis_fmreg_col[fmreg_table][2] and
+ songdata.dis_fmreg_col[fmreg_table][3] and
+ songdata.dis_fmreg_col[fmreg_table][12] and
+ songdata.dis_fmreg_col[fmreg_table][13] and
+ songdata.dis_fmreg_col[fmreg_table][14] and
+ songdata.dis_fmreg_col[fmreg_table][15]) then
+ force_macro_keyon := TRUE;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][0] then
+ fmpar_table[chan].adsrw_mod.attck := fm_data.ATTCK_DEC_modulator SHR 4;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][1] then
+ fmpar_table[chan].adsrw_mod.dec := fm_data.ATTCK_DEC_modulator AND $0f;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][2] then
+ fmpar_table[chan].adsrw_mod.sustn := fm_data.SUSTN_REL_modulator SHR 4;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][3] then
+ fmpar_table[chan].adsrw_mod.rel := fm_data.SUSTN_REL_modulator AND $0f;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][4] then
+ fmpar_table[chan].adsrw_mod.wform := fm_data.WAVEFORM_modulator AND $07;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][6] then
+ fmpar_table[chan].kslM := fm_data.KSL_VOLUM_modulator SHR 6;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][7] then
+ fmpar_table[chan].multipM := fm_data.AM_VIB_EG_modulator AND $0f;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][8] then
+ fmpar_table[chan].tremM := fm_data.AM_VIB_EG_modulator SHR 7;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][9] then
+ fmpar_table[chan].vibrM := fm_data.AM_VIB_EG_modulator SHR 6 AND 1;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][10] then
+ fmpar_table[chan].ksrM := fm_data.AM_VIB_EG_modulator SHR 4 AND 1;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][11] then
+ fmpar_table[chan].sustM := fm_data.AM_VIB_EG_modulator SHR 5 AND 1;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][12] then
+ fmpar_table[chan].adsrw_car.attck := fm_data.ATTCK_DEC_carrier SHR 4;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][13] then
+ fmpar_table[chan].adsrw_car.dec := fm_data.ATTCK_DEC_carrier AND $0f;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][14] then
+ fmpar_table[chan].adsrw_car.sustn := fm_data.SUSTN_REL_carrier SHR 4;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][15] then
+ fmpar_table[chan].adsrw_car.rel := fm_data.SUSTN_REL_carrier AND $0f;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][16] then
+ fmpar_table[chan].adsrw_car.wform := fm_data.WAVEFORM_carrier AND $07;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][18] then
+ fmpar_table[chan].kslC := fm_data.KSL_VOLUM_carrier SHR 6;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][19] then
+ fmpar_table[chan].multipC := fm_data.AM_VIB_EG_carrier AND $0f;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][20] then
+ fmpar_table[chan].tremC := fm_data.AM_VIB_EG_carrier SHR 7;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][21] then
+ fmpar_table[chan].vibrC := fm_data.AM_VIB_EG_carrier SHR 6 AND 1;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][22] then
+ fmpar_table[chan].ksrC := fm_data.AM_VIB_EG_carrier SHR 4 AND 1;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][23] then
+ fmpar_table[chan].sustC := fm_data.AM_VIB_EG_carrier SHR 5 AND 1;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][24] then
+ fmpar_table[chan].connect := fm_data.FEEDBACK_FM AND 1;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][25] then
+ fmpar_table[chan].feedb := fm_data.FEEDBACK_FM SHR 1 AND 7;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][27] then
+ If NOT pan_lock[chan] then
+ panning_table[chan] := panning;
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][5] then
+ set_ins_volume(63-fm_data.KSL_VOLUM_modulator AND $3f,
+ BYTE_NULL,chan);
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][17] then
+ set_ins_volume(BYTE_NULL,
+ 63-fm_data.KSL_VOLUM_carrier AND $3f,chan);
+
+ update_modulator_adsrw(chan);
+ update_carrier_adsrw(chan);
+ update_fmpar(chan);
+
+ If force_macro_keyon or
+ NOT (fm_data.FEEDBACK_FM OR $80 <> fm_data.FEEDBACK_FM) then
+ output_note(event_table[chan].note,
+ event_table[chan].instr_def,chan,FALSE);
+
+ If NOT songdata.dis_fmreg_col[fmreg_table][26] then
+ If (freq_slide > 0) then
+ portamento_up(chan,freq_slide,nFreq(12*8+1))
+ else If (freq_slide < 0) then
+ portamento_down(chan,Abs(freq_slide),nFreq(0));
+ end;
+ end;
+ end;
+
+ With songdata.macro_table[arpg_table].arpeggio do
+ If (arpg_table <> 0) and (speed <> 0) then
+ If (arpg_count = speed) then
+ begin
+ arpg_count := 1;
+ If (arpg_pos <= length) then
+ If (loop_begin <> 0) and (loop_length <> 0) then
+ If (arpg_pos = loop_begin+PRED(loop_length)) then
+ arpg_pos := loop_begin
+ else If (arpg_pos < length) then Inc(arpg_pos)
+ else arpg_pos := finished_flag
+ else If (arpg_pos < length) then Inc(arpg_pos)
+ else arpg_pos := finished_flag
+ else arpg_pos := finished_flag;
+
+ If (freq_table[chan] OR $2000 = freq_table[chan]) and
+ (keyoff_pos <> 0) and
+ (arpg_pos >= keyoff_pos) then
+ arpg_pos := IDLE
+ else If (freq_table[chan] OR $2000 <> freq_table[chan]) and
+ (keyoff_pos <> 0) and (keyoff_pos <> 0) and
+ ((arpg_pos < keyoff_pos) or (arpg_pos = IDLE)) then
+ arpg_pos := keyoff_pos;
+
+ If (arpg_pos <> 0) and
+ (arpg_pos <> IDLE) and (arpg_pos <> finished_flag) then
+ Case data[arpg_pos] of
+ 0: change_frequency(chan,
+ nFreq(arpg_note-1)+
+ SHORTINT(ins_parameter(event_table[chan].instr_def,12)));
+
+ 1..96:
+ change_frequency(chan,
+ nFreq(max(arpg_note+data[arpg_pos],97)-1)+
+ SHORTINT(ins_parameter(event_table[chan].instr_def,12)));
+
+ $80..$80+12*8+1:
+ change_frequency(chan,nFreq(data[arpg_pos]-$80-1)+
+ SHORTINT(ins_parameter(event_table[chan].instr_def,12)));
+ end;
+ end
+ else Inc(arpg_count);
+
+ With songdata.macro_table[vib_table].vibrato do
+ If NOT vib_paused and
+ (vib_table <> 0) and (speed <> 0) then
+ If (vib_count = speed) then
+ If (vib_delay <> 0) then Dec(vib_delay)
+ else begin
+ vib_count := 1;
+ If (vib_pos <= length) then
+ If (loop_begin <> 0) and (loop_length <> 0) then
+ If (vib_pos = loop_begin+PRED(loop_length)) then
+ vib_pos := loop_begin
+ else If (vib_pos < length) then Inc(vib_pos)
+ else vib_pos := finished_flag
+ else If (vib_pos < length) then Inc(vib_pos)
+ else vib_pos := finished_flag
+ else vib_pos := finished_flag;
+
+ If (freq_table[chan] OR $2000 = freq_table[chan]) and
+ (keyoff_pos <> 0) and
+ (vib_pos >= keyoff_pos) then
+ vib_pos := IDLE
+ else If (freq_table[chan] OR $2000 <> freq_table[chan]) and
+ (vib_pos <> 0) and (keyoff_pos <> 0) and
+ ((vib_pos < keyoff_pos) or (vib_pos = IDLE)) then
+ vib_pos := keyoff_pos;
+
+ If (vib_pos <> 0) and
+ (vib_pos <> IDLE) and (vib_pos <> finished_flag) then
+ If (data[vib_pos] > 0) then
+ macro_vibrato__porta_up(chan,data[vib_pos])
+ else If (data[vib_pos] < 0) then
+ macro_vibrato__porta_down(chan,Abs(data[vib_pos]))
+ else change_freq(chan,vib_freq);
+ end
+ else Inc(vib_count);
+ end;
+ end;
+ _debug_str_ := _debug_str_bak_;
+end;
+
+var
+ ticklooper,
+ macro_ticklooper: Longint;
+
+procedure timer_poll_proc;
+
+var
+ _debug_str_bak_: String;
+
+begin
+ _debug_str_bak_ := _debug_str_;
+ _debug_str_ := 'A2PLAYER.PAS:timer_poll_proc';
+
+ If (timer_det < IRQ_freq DIV 200) then Inc(timer_det)
+ else begin
+ timer_det := 1;
+ Inc(_delay_counter);
+ end;
+
+ If (current_order = 0) and (current_line = 0) and
+ (tick0 = ticks) then
+ begin
+ song_timer := 0;
+ timer_temp := 0;
+ song_timer_tenths := 0;
+ end;
+
+ If (play_status = isPlaying) then
+ begin
+ song_timer_tenths := Trunc(100/IRQ_freq*timer_temp);
+ If (song_timer_tenths = 100) then song_timer_tenths := 0;
+ If (timer_temp < IRQ_freq) then Inc(timer_temp)
+ else begin
+ Inc(song_timer);
+ timer_temp := 1;
+ end;
+ end;
+
+ If (song_timer > 3600-1) then
+ begin
+ song_timer := 0;
+ timer_temp := 0;
+ song_timer_tenths := 0;
+ end;
+
+ If (ticklooper = 0) and NOT replay_forbidden then
+ poll_proc;
+
+ If (macro_ticklooper = 0) then
+ macro_poll_proc;
+
+ Inc(ticklooper);
+ If (ticklooper >= IRQ_freq DIV tempo) or fast_forward then
+ ticklooper := 0;
+
+ Inc(macro_ticklooper);
+ If (macro_ticklooper >= IRQ_freq DIV (tempo*_macro_speedup)) then
+ macro_ticklooper := 0;
+
+ _debug_str_ := _debug_str_bak_;
+end;
+
+procedure newtimer;
+begin
+ _debug_str_ := 'A2PLAYER.PAS:newtimer';
+ If irq_mode then timer_poll_proc;
+ If (@external_irq_hook <> NIL) then external_irq_hook;
+end;
+
+procedure init_irq;
+begin
+ _debug_str_ := 'A2PLAYER.PAS:init_irq';
+ If irq_initialized then EXIT;
+ irq_initialized := TRUE;
+ TimerInstallHandler(@newtimer);
+ TimerSetup(50);
+end;
+
+procedure done_irq;
+begin
+ _debug_str_ := 'A2PLAYER.PAS:done_irq';
+ If NOT irq_initialized then EXIT;
+ irq_initialized := FALSE;
+ irq_mode := TRUE;
+ TimerDone;
+ TimerRemoveHandler;
+ irq_mode := FALSE;
+end;
+
+function calc_pattern_pos(pattern: Byte): Byte;
+
+var
+ index: Integer;
+ jump_count,pattern_pos: Byte;
+
+begin
+ _debug_str_ := 'A2PLAYER.PAS:calc_pattern_pos';
+ pattern_pos := BYTE_NULL;
+ jump_count := 0;
+ index := calc_following_order(0);
+ While (index <> -1) and (jump_count < $7f) do
+ If (songdata.pattern_order[index] <> pattern) then
+ If NOT (index < $7f) then BREAK
+ else begin
+ Inc(index);
+ index := calc_following_order(index);
+ Inc(jump_count);
+ end
+ else begin
+ pattern_pos := index;
+ BREAK;
+ end;
+ calc_pattern_pos := pattern_pos;
+end;
+
+procedure init_buffers;
+
+var
+ temp: Byte;
+
+begin
+ _debug_str_ := 'A2PLAYER.PAS:init_buffers';
+ FillChar(fmpar_table,SizeOf(fmpar_table),0);
+ FillChar(pan_lock,SizeOf(pan_lock),BYTE(panlock));
+ FillChar(volume_table,SizeOf(volume_table),0);
+ FillChar(vscale_table,SizeOf(vscale_table),0);
+ FillChar(modulator_vol,SizeOf(modulator_vol),0);
+ FillChar(carrier_vol,SizeOf(carrier_vol),0);
+ FillChar(event_table,SizeOf(event_table),0);
+ FillChar(freq_table,SizeOf(freq_table),0);
+ FillChar(effect_table,SizeOf(effect_table),0);
+ FillChar(effect_table2,SizeOf(effect_table2),0);
+ FillChar(fslide_table,SizeOf(fslide_table),0);
+ FillChar(fslide_table2,SizeOf(fslide_table2),0);
+ FillChar(glfsld_table,SizeOf(glfsld_table),0);
+ FillChar(glfsld_table2,SizeOf(glfsld_table2),0);
+ FillChar(porta_table,SizeOf(porta_table),0);
+ FillChar(porta_table2,SizeOf(porta_table2),0);
+ FillChar(arpgg_table,SizeOf(arpgg_table),0);
+ FillChar(arpgg_table2,SizeOf(arpgg_table2),0);
+ FillChar(vibr_table,SizeOf(vibr_table),0);
+ FillChar(vibr_table2,SizeOf(vibr_table2),0);
+ FillChar(trem_table,SizeOf(trem_table),0);
+ FillChar(trem_table2,SizeOf(trem_table2),0);
+ FillChar(retrig_table,SizeOf(retrig_table),0);
+ FillChar(retrig_table2,SizeOf(retrig_table2),0);
+ FillChar(tremor_table,SizeOf(tremor_table),0);
+ FillChar(tremor_table2,SizeOf(tremor_table2),0);
+ FillChar(panning_table,SizeOf(panning_table),0);
+ FillChar(last_effect,SizeOf(last_effect),0);
+ FillChar(last_effect2,SizeOf(last_effect2),0);
+ FillChar(voice_table,SizeOf(voice_table),0);
+ FillChar(event_new,SizeOf(event_new),0);
+ FillChar(notedel_table,SizeOf(notedel_table),BYTE_NULL);
+ FillChar(notecut_table,SizeOf(notecut_table),BYTE_NULL);
+ FillChar(ftune_table,SizeOf(ftune_table),0);
+ FillChar(loopbck_table,SizeOf(loopbck_table),BYTE_NULL);
+ FillChar(loop_table,SizeOf(loop_table),BYTE_NULL);
+ FillChar(reset_chan,SizeOf(reset_chan),BYTE(FALSE));
+ FillChar(keyoff_loop,SizeOf(keyoff_loop),BYTE(FALSE));
+ FillChar(macro_table,SizeOf(macro_table),0);
+
+ If NOT lockvol then FillChar(volume_lock,SizeOf(volume_lock),0)
+ else For temp := 1 to 20 do volume_lock[temp] := BOOLEAN(songdata.lock_flags[temp] SHR 4 AND 1);
+
+ If NOT panlock then FillChar(panning_table,SizeOf(panning_table),0)
+ else For temp := 1 to 20 do panning_table[temp] := songdata.lock_flags[temp] AND 3;
+
+ If NOT lockVP then FillChar(peak_lock,SizeOf(peak_lock),0)
+ else For temp := 1 to 20 do peak_lock[temp] := BOOLEAN(songdata.lock_flags[temp] SHR 5 AND 1);
+
+ For temp := 1 to 20 do
+ volslide_type[temp] := songdata.lock_flags[temp] SHR 2 AND 3;
+end;
+
+procedure init_player;
+
+var
+ temp: Byte;
+
+begin
+ _debug_str_ := 'A2PLAYER.PAS:init_player';
+ opl2out($01,0);
+
+ For temp := 1 to 18 do opl2out($0b0+_chan_n[temp],0);
+ For temp := $080 to $08d do opl2out(temp,BYTE_NULL);
+ For temp := $090 to $095 do opl2out(temp,BYTE_NULL);
+
+ speed_update := BOOLEAN(songdata.common_flag AND 1);
+ lockvol := BOOLEAN(songdata.common_flag SHR 1 AND 1);
+ lockVP := BOOLEAN(songdata.common_flag SHR 2 AND 1);
+ tremolo_depth := songdata.common_flag SHR 3 AND 1;
+ vibrato_depth := songdata.common_flag SHR 4 AND 1;
+ panlock := BOOLEAN(songdata.common_flag SHR 5 AND 1);
+ percussion_mode := BOOLEAN(songdata.common_flag SHR 6 AND 1);
+ volume_scaling := BOOLEAN(songdata.common_flag SHR 7 AND 1);
+
+ current_tremolo_depth := tremolo_depth;
+ current_vibrato_depth := vibrato_depth;
+ init_buffers;
+
+ If NOT percussion_mode then
+ begin
+ _chan_n := _chmm_n;
+ _chan_m := _chmm_m;
+ _chan_c := _chmm_c;
+ end
+ else
+ begin
+ _chan_n := _chpm_n;
+ _chan_m := _chpm_m;
+ _chan_c := _chpm_c;
+ end;
+
+ misc_register := tremolo_depth SHL 7+
+ vibrato_depth SHL 6+
+ BYTE(percussion_mode) SHL 5;
+
+ opl2out($01,$20);
+ opl2out($08,$40);
+ opl3exp($0105);
+ opl3exp($04+songdata.flag_4op SHL 8);
+
+ key_off(17);
+ key_off(18);
+ opl2out(_instr[11],misc_register);
+
+ current_tremolo_depth := tremolo_depth;
+ current_vibrato_depth := vibrato_depth;
+ global_volume := 63;
+ vibtrem_speed_factor := def_vibtrem_speed_factor;
+ vibtrem_table_size := def_vibtrem_table_size;
+ Move(def_vibtrem_table,vibtrem_table,SizeOf(vibtrem_table));
+
+ For temp := 1 to 20 do
+ begin
+ arpgg_table[temp].state := 1;
+ voice_table[temp] := temp;
+ end;
+end;
+
+procedure stop_playing;
+
+var
+ temp: Byte;
+
+begin
+ _debug_str_ := 'A2PLAYER.PAS:stop_playing';
+ irq_mode := FALSE;
+ play_status := isStopped;
+ global_volume := 63;
+ current_tremolo_depth := tremolo_depth;
+ current_vibrato_depth := vibrato_depth;
+ pattern_break := FALSE;
+ current_order := 0;
+ current_pattern := 0;
+ current_line := 0;
+ song_timer := 0;
+ timer_temp := 0;
+ song_timer_tenths := 0;
+
+ For temp := 1 to 20 do release_sustaining_sound(temp);
+ opl2out(_instr[11],0);
+ opl3exp($0004);
+ opl3exp($0005);
+ init_buffers;
+
+ speed := songdata.speed;
+ update_timer(songdata.tempo);
+end;
+
+procedure init_old_songdata;
+begin
+ _debug_str_ := 'A2PLAYER.PAS:init_old_songdata';
+ FillChar(old_songdata,SizeOf(old_songdata),0);
+ FillChar(old_songdata.pattern_order,SizeOf(old_songdata.pattern_order),$080);
+ FillChar(old_songdata.instr_data,SizeOf(old_songdata.instr_data),0);
+end;
+
+procedure init_songdata;
+begin
+ _debug_str_ := 'A2PLAYER.PAS:init_songdata';
+ If (play_status <> isStopped) then stop_playing
+ else init_buffers;
+
+ FillChar(songdata,SizeOf(songdata),0);
+ FillChar(songdata.pattern_order,SizeOf(songdata.pattern_order),$080);
+ FillChar(pattdata^,PATTERN_SIZE*max_patterns,0);
+
+ songdata.patt_len := 64;
+ songdata.nm_tracks := 9;
+ songdata.tempo := tempo;
+ songdata.speed := speed;
+ songdata.macro_speedup := 1;
+ speed_update := FALSE;
+ lockvol := FALSE;
+ panlock := FALSE;
+ lockVP := FALSE;
+ tremolo_depth := 0;
+ vibrato_depth := 0;
+ volume_scaling := FALSE;
+
+ If (songdata.nm_tracks <= 18) then
+ begin
+ percussion_mode := FALSE;
+ _chan_n := _chmm_n;
+ _chan_m := _chmm_m;
+ _chan_c := _chmm_c;
+ end
+ else
+ begin
+ percussion_mode := TRUE;
+ _chan_n := _chpm_n;
+ _chan_m := _chpm_m;
+ _chan_c := _chpm_c;
+ end;
+end;
+
+procedure start_playing;
+begin
+ _debug_str_ := 'A2PLAYER.PAS:start_playing';
+ stop_playing;
+ If (error_code <> 0) then EXIT
+ else init_player;
+
+ current_order := 0;
+ If (songdata.pattern_order[current_order] > $7f) then
+ If (calc_order_jump = -1) then EXIT;
+
+ current_pattern := songdata.pattern_order[current_order];
+ current_line := 0;
+ pattern_break := FALSE;
+ pattern_delay := FALSE;
+ tickXF := 0;
+ ticks := 0;
+ tick0 := 0;
+ next_line := 0;
+ song_timer := 0;
+ timer_temp := 0;
+ song_timer_tenths := 0;
+ irq_mode := TRUE;
+ replay_forbidden := FALSE;
+ play_status := isPlaying;
+ time_playing := 0;
+ ticklooper := 0;
+ macro_ticklooper := 0;
+ speed := songdata.speed;
+ macro_speedup := songdata.macro_speedup;
+ update_timer(songdata.tempo);
+end;
+
+procedure get_chunk(pattern,line,channel: Byte;
+ var chunk: tADTRACK2_EVENT); assembler;
+asm
+ mov esi,dword ptr [pattdata]
+ mov edi,[chunk]
+ mov al,pattern
+ inc al
+ cmp al,max_patterns
+ jbe @@1
+ mov ecx,CHUNK_SIZE
+ xor al,al
+ rep stosb
+ jmp @@2
+@@1: xor eax,eax
+ mov al,line
+ mov ebx,CHUNK_SIZE
+ mul ebx
+ mov ecx,eax
+ xor eax,eax
+ mov al,channel
+ dec eax
+ mov ebx,256*CHUNK_SIZE
+ mul ebx
+ add ecx,eax
+ xor eax,eax
+ mov al,pattern
+ mov ebx,8
+ div ebx
+ push eax
+ mov eax,edx
+ mov ebx,20*256*CHUNK_SIZE
+ mul ebx
+ add ecx,eax
+ pop eax
+ mov ebx,8*20*256*CHUNK_SIZE
+ mul ebx
+ add ecx,eax
+ add esi,ecx
+ mov ecx,CHUNK_SIZE
+ rep movsb
+@@2:
+end;
+
+procedure put_chunk(pattern,line,channel: Byte;
+ chunk: tADTRACK2_EVENT); assembler;
+asm
+ mov esi,[chunk]
+ mov edi,dword ptr [pattdata]
+ mov al,pattern
+ inc al
+ cmp al,max_patterns
+ jbe @@1
+ mov limit_exceeded,TRUE
+ jmp @@2
+@@1: xor eax,eax
+ mov al,line
+ mov ebx,CHUNK_SIZE
+ mul ebx
+ mov ecx,eax
+ xor eax,eax
+ mov al,channel
+ dec eax
+ mov ebx,256*CHUNK_SIZE
+ mul ebx
+ add ecx,eax
+ xor eax,eax
+ mov al,pattern
+ mov ebx,8
+ div ebx
+ push eax
+ mov eax,edx
+ mov ebx,20*256*CHUNK_SIZE
+ mul ebx
+ add ecx,eax
+ pop eax
+ mov ebx,8*20*256*CHUNK_SIZE
+ mul ebx
+ add ecx,eax
+ add edi,ecx
+ mov ecx,CHUNK_SIZE
+ rep movsb
+@@2:
+end;
+
+procedure count_order(var entries: Byte);
+
+var
+ index,
+ index2: Byte;
+
+begin
+ _debug_str_ := 'A2PLAYER.PAS:count_order';
+ index := 0;
+ index2 := 0;
+
+ Repeat
+ If (songdata.pattern_order[index] <> $80) then
+ begin
+ If (songdata.pattern_order[index] > $80) then
+ If (songdata.pattern_order[index]-$80 <> index2) then
+ begin
+ index := songdata.pattern_order[index]-$80;
+ index2 := index;
+ end
+ else BREAK;
+ end
+ else BREAK;
+ If (index < $80) then Inc(index);
+ until (index > $7f);
+
+ entries := index;
+end;
+
+var
+ old_exit_proc: Pointer;
+ temp: Byte;
+
+procedure new_exit_proc;
+begin
+ _debug_str_ := 'A2PLAYER.PAS:new_exit_proc';
+ stop_playing;
+ done_irq;
+ FreeMem(pattdata,PATTERN_SIZE*max_patterns);
+end;
+
+begin
+ old_exit_proc := ExitProc;
+ ExitProc := @new_exit_proc;
+
+ error_code := 0;
+ temp := $80;
+ Repeat
+ If (MemAvail > PATTERN_SIZE*temp) then
+ begin
+ max_patterns := temp;
+ BREAK;
+ end
+ else If (temp-$10 >= $10) then Dec(temp,$10)
+ else begin
+ error_code := -2;
+ BREAK;
+ end;
+ until FALSE;
+
+ If (error_code <> -2) then
+ GetMem(pattdata,PATTERN_SIZE*max_patterns);
+
+ FillChar(decay_bar,SizeOf(decay_bar),0);
+ play_status := isStopped;
+ init_songdata;
+ init_irq;
+ timer_det := 1;
+end.
--- /dev/null
+/* Output from p2c 1.21alpha-07.Dec.93, the Pascal-to-C translator */
+/* From input file "adt2play.pas" */
+
+
+#include <p2c/p2c.h>
+/* p2c: adt2play.pas, line 2: Warning: Could not find module DPMI [271] */
+
+
+#include "dpmi.h"
+/* p2c: typconst.inc, line 4: Warning: Mismatched '$' signs [241] */
+/* p2c: typconst.inc, line 4:
+ * Warning: Expected a semicolon, found 'ffffffff' [227] */
+
+#ifndef A2PLAYER_H
+#include "a2player.h"
+#endif
+
+#ifndef TIMERINT_H
+#include "timerint.h"
+#endif
+
+#ifndef PARSERIO_H
+#include "parserio.h"
+#endif
+/* p2c: adt2play.pas, line 3:
+ * Warning: Could not find module STRINGIO [271] */
+
+#include "stringio.h"
+/* p2c: adt2play.pas, line 3:
+ * Warning: Could not find module TXTSCRIO [271] */
+#include "txtscrio.h"
+/* p2c: unpk_lib.pas, line 1:
+ * Warning: Unrecognized character 015 in file [247] */
+/* p2c: unpk_lib.pas, line 2:
+ * Warning: Unrecognized character 015 in file [247] */
+/* p2c: unpk_lib.pas, line 3:
+ * Warning: Unrecognized character 015 in file [247] */
+/* p2c: unpk_lib.pas, line 4:
+ * Warning: Expected IMPLEMENTATION, found a '/' [227] */
+#ifndef UNPK_LIB_H
+#include "unpk_lib.h"
+#endif
+
+
+#define _timer_xpos 198
+#define _timer_ypos 5
+#define _timer_color 1
+#define _decay_bar_xpos 10
+#define _decay_bar_ypos 140
+#define _decay_bar_palette_start 250
+#define _progress_xpos 8
+#define _progress_ypos 155
+#define _progress_color 251
+#define _fname_xpos 8
+#define _fname_ypos 170
+#define _fname_color 255
+#define _pos_str_xpos 8
+#define _pos_str_ypos 186
+#define _pos_str_color 252
+/* p2c: adt2play.pas, line 30: Note: Characters >= 128 encountered [281] */
+/* p2c: adt2play.pas, line 31: Note: Characters >= 128 encountered [281] */
+/* p2c: adt2play.pas, line 32: Note: Characters >= 128 encountered [281] */
+/* p2c: adt2play.pas, line 33: Note: Characters >= 128 encountered [281] */
+/* p2c: adt2play.pas, line 39: Note: Characters >= 128 encountered [281] */
+
+
+
+#define kBkSPC 0xe08
+#define kESC 0x11b
+#define kENTER 0x1c0d
+
+
+Static double decay_bar_rise = 10.0, decay_bar_fall = 0.50;
+Static boolean adjust_tracks = true, accurate_conv = true,
+ fix_c_note_bug = true;
+Static uchar window_top = 8;
+
+Static Char modname[15][40] = {
+ "/\264DLiB TR/\264CK3R ][ module", "/\264DLiB TR/\264CK3R ][ G3 module",
+ "/\264DLiB TR/\264CK3R ][ tiny module",
+ "/\264DLiB TR/\264CK3R ][ G3 tiny module", "Amusic module",
+ "XMS-Tracker module", "BoomTracker 4.0 module", "Digital-FM module",
+ "HSC AdLib Composer / HSC-Tracker module", "MPU-401 tr\222kk\356r module",
+ "Reality ADlib Tracker module", "Scream Tracker 3.x module",
+ "FM-Kingtracker module", "Surprise! AdLib Tracker module",
+ "Surprise! AdLib Tracker 2.0 module"
+};
+
+Static Char songdata_source[256];
+Static Char songdata_title[256];
+Static uchar load_flag;
+Static unsigned short fkey;
+Static uchar index_, last_order;
+Static SearchRec dirinfo;
+
+Static uchar buf1[sizeof(tVARIABLE_DATA)];
+Static uchar buf2[65535L];
+Static uchar buf3[65535L];
+Static uchar buf4[65535L];
+Static uchar temp_screen[8192];
+Static short correction;
+Static uchar entries, entries2, temp, temp2;
+Static unsigned short dos_memavail;
+Static Char _ParamStr[256][256];
+Static boolean jukebox = false;
+
+
+Static Void ResetF(f)
+FILE **f;
+{
+ unsigned short fattr;
+
+ strcpy(_debug_str_, "ADT2PLAY.PAS:ResetF_RW");
+ GetFAttr(*f, fattr);
+/* p2c: adt2play.pas, line 81:
+ * Warning: Symbol 'GETFATTR' is not defined [221] */
+ if ((fattr & ReadOnly) == ReadOnly) {
+ FileMode = 0;
+/* p2c: adt2play.pas, line 82:
+ * Warning: Symbol 'FILEMODE' is not defined [221] */
+ }
+/* p2c: adt2play.pas, line 84:
+ * Note: Can't interpret name argument in RESET [180] */
+ rewind(*f);
+}
+
+
+Static Void BlockReadF(f, data, size, bytes_read)
+FILE **f;
+Anyptr data;
+long size, *bytes_read;
+{
+ strcpy(_debug_str_, "ADT2PLAY.PAS:BlockReadF");
+ *bytes_read = fread(data, 1, size, *f);
+ P_ioresult = 0;
+ if (false)
+ *bytes_read = 0;
+}
+
+
+Static Void SeekF(f, fpos)
+FILE **f;
+long fpos;
+{
+ strcpy(_debug_str_, "ADT2PLAY.PAS:SeekF");
+ _SETIO(fseek(*f, fpos, 0) == 0, EndOfFile);
+}
+
+
+Static Void CloseF(f)
+FILE **f;
+{
+ strcpy(_debug_str_, "ADT2PLAY.PAS:CloseF");
+ if (*f != NULL)
+ fclose(*f);
+ *f = NULL;
+}
+/* p2c: adt2play.pas, line 114:
+ * Warning: Expected BEGIN, found 'assembler' [227] */
+
+
+extern unsigned short min PP((int value, int minimum));
+
+main(argc, argv)
+int argc;
+Char *argv[];
+{
+ PASCAL_MAIN(argc, argv);
+/* p2c: adt2play.pas, line 115:
+ * Warning: Expected BEGIN, found 'asm' [227] */
+ exit(EXIT_SUCCESS);
+}
+/* p2c: adt2play.pas, line 123:
+ * Warning: Junk at end of input file ignored [277] */
+
+
+
+
+/* End. */
--- /dev/null
+uses
+ DOS,DPMI,
+ A2player,TimerInt,ParserIO,StringIO,TxtScrIO,
+ UNPK_LIB;
+
+const
+ _timer_xpos = 198;
+ _timer_ypos = 5;
+ _timer_color = 1;
+ _decay_bar_xpos = 10;
+ _decay_bar_ypos = 140;
+ _decay_bar_palette_start = 250;
+ _progress_xpos = 8;
+ _progress_ypos = 155;
+ _progress_color = 251;
+ _fname_xpos = 8;
+ _fname_ypos = 170;
+ _fname_color = 255;
+ _pos_str_xpos = 8;
+ _pos_str_ypos = 186;
+ _pos_str_color = 252;
+
+const
+ decay_bar_rise: Real = 10.0;
+ decay_bar_fall: Real = 0.50;
+ adjust_tracks: Boolean = TRUE;
+ accurate_conv: Boolean = TRUE;
+ fix_c_note_bug: Boolean = TRUE;
+ window_top: Byte = 8;
+ modname: array[1..15] of String[39] = ('/´DLiB TR/´CK3R ][ module',
+ '/´DLiB TR/´CK3R ][ G3 module',
+ '/´DLiB TR/´CK3R ][ tiny module',
+ '/´DLiB TR/´CK3R ][ G3 tiny module',
+ 'Amusic module',
+ 'XMS-Tracker module',
+ 'BoomTracker 4.0 module',
+ 'Digital-FM module',
+ 'HSC AdLib Composer / HSC-Tracker module',
+ 'MPU-401 tr\92kkîr module',
+ 'Reality ADlib Tracker module',
+ 'Scream Tracker 3.x module',
+ 'FM-Kingtracker module',
+ 'Surprise! AdLib Tracker module',
+ 'Surprise! AdLib Tracker 2.0 module');
+var
+ songdata_source: String;
+ songdata_title: String;
+ load_flag: Byte;
+ fkey: Word;
+ index,last_order: Byte;
+ dirinfo: SearchRec;
+
+var
+ buf1: array[0..PRED(SizeOf(tVARIABLE_DATA))] of Byte;
+ buf2: array[0..PRED(65535)] of Byte;
+ buf3: array[0..PRED(65535)] of Byte;
+ buf4: array[0..PRED(65535)] of Byte;
+ temp_screen: array[0..PRED(8192)] of Byte;
+ correction: Integer;
+ entries,
+ entries2: Byte;
+ temp,temp2: Byte;
+ dos_memavail: Word;
+ _ParamStr: array[0..255] of String;
+
+const
+ jukebox: Boolean = FALSE;
+
+const
+ kBkSPC = $0e08;
+ kESC = $011b;
+ kENTER = $1c0d;
+
+procedure ResetF(var f: File);
+
+var
+ fattr: Word;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:ResetF_RW';
+ GetFAttr(f,fattr);
+ If (fattr AND ReadOnly = ReadOnly) then FileMode := 0;
+ {$i-}
+ Reset(f,1);
+ {$i+}
+end;
+
+procedure BlockReadF(var f: File; var data; size: Longint; var bytes_read: Longint);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:BlockReadF';
+ {$i-}
+ BlockRead(f,data,size,bytes_read);
+ {$i+}
+ If (IOresult <> 0) then bytes_read := 0;
+end;
+
+procedure SeekF(var f: File; fpos: Longint);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:SeekF';
+ {$i-}
+ Seek(f,fpos);
+ {$i+}
+end;
+
+procedure CloseF(var f: File);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:CloseF';
+ {$i-}
+ Close(f);
+ {$i+}
+ If (IOresult <> 0) then ;
+end;
+
+function min(value: Word; minimum: Word): Word; assembler;
+asm
+ mov ax,value
+ cmp ax,minimum
+ jae @@1
+ mov ax,minimum
+@@1:
+end;
+
+function max(value: Word; maximum: Word): Word; assembler;
+asm
+ mov ax,value
+ cmp ax,maximum
+ jbe @@1
+ mov ax,maximum
+@@1:
+end;
+
+function concw(lo,hi: Byte): Word; assembler;
+asm
+ mov al,lo
+ mov ah,hi
+end;
+
+function keypressed: Boolean; assembler;
+asm
+ mov ah,01h
+ int 16h
+ mov al,TRUE
+ jnz @@1
+ mov al,FALSE
+@@1:
+end;
+
+function is_4op_mode: Boolean; assembler;
+asm
+ mov al,byte ptr [songdata.flag_4op]
+ or al,al
+ jz @@1
+ mov al,TRUE
+@@1:
+end;
+
+function is_4op_chan(chan: Byte): Boolean; assembler;
+asm
+ mov al,byte ptr [songdata.flag_4op]
+ mov ah,chan
+ test al,1
+ jz @@1
+ cmp ah,1
+ jb @@1
+ cmp ah,2
+ ja @@1
+ mov al,TRUE
+ jmp @@7
+@@1: test al,2
+ jz @@2
+ cmp ah,3
+ jb @@2
+ cmp ah,4
+ ja @@2
+ mov al,TRUE
+ jmp @@7
+@@2: test al,4
+ jz @@3
+ cmp ah,5
+ jb @@3
+ cmp ah,6
+ ja @@3
+ mov al,TRUE
+ jmp @@7
+@@3: test al,8
+ jz @@4
+ cmp ah,10
+ jb @@4
+ cmp ah,11
+ ja @@4
+ mov al,TRUE
+ jmp @@7
+@@4: test al,10h
+ jz @@5
+ cmp ah,12
+ jb @@5
+ cmp ah,13
+ ja @@5
+ mov al,TRUE
+ jmp @@7
+@@5: test al,20h
+ jz @@6
+ cmp ah,14
+ jb @@6
+ cmp ah,15
+ ja @@6
+ mov al,TRUE
+ jmp @@7
+@@6: mov al,FALSE
+@@7:
+end;
+
+{$i structrs.inc}
+{$i iloaders.inc}
+
+const
+ _picture_mode: Boolean = FALSE;
+
+var
+ vmem: array[0..PRED(320*200)] of Byte;
+ fade_buf,fade_buf2: tFADE_BUF;
+ vstate: tVIDEO_STATE;
+
+procedure _refresh_decay_bar(xpos,ypos: Word; height,width,level: Byte); assembler;
+asm
+ mov edi,0a0000h
+ lea edx,dword ptr [_picture_palette]
+ add edx,6
+ lea esi,dword ptr [_picture_bitmap]
+ add esi,6
+ movzx eax,ypos
+ mov ebx,320
+ mul ebx
+ movzx ebx,xpos
+ add eax,ebx
+ add edi,eax
+ cmp level,BYTE_NULL
+ jnz @@1
+ mov level,0
+ jmp @@2
+@@1: cmp level,2
+ jae @@2
+ mov level,2
+@@2: movzx ecx,width
+ jecxz @@10
+@@3: push ecx
+ push edi
+ movzx ecx,height
+ jecxz @@9
+@@4: movzx ebx,height
+ sub ebx,ecx
+ movzx eax,level
+ cmp ebx,eax
+ jnae @@5
+ mov ebx,edi
+ sub ebx,0a0000h
+ add ebx,esi
+ movzx eax,byte ptr [ebx]
+ jmp @@8
+@@5: movzx eax,height
+ push edx
+ xor edx,edx
+ sub eax,ecx
+ mov ebx,5
+ div ebx
+ mov eax,edx
+ pop edx
+ cmp eax,3
+ jbe @@6
+ mov ebx,edi
+ sub ebx,0a0000h
+ add ebx,esi
+ movzx eax,byte ptr [ebx]
+ jmp @@8
+@@6: or eax,eax
+ jnz @@7
+ xor eax,eax
+ jmp @@8
+@@7: add eax,_decay_bar_palette_start
+ cmp level,2
+ jnbe @@8
+ mov eax,250
+@@8: mov byte ptr [edi],al
+ sub edi,320
+ loop @@4
+@@9: pop edi
+ pop ecx
+ inc edi
+ loop @@3
+@@10:
+end;
+
+const
+ _decay_bars_initialized: Boolean = FALSE;
+ _decay_bars_nm_tracks: Byte = 0;
+
+var
+ _old_decay_bar_value: array[1..25] of Byte;
+
+procedure decay_bars_refresh;
+
+var
+ temp: Byte;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:decay_bars_refresh';
+ If NOT _decay_bars_initialized then
+ For temp := 1 to 25 do
+ _old_decay_bar_value[temp] := BYTE_NULL;
+
+ For temp := 1 to 25 do
+ begin
+ If (decay_bar[temp].dir = 1) then
+ decay_bar[temp].lvl := decay_bar[temp].lvl+
+ decay_bar[temp].dir*(decay_bar_rise/IRQ_freq*100)
+ else
+ decay_bar[temp].lvl := decay_bar[temp].lvl+
+ decay_bar[temp].dir*(decay_bar_fall/IRQ_freq*100);
+
+ If (decay_bar[temp].lvl < 0) then decay_bar[temp].lvl := 0;
+ If (decay_bar[temp].lvl > decay_bar[temp].max_lvl) then
+ begin
+ decay_bar[temp].dir := -1;
+ If (decay_bar[temp].lvl > 63) then
+ decay_bar[temp].lvl := 63;
+ end;
+
+ If (_old_decay_bar_value[temp] <> Round(decay_bar[temp].lvl*4/3)) then
+ begin
+ _refresh_decay_bar(_decay_bar_xpos+PRED(temp)*12,_decay_bar_ypos,
+ Round(63*4/3),10,
+ Round(decay_bar[temp].lvl*4/3));
+ _old_decay_bar_value[temp] := Round(decay_bar[temp].lvl*4/3);
+ end;
+ end;
+end;
+
+procedure toggle_picture_mode;
+
+var
+ index: Byte;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:toggle_picture_mode';
+ If NOT _picture_mode then
+ begin
+ _picture_mode := NOT _picture_mode;
+ GetVideoState(vstate);
+ fade_speed := 16;
+ fade_buf.action := first;
+ VgaFade(fade_buf,fadeOut,delayed);
+ For index := 1 to 20 do WaitRetrace;
+ asm mov ax,13h; int 10h end;
+
+ For index := 1 to 20 do WaitRetrace;
+ For index := 0 to 255 do
+ SetRGBitem(index,tRGB_PALETTE(MEM[Ofs(_picture_palette)+6])[index].r,
+ tRGB_PALETTE(MEM[Ofs(_picture_palette)+6])[index].g,
+ tRGB_PALETTE(MEM[Ofs(_picture_palette)+6])[index].b);
+ fade_speed := 16;
+ fade_buf.action := first;
+ VgaFade(fade_buf2,fadeOut,fast);
+
+ Move(MEM[Ofs(_picture_bitmap)+6],MEM[$0a0000],320*200);
+ VgaFade(fade_buf2,fadeIn,delayed);
+ external_irq_hook := decay_bars_refresh;
+ end
+ else begin
+ external_irq_hook := NIL;
+ _picture_mode := NOT _picture_mode;
+ _decay_bars_initialized := FALSE;
+ VgaFade(fade_buf2,fadeOut,delayed);
+
+ SetVideoState(vstate,FALSE);
+ VgaFade(fade_buf2,fadeOut,fast);
+ For index := 1 to 20 do WaitRetrace;
+ Move(vstate.screen,MEM[$0b8000],SizeOf(vstate.screen));
+
+ For index := 1 to 20 do WaitRetrace;
+ VgaFade(fade_buf,fadeIn,delayed);
+ end;
+end;
+
+procedure wtext(xstart,ystart: Word; txt: String; color: Byte);
+
+var
+ x,y: Word;
+ temp,i,j,b: Word;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:wtext';
+ If NOT _picture_mode then EXIT;
+ Move(MEM[Ofs(_picture_bitmap)+6+320*ystart],vmem[320*ystart],(8+1)*320);
+ x := xstart+1;
+ y := ystart+1;
+
+ For temp := 1 to Length(txt) do
+ begin
+ For j := 0 to 7 do
+ begin
+ b := tCHAR8x8(MEM[Ofs(_font8x8)+6])[txt[temp]][j];
+ For i := 7 downto 0 do
+ If (b OR (1 SHL i) = b) then
+ vmem[x+7-i+(y+j)*320] := 0
+ end;
+ Inc(x,8);
+ end;
+
+ x := xstart;
+ y := ystart;
+
+ For temp := 1 to Length(txt) do
+ begin
+ For j := 0 to 7 do
+ begin
+ b := tCHAR8x8(MEM[Ofs(_font8x8)+6])[txt[temp]][j];
+ For i := 7 downto 0 do
+ If (b OR (1 SHL i) = b) then
+ vmem[x+7-i+(y+j)*320] := color;
+ end;
+ Inc(x,8);
+ end;
+
+ Move(vmem[320*ystart],MEM[$0a0000+320*ystart],(8+1)*320);
+end;
+
+procedure wtext2(xstart,ystart: Word; txt: String; color: Byte);
+
+const
+ _double: array[0..15] of Byte = (0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7);
+
+var
+ x,y: Word;
+ temp,i,j,b: Word;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:wtext2';
+ If NOT _picture_mode then EXIT;
+ Move(MEM[Ofs(_picture_bitmap)+6+320*ystart],vmem[320*ystart],(16+1)*320);
+ x := xstart+1;
+ y := ystart+1;
+
+ For temp := 1 to Length(txt) do
+ begin
+ For j := 0 to 15 do
+ begin
+ b := tCHAR8x16(MEM[Ofs(_font8x16)+6])[txt[temp]][j];
+ For i := 15 downto 0 do
+ If (b OR (1 SHL _double[i]) = b) then
+ vmem[x+15-i+(y+j)*320] := 0
+ end;
+ Inc(x,16);
+ end;
+
+ x := xstart;
+ y := ystart;
+
+ For temp := 1 to Length(txt) do
+ begin
+ For j := 0 to 15 do
+ begin
+ b := tCHAR8x16(MEM[Ofs(_font8x16)+6])[txt[temp]][j];
+ For i := 15 downto 0 do
+ If (b OR (1 SHL _double[i]) = b) then
+ vmem[x+15-i+(y+j)*320] := color;
+ end;
+ Inc(x,16);
+ end;
+
+ Move(vmem[320*ystart],MEM[$0a0000+320*ystart],(16+1)*320);
+end;
+
+procedure C3Write(str: String; atr1,atr2,atr3: Byte);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:CWrite';
+ If _picture_mode then EXIT;
+ ShowC3Str(MEM[$0b8000],WhereX,WhereY,str,atr1,atr2,atr3);
+ GotoXY(1,WhereY);
+end;
+
+procedure C3WriteLn(str: String; atr1,atr2,atr3: Byte);
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:C3WriteLn';
+ ShowC3Str(Ptr(v_seg,v_ofs)^,WhereX,WhereY,
+ str,
+ atr1,atr2,atr3);
+ WriteLn;
+end;
+
+procedure CWriteLn(str: String; atr1,atr2: Byte);
+
+var
+ temp: Word;
+ attr,posx,posy: Byte;
+ color2: Boolean;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:CWriteLn';
+ If _picture_mode then EXIT;
+ color2 := FALSE;
+ attr := atr1;
+ posx := WhereX;
+ posy := WhereY;
+
+ For temp := 1 to Length(str) do
+ If (str[temp] <> '~') then
+ begin
+ MEM[$0b8000+(posx-1+(posy-1)*MaxCol) SHL 1] := BYTE(str[temp]);
+ MEM[$0b8000+(posx-1+(posy-1)*MaxCol) SHL 1+1] := attr;
+ If (posx < MaxCol) then Inc(posx)
+ else begin
+ posx := 1;
+ Inc(posy);
+ If (posy > MaxLn) then
+ begin
+ asm
+ mov ah,06h
+ mov al,1
+ mov bh,07h
+ mov ch,window_top
+ mov cl,1
+ mov dh,MaxLn
+ mov dl,MaxCol
+ dec ch
+ dec cl
+ dec dh
+ dec dl
+ int 10h
+ end;
+ Dec(posy);
+ end;
+ end;
+ end
+ else begin
+ color2 := NOT color2;
+ If color2 then attr := atr2 else attr := atr1;
+ end;
+
+ Inc(posy);
+ If (posy > MaxLn) then
+ begin
+ asm
+ mov ah,06h
+ mov al,1
+ mov bh,07h
+ mov ch,window_top
+ mov cl,1
+ mov dh,MaxLn
+ mov dl,MaxCol
+ dec ch
+ dec cl
+ dec dh
+ dec dl
+ int 10h
+ end;
+ Dec(posy);
+ end;
+
+ posx := 1;
+ GotoXY(posx,posy);
+end;
+
+function __progress_str(value: Byte): String;
+
+var
+ result: String;
+
+begin
+ result := '';
+ Repeat
+ If (value > 4) then
+ begin
+ result := result+#4;
+ Dec(value,4);
+ end;
+ If (value <= 4) and (value <> 0) then
+ result := result+CHR(0+value)
+ until (value <= 4);
+ __progress_str := result;
+end;
+
+function _progress_str: String;
+begin
+ If (songdata.patt_len = 0) then EXIT;
+ If (entries <> 0) then
+ _progress_str :=
+ ExpStrR(__progress_str(
+ Round(4*38/entries*(current_order-correction+
+ 1/songdata.patt_len*(current_line+1)))),38,#0)
+ else _progress_str := ExpStrR('',38,#0);
+end;
+
+function _timer_str: String;
+begin
+ _timer_str := ExpStrL(Num2str(song_timer DIV 60,10),2,'0')+':'+
+ ExpStrL(Num2str(song_timer MOD 60,10),2,'0')+'.'+
+ Num2str(song_timer_tenths DIV 10,10);
+end;
+
+function _position_str: String;
+begin
+ If (songdata.patt_len = 0) then EXIT;
+ If (entries <> 0) then
+ _position_str :=
+ 'Order '+ExpStrL(Num2str(current_order,10),3,'0')+'/'+
+ ExpStrL(Num2str(PRED(entries2),10),3,'0')+', '+
+ 'pattern '+ExpStrL(Num2str(current_pattern,10),3,'0')+', '+
+ 'row '+ExpStrL(Num2str(current_line,10),3,'0')+' '+
+ '['+ExpStrL(Num2str(Round(100/entries*(current_order-correction+
+ 1/songdata.patt_len*(current_line+1))),10),3,'0')+'%] '+
+ '['+_timer_str+']'+' '
+ else _position_str :=
+ 'Order '+ExpStrL(Num2str(current_order,10),3,'0')+'/'+
+ ExpStrL(Num2str(PRED(entries2),10),3,'0')+', '+
+ 'pattern '+ExpStrL(Num2str(current_pattern,10),3,'0')+', '+
+ 'row '+ExpStrL(Num2str(current_line,10),3,'0')+' '+
+ '['+ExpStrL('',3,'0')+'%] '+
+ '['+_timer_str+']'+' ';
+end;
+
+function _position_str2: String;
+begin
+ _position_str2 :=
+ 'Order '+ExpStrL(Num2str(current_order,10),3,'0')+'/'+
+ ExpStrL(Num2str(PRED(entries2),10),3,'0')+', '+
+ 'pattern '+ExpStrL(Num2str(current_pattern,10),3,'0')+', '+
+ 'row '+ExpStrL(Num2str(current_line,10),3,'0')+' ';
+end;
+
+procedure fade_out;
+
+var
+ temp: Byte;
+
+begin
+ _debug_str_:= 'ADT2PLAY.PAS:fade_out';
+ For temp := overall_volume downto 0 do
+ begin
+ set_overall_volume(temp);
+ _delay_counter := 0;
+ While (_delay_counter < overall_volume DIV 10) do
+ begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+'\11\10',_pos_str_color);
+ C3Write(DietStr(_position_str+'\11\10',PRED(MaxCol)),$0f,0,0);
+ MEMW[0:$041c] := MEMW[0:$041a];
+ end;
+ end;
+end;
+
+function _gfx_mode: Boolean;
+
+var
+ result: Boolean;
+ temp: Byte;
+
+begin
+ result := FALSE;
+ For temp := 1 to ParamCount do
+ If (Lower(_ParamStr[temp]) = '/gfx') then
+ begin
+ result := TRUE;
+ BREAK;
+ end;
+ _gfx_mode := result;
+end;
+
+procedure _list_title;
+begin
+ If iVGA then
+ begin
+ CWriteLn('',$07,0);
+ CWriteLn(' subz3ro''s',$09,0);
+ CWriteLn(' ÄÂÄ ÄÄ',$09,0);
+ CWriteLn(' /´DLiB³R/´CK3R ³³ G3 PLAYER',$09,0);
+ CWriteLn(' ³ ³ ÄÄ 0.43',$09,0);
+ CWriteLn('',$07,0);
+ end
+ else begin
+ WriteLn;
+ WriteLn(' subz3ro''s');
+ WriteLn(' ÄÂÄ ÄÄ');
+ WriteLn(' /´DLiB³R/´CK3R ³³ G3 PLAYER');
+ WriteLn(' ³ ³ ÄÄ 0.43');
+ WriteLn;
+ end;
+end;
+
+var
+ old_exit_proc: procedure;
+
+procedure new_exit_proc;
+begin
+ If (ErrorAddr <> NIL) then
+ begin
+ stop_playing;
+ TimerDone;
+ opl3exp($0004);
+ opl3exp($0005);
+ FreeMem(pattdata,PATTERN_SIZE*max_patterns);
+
+ asm
+ mov ax,03h
+ xor bh,bh
+ int 10h
+ mov MaxCol,80
+ mov MaxLn,25
+ end;
+
+ WriteLn('ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ');
+ WriteLn('Û ABNORMAL PROGRAM TERMiNATiON Û');
+ WriteLn('ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß');
+ WriteLn('ERROR_ID #'+Num2str(ExitCode,10)+' at '+ExpStrL(Num2str(LONGINT(ErrorAddr),16),8,'0'));
+ WriteLn(_debug_str_);
+ WriteLn;
+ WriteLn('Please send this information with brief description');
+ WriteLn('what you were doing with the program when this error was encountered');
+ WriteLn('to following email address:');
+ WriteLn;
+ WriteLn('subz3ro@hotmail.com');
+
+ ErrorAddr := NIL;
+ HALT(ExitCode);
+ end
+ else
+ ExitProc := @old_exit_proc;
+end;
+
+begin
+ For temp := 0 to 255 do
+ _ParamStr[temp] := ParamStr(temp);
+
+ If NOT _gfx_mode then
+ begin
+ If iVGA then CleanScreen(MEM[$0b8000]);
+ GotoXY(1,1);
+ _list_title;
+ end;
+
+ asm
+ mov bx,0ffffh
+ mov ah,48h
+ int 21h
+ mov dos_memavail,bx
+ end;
+
+ If (dos_memavail*16 DIV 1024 < 120) then
+ begin
+ If _gfx_mode then _list_title;
+ WriteLn('ERROR(1) - Insufficient DOS memory!');
+ HALT(1);
+ end;
+
+ If NOT iVGA then
+ begin
+ WriteLn('ERROR(2) - Insufficient video equipment!');
+ HALT(2);
+ end;
+
+ For temp := 1 to ParamCount do
+ If (Lower(_ParamStr[temp]) = '/jukebox') then
+ jukebox := TRUE;
+
+ index := 0;
+ If (ParamCount = 0) then
+ begin
+ If _gfx_mode then _list_title;
+ CWriteLn('Syntax: '+BaseNameOnly(_ParamStr[0])+' files|wildcards [files|wildcards{...}]',$07,0);
+ CWriteLn('',$07,0);
+ CWriteLn('Command-line options:',$07,0);
+ CWriteLn(' /jukebox play modules w/ no repeat',$07,0);
+ CWriteLn(' /gfx graphical interface',$07,0);
+ HALT;
+ end;
+
+ @old_exit_proc := ExitProc;
+ ExitProc := @new_exit_proc;
+
+ If _gfx_mode then
+ toggle_picture_mode;
+
+ Repeat
+ If NOT (index <> 0) then
+ begin
+ CWriteLn(FilterStr(DietStr('úù-Ä--ùú úù-ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ--ùú úù-ÄÄÄ--ùú úù-ÄÄ-Äùú',
+ PRED(MaxCol)),
+ '.',' '),$01,0);
+ CWriteLn( ' ~[~SPACE~]~ Fast-Forward ~[~\11Ä~]~ Restart ~[~\11ÄÙ~]~ Next ~[~ESC~]~ Quit',$09,$01);
+ CWriteLn(FilterStr(DietStr('úù-ÄÄÄÄÄÄÄÄÄÄ--ùú úù-ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-Äùú',
+ PRED(MaxCol)),
+ '.',' '),$01,0);
+
+ CWriteLn('',$07,0);
+ window_top := WhereY;
+ end;
+
+ Inc(index);
+ If (_ParamStr[index][1] <> '/') then
+ begin
+ FindFirst(_ParamStr[index],AnyFile-VolumeID-Directory,dirinfo);
+ If (DosError <> 0) then
+ begin
+ CWriteLn(DietStr('ERROR(2) - No such file "'+
+ Lower(_ParamStr[index])+'"',
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ FindNext(dirinfo);
+ CONTINUE;
+ end;
+
+ While NOT (DosError <> 0) do
+ begin
+ If (PathOnly(_ParamStr[index]) <> '') then
+ songdata_source := Upper(PathOnly(_ParamStr[index])+dirinfo.name)
+ else songdata_source := Upper(dirinfo.name);
+
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+' ',_pos_str_color);
+ wtext2(_fname_xpos,_fname_ypos,NameOnly(songdata_source),_fname_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,'Loading...',_pos_str_color);
+
+ C3Write(DietStr('Loading "'+songdata_source+'" (please wait)',
+ PRED(MaxCol)),$07,0,0);
+ For temp := 1 to 10 do WaitRetrace;
+
+ limit_exceeded := FALSE;
+ load_flag := BYTE_NULL;
+
+ _decay_bars_initialized := FALSE;
+ a2m_file_loader;
+ If (load_flag = BYTE_NULL) then a2t_file_loader;
+ If (load_flag = BYTE_NULL) then amd_file_loader;
+ If (load_flag = BYTE_NULL) then cff_file_loader;
+ If (load_flag = BYTE_NULL) then dfm_file_loader;
+ If (load_flag = BYTE_NULL) then mtk_file_loader;
+ If (load_flag = BYTE_NULL) then rad_file_loader;
+ If (load_flag = BYTE_NULL) then s3m_file_loader;
+ If (load_flag = BYTE_NULL) then fmk_file_loader;
+ If (load_flag = BYTE_NULL) then sat_file_loader;
+ If (load_flag = BYTE_NULL) then sa2_file_loader;
+ If (load_flag = BYTE_NULL) then hsc_file_loader;
+ If (load_flag = BYTE_NULL) or
+ (load_flag = $7f) then
+ begin
+ CWriteLn(DietStr(ExpStrR('ERROR(3) - Invalid module ('+songdata_source+')',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ FindNext(dirinfo);
+ CONTINUE;
+ end;
+
+ last_order := 0;
+ entries := 0;
+ If limit_exceeded then
+ begin
+ CWriteLn(DietStr(ExpStrR('ERROR(1) - Insufficient memory!',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ FindNext(dirinfo);
+ CONTINUE;
+ end;
+
+ count_order(entries);
+ correction := calc_following_order(0);
+ entries2 := entries;
+ If (correction <> -1) then Dec(entries,correction)
+ else entries := 0;
+ CWriteLn(DietStr(ExpStrR('Playing '+modname[load_flag]+' "'+
+ songdata_source+'"',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ temp2 := PRED(WhereY);
+
+ If (entries = 0) then
+ begin
+ If NOT _picture_mode then GotoXY(1,temp2);
+ CWriteLn(DietStr(ExpStrR('Playing '+modname[load_flag]+' "'+
+ songdata_source+'"',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$08,0);
+ CWriteLn(DietStr(ExpStrR(''+NameOnly(songdata_source)+' [stopped] ['+
+ ExpStrL(Num2str(TRUNC(time_playing) DIV 60,10),2,'0')+
+ ':'+ExpStrL(Num2str(TRUNC(time_playing) MOD 60,10),2,'0')+']',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ FindNext(dirinfo);
+ CONTINUE;
+ end;
+
+ start_playing;
+ set_overall_volume(63);
+ _decay_bars_nm_tracks := songdata.nm_tracks;
+ _decay_bars_initialized := TRUE;
+
+ Repeat
+ If (overall_volume = 63) then
+ begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+' ',_pos_str_color);
+ C3Write(DietStr(_position_str+' ',PRED(MaxCol)),$0f,0,0);
+ end;
+
+ If (PORT[$60] = $39) { SPACE pressed } then
+ begin
+ If (overall_volume > 32) then
+ For temp := 63 downto 32 do
+ begin
+ set_overall_volume(temp);
+ _delay_counter := 0;
+ While (_delay_counter < overall_volume DIV 20) do
+ begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+'\10\10',_pos_str_color);
+ MEMW[0:$041c] := MEMW[0:$041a];
+ C3Write(DietStr(_position_str+'\10\10',PRED(MaxCol)),$0f,0,0);
+ end;
+ end
+ else begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+'\10\10',_pos_str_color);
+ C3Write(DietStr(_position_str+'\10\10',PRED(MaxCol)),$0f,0,0);
+ MEMW[0:$041c] := MEMW[0:$041a];
+ end;
+ fast_forward := TRUE;
+ end
+ else If (PORT[$60] = $0b9) { SPACE released } then
+ begin
+ fast_forward := FALSE;
+ If (overall_volume < 63) then
+ For temp := 32 to 63 do
+ begin
+ set_overall_volume(temp);
+ _delay_counter := 0;
+ While (_delay_counter < overall_volume DIV 20) do
+ begin
+ wtext2(_timer_xpos,_timer_ypos,_timer_str,_timer_color);
+ wtext(_progress_xpos,_progress_ypos,_progress_str,_progress_color);
+ wtext(_pos_str_xpos,_pos_str_ypos,_position_str2+' ',_pos_str_color);
+ C3Write(DietStr(_position_str+' ',PRED(MaxCol)),$0f,0,0);
+ MEMW[0:$041c] := MEMW[0:$041a];
+ end;
+ end;
+ end;
+
+ If keypressed then asm xor ax,ax; int 16h; mov fkey,ax end
+ else fkey := $0ffff;
+ MEMW[0:$041c] := MEMW[0:$041a];
+
+ If jukebox and (last_order <> current_order) then
+ begin
+ If (last_order > current_order) and
+ (last_order = PRED(entries2)) then BREAK
+ else last_order := current_order;
+ end;
+
+ If (fkey = kBkSPC) then
+ begin
+ fade_out;
+ stop_playing;
+ set_overall_volume(63);
+ start_playing;
+ end;
+ until (fkey = kENTER) or
+ (fkey = kESC);
+
+ fade_out;
+ stop_playing;
+ If NOT _picture_mode then GotoXY(1,temp2);
+ CWriteLn(DietStr(ExpStrR('Playing '+modname[load_flag]+' "'+
+ songdata_source+'"',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$08,0);
+ CWriteLn(DietStr(ExpStrR(''+NameOnly(songdata_source)+' [stopped] ['+
+ ExpStrL(Num2str(TRUNC(time_playing) DIV 60,10),2,'0')+
+ ':'+ExpStrL(Num2str(TRUNC(time_playing) MOD 60,10),2,'0')+']',
+ PRED(MaxCol),' '),
+ PRED(MaxCol)),$07,0);
+ CWriteLn('',$07,0);
+ If (fkey = kESC) then BREAK;
+ FindNext(dirinfo);
+ end;
+ end;
+ until (index = ParamCount);
+
+ If _picture_mode then toggle_picture_mode;
+ MEMW[0:$041c] := MEMW[0:$041a];
+ FreeMem(pattdata,PATTERN_SIZE*max_patterns);
+ ExitProc := @old_exit_proc;
+ HALT(0);
+end.
--- /dev/null
+unit ParserIO;
+interface
+
+type
+ tDUMMY_BUFF = array[0..PRED(655350)] of Byte;
+
+function Scan(var buf; skip,size: Longint; str: String): Longint;
+function SensitiveScan(var buf; skip,size: Longint; str: String): Longint;
+function Compare(var buf1,buf2; size: Longint): Boolean;
+function Empty(var buf; size: Longint): Boolean;
+function CountLines(var buf; size: Longint): Longint;
+function Update16(var buf; size: Longint; crc: Word): Word;
+function Update32(var buf; size: Longint; crc: Longint): Longint;
+
+implementation
+
+var
+ CRC16_table: array[BYTE] of Word;
+ CRC32_table: array[BYTE] of Longint;
+
+function Scan(var buf; skip,size: Longint; str: String): Longint; assembler;
+asm
+ mov edi,[str]
+ mov esi,[str]
+ xor eax,eax
+ lodsb
+ stosb
+ xor ecx,ecx
+ mov ecx,eax
+ xor ebx,ebx
+ mov ebx,eax
+ jecxz @@9
+@@1: lodsb
+ cmp al,'a'
+ jb @@2
+ cmp al,'z'
+ ja @@2
+ sub al,20h
+@@2: stosb
+ loop @@1
+ sub edi,ebx
+ mov esi,[buf]
+ add esi,skip
+ mov ecx,size
+ sub ecx,skip
+ jecxz @@8
+ cld
+ sub ecx,ebx
+ jb @@8
+ inc ecx
+@@4: mov ah,[edi]
+ and ah,NOT 20h
+@@5: lodsb
+ and al,NOT 20h
+ cmp al,ah
+ loopne @@5
+ jne @@8
+ dec esi
+ mov edx,ecx
+ mov ecx,ebx
+@@6: repe cmpsb
+ je @@10
+ mov al,[esi-1]
+ cmp al,'a'
+ jb @@7
+ cmp al,'z'
+ ja @@7
+ sub al,20h
+@@7: cmp al,[edi-1]
+ je @@6
+ sub ecx,ebx
+ add esi,ecx
+ add edi,ecx
+ inc esi
+ mov ecx,edx
+ jne @@4
+@@8: xor eax,eax
+ jmp @@11
+@@9: mov eax,1
+ jmp @@11
+@@10: sub esi,ebx
+ mov eax,esi
+ sub eax,dword ptr buf
+ inc eax
+@@11: dec eax
+end;
+
+function SensitiveScan(var buf; skip,size: Longint; str: String): Longint; assembler;
+asm
+ mov edi,[buf]
+ add edi,skip
+ mov esi,[str]
+ mov ecx,size
+ sub ecx,skip
+ xor eax,eax
+ jecxz @@3
+ cld
+ lodsb
+ cmp al,1
+ jb @@5
+ ja @@1
+ lodsb
+ repne scasb
+ jne @@3
+ jmp @@5
+@@1: xor ah,ah
+ mov ebx,eax
+ dec ebx
+ mov edx,ecx
+ sub edx,eax
+ jb @@3
+ lodsb
+ add edx,2
+@@2: dec edx
+ mov ecx,edx
+ repne scasb
+ jne @@3
+ mov edx,ecx
+ mov ecx,ebx
+ rep cmpsb
+ je @@4
+ sub ecx,ebx
+ add esi,ecx
+ add edi,ecx
+ inc edi
+ or edx,edx
+ jne @@2
+@@3: xor eax,eax
+ jmp @@6
+@@4: sub edi,ebx
+@@5: mov eax,edi
+ sub eax,dword ptr buf
+@@6: dec eax
+end;
+
+function Compare(var buf1,buf2; size: Longint): Boolean; assembler;
+asm
+ xor edx,edx
+ mov eax,size
+ cmp eax,16
+ jb @@3
+ mov ecx,4
+ div ecx
+ mov ecx,eax
+ jecxz @@1
+ mov esi,[buf1]
+ mov edi,[buf2]
+ cld
+ repz cmpsd
+ jnz @@2
+ mov ecx,edx
+ jecxz @@1
+ repz cmpsb
+ jnz @@2
+@@1: mov al,1
+ jmp @@6
+@@2: xor al,al
+ jmp @@6
+@@3: mov ecx,size
+ jecxz @@4
+ mov esi,[buf1]
+ mov edi,[buf2]
+ cld
+ repz cmpsb
+ jnz @@5
+@@4: mov al,1
+ jmp @@6
+@@5: xor al,al
+@@6:
+end;
+
+function Empty(var buf; size: Longint): Boolean; assembler;
+asm
+ xor edx,edx
+ mov eax,size
+ cmp eax,16
+ jb @@3
+ mov ecx,4
+ div ecx
+ mov ecx,eax
+ jecxz @@1
+ mov edi,[buf]
+ xor eax,eax
+ repz scasd
+ jnz @@2
+ mov ecx,edx
+ jecxz @@1
+ repz scasb
+ jnz @@2
+@@1: mov al,1
+ jmp @@6
+@@2: xor al,al
+ jmp @@6
+@@3: mov ecx,size
+ jecxz @@4
+ mov edi,[buf]
+ xor eax,eax
+ repz scasb
+ jnz @@5
+@@4: mov al,1
+ jmp @@6
+@@5: xor al,al
+@@6:
+end;
+
+function CountLines(var buf; size: Longint): Longint; assembler;
+asm
+ mov edi,[buf]
+ mov ecx,size
+ mov edx,edi
+ add edx,ecx
+ xor ebx,ebx
+ jecxz @@3
+@@1: mov al,0dh
+ repnz scasb
+ jnz @@3
+ cmp byte ptr [edi],0ah
+ jnz @@2
+ inc edi
+ inc ebx
+@@2: cmp edi,edx
+ jb @@1
+@@3: mov eax,ebx
+end;
+
+function Update16(var buf; size: Longint; crc: Word): Word; assembler;
+asm
+ mov esi,[buf]
+ lea edi,[CRC16_table]
+ mov bx,crc
+ mov ecx,size
+ jecxz @@2
+@@1: xor ax,ax
+ lodsb
+ mov dl,bh
+ xor dh,dh
+ xor bh,bh
+ xor bx,ax
+ and ebx,000000ffh
+ shl ebx,1
+ mov bx,[edi+ebx]
+ xor bx,dx
+ loop @@1
+@@2: mov ax,bx
+end;
+
+function Update32(var buf; size: Longint; crc: Longint): Longint; assembler;
+asm
+ mov esi,[buf]
+ lea edi,[CRC32_table]
+ mov ebx,crc
+ mov ecx,size
+ jecxz @@2
+@@1: xor eax,eax
+ lodsb
+ xor ebx,eax
+ mov edx,ebx
+ and ebx,000000ffh
+ shl ebx,2
+ mov ebx,[edi+ebx]
+ shr edx,8
+ and edx,00ffffffh
+ xor ebx,edx
+ loop @@1
+@@2: mov eax,ebx
+end;
+
+procedure make_table_16bit;
+
+var
+ crc: Word;
+ n,index: Byte;
+
+begin
+ For index := 0 to 255 do
+ begin
+ crc := index;
+ For n := 1 to 8 do
+ If Odd(crc) then crc := crc SHR 1 XOR $0a001
+ else crc := crc SHR 1;
+ CRC16_table[index] := crc;
+ end;
+end;
+
+procedure make_table_32bit;
+
+var
+ crc: DWord;
+ n,index: Byte;
+
+begin
+ For index := 0 to 255 do
+ begin
+ crc := index;
+ For n := 1 to 8 do
+ If Odd(crc) then crc := crc SHR 1 XOR $0edb88320
+ else crc := crc SHR 1;
+ CRC32_table[index] := crc;
+ end;
+end;
+
+begin
+ make_table_16bit;
+ make_table_32bit;
+end.
--- /dev/null
+unit TimerInt;
+interface
+
+const
+ _debug_str_: String = '';
+
+procedure TimerSetup(Hz: Longint);
+procedure TimerDone;
+procedure TimerInstallHandler(handler: Pointer);
+procedure TimerRemoveHandler;
+
+implementation
+
+uses DOS;
+
+var
+ oldint08: {$IFDEF __TMT__} FarPointer
+ {$ELSE} Pointer
+ {$ENDIF};
+var
+ newint08: Pointer;
+ counter,
+ clock_ticks,clock_flag: Word;
+ ticks: Longint;
+
+const
+ timer_handler: Pointer = NIL;
+
+procedure int08; interrupt;
+ assembler;
+asm
+{$IFNDEF _32BIT}
+ cmp word ptr timer_handler,0
+ jnz @@1
+ cmp word ptr timer_handler+2,0
+ jz @@2
+@@1: push ds
+ call [timer_handler]
+ pop ds
+@@2: mov ax,word ptr ticks
+ mov bx,word ptr ticks+2
+ add ax,1
+ adc bx,0
+ mov word ptr ticks,ax
+ mov word ptr ticks+2,bx
+ inc clock_ticks
+ mov ax,clock_ticks
+ cmp ax,clock_flag
+ jb @@3
+ mov clock_ticks,0
+ pushf
+ call [oldint08]
+ jmp @@ret
+@@3: mov al,60h
+ out 20h,al
+{$ELSE}
+ cmp timer_handler,0
+ jz @@1
+ push ds
+ push es
+ call [timer_handler]
+ pop es
+ pop ds
+@@1: inc ticks
+ inc clock_ticks
+ mov ax,clock_ticks
+ cmp ax,clock_flag
+ jnz @@2
+ mov clock_ticks,0
+ pushfd
+ call [oldint08]
+ jmp @@ret
+@@2: mov al,60h
+ out 20h,al
+{$ENDIF}
+@@ret:
+end;
+
+procedure DisableTimerIRQ; assembler;
+asm
+ in al,21h
+ or al,1
+ out 21h,al
+end;
+
+procedure EnableTimerIRQ; assembler;
+asm
+ in al,21h
+ and al,0feh
+ out 21h,al
+end;
+
+procedure TimerSetup(Hz: Longint);
+begin
+ _debug_str_ := 'TIMERINT.PAS:TimerSetup';
+ If (Hz < 19) then Hz := 19;
+ If (Hz > 1193180) then Hz := 1193180;
+
+ counter := 1193180 DIV Hz;
+ clock_flag := Hz*1000 DIV 18206;
+ newint08 := @int08;
+ ticks := 0;
+ clock_ticks := 0;
+
+ DisableTimerIRQ;
+ asm
+ mov al,36h
+ out 43h,al
+ mov bx,counter
+ mov al,bl
+ out 40h,al
+ mov al,bh
+ out 40h,al
+ end;
+
+ SetIntVec($08,newint08);
+ EnableTimerIRQ;
+end;
+
+procedure TimerDone;
+begin
+ _debug_str_ := 'TIMERINT.PAS:TimerDone';
+ DisableTimerIRQ;
+ asm
+ mov al,36h
+ out 43h,al
+ xor ax,ax
+ out 40h,al
+ out 40h,al
+ end;
+
+ SetIntVec($08,oldint08);
+ EnableTimerIRQ;
+end;
+
+procedure TimerInstallHandler(handler: Pointer);
+begin
+ _debug_str_ := 'TIMERINT.PAS:TimerInstallHandler';
+ DisableTimerIRQ;
+ timer_handler := handler;
+ EnableTimerIRQ;
+end;
+
+procedure TimerRemoveHandler;
+begin
+ _debug_str_ := 'TIMERINT.PAS:TimerRemoveHandler';
+ DisableTimerIRQ;
+ timer_handler := NIL;
+ EnableTimerIRQ;
+end;
+
+begin
+ GetIntVec($08,oldint08);
+end.
--- /dev/null
+const
+ BYTE_NULL = $0ff;
+ WORD_NULL = $0ffff;
+ DWORD_NULL = $0ffffffff;
+
+type
+ tCHAR8x8 = array[char] of array[0..7] of Byte;
+ tCHAR8x16 = array[char] of array[0..15] of Byte;
+
+type
+ tRGB = Record r,g,b: Byte end;
+ tRGB_PALETTE = array[0..255] of tRGB;
--- /dev/null
+unit UNPK_LIB;\r
+interface\r
+\r
+// Compression algorithm: RDC\r
+// Algorithm developed by Ed Ross\r
+function RDC_decompress(var source,dest; size: Word): Word;\r
+\r
+// Compression algorithm: LZSS\r
+// Algorithm developed by Lempel-Ziv-Storer-Szymanski\r
+function LZSS_decompress(var source,dest; size: Word): Word;\r
+\r
+// Compression algorithm: LZW\r
+// Algorithm developed by Lempel-Ziv-Welch\r
+function LZW_decompress(var source,dest): Word;\r
+\r
+// Compression algorithm: SixPack\r
+// Algorithm developed by Philip G. Gage\r
+function SIXPACK_decompress(var source,dest; size: Word): Word;\r
+\r
+// Compression algorithm: aPack\r
+// Algorithm developed by Joergen Ibsen\r
+function APACK_decompress(var source,dest): Longint;\r
+\r
+implementation\r
+\r
+const\r
+ WORKMEM_SIZE = 64*1024;\r
+\r
+var\r
+ work_mem: array[0..PRED(WORKMEM_SIZE)] of Byte;\r
+ ibufCount,ibufSize: Word;\r
+ input_size,output_size: Word;\r
+ input_ptr,output_ptr,work_ptr: Pointer;\r
+\r
+var\r
+ ibuf_idx,ibuf_end,obuf_idx,obuf_src: Pointer;\r
+ ctrl_bits,ctrl_mask,\r
+ command,count,offs: Word;\r
+\r
+procedure RDC_decode; assembler;\r
+asm\r
+ mov ctrl_mask,0\r
+ mov eax,input_ptr\r
+ mov ibuf_end,eax\r
+ xor eax,eax\r
+ mov ax,input_size\r
+ add ibuf_end,eax\r
+ mov eax,input_ptr\r
+ mov ibuf_idx,eax\r
+ mov eax,output_ptr\r
+ mov obuf_idx,eax\r
+@@1: xor ecx,ecx\r
+ mov eax,ibuf_idx\r
+ cmp eax,ibuf_end\r
+ jnb @@7\r
+ mov ax,ctrl_mask\r
+ shr ax,1\r
+ mov ctrl_mask,ax\r
+ or ax,ax\r
+ jnz @@2\r
+ mov esi,ibuf_idx\r
+ lodsw\r
+ mov ctrl_bits,ax\r
+ add ibuf_idx,2\r
+ mov ctrl_mask,8000h\r
+@@2: mov ax,ctrl_bits\r
+ and ax,ctrl_mask\r
+ or ax,ax\r
+ jnz @@3\r
+ mov esi,ibuf_idx\r
+ mov edi,obuf_idx\r
+ movsb\r
+ inc ibuf_idx\r
+ inc obuf_idx\r
+ jmp @@1\r
+@@3: xor ah,ah\r
+ mov esi,ibuf_idx\r
+ lodsb\r
+ shr ax,4\r
+ and ax,0fh\r
+ mov command,ax\r
+ xor ah,ah\r
+ mov esi,ibuf_idx\r
+ lodsb\r
+ and ax,0fh\r
+ mov count,ax\r
+ inc ibuf_idx\r
+ cmp command,0\r
+ jnz @@4\r
+ add count,3\r
+ mov edi,obuf_idx\r
+ mov cx,count\r
+ mov esi,ibuf_idx\r
+ lodsb\r
+ rep stosb\r
+ inc ibuf_idx\r
+ mov cx,count\r
+ add obuf_idx,ecx\r
+ jmp @@1\r
+@@4: cmp command,1\r
+ jnz @@5\r
+ xor ah,ah\r
+ mov esi,ibuf_idx\r
+ lodsb\r
+ shl ax,4\r
+ add count,ax\r
+ inc ibuf_idx\r
+ add count,19\r
+ mov edi,obuf_idx\r
+ mov cx,count\r
+ mov esi,ibuf_idx\r
+ lodsb\r
+ rep stosb\r
+ inc ibuf_idx\r
+ mov cx,count\r
+ add obuf_idx,ecx\r
+ jmp @@1\r
+@@5: cmp command,2\r
+ jnz @@6\r
+ mov ax,count\r
+ add ax,3\r
+ mov offs,ax\r
+ xor ah,ah\r
+ mov esi,ibuf_idx\r
+ lodsb\r
+ shl ax,4\r
+ add offs,ax\r
+ inc ibuf_idx\r
+ xor ah,ah\r
+ mov esi,ibuf_idx\r
+ lodsb\r
+ mov count,ax\r
+ inc ibuf_idx\r
+ add count,16\r
+ mov eax,obuf_idx\r
+ mov cx,offs\r
+ sub eax,ecx\r
+ mov obuf_src,eax\r
+ mov esi,eax\r
+ mov edi,obuf_idx\r
+ mov cx,count\r
+ rep movsb\r
+ mov cx,count\r
+ add obuf_idx,ecx\r
+ jmp @@1\r
+@@6: mov ax,count\r
+ add ax,3\r
+ mov offs,ax\r
+ xor ah,ah\r
+ mov esi,ibuf_idx\r
+ lodsb\r
+ shl ax,4\r
+ add offs,ax\r
+ inc ibuf_idx\r
+ mov eax,obuf_idx\r
+ mov cx,offs\r
+ sub eax,ecx\r
+ mov obuf_src,eax\r
+ mov esi,eax\r
+ mov edi,obuf_idx\r
+ mov cx,command\r
+ rep movsb\r
+ mov cx,command\r
+ add obuf_idx,ecx\r
+ jmp @@1\r
+@@7: mov eax,obuf_idx\r
+ sub eax,output_ptr\r
+ mov output_size,ax\r
+end;\r
+\r
+function RDC_decompress(var source,dest; size: Word): Word;\r
+begin\r
+ input_ptr := @source;\r
+ output_ptr := @dest;\r
+ input_size := size;\r
+ RDC_decode;\r
+ RDC_decompress := output_size;\r
+end;\r
+\r
+const\r
+ N = 4096;\r
+ F = 18;\r
+ THRESHOLD = 2;\r
+\r
+procedure GetChar; assembler;\r
+asm\r
+ push ebx\r
+ mov bx,ibufCount\r
+ cmp bx,ibufSize\r
+ jb @@1\r
+ jmp @@2\r
+@@1: push edi\r
+ mov edi,input_ptr\r
+ mov al,byte ptr [edi+ebx]\r
+ pop edi\r
+ inc ebx\r
+ mov ibufCount,bx\r
+ pop ebx\r
+ clc\r
+ jmp @@3\r
+@@2: pop ebx\r
+ stc\r
+@@3:\r
+end;\r
+\r
+procedure PutChar; assembler;\r
+asm\r
+ push ebx\r
+ mov bx,output_size\r
+ push edi\r
+ mov edi,output_ptr\r
+ mov byte ptr [edi+ebx],al\r
+ pop edi\r
+ inc ebx\r
+ mov output_size,bx\r
+ pop ebx\r
+end;\r
+\r
+procedure LZSS_decode; assembler;\r
+asm\r
+ mov ibufCount,0\r
+ mov ax,input_size\r
+ mov ibufSize,ax\r
+ mov output_size,0\r
+ xor ebx,ebx\r
+ xor edx,edx\r
+ mov edi,N-F\r
+@@1: shr dx,1\r
+ or dh,dh\r
+ jnz @@2\r
+ call GetChar\r
+ jc @@5\r
+ mov dh,0ffh\r
+ mov dl,al\r
+@@2: test dx,1\r
+ jz @@3\r
+ call GetChar\r
+ jc @@5\r
+ push esi\r
+ mov esi,work_ptr\r
+ add esi,edi\r
+ mov byte ptr [esi],al\r
+ pop esi\r
+ inc edi\r
+ and edi,N-1\r
+ call PutChar\r
+ jmp @@1\r
+@@3: call GetChar\r
+ jc @@5\r
+ mov ch,al\r
+ call GetChar\r
+ jc @@5\r
+ mov bh,al\r
+ mov cl,4\r
+ shr bh,cl\r
+ mov bl,ch\r
+ mov cl,al\r
+ and cl,0fh\r
+ add cl,THRESHOLD\r
+ inc cl\r
+@@4: and ebx,N-1\r
+ push esi\r
+ mov esi,work_ptr\r
+ mov al,byte ptr [esi+ebx]\r
+ add esi,edi\r
+ mov byte ptr [esi],al\r
+ pop esi\r
+ inc edi\r
+ and edi,N-1\r
+ call PutChar\r
+ inc ebx\r
+ dec cl\r
+ jnz @@4\r
+ jmp @@1\r
+@@5:\r
+end;\r
+\r
+function LZSS_decompress(var source,dest; size: Word): Word;\r
+\r
+begin\r
+ input_ptr := @source;\r
+ output_ptr := @dest;\r
+ work_ptr := @work_mem;\r
+ input_size := size;\r
+ FillChar(work_ptr^,WORKMEM_SIZE,0);\r
+ LZSS_decode;\r
+ LZSS_decompress := output_size;\r
+end;\r
+\r
+var\r
+ le76,le77: Byte;\r
+ le6a,le6c,le6e,le70,le72,le74,le78,\r
+ le7a_0,le7a_2,le7a_4,le7a_6,le7a_8,le82a,le82b: Word;\r
+\r
+procedure NextCode; assembler;\r
+asm\r
+ mov bx,le82a\r
+ mov ax,le82b\r
+ add bx,le78\r
+ adc ax,0\r
+ xchg bx,le82a\r
+ xchg ax,le82b\r
+ mov cx,bx\r
+ and cx,7\r
+ shr ax,1\r
+ rcr bx,1\r
+ shr ax,1\r
+ rcr bx,1\r
+ shr ax,1\r
+ rcr bx,1\r
+ mov esi,input_ptr\r
+ mov ax,[ebx+esi]\r
+ mov dl,[ebx+esi+2]\r
+ or cx,cx\r
+ jz @@2\r
+@@1: shr dl,1\r
+ rcr ax,1\r
+ loop @@1\r
+@@2: mov bx,le78\r
+ sub bx,9\r
+ shl bx,1\r
+ and ax,[ebx+le7a_0]\r
+end;\r
+\r
+function LZW_decode: Word; assembler;\r
+asm\r
+ xor eax,eax\r
+ xor ebx,ebx\r
+ xor ecx,ecx\r
+ mov le72,0\r
+ mov le78,9\r
+ mov le70,102h\r
+ mov le74,200h\r
+ mov edi,output_ptr\r
+ xor eax,eax\r
+ mov le6a,ax\r
+ mov le6c,ax\r
+ mov le6e,ax\r
+ mov le76,al\r
+ mov le77,al\r
+ mov le82a,ax\r
+ mov le82b,ax\r
+ mov le7a_0,1ffh\r
+ mov le7a_2,3ffh\r
+ mov le7a_4,7ffh\r
+ mov le7a_6,0fffh\r
+ mov le7a_8,1fffh\r
+@@1: call NextCode\r
+ cmp ax,101h\r
+ jnz @@2\r
+ jmp @@9\r
+@@2: cmp ax,100h\r
+ jnz @@3\r
+ mov le78,9\r
+ mov le74,200h\r
+ mov le70,102h\r
+ call NextCode\r
+ mov le6a,ax\r
+ mov le6c,ax\r
+ mov le77,al\r
+ mov le76,al\r
+ mov al,le77\r
+ mov byte ptr [edi],al\r
+ inc edi\r
+ jmp @@1\r
+@@3: mov le6a,ax\r
+ mov le6e,ax\r
+ cmp ax,le70\r
+ jb @@4\r
+ mov ax,le6c\r
+ mov le6a,ax\r
+ mov al,le76\r
+ push eax\r
+ inc le72\r
+@@4: cmp le6a,0ffh\r
+ jbe @@5\r
+ mov esi,work_ptr\r
+ mov bx,le6a\r
+ shl bx,1\r
+ add bx,le6a\r
+ mov al,[ebx+esi+2]\r
+ push eax\r
+ inc le72\r
+ mov ax,[ebx+esi]\r
+ mov le6a,ax\r
+ jmp @@4\r
+@@5: mov ax,le6a\r
+ mov le76,al\r
+ mov le77,al\r
+ push eax\r
+ inc le72\r
+ xor ecx,ecx\r
+ mov cx,le72\r
+ jecxz @@7\r
+@@6: pop eax\r
+ mov byte ptr [edi],al\r
+ inc edi\r
+ loop @@6\r
+@@7: mov le72,0\r
+ push esi\r
+ mov bx,le70\r
+ shl bx,1\r
+ add bx,le70\r
+ mov esi,work_ptr\r
+ mov al,le77\r
+ mov [ebx+esi+2],al\r
+ mov ax,le6c\r
+ mov [ebx+esi],ax\r
+ inc le70\r
+ pop esi\r
+ mov ax,le6e\r
+ mov le6c,ax\r
+ mov bx,le70\r
+ cmp bx,le74\r
+ jl @@8\r
+ cmp le78,14\r
+ jz @@8\r
+ inc le78\r
+ shl le74,1\r
+@@8: jmp @@1\r
+@@9: mov output_size,ax\r
+end;\r
+\r
+function LZW_decompress(var source,dest): Word;\r
+begin\r
+ input_ptr := @source;\r
+ output_ptr := @dest;\r
+ work_ptr := @work_mem;\r
+ LZW_decode;\r
+ LZW_decompress := output_size;\r
+end;\r
+\r
+const\r
+ MAXFREQ = 2000;\r
+ MINCOPY = 3;\r
+ MAXCOPY = 255;\r
+ COPYRANGES = 6;\r
+ TERMINATE = 256;\r
+ FIRSTCODE = 257;\r
+ ROOT = 1;\r
+ CODESPERRANGE = MAXCOPY-MINCOPY+1;\r
+ MAXCHAR = FIRSTCODE+COPYRANGES*CODESPERRANGE-1;\r
+ SUCCMAX = MAXCHAR+1;\r
+ TWICEMAX = 2*MAXCHAR+1;\r
+ MAXBUF = PRED(64*1024);\r
+ MAXDISTANCE = 21389;\r
+ MAXSIZE = 21389+MAXCOPY;\r
+\r
+const\r
+ BitValue: array[1..14] of Word = (1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192);\r
+ CopyBits: array[0..PRED(COPYRANGES)] of Word = (4,6,8,10,12,14);\r
+ CopyMin: array[0..PRED(COPYRANGES)] of Word = (0,16,80,336,1360,5456);\r
+\r
+var\r
+ leftC,rghtC: array[0..MAXCHAR] of Word;\r
+ dad,freq: array[0..TWICEMAX] of Word;\r
+ index,ibitCount,ibitBuffer,obufCount: Word;\r
+\r
+procedure InitTree; assembler;\r
+asm\r
+ xor edi,edi\r
+ mov di,2\r
+ mov bx,2\r
+ mov cx,1\r
+@@1: xor dx,dx\r
+ mov ax,di\r
+ div bx\r
+ push edi\r
+ shl di,1\r
+ mov word ptr dad[edi],ax\r
+ mov word ptr freq[edi],cx\r
+ pop edi\r
+ inc di\r
+ cmp di,TWICEMAX\r
+ jbe @@1\r
+ mov di,1\r
+@@2: xor dx,dx\r
+ mov ax,di\r
+ mul bx\r
+ push edi\r
+ shl di,1\r
+ mov word ptr leftC[edi],ax\r
+ inc ax\r
+ mov word ptr rghtC[edi],ax\r
+ pop edi\r
+ inc di\r
+ cmp di,MAXCHAR\r
+ jbe @@2\r
+end;\r
+\r
+procedure UpdateFreq(a,b: Word); assembler;\r
+asm\r
+ xor ecx,ecx\r
+ xor edi,edi\r
+@@1: mov di,a\r
+ shl di,1\r
+ mov bx,word ptr freq[edi]\r
+ mov di,b\r
+ shl di,1\r
+ add bx,word ptr freq[edi]\r
+ mov di,a\r
+ shl di,1\r
+ mov dx,word ptr dad[edi]\r
+ mov di,dx\r
+ shl di,1\r
+ mov word ptr freq[edi],bx\r
+ mov a,dx\r
+ cmp a,ROOT\r
+ jz @@3\r
+ mov di,a\r
+ shl di,1\r
+ mov di,word ptr dad[edi]\r
+ mov ax,di\r
+ shl di,1\r
+ mov bx,word ptr leftC[edi]\r
+ cmp a,bx\r
+ jnz @@2\r
+ mov di,ax\r
+ shl di,1\r
+ mov bx,word ptr rghtC[edi]\r
+ mov b,bx\r
+ jmp @@3\r
+@@2: mov di,ax\r
+ shl di,1\r
+ mov bx,word ptr leftC[edi]\r
+ mov b,bx\r
+@@3: cmp a,ROOT\r
+ jnz @@1\r
+ mov bx,MAXFREQ\r
+ mov di,ROOT\r
+ shl di,1\r
+ cmp word ptr freq[edi],bx\r
+ jnz @@5\r
+ lea esi,[freq]\r
+ lea edi,[freq]\r
+ mov cx,TWICEMAX\r
+ movsw\r
+@@4: lodsw\r
+ shr ax,1\r
+ stosw\r
+ loop @@4\r
+@@5:\r
+end;\r
+\r
+procedure UpdateModel(code: Word); assembler;\r
+asm\r
+ xor ecx,ecx\r
+ xor edi,edi\r
+ mov bx,code\r
+ add bx,SUCCMAX\r
+ mov di,bx\r
+ shl di,1\r
+ mov ax,di\r
+ mov cx,word ptr freq[edi]\r
+ inc cx\r
+ mov word ptr freq[edi],cx\r
+ mov di,ax\r
+ mov cx,ROOT\r
+ cmp word ptr dad[edi],cx\r
+ jz @@10\r
+ mov dx,word ptr dad[edi]\r
+ push edi\r
+ lea edi,[leftC]\r
+ mov cx,dx\r
+ shl cx,1\r
+ add edi,ecx\r
+ mov si,word ptr [edi]\r
+ pop edi\r
+ cmp si,bx\r
+ jnz @@1\r
+ mov di,dx\r
+ shl di,1\r
+ mov si,word ptr rghtC[edi]\r
+@@1: push ebx\r
+ push edx\r
+ push ebx\r
+ push esi\r
+ call UpdateFreq\r
+ pop edx\r
+ pop ebx\r
+@@2: xor edi,edi\r
+ mov di,dx\r
+ shl di,1\r
+ mov ax,word ptr dad[edi]\r
+ mov di,ax\r
+ shl di,1\r
+ mov cx,di\r
+ cmp word ptr leftC[edi],dx\r
+ jnz @@3\r
+ mov di,cx\r
+ mov si,word ptr rghtC[edi]\r
+ jmp @@4\r
+@@3: mov si,word ptr leftC[edi]\r
+@@4: xor edi,edi\r
+ mov di,bx\r
+ shl di,1\r
+ push eax\r
+ mov ax,word ptr freq[edi]\r
+ mov di,si\r
+ shl di,1\r
+ mov cx,ax\r
+ pop eax\r
+ cmp cx,word ptr freq[edi]\r
+ jbe @@9\r
+ mov di,ax\r
+ shl di,1\r
+ mov cx,di\r
+ cmp word ptr leftC[edi],dx\r
+ jnz @@5\r
+ mov di,cx\r
+ mov word ptr rghtC[edi],bx\r
+ jmp @@6\r
+@@5: xor edi,edi\r
+ mov di,cx\r
+ mov word ptr leftC[edi],bx\r
+@@6: lea edi,[leftC]\r
+ xor ecx,ecx\r
+ mov cx,dx\r
+ shl cx,1\r
+ add edi,ecx\r
+ cmp word ptr [edi],bx\r
+ jnz @@7\r
+ mov word ptr [edi],si\r
+ xor edi,edi\r
+ mov di,cx\r
+ mov cx,word ptr rghtC[edi]\r
+ jmp @@8\r
+@@7: xor edi,edi\r
+ mov di,cx\r
+ mov word ptr rghtC[edi],si\r
+ mov cx,word ptr leftC[edi]\r
+@@8: xor edi,edi\r
+ mov di,si\r
+ shl di,1\r
+ mov word ptr dad[edi],dx\r
+ mov di,bx\r
+ shl di,1\r
+ mov word ptr dad[edi],ax\r
+ push esi\r
+ push esi\r
+ push ecx\r
+ call UpdateFreq\r
+ pop ebx\r
+@@9: xor edi,edi\r
+ mov di,bx\r
+ shl di,1\r
+ mov bx,word ptr dad[edi]\r
+ mov di,bx\r
+ shl di,1\r
+ mov dx,word ptr dad[edi]\r
+ cmp dx,ROOT\r
+ jnz @@2\r
+@@10:\r
+end;\r
+\r
+function InputCode(bits: Word): Word; assembler;\r
+asm\r
+ xor bx,bx\r
+ xor ecx,ecx\r
+ mov cx,1\r
+@@1: cmp ibitCount,0\r
+ jnz @@3\r
+ cmp ibufCount,MAXBUF\r
+ jnz @@2\r
+ mov ax,input_size\r
+ mov ibufCount,0\r
+@@2: mov edi,input_ptr\r
+ xor edx,edx\r
+ mov dx,ibufCount\r
+ shl dx,1\r
+ add edi,edx\r
+ mov ax,[edi]\r
+ mov ibitBuffer,ax\r
+ inc ibufCount\r
+ mov ibitCount,15\r
+ jmp @@4\r
+@@3: dec ibitCount\r
+@@4: cmp ibitBuffer,7fffh\r
+ jbe @@5\r
+ xor edi,edi\r
+ mov di,cx\r
+ dec di\r
+ shl di,1\r
+ mov ax,word ptr BitValue[edi]\r
+ or bx,ax\r
+@@5: shl ibitBuffer,1\r
+ inc cx\r
+ cmp cx,bits\r
+ jbe @@1\r
+ mov ax,bx\r
+end;\r
+\r
+function Uncompress: Word; assembler;\r
+asm\r
+ xor eax,eax\r
+ xor ebx,ebx\r
+ mov bx,1\r
+ mov dx,ibitCount\r
+ mov cx,ibitBuffer\r
+ mov ax,ibufCount\r
+@@1: or dx,dx\r
+ jnz @@3\r
+ cmp ax,MAXBUF\r
+ jnz @@2\r
+ mov ax,input_size\r
+ xor ax,ax\r
+@@2: shl ax,1\r
+ mov edi,input_ptr\r
+ add edi,eax\r
+ shr ax,1\r
+ mov cx,[edi]\r
+ inc ax\r
+ mov dx,15\r
+ jmp @@4\r
+@@3: dec dx\r
+@@4: cmp cx,7fffh\r
+ jbe @@5\r
+ mov edi,ebx\r
+ shl edi,1\r
+ mov bx,word ptr rghtC[edi]\r
+ jmp @@6\r
+@@5: mov edi,ebx\r
+ shl edi,1\r
+ mov bx,word ptr leftC[edi]\r
+@@6: shl cx,1\r
+ cmp bx,MAXCHAR\r
+ jle @@1\r
+ sub bx,SUCCMAX\r
+ mov ibitCount,dx\r
+ mov ibitBuffer,cx\r
+ mov ibufCount,ax\r
+ push ebx\r
+ push ebx\r
+ call UpdateModel\r
+ pop eax\r
+end;\r
+\r
+procedure SIXPACK_decode; assembler;\r
+asm\r
+ mov ibitCount,0\r
+ mov ibitBuffer,0\r
+ mov obufCount,0\r
+ mov ibufCount,0\r
+ xor ebx,ebx\r
+ xor ecx,ecx\r
+ mov count,0\r
+ call InitTree\r
+ call Uncompress\r
+@@1: cmp ax,TERMINATE\r
+ jz @@10\r
+ cmp ax,256\r
+ jae @@3\r
+ mov edi,output_ptr\r
+ push ebx\r
+ mov bx,obufCount\r
+ add edi,ebx\r
+ pop ebx\r
+ stosb\r
+ inc obufCount\r
+ mov bx,MAXBUF\r
+ cmp obufCount,bx\r
+ jnz @@2\r
+ mov output_size,bx\r
+ mov obufCount,0\r
+@@2: mov edi,work_ptr\r
+ push ebx\r
+ mov bx,count\r
+ add edi,ebx\r
+ pop ebx\r
+ stosb\r
+ inc count\r
+ cmp count,MAXSIZE\r
+ jnz @@9\r
+ mov count,0\r
+ jmp @@9\r
+@@3: sub ax,FIRSTCODE\r
+ mov cx,ax\r
+ xor dx,dx\r
+ mov bx,CODESPERRANGE\r
+ div bx\r
+ mov index,ax\r
+ xor dx,dx\r
+ mul bx\r
+ mov bx,cx\r
+ add bx,MINCOPY\r
+ sub bx,ax\r
+ mov si,bx\r
+ xor edi,edi\r
+ mov di,index\r
+ shl di,1\r
+ mov bx,word ptr CopyBits[edi]\r
+ push ebx\r
+ call InputCode\r
+ add ax,si\r
+ xor edi,edi\r
+ mov di,index\r
+ shl di,1\r
+ add ax,word ptr CopyMin[edi]\r
+ mov bx,count\r
+ mov dx,bx\r
+ sub dx,ax\r
+ mov cx,dx\r
+ cmp count,ax\r
+ jae @@4\r
+ add cx,MAXSIZE\r
+@@4: xor dx,dx\r
+@@5: mov edi,work_ptr\r
+ add edi,ecx\r
+ mov al,byte ptr [edi]\r
+ mov edi,output_ptr\r
+ push ebx\r
+ mov bx,obufCount\r
+ add edi,ebx\r
+ pop ebx\r
+ mov byte ptr [edi],al\r
+ inc obufCount\r
+ mov ax,MAXBUF\r
+ cmp obufCount,ax\r
+ jnz @@6\r
+ mov output_size,ax\r
+ mov obufCount,0\r
+@@6: mov edi,work_ptr\r
+ push edi\r
+ add edi,ecx\r
+ mov al,byte ptr [edi]\r
+ pop edi\r
+ add edi,ebx\r
+ mov byte ptr [edi],al\r
+ inc bx\r
+ cmp bx,MAXSIZE\r
+ jnz @@7\r
+ xor bx,bx\r
+@@7: inc cx\r
+ cmp cx,MAXSIZE\r
+ jnz @@8\r
+ xor cx,cx\r
+@@8: inc dx\r
+ cmp dx,si\r
+ jb @@5\r
+ mov ax,si\r
+ add count,ax\r
+ cmp count,MAXSIZE\r
+ jb @@9\r
+ sub count,MAXSIZE\r
+@@9: call Uncompress\r
+ jmp @@1\r
+@@10: mov bx,obufCount\r
+ mov output_size,bx\r
+end;\r
+\r
+function SIXPACK_decompress(var source,dest; size: Word): Word;\r
+begin\r
+ input_ptr := @source;\r
+ output_ptr := @dest;\r
+ work_ptr := @work_mem;\r
+ input_size := size;\r
+ SIXPACK_decode;\r
+ SIXPACK_decompress := output_size;\r
+end;\r
+\r
+function APACK_decompress(var source,dest): Longint; assembler;\r
+asm\r
+ mov esi,[source]\r
+ mov edi,[dest]\r
+ cld\r
+ mov dl,80h\r
+@@1: movsb\r
+@@2: add dl,dl\r
+ jnz @@3\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@3: jnc @@1\r
+ xor ecx,ecx\r
+ add dl,dl\r
+ jnz @@4\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@4: jnc @@8\r
+ xor eax,eax\r
+ add dl,dl\r
+ jnz @@5\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@5: jnc @@15\r
+ inc ecx\r
+ mov al,10h\r
+@@6: add dl,dl\r
+ jnz @@7\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@7: adc al,al\r
+ jnc @@6\r
+ jnz @@24\r
+ stosb\r
+ jmp @@2\r
+@@8: inc ecx\r
+@@9: add dl,dl\r
+ jnz @@10\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@10: adc ecx,ecx\r
+ add dl,dl\r
+ jnz @@11\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@11: jc @@9\r
+ dec ecx\r
+ loop @@16\r
+ xor ecx,ecx\r
+ inc ecx\r
+@@12: add dl,dl\r
+ jnz @@13\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@13: adc ecx,ecx\r
+ add dl,dl\r
+ jnz @@14\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@14: jc @@12\r
+ jmp @@23\r
+@@15: lodsb\r
+ shr eax,1\r
+ jz @@25\r
+ adc ecx,ecx\r
+ jmp @@20\r
+@@16: xchg eax,ecx\r
+ dec eax\r
+ shl eax,8\r
+ lodsb\r
+ xor ecx,ecx\r
+ inc ecx\r
+@@17: add dl,dl\r
+ jnz @@18\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@18: adc ecx,ecx\r
+ add dl,dl\r
+ jnz @@19\r
+ mov dl,[esi]\r
+ inc esi\r
+ adc dl,dl\r
+@@19: jc @@17\r
+ cmp eax,32000\r
+ jae @@20\r
+ cmp ah,5\r
+ jae @@21\r
+ cmp eax,7fh\r
+ ja @@22\r
+@@20: inc ecx\r
+@@21: inc ecx\r
+@@22: xchg eax,@dummy\r
+@@23: mov eax,@dummy\r
+@@24: push esi\r
+ mov esi,edi\r
+ sub esi,eax\r
+ rep movsb\r
+ pop esi\r
+ jmp @@2\r
+@@25: sub edi,[dest]\r
+ mov eax,edi\r
+ jmp @ret\r
+\r
+@dummy: dd 0\r
+@ret:\r
+end;\r
+\r
+end.\r
16LIBOBJS = 16_in.$(OBJ) 16_mm.$(OBJ) wcpu.$(OBJ) 16_head.$(OBJ) scroll16.$(OBJ) 16_ca.$(OBJ) 16_snd.$(OBJ)
GFXLIBOBJS = modex16.$(OBJ) bitmap.$(OBJ) planar.$(OBJ) 16text.$(OBJ)
-all: 16.exe test.exe pcxtest.exe test2.exe palettec.exe maptest.exe fmemtest.exe fonttest.exe inputest.exe exmmtest.exe fonttes0.exe fontgfx.exe
+all: 16.exe test.exe pcxtest.exe test2.exe palettec.exe maptest.exe fmemtest.exe fonttest.exe inputest.exe exmmtest.exe fonttes0.exe fontgfx.exe sountest.exe
#
#executables
inputest.exe: inputest.$(OBJ) 16.lib
wcl $(FLAGS) inputest.$(OBJ) 16.lib
+sountest.exe: sountest.$(OBJ) 16.lib
+ wcl $(FLAGS) sountest.$(OBJ) 16.lib
+
pcxtest.exe: pcxtest.$(OBJ) gfx.lib
wcl $(FLAGS) pcxtest.$(OBJ) gfx.lib
inputest.$(OBJ): $(SRC)inputest.c
wcl $(FLAGS) -c $(SRC)inputest.c
+sountest.$(OBJ): $(SRC)sountest.c
+ wcl $(FLAGS) -c $(SRC)sountest.c
+
exmmtest.$(OBJ): $(SRC)exmmtest.c
wcl $(FLAGS) -c $(SRC)exmmtest.c
}\r
\r
boolean IN_qb(byte kee)\r
-{\r
- printf("%u\n", inpu.Keyboard[kee]);\r
+{
+ #ifdef TESTKEYIN\r
+ printf("%u\n", inpu.Keyboard[kee]);
+ #endif\r
if(inpu.Keyboard[kee]==true) return 1;\r
else return 0;\r
}\r
#include "src/lib/16_head.h"\r
\r
#ifdef __DEBUG__\r
-#define __DEBUG_InputMgr__\r
+//#define __DEBUG_InputMgr__\r
#endif\r
\r
#ifdef __DEBUG_InputMgr__\r
-//#define TESTKEYIN\r
+#define TESTKEYIN\r
#define TESTCONTROLNOISY\r
#endif\r
\r
\r
//FMSetPercusiveMode(percusiveMode);\r
} /* End of FMReset */
+
+/* Function: FMKeyOff *******************************************************\r
+*\r
+* Parameters: voice - which voice to turn off.\r
+*\r
+* Description: turns off the specified voice.\r
+*\r
+*/\r
+void FMKeyOff(int voice)
+{\r
+ int regNum;\r
+\r
+ /* turn voice off */\r
+ regNum = 0xB0 + voice % 11;//NUMVOICE;\r
+ opl2out(regNum, 0x0E);\r
+} /* End of FMKeyOff */\r
+\r
+/* Function: FMKeyOn *******************************************************\r
+*\r
+* Parameters: voice - which voice to turn on.\r
+* freq - its frequency (note).\r
+* octave - its octave.\r
+*\r
+* Description: turns on a voice of specfied frequency and\r
+* octave.\r
+*\r
+*/\r
+void FMKeyOn(int voice, int freq, int octave)
+{\r
+ int regNum, tmp;\r
+\r
+ regNum = 0xA0 + voice % 11;//NUMVOICE;\r
+ opl2out(regNum, freq & 0xff);\r
+ regNum = 0xB0 + voice % 11;//NUMVOICE;\r
+ tmp = (freq >> 8) | (octave << 2) | 0x20;
+ opl2out(regNum, tmp);\r
+} /* End of FMKeyOn */
+
+/* Function: FMSetVoice *****************************************************\r
+*\r
+* Parameters: voiceNum - which voice to set.\r
+* ins - instrument to set voice.\r
+*\r
+* Description: sets the instrument of a voice.\r
+*\r
+*/\r
+void FMSetVoice(int voiceNum, FMInstrument *ins){\r
+ int opCellNum, cellOffset;\r
+\r
+ voiceNum %= 11;//NUMVOICE;\r
+ cellOffset = voiceNum % 3 + ((voiceNum / 3) << 3);\r
+\r
+ /* set sound characteristic */\r
+ opCellNum = 0x20 + (char)cellOffset;\r
+ opl2out(opCellNum, ins->SoundCharacteristic[0]);\r
+ opCellNum += 3;\r
+ opl2out(opCellNum, ins->SoundCharacteristic[1]);\r
+\r
+ /* set level/output */\r
+ opCellNum = 0x40 + (char)cellOffset;\r
+ opl2out(opCellNum, ins->Level[0]);\r
+ opCellNum += 3;\r
+ opl2out(opCellNum, ins->Level[1]);\r
+\r
+ /* set Attack/Decay */\r
+ opCellNum = 0x60 + (char)cellOffset;\r
+ opl2out(opCellNum, ins->AttackDecay[0]);\r
+ opCellNum += 3;\r
+ opl2out(opCellNum, ins->AttackDecay[1]);\r
+\r
+ /* set Sustain/Release */\r
+ opCellNum = 0x80 + (char)cellOffset;\r
+ opl2out(opCellNum, ins->SustainRelease[0]);\r
+ opCellNum += 3;\r
+ opl2out(opCellNum, ins->SustainRelease[1]);\r
+\r
+ /* set Wave Select */\r
+ opCellNum = 0xE0 + (char)cellOffset;\r
+ opl2out(opCellNum, ins->WaveSelect[0]);\r
+ opCellNum += 3;\r
+ opl2out(opCellNum, ins->WaveSelect[1]);\r
+\r
+ /* set Feedback/Selectivity */\r
+ opCellNum = (byte)0xC0 + (byte)voiceNum;\r
+ opl2out(opCellNum, ins->Feedback);\r
+} /* End of FMSetVoice */
#define ADLIB_FM_ADDRESS 0x388 /* adlib address/status register */\r
#define ADLIB_FM_DATA 0x389 /* adlib data register */
+/*\r
+* FM Instrument definition for .SBI files - SoundBlaster instrument\r
+* - these are the important parts - we will skip the header, but since\r
+* I am not sure where it starts and ends so I have had to guess.\r
+* However it SEEMS! to work. Each array has two values, one for\r
+* each operator.\r
+*/\r
+typedef struct{\r
+ byte SoundCharacteristic[2]; /* modulator frequency multiple... */\r
+ byte Level[2]; /* modulator frequency level... */\r
+ byte AttackDecay[2]; /* modulator attack/decay... */\r
+ byte SustainRelease[2]; /* modulator sustain/release... */\r
+ byte WaveSelect[2]; /* output waveform distortion */\r
+ byte Feedback; /* feedback algorithm and strength */\r
+} FMInstrument;\r
+
+
void opl2out(word reg, word data);
void opl3out(word reg, word data);
void opl3exp(word data);
+
+//Unknown licence!
void FMReset(void/*int percusiveMode*/);
+void FMKeyOff(int voice);
+void FMKeyOn(int voice, int freq, int octave);
+void FMSetVoice(int voiceNum, FMInstrument *ins);
#endif /*__16_SND_H_*/
--- /dev/null
+/* Project 16 Source Code~\r
+ * Copyright (C) 2012-2015 sparky4 & pngwen & andrius4669\r
+ *\r
+ * This file is part of Project 16.\r
+ *\r
+ * Project 16 is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 3 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * Project 16 is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>, or\r
+ * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
+ * Fifth Floor, Boston, MA 02110-1301 USA.\r
+ *\r
+ */
+
+#include <stdio.h>
+
+#include "src/lib/16_in.h"
+#include "src/lib/16_snd.h"
+
+void main(int argc, char near *argv[])\r
+{
+ static FMInstrument testInst =\r
+{\r
+0x00, 0x01, /* modulator frequency multiple... 0x20 */\r
+0x00, 0x00, /* modulator frequency level... 0x40 */\r
+0xF0, 0xF0, /* modulator attack/decay... 0x60 */\r
+0x73, 0x73, /* modulator sustain/release... 0x80 */\r
+0x03, 0x00, /* output waveform distortion 0xE0 */\r
+0x36, /* feedback algorithm and strength 0xC0 */\r
+};
+
+ IN_Startup();
+ FMReset();
+ FMSetVoice(0, &testInst);
+ printf("p");
+ while(!IN_qb(1))
+ {
+ if(IN_qb(44))
+ {
+ printf("e");\r
+ FMKeyOn(0, 0x106, 4);
+ }
+ else
+ {
+ FMKeyOff(0);
+ }\r
+ }
+ printf("!\n");
+ IN_Shutdown();
+}
\ No newline at end of file