100 OPEN1,8,1,"@:BASS/IRQ" 110 OPEN4,4 120 SYS9*4096 130 .OPT P4,O1 140 ; 150 ;************ 160 ;* BASS/IRQ * 170 ;************ 180 ; 190 ; (C)1985 ROBERT TREICHLER 200 ; FL-9497 TRIESENBERG, F.TUM LIECHTENSTEIN 210 ; 220 *= $C000 230 ; 240 ; AUFRUFE AUS BASIC --------------- 245 ; 250 ; INIT SYS AP 252 ; EXIT SYS AP+3 254 ; PARA SYS AP+6,H4,FW,FW*FW,TON-BEZ. 256 ; TREND SYS AP+9,HA%(H),TR%,TA% 257 ; HNEXT SYS AP+12,HA%(H),HA%(HN),HG%(H),HG%(HN),TR%,TA% 258 ; ZUFALL SYS AP+15,HA%(H),TA% 259 ; TEMPO SYS AP+18,T2%.T3%,T4% 260 ; 265 JMP INIT ;IRQ-ROUT. EIN 270 JMP EXIT ;IRQ-ROUT. AUS 280 JMP PARA ;TON-PARAMETER AUS BASIC HOLEN 290 JMP TREND ;NAE.AKKORDEIG.TON SUCHEN 300 JMP HNEXT ;UEBERG.TON ZU NAE.HARM.SUCHEN 310 JMP ZUFALL ;ZUFALLS-TON ERMITTELN 312 JMP TEMPO ;TEMPO AUS BASIC HOLEN 315 ; 320 ; DEFINITIONEN -------------------- 330 ; 340 H4 .BYT 0 ;NR. 1/4-SCHLAG IM TAKT 350 FS .BYT 0,0;FREQUENZ HAUPTSCHLAG 360 FV .BYT 0,0;FREQUENZ VORSCHLAG 370 SAVE .BYT 0,0,0,0,0;SAVE H4,FS,FV 380 ; 390 T2 .BYT 0 ;ZEIT-INKREMENT (1.VORS.) 400 T3 .BYT 0 ; DO. (2.VORS.) 410 T4 .BYT 0 ; DO. (HAUPTS.) 420 ; 430 TIMER .BYT 0 ;ZEIT-ZAEHLER 440 ; 450 PC .BYT 0 ;PERC. ATTACK/DECAY 460 ; 470 HA .BYT 0,0 ;AKKORDEIG.TOENE AKT.HARMONIE (LB/HB) 480 HANX .BYT 0,0 ;AKKORDEIG.TOENE NAECHSTE HARMONIE 490 HG .BYT 0 ;NR.GRUNDTON AKT.HARMONIE 500 TR .BYT 0 ;TREND +/-1 (1,255) 510 TA .BYT 0 ;NR.AKT.TON 512 ; 513 ;AND-MASKEN FUER 2ER-POTENZEN 514 MASK .BYT 1,2,4,8,16,32,64,128 ;LB(BIT0-7) 516 .BYT 1,2,4,8 ;HB(BIT8-11) 520 ; 530 RB = 251 ;RUN BASS 540 RP = 252 ;RUN PERCUSSION 550 ; 560 SID = 54272 ;SID-REG.ADR 570 RANDOM = $D012 ;PSEUDO-RANDOM-WERT 580 IRQEX = $EA31 ;IRQ-ROUT.EXIT 590 CHKCOM = $AEFD ;CHECK KOMMA 600 CHROUT = $FFD2 ;CHAR-OUTPUT 610 GETBYT = $B79E ;HOLT 1-BYTE-WERT ->REG.X 612 GETVAR = $B08B ;VARIABLE SUCHEN 614 TYPERR = $AD99 ;TYPE-MISMATCH-ERROR 620 GETPAR = $B1B2 ;HOLT 16-BIT-PARAMETER ->$64/65 630 FRMEVL = $AD9E ;BEL.AUSDRUCK AUSWERTEN 640 FRESTR = $B6A3 ;STRING-VERWALTUNG 650 ; 660 ; PROGRAMM ------------------------ 750 ; 760 ; IRQ-ROUTINE EINSCHALTEN 770 ; 780 INIT LDA #IRQ 800 VEKTOR SEI 805 STA $0314 810 STX $0315 820 LDA #0 830 STA RB 840 STA RP 850 STA FS 860 CLI 870 RTS 880 ; 890 ;IRQ-ROUT. AUS 895 ; 900 EXIT LDA #IRQEX 920 JMP VEKTOR 930 ; 931 ;IRQ-EINSPRUNG 932 ; 940 IRQ LDA RB 950 ORA RP 960 BEQ TIM 970 INC TIMER 980 LDA TIMER 990 CMP T2;CHECK INTERVALL-ZEITEN 1000 BEQ PLAYT2 1010 CMP T3 1020 BEQ PLAYT3 1030 CMP T4 1040 BEQ PLAYT4 1050 TIM STA TIMER 1060 RETURN JMP IRQEX 1070 ; 1080 PLAYT2 LDA #0;1.VORSCHLAG 1090 STA PC 1100 LDA H4 ;KEIN 1.VORSCHLAG, WENN ... 1110 BMI RETURN ;...H4=NEG. 1115 BEQ RETURN ;...ODER H4=0 1120 AND #1 1130 BNE RETURN ;...ODER SCHLAG=UNGERADE 1140 LDA RANDOM 1150 ADC #220 1160 BCS RETURN ;...ODER RANDOM-EXIT 1170 LDA #5 1180 STA PC ;HI-HAT KURZ 1190 JSR PERC 1200 JMP RETURN 1210 ; 1220 PLAYT3 LDA H4;2.VORSCHLAG 1230 BMI RETURN ;KEIN 2.VORS.WENN H4=NEG 1235 BEQ RETURN ;...ODER H4=0 1240 AND #1 1250 BEQ P310 1260 LDA #5 ;HI-HAT KURZ,WENN... 1270 STA PC ;...SCHLAG=UNGERADE 1280 P310 JSR PERC ;...ODER 1.VORS.AUSGEFUEHRT 1290 LDA H4 1300 CMP #2 1310 BCS RETURN ;BASS-VORSCHLAG NUR BEI #1 1320 LDA RANDOM 1330 ADC #200 1340 BCS RETURN ;RANDOM-EXIT 1350 LDA FV+1 ;BASS-VORSCHLAG 1360 LDY FV 1365 BEQ RETURN ;TON NOCH NICHT BEREIT 1370 JSR BASS 1380 JMP RETURN 1390 ; 1400 PLAYT4 LDX #5;1/4-HAUPTSCHLAG 1410 LDA H4 1420 AND #1 1430 BEQ P410 1440 LDX #8 1450 P410 STX PC 1460 JSR PERC 1470 LDA FS+1 ;BASS-HAUPTSCHLAG 1480 LDY FS 1490 JSR BASS 1500 LDA #0 1510 STA TIMER;RESET TIMER 1515 STA PC ;RESET PERC.BYTE 1520 LDX H4 1530 BEQ P600 1540 STA FS;FREIGEBEN FREQ-LOC. WENN H4>0 1550 STA FV 1560 LDA STRING 1570 BEQ P600 1580 LDX #0 ;STRING AUSDRUCKEN 1590 P500 LDA STRING,X 1600 BEQ P550 1610 JSR CHROUT 1620 INX 1630 BNE P500 1640 P550 LDA #32 1650 JSR CHROUT 1660 P600 JMP RETURN 1670 ; 1680 PERC LDA RP;EVTL.PERCUSSION ->SID 1690 BEQ PERCEX;->KEINE PERC. 1700 LDA PC 1710 BEQ PERCEX;->KEINE PERC. 1720 LDA #128 1730 STA SID+18;VCO#3 NOISE+GATE 1740 LDA PC 1750 STA SID+19;VCO#3 ATTACK/DECAY 1760 LDA #129 1770 STA SID+18 1780 PERCEX RTS 1790 ; 1800 BASS BNE BASS10 ;EVTL.BASS ->SID 1810 LDA #42 ;TIMING-FEHLER 1820 JSR CHROUT 1830 LDA #$FF 1840 BASS10 BMI BASSEX ;PAUSE 1850 LDX RB 1860 BEQ BASSEX;->KEIN BASS 1890 LDX #32 1895 STX SID+4 ;VCO#1 SAEGEZAHN+GATE 1900 LDX #64 1905 STX SID+11;VCO#2 RECHTECK+SYNC+GATE 1910 STA SID ;VCO#1 FREQUENZ 1915 STY SID+1 1920 STA SID+7 ;VCO#2 FREQUENZ 1925 STY SID+8 1930 LDA #33 1935 STA SID+4 1940 LDA #67 1945 STA SID+11 1950 BASSEX RTS 1960 ; 1961 ;TON-PARAMETER AUS BASIC HOLEN 1962 ; 1970 PARA JSR CHKCOM 1980 JSR GETBYT ;H4 1990 STX SAVE 2000 JSR GETPAR ;HAUPT-FREQ-WERT 2010 LDA $64 2020 BNE PAR10 2030 LDA #$FF ;AUS NULL WIRD $FF 2040 PAR10 STA SAVE+1 ; HB 2050 LDA $65 2060 STA SAVE+2 ; LB 2070 JSR GETPAR ;VORSCHLAG-FREQ-WERT 2080 LDA $64 2090 STA SAVE+3 ; HB 2100 LDA $65 2110 STA SAVE+4 ; LB 2120 PAR20 LDA FS ;CHECK FREQ-LOC.FREI 2130 BEQ PAR40 ;JA 2140 LDA H4 2150 BNE PAR20 ;WARTEN WENN H4>0 2160 PAR40 LDX #4 2170 PAR60 LDA SAVE,X ;PARAM.UEBERTRAGEN 2180 STA H4,X 2190 DEX 2200 BPL PAR60 2210 ; 2220 JSR CHKCOM ;STRING HOLEN 2230 JSR FRMEVL 2240 JSR FRESTR 2250 TAX 2260 LDY #0 2270 INX 2280 PAR80 DEX ;STRING UEBERTRAGEN 2290 BEQ PAR90 ;STRING ZU ENDE 2300 LDA ($22),Y 2310 STA STRING,Y 2320 INY 2330 BNE PAR80 2340 PAR90 LDA #0 ;MIT NULL ABSCHLIESSEN 2350 STA STRING,Y 2360 RTS 2370 ; 2380 ;NAECHSTEN TON IM TREND SUCHEN 2390 ; 2400 TREND JSR GETINT ;HOLE BIT-MUSTER HA%() 2410 ; 2420 STA HA ;L.B. 2430 STX HA+1 ;H.B. 2440 JSR GETINT ;HOLE TREND TR% 2450 STA TR 2460 JSR GETINT ;HOLE TON-NR. TA% 2470 TRE010 STA TA 2480 TRE020 LDA TR ;TA+TR->TA 2490 JSR CHKAKK ;CHECK OB AKKORDEIGEN 2500 BEQ TRE020 ;NEIN ->LOOP 2510 JSR PUTTA ;TA% ABSP. 2520 RTS 2530 ; 2540 ;UEBERGANGSTON ZU NAE.HARMONIE SUCHEN 2550 ; 2560 HNEXT JSR GETINT ;HOLE HA%(H) 2570 STA HA 2580 STX HA+1 2590 JSR GETINT ;HOLE HA%(HN) 2600 STA HANX 2610 STX HANX+1 2620 JSR GETINT ;HOLE HG%(H) 2630 STA HG 2640 JSR GETINT ;HOLE HG%(HN) 2650 STA TA ;->WIRD TA 2660 JSR GETINT ;HOLE TR% 2670 STA TR 2680 JSR GETINT ;HOLE TA% 2690 STA SAVE ;TA% SAVEN 2700 ;1.VAR. SUCHE NACHBAR-TON V.NAE.GRUNDTON, ... 2710 ;..DER AKKORDEIGEN ZU AKT.HARMONIE IST 2720 LDA #255 ;TA-1->TA (-1/2 TON) 2730 JSR CHKAKK ;CHECK OB AKKORDEIGEN 2740 BNE HNEXIT ;->JA, NEUER TON GEFUNDEN 2750 LDA #2 ;TA+2->TA (+1/2 TON) 2760 JSR CHKAKK ;CHECK OB AKKORDEIGEN 2770 BNE HNEXIT ;->JA, NEUER TON GEFUNDEN 2780 LDA #253 ;TA-3->TA (-1 TON) 2790 JSR CHKAKK ;CHECK OB AKKORDEIGEN 2800 BNE HNEXIT ;->JA, NEUER TON GEFUNDEN 2810 LDA #4 ;TA+4->TA (+1 TON) 2820 JSR CHKAKK ;CHECK OB AKKORDEIGEN 2830 BNE HNEXIT ;->JA, NEUER TON GEFUNDEN 2840 ;2.VAR. SUCHE TON, DER FUER BEIDE HARM. AKKORDEIGEN 2850 LDA HA 2860 AND HANX 2870 STA HA 2880 LDA HA+1 2890 AND HANX+1 2900 STA HA+1 2910 ORA HA ;CHECK OB GEMEINS.TOENE 2920 BNE HNE020 ;->JA 2930 LDA HG ;NEIN, GRUNDTON NEHMEN 2940 STA TA 2950 HNEXIT JSR PUTTA ;TA% ABSP. 2960 RTS 2970 ; 2980 HNE020 LDA SAVE ;TA% HOLEN UND LAUT TREND... 2990 JMP TRE010 ;...GEMEINS.AKKORD-TON SUCHEN 3000 ; 3010 ;HOLE INTEGER AUS BASIC 3020 ; 3030 GETINT JSR CHKCOM ;KOMMA 3040 JSR GETVAR ;VAR.SUCHEN 3050 STA $49 ;VAR.ADR. ABSP. 3060 STY $4A 3070 LDA $0E ;CHECK OB INTEGER 3080 BEQ GETERR ;->NEIN, ERROR 3085 LDY #0 3090 LDA ($49),Y ;VAR.WERT HOLEN 3100 TAX ;H.B. ->REG.X 3110 INY 3120 LDA ($49),Y ;L.B. ->REG.A 3130 RTS 3140 ; 3150 GETERR JMP TYPERR ;ERROR 3160 ; 3170 ;TA% ALS BASIC-INTEGER-VAR. ABSP. 3180 ; 3190 PUTTA LDA #0 3200 TAY 3210 STA ($49),Y ;H.B. 3220 LDA TA 3230 INY 3240 STA ($49),Y ;L.B. 3250 RTS 3260 ; 3270 ;CHECK OB TON NR.(TA)+REG.A = AKKORDEIGEN 3280 ;IN REG.A=INKR./DEKR. AUF TA 3290 ; 3300 CHKAKK CLC 3310 ADC TA ;TA+INKR/DEKR ->TA 3320 BPL CAK010 ;CHECK OB TA IM BEREICH 0...11 3330 CLC 3340 ADC #12 ;...SONST KORREKTUR 3350 CAK010 CMP #12 3360 BCC CAKBIT 3370 SEC 3380 SBC #12 3390 ; 3400 CAKBIT STA TA ;BIT F.AKT.TON HOLEN 3410 TAX 3420 LDA MASK,X ;AND-MASKE HOLEN 3430 LDY #0 3440 CPX #8 ;CHECK OB L.B. ODER H.B 3450 BCC CAK030 ;->L.B. 3460 LDY #1 ;H.B. 3470 CAK030 AND HA,Y ;BIT AUS AKT.HARM.EXTRAHIEREN 3480 RTS 3490 ; 3500 ; ZUFALLS-TON ERMITTELN 3510 ; 3520 ZUFALL JSR GETINT ;HOLE HA%(H) 3530 STA HA ;L.B. 3540 STX HA+1 ;H.B. 3550 JSR GETINT ;HOLE TA% 3560 JSR CAKBIT ;BIT F.AKT.TON HOLEN 3570 EOR #$FF ;...UND LOESCHEN 3580 AND HA,Y ;...DAMIT NICHT NOCHMALS 3590 STA HA,Y ;...GLEICHER TON KOMMT. 3600 LDA RANDOM ;ZUFALLS-ZAHL + TA ->TA 3610 AND #7 3620 BNE ZUF030 3630 ZUF020 LDA #1 3640 ZUF030 JSR CHKAKK ;CHECK OB AKK.EIGEN 3650 BEQ ZUF020 ;->NEIN, WEITER SUCHEN 3660 JMP PUTTA ;JA, TA% ALS BASIC-VAR.ABSP. 3690 ; 3700 ; TEMPO AUS BASIC HOLEN 3701 ; 3710 TEMPO JSR GETINT ;HOLE T2% (1.VORSCHLAG) 3720 STA T2 3730 JSR GETINT ;HOLE T3% (2.VORSCHLAG) 3740 STA T3 3750 JSR GETINT ;HOLE T4% (1/4-HAUPTSCHLAG) 3760 STA T4 3770 RTS 5000 ; 5010 STRING = * 5020 .END 5030 END