10 REM > S/Music
   20 REM Graphical music display
   30 REM Original by Bill Blunn 6/7/85
   40 REM This version by J.G.Harston
   50 REM *Music turns on (repeatable)
   60 REM *CODE turns off
   70 :
   80 DIM space% &400
  100 IRQ2V=&206:USERV=&200
  110 mcode%=&FFFF0B58
  120 FOR P=0 TO 1
  130   P%=mcode%:O%=space%
  140   [OPT P*3+4
  150   .Start%
  160   LDA IRQ2V:CMP #CS%AND255:BNE Setup
  170   LDA IRQ2V+1:CMP#CS%DIV256:BEQ Exit
  180   .Setup
  190   JSR Vectors:\ Save old vectors
  200   LDA #Int AND 255:STA IRQ2V
  210   LDA #Int DIV 256:STA IRQ2V+1
  220   LDA #Undo AND 255:STA USERV
  230   LDA #Undo DIV 256:STA USERV+1
  240   LDA #&00:LDX #&04
  250   .ClrLp
  260   STA &93,X
  270   DEX:BNE ClrLp
  280   LDX #&FD:JSR IntMask
  290   .Exit
  300   LDX #7
  310   .ExitLp
  320   LDA Chars,X:JSR &FFEE
  330   DEX:BPL ExitLp
  340   RTS
  350   .Chars
  360   EQUB 12:EQUB 8:EQUB &27
  370   EQUB &18:EQUB 0:EQUB 28
  380   EQUB 7:EQUB 22
  390   .IntMask
  400   LDA #&E9:LDY #0:JMP &FFF4
  410   .Undo
  420   LDX #&FF:JSR IntMask
  430   .Vectors
  440   LDX #1
  450   .VecLp
  460   LDA USERV,X:LDY OldUSERV,X
  470   STA OldUSERV,X:TYA:STA USERV,X
  480   LDA IRQ2V,X:LDY OldIRQ2V,X
  490   STA OldIRQ2V,X:TYA:STA IRQ2V,X
  500   DEX:BPL VecLp
  510   RTS
  520   .Screen
  530   LDA #32:LDX #255
  540   .ScrBlnk
  550   STA &7C40,X:DEX:BNE ScrBlnk
  560   LDX #8
  570   .ScrLp
  580   LDA Vol,X:STA &7C00,X:STA &7C50,X
  590   STA &7CA0,X:STA &7CF0,X
  600   LDA Pit,X:STA &7C28,X:STA &7C78,X
  610   STA &7CC8,X:STA &7D18,X
  620   DEX:BPL ScrLp
  630   RTS
  640   .Vol:EQUS "Volume0“"
  650   .Pit:EQUS "Pitch0— "
  660   :
  670   .CS%:.C%:\ Code start
  680   .L7D40
  690   .Int
  700   LDA &FC
  710   PHA:TXA:PHA:TYA:PHA
  720   LDA &FE4D:AND #&82
  730   CMP #&82:BEQ L7D53
  740   JMP L0CB0-CS%+C%
  750   .L7D53
  760   STA &FE4D
  770   LDA #&09:STA &90
  780   LDA #&7C:STA &91
  790   LDA #&30:STA &92
  800   LDA #&7C:STA &93
  810   LDA #&00:STA L0CDC-CS%+C%
  820   .L0C2B
  830   LDX L0CDC-CS%+C%
  840   LDA &0808,X
  850   CMP #&C0:BMI L7D7B
  860   CMP #&C7:BPL L7D7B
  870   LDA #&C7
  880   .L7D7B
  890   SEC:SBC #&C7
  900   LSR A:LSR A:LSR A:STA L0CDE-CS%+C%
  910   LDY #&00:LDA #&AF
  920   .L7D88
  930   CPY L0CDE-CS%+C%:BMI L7D8F
  940   LDA #&20
  950   .L7D8F
  960   STA (&90),Y
  970   INY:CPY #&10:BNE L7D88
  980   LDA &90:CLC:ADC #&50:STA &90
  990   BCC L7DA1:INC &91
 1000   .L7DA1
 1010   LDX L0CDC-CS%+C%
 1020   LDA L0CDE-CS%+C%:BEQ L7DB6
 1030   LDA &0830,X:STA L0CDD-CS%+C%
 1040   CPX #&00:BEQ L7DFA
 1050   .L0C73
 1060   LSR A:LSR A:LSR A
 1070   .L7DB6:.L0C76
 1080   STA L0CDF-CS%+C%
 1090   LDY &94,X
 1100   LDA #&20:STA (&92),Y
 1110   LDA L0CDE-CS%+C%:BEQ L7DD7
 1120   LDY #&A5:LDA L0CDD-CS%+C%
 1130   AND #&04:BEQ L7DCF
 1140   LDY #&AA
 1150   .L7DCF
 1160   TYA
 1170   LDY L0CDF-CS%+C%
 1180   STY &94,X
 1190   STA (&92),Y
 1200   .L7DD7
 1210   LDA &92:CLC:ADC #&50:STA &92
 1220   BCC L7DE2
 1230   INC &93
 1240   .L7DE2
 1250   LDX L0CDC-CS%+C%
 1260   INX
 1270   STX L0CDC-CS%+C%
 1280   CPX #&04
 1290   BEQ L7DF0
 1300   JMP L0C2B-CS%+C%
 1310   .L7DF0:.L0CB0
 1320   LDA &7D18:CMP #ASC"P":BNE CallScr
 1330   LDA &7C00:CMP #ASC"V":BEQ IntExit
 1340   .CallScr
 1350   JSR Screen
 1360   .IntExit
 1370   PLA:TAY:PLA:TAX:PLA:STA &FC
 1380   JMP (OldIRQ2V-CS%+C%)
 1390   .L7DFA
 1400   AND #&07:CMP #&03:BEQ L7E0E
 1410   CMP #&07:BEQ L7E0E
 1420   PHA
 1430   LDA #&93:STA &7C2F
 1440   PLA
 1450   JMP L0C76-CS%+C%
 1460   .L7E0E
 1470   LDA #&92:STA &7C2F
 1480   LDA &0831
 1490   STA L0CDD-CS%+C%
 1500   JMP L0C73-CS%+C%
 1510   .L0CDC:BRK
 1520   .L0CDD:BRK
 1530   .L0CDE:BRK
 1540   .L0CDF:BRK
 1550   .OldIRQ2V:EQUW Int
 1560   .OldUSERV:EQUW Undo
 1570 ]NEXT:O%=O%-4
 1580 PRINT"*SAVE Music ";~space%;" ";~O%;" ";~Start%OR&FFFF0000;" ";~mcode%