Commit c94e28d

Nick committed on
Implement conversion of patterns to new ch4 format
commit c94e28dddb870b9b81c98fb2a100a99aaadfa891 parent a48de16
6 changed files +77−154
ModifiedCpu/machine.pas +0−74
@@ -390,80 +390,6 @@ begin
390 m_iram2[address] := Data; 390 m_iram2[address] := Data;
391 exit; 391 exit;
392 end; 392 end;
393
394 // Palette code has a bug which causes range check error.
395 // Commented out here because graphics related functions are unused
396
397 {case address of
398 $ff69:
399 begin
400 palramb[(m_iram[$ff68]) and 63] := Data;
401 if (m_iram[$ff68] and 1) > 0 then
402 begin
403 tempL := ((m_iram[$ff68]) and 56) shr 3;
404 tempR := ((m_iram[$ff68]) and 6) shr 1;
405 pal_b[templ][tempr][0] := (Data and 124) shl 1;
406 pal_b[templ][tempr][1] := pal_b[templ][tempr][1] and 63;
407 pal_b[templ][tempr][1] := pal_b[templ][tempr][1] or (Data shl 6);
408 end
409 else
410 begin
411 templ := ((m_iram[$ff68]) and 56) shr 3;
412 tempr := ((m_iram[$ff68]) and 6) shr 1;
413
414 pal_b[templ][tempr][2] := (Data and 31) shl 3;
415 pal_b[templ][tempr][1] := pal_b[templ][tempr][1] and 192;
416 pal_b[templ][tempr][1] := pal_b[templ][tempr][1] or ((Data and 224) shr 2);
417 end;
418
419 pal_dx_b[((m_iram[$ff68]) and 56) shr 3][((m_iram[$ff68]) and 6) shr 1] :=
420 (((pal_b[((m_iram[$ff68]) and 56) shr 3][((m_iram[$ff68]) and 6) shr 1][2]) shr
421 (8 - dx_r)) shl dx_sr) or (((pal_b[((m_iram[$ff68]) and 56) shr 3][
422 ((m_iram[$ff68]) and 6) shr 1][1]) shr (8 - dx_g)) shl dx_sg) or
423 (((pal_b[((m_iram[$ff68]) and 56) shr 3][((m_iram[$ff68]) and 6) shr 1][0]) shr
424 (8 - dx_b)) shl dx_sb);
425 if (m_iram[$ff68] and 128) > 0 then
426 begin
427 m_iram[$ff68] := m_iram[$ff68] and $3f;
428 Inc(m_iram[$ff68]);
429 m_iram[$ff68] := m_iram[$ff68] or 128;
430 end;
431 end;
432 $ff6b:
433 begin
434 palramo[(m_iram[$ff6a]) and 63] := Data;
435 if (m_iram[$ff6a] and 1) > 0 then
436 begin
437 templ := ((m_iram[$ff6a]) and 56) shr 3;
438 tempr := ((m_iram[$ff6a]) and 6) shr 1;
439
440 pal_o[templ][tempr][0] := (Data and 124) shl 1;
441 pal_o[templ][tempr][1] := pal_o[templ][tempr][1] and 63;
442 pal_o[templ][tempr][1] := pal_o[templ][tempr][1] or (Data shl 6);
443 end
444 else
445 begin
446 templ := ((m_iram[$ff6a]) and 56) shr 3;
447 tempr := ((m_iram[$ff6a]) and 6) shr 1;
448
449 pal_o[templ][tempr][2] := (Data and 31) shl 3;
450 pal_o[templ][tempr][1] := pal_o[templ][tempr][1] and 192;
451 pal_o[templ][tempr][1] := pal_o[templ][tempr][1] or ((Data and 224) shr 2);
452 end;
453 pal_dx_o[((m_iram[$ff6a]) and 56) shr 3][((m_iram[$ff6a]) and 6) shr 1] :=
454 (((pal_o[((m_iram[$ff6a]) and 56) shr 3][((m_iram[$ff6a]) and 6) shr 1][2]) shr
455 (8 - dx_r)) shl dx_sr) or (((pal_o[((m_iram[$ff6a]) and 56) shr 3][
456 ((m_iram[$ff6a]) and 6) shr 1][1]) shr (8 - dx_g)) shl dx_sg) or
457 (((pal_o[((m_iram[$ff6a]) and 56) shr 3][((m_iram[$ff6a]) and 6) shr 1][0]) shr
458 (8 - dx_b)) shl dx_sb);
459 if (m_iram[$ff6a] and 128) > 0 then
460 begin
461 m_iram[$ff6a] := m_iram[$ff6a] and $3f;
462 Inc(m_iram[$ff6a]);
463 m_iram[$ff6a] := m_iram[$ff6a] or 128;
464 end;
465 end;
466 end;}
467 end; 393 end;
468 394
469 if ((address >= $e000) and (address < $fe00)) then 395 if ((address >= $e000) and (address < $fe00)) then
Modifiedcodegen.pas +4−4
@@ -93,9 +93,9 @@ var
93 93
94 if Instrument.Type_ = itNoise then 94 if Instrument.Type_ = itNoise then
95 begin 95 begin
96 SL.Add(IntToStr(AsmInstrument[1])); 96 SL.Add(IntToStr(AsmInstrument[1])); // envelope
97 97
98 HighMask := %00000000; 98 HighMask := AsmInstrument[0];
99 if Instrument.LengthEnabled then 99 if Instrument.LengthEnabled then
100 HighMask := HighMask or %01000000; 100 HighMask := HighMask or %01000000;
101 if Instrument.CounterStep = swSeven then 101 if Instrument.CounterStep = swSeven then
@@ -242,9 +242,9 @@ begin
242 242
243 if Instruments[I].Type_ = itNoise then 243 if Instruments[I].Type_ = itNoise then
244 begin 244 begin
245 SL.Add(IntToStr(AsmInstrument[1])); 245 SL.Add(IntToStr(AsmInstrument[1])); // envelope
246 246
247 HighMask := %00000000; 247 HighMask := AsmInstrument[0];
248 if Instruments[I].LengthEnabled then 248 if Instruments[I].LengthEnabled then
249 HighMask := HighMask or %01000000; 249 HighMask := HighMask or %01000000;
250 if Instruments[I].CounterStep = swSeven then 250 if Instruments[I].CounterStep = swSeven then
Modifiedconstants.pas +64−63
@@ -545,69 +545,70 @@ begin
545 {%EndRegion} 545 {%EndRegion}
546 546
547 {%Region Ch4 Frequency -> Note Code} 547 {%Region Ch4 Frequency -> Note Code}
548 Ch4FreqToNoteCodeMap.Add(524288, 0); 548 Ch4FreqToNoteCodeMap.Add(524288, 63);
549 Ch4FreqToNoteCodeMap.Add(262144, 1); 549 Ch4FreqToNoteCodeMap.Add(262144, 62);
550 Ch4FreqToNoteCodeMap.Add(131072, 2); 550 Ch4FreqToNoteCodeMap.Add(131072, 61);
551 Ch4FreqToNoteCodeMap.Add(87381, 3); 551 Ch4FreqToNoteCodeMap.Add(87381, 60);
552 Ch4FreqToNoteCodeMap.Add(65536, 4); 552 Ch4FreqToNoteCodeMap.Add(65536, 59);
553 Ch4FreqToNoteCodeMap.Add(52428, 5); 553 Ch4FreqToNoteCodeMap.Add(52428, 58);
554 Ch4FreqToNoteCodeMap.Add(43690, 6); 554 Ch4FreqToNoteCodeMap.Add(43690, 57);
555 Ch4FreqToNoteCodeMap.Add(37449, 7); 555 Ch4FreqToNoteCodeMap.Add(37449, 56);
556 Ch4FreqToNoteCodeMap.Add(32768, 8); 556 Ch4FreqToNoteCodeMap.Add(32768, 55);
557 Ch4FreqToNoteCodeMap.Add(26214, 9); 557 Ch4FreqToNoteCodeMap.Add(26214, 54);
558 Ch4FreqToNoteCodeMap.Add(21845, 10); 558 Ch4FreqToNoteCodeMap.Add(21845, 53);
559 Ch4FreqToNoteCodeMap.Add(18724, 11); 559 Ch4FreqToNoteCodeMap.Add(18724, 52);
560 Ch4FreqToNoteCodeMap.Add(16384, 12); 560 Ch4FreqToNoteCodeMap.Add(16384, 51);
561 Ch4FreqToNoteCodeMap.Add(13107, 13); 561 Ch4FreqToNoteCodeMap.Add(13107, 50);
562 Ch4FreqToNoteCodeMap.Add(10922, 14); 562 Ch4FreqToNoteCodeMap.Add(10922, 49);
563 Ch4FreqToNoteCodeMap.Add(9362, 15); 563 Ch4FreqToNoteCodeMap.Add(9362, 48);
564 Ch4FreqToNoteCodeMap.Add(8192, 16); 564 Ch4FreqToNoteCodeMap.Add(8192, 47);
565 Ch4FreqToNoteCodeMap.Add(6553, 17); 565 Ch4FreqToNoteCodeMap.Add(6553, 46);
566 Ch4FreqToNoteCodeMap.Add(5461, 18); 566 Ch4FreqToNoteCodeMap.Add(5461, 45);
567 Ch4FreqToNoteCodeMap.Add(4681, 19); 567 Ch4FreqToNoteCodeMap.Add(4681, 44);
568 Ch4FreqToNoteCodeMap.Add(4096, 20); 568 Ch4FreqToNoteCodeMap.Add(4096, 43);
569 Ch4FreqToNoteCodeMap.Add(3276, 21); 569 Ch4FreqToNoteCodeMap.Add(3276, 42);
570 Ch4FreqToNoteCodeMap.Add(2730, 22); 570 Ch4FreqToNoteCodeMap.Add(2730, 41);
571 Ch4FreqToNoteCodeMap.Add(2340, 23); 571 Ch4FreqToNoteCodeMap.Add(2340, 40);
572 Ch4FreqToNoteCodeMap.Add(2048, 24); 572 Ch4FreqToNoteCodeMap.Add(2048, 39);
573 Ch4FreqToNoteCodeMap.Add(1638, 25); 573 Ch4FreqToNoteCodeMap.Add(1638, 38);
574 Ch4FreqToNoteCodeMap.Add(1365, 26); 574 Ch4FreqToNoteCodeMap.Add(1365, 37);
575 Ch4FreqToNoteCodeMap.Add(1170, 27); 575 Ch4FreqToNoteCodeMap.Add(1170, 36);
576 Ch4FreqToNoteCodeMap.Add(1024, 28); 576 Ch4FreqToNoteCodeMap.Add(1024, 35);
577 Ch4FreqToNoteCodeMap.Add(819, 29); 577 Ch4FreqToNoteCodeMap.Add(819, 34);
578 Ch4FreqToNoteCodeMap.Add(682, 30); 578 Ch4FreqToNoteCodeMap.Add(682, 33);
579 Ch4FreqToNoteCodeMap.Add(585, 31); 579 Ch4FreqToNoteCodeMap.Add(585, 32);
580 Ch4FreqToNoteCodeMap.Add(512, 32); 580 Ch4FreqToNoteCodeMap.Add(512, 31);
581 Ch4FreqToNoteCodeMap.Add(409, 33); 581 Ch4FreqToNoteCodeMap.Add(409, 30);
582 Ch4FreqToNoteCodeMap.Add(341, 34); 582 Ch4FreqToNoteCodeMap.Add(341, 29);
583 Ch4FreqToNoteCodeMap.Add(292, 35); 583 Ch4FreqToNoteCodeMap.Add(292, 28);
584 Ch4FreqToNoteCodeMap.Add(256, 36); 584 Ch4FreqToNoteCodeMap.Add(256, 27);
585 Ch4FreqToNoteCodeMap.Add(204, 37); 585 Ch4FreqToNoteCodeMap.Add(204, 26);
586 Ch4FreqToNoteCodeMap.Add(170, 38); 586 Ch4FreqToNoteCodeMap.Add(170, 25);
587 Ch4FreqToNoteCodeMap.Add(146, 39); 587 Ch4FreqToNoteCodeMap.Add(146, 24);
588 Ch4FreqToNoteCodeMap.Add(128, 40); 588 Ch4FreqToNoteCodeMap.Add(128, 23);
589 Ch4FreqToNoteCodeMap.Add(102, 41); 589 Ch4FreqToNoteCodeMap.Add(102, 22);
590 Ch4FreqToNoteCodeMap.Add(85, 42); 590 Ch4FreqToNoteCodeMap.Add(85, 21);
591 Ch4FreqToNoteCodeMap.Add(73, 43); 591 Ch4FreqToNoteCodeMap.Add(73, 20);
592 Ch4FreqToNoteCodeMap.Add(64, 44); 592 Ch4FreqToNoteCodeMap.Add(64, 19);
593 Ch4FreqToNoteCodeMap.Add(51, 45); 593 Ch4FreqToNoteCodeMap.Add(51, 18);
594 Ch4FreqToNoteCodeMap.Add(42, 46); 594 Ch4FreqToNoteCodeMap.Add(42, 17);
595 Ch4FreqToNoteCodeMap.Add(36, 47); 595 Ch4FreqToNoteCodeMap.Add(36, 16);
596 Ch4FreqToNoteCodeMap.Add(32, 48); 596 Ch4FreqToNoteCodeMap.Add(32, 15);
597 Ch4FreqToNoteCodeMap.Add(25, 49); 597 Ch4FreqToNoteCodeMap.Add(25, 14);
598 Ch4FreqToNoteCodeMap.Add(21, 50); 598 Ch4FreqToNoteCodeMap.Add(21, 13);
599 Ch4FreqToNoteCodeMap.Add(18, 51); 599 Ch4FreqToNoteCodeMap.Add(18, 12);
600 Ch4FreqToNoteCodeMap.Add(16, 52); 600 Ch4FreqToNoteCodeMap.Add(16, 11);
601 Ch4FreqToNoteCodeMap.Add(12, 53); 601 Ch4FreqToNoteCodeMap.Add(12, 10);
602 Ch4FreqToNoteCodeMap.Add(10, 54); 602 Ch4FreqToNoteCodeMap.Add(10, 9);
603 Ch4FreqToNoteCodeMap.Add(9, 55); 603 Ch4FreqToNoteCodeMap.Add(9, 8);
604 Ch4FreqToNoteCodeMap.Add(8, 56); 604 Ch4FreqToNoteCodeMap.Add(8, 7);
605 Ch4FreqToNoteCodeMap.Add(6, 57); 605 Ch4FreqToNoteCodeMap.Add(6, 6);
606 Ch4FreqToNoteCodeMap.Add(5, 58); 606 Ch4FreqToNoteCodeMap.Add(5, 5);
607 Ch4FreqToNoteCodeMap.Add(4, 60); 607 Ch4FreqToNoteCodeMap.Add(4, 4);
608 Ch4FreqToNoteCodeMap.Add(3, 61); 608 Ch4FreqToNoteCodeMap.Add(4, 3);
609 Ch4FreqToNoteCodeMap.Add(2, 64); 609 Ch4FreqToNoteCodeMap.Add(3, 2);
610 Ch4FreqToNoteCodeMap.Add(1, 67); 610 Ch4FreqToNoteCodeMap.Add(2, 1);
611 Ch4FreqToNoteCodeMap.Add(2, 0);
611 {%EndRegion} 612 {%EndRegion}
612 613
613 end. 614 end.
ModifiedhUGEDriver +1−1
@@ -1 +1 @@
1 Subproject commit 54fbcc1162a9cfbec60071d6ff61f6e3464eb2c7 1 Subproject commit 5acfb8fcd4cc8a7331471938a7680683f9f12a09
Modifiedinstruments.pas +3−5
@@ -247,8 +247,7 @@ begin
247 // Because *InstrumentToRegisters is meant for previewing, it puts in 247 // Because *InstrumentToRegisters is meant for previewing, it puts in
248 // a value for shift clock freq, so we have to remove it and put in the mask 248 // a value for shift clock freq, so we have to remove it and put in the mask
249 // instead. 249 // instead.
250 // TODO: Come back here 250 Poly.ShiftClockFrequency := Instrument.ShiftClockFreq;
251 //Poly.ShiftClockFrequency := Instrument.ShiftClockFreq;
252 Result[3] := Regs.NR44; 251 Result[3] := Regs.NR44;
253 end; 252 end;
254 253
@@ -321,9 +320,8 @@ begin
321 320
322 NR43.ShiftClockFrequency := $F - (Frequency shr 7); // Quantize CH4 note 321 NR43.ShiftClockFrequency := $F - (Frequency shr 7); // Quantize CH4 note
323 322
324 // TODO: Come back here 323 NR43.DividingRatio:= Instr.DividingRatio;
325 //NR43.DividingRatio:= Instr.DividingRatio; 324 NR43.SevenBitCounter:=Instr.CounterStep = swSeven;
326 //NR43.SevenBitCounter:=Instr.CounterStep = swSeven;
327 325
328 NR44.Initial:= Initial; 326 NR44.Initial:= Initial;
329 NR44.UseLength:=Instr.LengthEnabled; 327 NR44.UseLength:=Instr.LengthEnabled;
Modifiedsong.pas +5−7
@@ -368,10 +368,9 @@ begin
368 VolSweepDirection := Down; 368 VolSweepDirection := Down;
369 VolSweepAmount := 0; 369 VolSweepAmount := 0;
370 NoiseMacro := Default(TNoiseMacro); 370 NoiseMacro := Default(TNoiseMacro);
371 // TODO: Come back here 371 ShiftClockFreq := 0;
372 //ShiftClockFreq := 0; 372 DividingRatio := 0;
373 //DividingRatio := 0; 373 CounterStep := swFifteen;
374 //CounterStep := swFifteen;
375 end; 374 end;
376 375
377 for I := Low(S.Waves) to High(S.Waves) do begin 376 for I := Low(S.Waves) to High(S.Waves) do begin
@@ -571,8 +570,7 @@ var
571 570
572 Ch4Freq := Trunc((524288 / RealR) / 2**(PolyCounter.ShiftClockFrequency+1)); 571 Ch4Freq := Trunc((524288 / RealR) / 2**(PolyCounter.ShiftClockFrequency+1));
573 if not Ch4FreqToNoteCodeMap.TryGetData(Ch4Freq, Pat[I].Note) then 572 if not Ch4FreqToNoteCodeMap.TryGetData(Ch4Freq, Pat[I].Note) then
574 writeln(Regs.NR43, ' not found!'); 573 writeln('[DEBUG] Note value ', Pat[I].Note, ' not found.');
575 //Pat[I].Note := Ch4PolyCounterToNoteCodeMap.KeyData[];
576 end; 574 end;
577 end; 575 end;
578 begin 576 begin
@@ -595,7 +593,7 @@ begin
595 // Rewrite noise patterns to accomodate the new noise instruments... 593 // Rewrite noise patterns to accomodate the new noise instruments...
596 for I := 0 to SV4.Patterns.Count-1 do 594 for I := 0 to SV4.Patterns.Count-1 do
597 if UsedInCH4(SV4.Patterns.Keys[I]) then begin 595 if UsedInCH4(SV4.Patterns.Keys[I]) then begin
598 //ConvertPattern(SV4.Patterns.Data[I]^); 596 ConvertPattern(SV4.Patterns.Data[I]^);
599 end; 597 end;
600 598
601 Result := UpgradeSong(SV4); 599 Result := UpgradeSong(SV4);