@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C4 ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `8  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D8:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu )}d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%*} DD˙`  }J)Lr J  ((  p L ()   J+}L= ( L 0q A    IB JC;? D W ,} LL  ` W )LA!  ߰")-݆ p" -} $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ`.}$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H /}p h  hyhy D L> L JJ    ! LA*` BF0}7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L1}EE !E^ ^ E E7EȩEdE/EȩE  D2} .L }  ;F d  ;?F7F? ( .   Z D LL d 3} . D  L    p  E` , d)  D L) 0BM݊L݉4} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G5} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G6}}!`GHLl Z dLȩ8 lI0 ` _} ; $ %  pLl`?}ݚ I(`DOS SYShChDC IC`0I B0x D)D`}Need DOS2.5,type Y @}Λd ddJ\|DOS SYSAUTORUN SYSA}B}B}-B}CDOS SYSC} C C*(> C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISKD}.COMLu L1 L ;LHL  T`  `8  ɐ     `TU E} L ? .  t`GBJ ~DEHI B V0dVF}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEhG}DEL8HI4 0 HI,0 0  9 .G VLOH},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D8:MEM.SAV J y08 B|DEHII} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHIJ} VY8 B V  @  /DE `E:D8:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO K}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -L}LLu ÝDEHILV 9 .l 9 .l  `` s$B BHM}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu }10 .TITLE "Atari Midi Interface"20 .PAGE "C Terpin 1991"30 ; created: 06/89 revised:03/9140 ;50 ; Midi 'V:' Handler60O} ;70 ; Christopher Terpin80 ; 144 Eggert Road90 ; Buffalo, N.Y. 142150100 ; terpin@autarch.acsu.buffalo.edu0110 ; orP} terpin@ubunix.acsu.buffalo.edu0120 ;0130 ; THIS SOURCE CODE IS IN THE0140 ; PUBLIC DOMAIN.0150 ; Please feel free to modQ}ify and0160 ; improve this code. Please0170 ; let me know about any major0180 ; improvements or bugs you0190 ; have discR}overed. Enjoy!0200 ;0210 ;0220 ;0230 ; execution from AtariBASIC:0240 ;1. POKE 106,154:GR.0:DOS0250 ;2. load D:MIDI.OBJS}0255 ;3. run BASIC cartridge0260 ;4. I=USR(39168,cmd,[start, end],speed) (see below)0270 ;------------------------------0T}280 ; to initialize V: handler:0290 ; I=USR(39168,ASC("I"))0300 ; CLOSE #1:OPEN #1,8,0,"V:"0310 ; use ?#1; or PUT #1 to seU}nd midi codes (i.e. ?#1;"A@";)0320 ;------------------------------0330 ;0340 ; to reset normal serial i/o:0350 ; I=USR(3V}9168,ASC("C"))0360 ;-------------------------------0370 ; to record:0380 ; I=USR(39168,ASC("R"),ADR(A$))0390 ; POKE 204,1W} to start recording0400 ; POKE 204,0 to stop recording0410 ; L = PEEK(205)+256*PEEK(206)0420 ; is # of bytes recorded04X}30 ;------------------------------0440 ; to playback:0450 ; I=USR(39168,ASC("P"),ADR(A$),ADR(A$)+L)0460 ;-----------------Y}-------------0470 ; to record B while playing A:0480 ; I=USR(39168,ASC("R"),ADR(B$))0490 ; POKE 204,1 :I=USR(39168,ASC("P"Z}),ADR(A$),ADR(A$)+L):POKE 204,00500 ;------------------------------0510 ;0520 ; equates0530 ;0540 AUDCTL=$D208 ; pokey [}register0550 OUTBUF=$CB ; character for output0560 SWITCH= $CC ; 0==stop recording0570 BUFADD = $CD ; pointer to buffe\}r for recording0580 PLAYBUF = $CF ; pointer to buffer for playback0590 CH = $2FC ; last key pressed0600 RECVDN = $39 ; ]}receive flag0610 SERIN = $D20D ; serial i/o0620 SEROUT = SERIN0630 ;0640 VSERIN=$020A ; interrupt vector for serial inpu^}t0650 VSEROR = $20C ; interrupt vector for serial output ready0660 VSEROC = $20E ; interrupt vector for serial output compl_}ete0670 ;0680 AUDF3=$D204 ; pokey ch3 :baudlo0690 AUDF4=$D206 ; pokey ch4 :baudhi0700 XMTDON=$3A ; transmit done flag07`}10 SSKCTL=$232 ; serial port control shadow0720 SKCTL=$D20F ; serial port control (W)0730 SKSTAT=$D20F ; serial port statusa} (R)0740 SKRES= $D20A ; resets SKSTAT0750 POKMSK=$10 ; shadow of IRQEN0760 IRQEN=$D20E ; interrupt request0770 HATABS=$3b}1A ; pointer to handler table0780 MIDIL= 22 ; midi baud rate0790 MIDIH = 0 ; values0800 RD = 4 ; CIO: open for rec}ad0810 WR = 8 ; CIO: open for write0820 CPUT = 11 ; CIO: PUT command0830 COPEN = 3 ; CIO: OPEN command0840 CCLOSd}E = 12 ; CIO: CLOSE command0850 ;0860 ; input-output control block (iocb)0870 ; structure:0880 ;0890 ICCOM = $342 ; comme}and0900 ICAX1 = $34A ; aux10910 ICAX2 = $34B ; aux20920 ICBAH = $345 ; buffer address hi0930 ICBAL = $344 ; buffer addresf}s lo0940 ICBLL = $348 ; buffer length lo0950 ICBLH = $349 ; buffer length hi0960 CIOV = $E456 ; Central I/O vector0970 ;g}0980 ;0990 ; countdown timers1000 ;1010 CDTMA1 = $0226 ; timer1 vector1020 CDTMA2 = $0228 ; timer2 vector1030 CDTMF5 = $h}022E ; timer5 flag1040 SETVBV = $E45C ; set vblank1050 CONSOL = $D01F ; used for keyboard click1060 ;1070 MARK = 255 ; bui}ffer timing mark1080 CTRLC = 146 ; control-c key1090 ;1100 *= $99001110 ;1120 ;1130 START1140 PLA1150 PLA1160 PLj}A get command1170 ;1180 CMP #'I1190 BNE OPT21200 JMP SETHAND ; setup CIO handler1210 ;1220 OPT2 CMP #'R12k}30 BNE OPT31240 JMP RECORD ; midi record1250 ;1260 OPT3 CMP #'P1270 BNE OPT41280 JMP PLAYBACK ; midi playback1290l} ;1300 OPT4 CMP #'C1310 BNE NOOPT1320 JMP RESET ; reset ser port1330 NOOPT SEC ; error1340 RTS1350 ;-----------m}------------------1360 ; MIDI "V:" handler1370 ;1380 SETHAND1390 LDY #0 ; add our handler1400 LPHND LDA HATABS,Y141n}0 CMP #0 ;free entry?1420 BEQ FOUND ;yes..1430 INY ;no, skip 3 bytes1440 INY1450 INY1460 CPY #34 ; o}end of table?1470 BNE LPHND ; no...keep looking1480 SEC ; yes..full table!1490 RTS ; quit with error150p}0 ;1510 FOUND LDA #'V ; "V:" handler1520 STA HATABS,Y ; save in table1530 INY1540 LDA #VTABL&255 ; store address155q}0 STA HATABS,Y ; of vector1560 INY ; table in1570 LDA #VTABL/255 ; handler table1580 STA HATABS,Y1590 ;r}1600 ; save interrupt vectors1610 ;1620 LDY #51630 SAVESER LDA VSERIN,Y1640 STA SAVEVEC,Y1650 DEY1660 BPL SAVESER1s}670 ;1680 RTS1690 ;1700 SAVEVEC .BYTE 0,0,0,0,0,01710 ;1720 ;--------------------------1730 ; begin MIDI Handler1740 t};1750 ; vector table:1760 VTABL .WORD VOPEN-11770 .WORD VCLOSE-11780 .WORD NOFUNC-1 (get)1790 .WORD VPu}UT-11800 .WORD NOFUNC-1 (status)1810 .WORD NOFUNC-1 (special)1820 JMP VINIT ; initialization1830 ;----------v}-------------------1840 VCLOSE1850 VOPEN LDA #01860 STA MODE1870 VINIT1880 RETURN1 LDY #1 ; return success1890 NOFUNC w}RTS1900 ;-----------------------------1910 ;1920 ;1930 ;1940 ;----------------------------1950 ; PUT function1960 ;19x}70 VPUT STA OUTBUF ; save accumulator1980 LDA MODE ; write mode ?1990 CMP #WR2000 BEQ WRMODE ; yes...2010 LDA #WR y}; no..set flag2020 STA MODE ; and2030 JSR SETIO ; set up for serial output2040 ;2050 WRMODE LDA OUTBUF ; retrieve bytz}e2060 STA SEROUT ; send it out &2070 WAIT LDA XMTDON wait for irqs2080 BEQ WAIT to do their2090 LDA #0 {} stuff...2100 STA XMTDON reset flag2110 LDY #1 exit2120 RTS with success2130 ;---------|}-------------------2140 ;2150 ;2160 ;----------------------------2180 ; enable serial I/O2190 SETIO LDA #$73 ; ALLOW I &}} O concurrently!2200 CONT STA SSKCTL ; set the serial port control,2210 STA SKCTL and shadow2220 LDA POKMSK ; ~}get irqen mask2230 AND #$CF ; no keyboard interrupts2240 CLC2250 ORA #$30 ;allow both types2260 STA POKMSK } of serial interrupts2270 STA IRQEN2280 LDA #MIDIL2290 STA AUDF3 ;set 31.5k baud2300 LDA #MIDIH rate for i/o2}310 STA AUDF4 in POKEY2320 LDA #$28 ; clock ch3 with 1.79MHz2330 STA AUDCTL ; & link ch3 to ch42340 ;2350 L}DA #0 ; reset transmit2360 STA XMTDON done flag2370 RTS2380 ;2390 ;2400 MODE .BYTE 0 ; read/write mode flag2}410 ;2420 ;------------------------------2430 ; reset serial port2440 RESET2450 LDA #$032460 STA SSKCTL ; disable247}0 STA SKCTL serial port2480 LDA POKMSK interrupts2490 AND #$C02500 STA POKMSK2510 STA IRQEN2520 LDA #02530} STA SWITCH2540 STA XMTDON2550 LDY #5 ; restore vectors2560 RESTV LDA SAVEVEC,Y2570 STA VSERIN,Y2580 DEY2590 }BPL RESTV2600 RTS2610 ;----------------------------2620 ;2630 ;2640 ; interrupt service routine2650 ; for serial input} ready2660 ;2670 ;----------------------------2680 ISRSIR TYA2690 PHA save y register2700 LDA SKSTAT reset }latches2710 STA SKRES in case of overrun2720 LDA SWITCH check software switch2730 BEQ LEAVIT switch on?2740 LD}Y #0 ; yes,save interval2750 LDA INTERVAL2755 CMP #2 ; 2 jiffies?2760 BCC TOOSHORT ;time is too short2770 L}DY #12780 STA (BUFADD),Y2790 LDA #MARK2800 LDY #02810 STA (BUFADD),Y2820 STY INTERVAL ; reset counter2830 LDY #2}2840 TOOSHORT LDA SERIN ;load serial input2850 STA (BUFADD),Y store input2860 INY in buffer &2870 TYA288}0 CLC2890 ADC BUFADD2900 STA BUFADD increment the2910 LDA BUFADD+1 buffer pointer2920 ADC #02930 STA BUFAD}D+12940 ;2950 LEAVIT LDA #$FF set recvdn flag2960 STA RECVDN2970 PLA restore the2980 TAY y register2990 PLA} and the accumulator3000 RTI & return from interrupt.3010 ;-----------------------------3020 ;3030 ;3040 ;-------}----------------------3050 ; TIMER ROUTINE3060 ;3070 ; inserts timing marks3080 ; to count time interval3090 ;3100 ;---}-------------------------3110 TIMER3120 LDA SWITCH ;are we recording?3130 BEQ SETTIM ;NO...reset this vbi3150 IN}C INTERVAL ; count # of marks3160 CMP #255 ; max count?3170 BNE SETTIM ; no, continue3190 LDY #0 ; writ}e to buffer3200 LDA #MARK ; timing mark3210 STA (BUFADD),Y3220 LDY #13230 LDA #2553240 STA (BUFADD),Y3260 LDA} #0 ; reset counter3270 STA INTERVAL3280 ;3290 CLC ;increment the3300 LDA BUFADD ; buffer point}er3310 ADC #2 ; by two3320 STA BUFADD3330 LDA BUFADD+13340 ADC #03350 STA BUFADD+13360 ;3370 ;3380 SETTI}M3390 LDA #TIMER&255 ; reset the3400 STA CDTMA2 timer vector3410 LDA #TIMER/2563420 STA CDTMA2+13490 LDY #1 } ; speed lo (1 jiffy)3500 LDX #0 ; speed hi3510 LDA #2 ; use timer 23520 JSR SETVBV ; start it!3530 RTS} ; done..3540 ;------------------------------3550 ;3560 ;3570 ;3580 ;-----------------------------3590 ; REC}ORD routine3600 ;3610 ;3620 RECORD3630 PLA3640 STA BUFADD+1 ;address of3650 PLA recording buffer3660 S}TA BUFADD3710 LDA #03720 STA INTERVAL ; reset counter3730 STA RECVDN ; reset input flag3740 JSR SETTIM ; sta}rt timer3750 LDA #ISRSIR&2553760 STA VSERIN ;setup serial3770 LDA #ISRSIR/256 input interrupts3780 STA VSERIN+1}3790 JSR SETIO ;enable serial input3800 RTS ; done!3820 INTERVAL .BYTE 03830 ;-----------------------------}3840 ;3850 ;3860 ; PLAYBACK routine3870 ;3880 PLAYBACK3890 PLA3900 STA PLAYBUF+1 ; playback buffer3910 PLA3920 }STA PLAYBUF3930 PLA3940 STA ENDBUF+1 ; pointer to end of buffer3950 PLA3970 STA ENDBUF4020 ;4030 LDA #04040 STA} DONE ; reset flag4050 ;4060 LDA #ISEROR&255 ; set up4070 STA VSEROR serial output4080 LDA #ISEROR/256 r}eady4090 STA VSEROR+1 interrupt4100 ;4110 LDA #ISRTD&255 ; set up4120 STA VSEROC serial output4130 LDA }#ISRTD/256 complete4140 STA VSEROC+1 interrupt4150 JSR SETIO4160 ;4170 ;4180 ;4190 ;4200 ;------------------}------------4210 ; output buffer4220 PLAYLOOP4230 LDY #04240 LDA (PLAYBUF),Y ; get note4250 CMP #MARK ; is it a ma}rk?4260 BNE ISMIDI ; no...4270 LDY #1 ; yes...wait4280 LDA (PLAYBUF),Y4290 TAY ; Y=jiffys to wait4300 } LDA #$104310 STA CDTMF54320 LDX #04330 LDA #54340 JSR SETVBV ; start timer 54350 WAITLOOP LDA CDTMF5 ; dumdedum..}4360 BNE WAITLOOP4370 ;4380 LDA #24390 JSR INCPLAY ; inc buffer by 24400 LDA CH ; check for break4410 CMP #C}TRLC4420 BNE PLAYLOOP4430 RTS4440 ;4450 ISMIDI JSR VPUT ; otherwise send it4460 LDA #14470 JSR INCPLAY ; incr. }by 14480 LDA DONE ; finished?4490 BEQ PLAYLOOP ; no....4500 RTS ; yes..quit4510 ;4520 ;4530 ;4540 INCP}LAY4550 CLC ; increment4560 ADC PLAYBUF playbuf by A4570 STA PLAYBUF4580 LDA PLAYBUF+14590 ADC #0460}0 STA PLAYBUF+14610 ;4620 CMP ENDBUF+1 ; end of song?4630 BCC NOTEND4640 LDA PLAYBUF4650 CMP ENDBUF4660 BCC NOT}END ; no..4670 LDA #1 ; yes...4680 STA DONE set done flag4690 NOTEND RTS4700 ;4710 ;4720 ENDBUF .}BYTE 0,04730 DONE .BYTE 0,04740 ;4750 ;4760 ;4770 ;4780 ;-----------------------------4790 ; serial output ready4800 }; interrupt service routine4810 ;4820 ISEROR4830 ;4840 LDA POKMSK ; enable4850 ORA #$08 the transmit done4860 ST}A POKMSK interrupt4870 STA IRQEN4880 PLA ; pop accumulator4890 RTI4900 ;4910 ;---------------------------49}20 ; Transmit Done Interrupt4930 ;4940 ISRTD4950 LDA #$FF ;set transmit4960 STA XMTDON done flag4970 LDA POK}MSK4980 AND #$F7 ;disable tdi4990 STA POKMSK5000 STA IRQEN5010 PLA ;restore accum.5020 RTI5030 ;---}-------------------------isable tdi4990 STA POKMSK5000 STA IRQEN5010 PLA ;restore accum.5020 RTI5030 ;---EiͩkΩ͙kCopj`j {j`Hi͝Νh`}L"SAB.ORTNI:D"NURͩkΩ͙kCopj`j {j`Hi͝Νh`  +AR@CC(;This brief introduction will now appear on all issues.--(%----- }--------------------------------(rr(iFor the purpose of reading text files,a program called XR40.OBJ has been supplied. } This also has a DOC2HH(@ file called XR40.DOC which explains how to use this program.7(<mm(dXR40 can be run fr }om the menu, after pressing Y when asked if you wish to turn off Basic. When theFtt(l program starts, type D:XR40. }DOC and press return. Press the space bar to advancethrough the pages.PH(H(=Also read D:INTRO.DOC which is the ed }itorial to this disk.Z0(0(%PRESS THE START KEY TO CONTINUE......d F:B2y,@An% D:COVER.BAS } D:INTRO.BAS disk.Z0(0(%PRESS THE START KEY TO CONTINUE......d F:B2y,@An% D:COVER.BAS  ABCDMXYLOOBBA(Bh@@ @} @ S."D:MENU.SYS LOAD*IT BY KARL STIEFVATERREVISED 10/24}/85BY CLAYTON WALNUMCOPYRIGHT (C) 1985(BY ANALOG COMPUTING2 Ap<&&;@ ,;@,;@@},FA +AR@A6-F:A`,%F:Aa,$AVPk0@70@Q0}@@k0@ZG%@@d%@3%@@G%@&@Hd70}@@70@@@nd6-6-% Ap,(}R(! ӭ ISS}UE #11d-@@x1@1@@D:*.*2@27@<@,4 FA`}&&7@<@,4SYSA06-%@( 2@27@<@,4 FA`&&7@}<@,4SYSAE( A0K-@(->.-@@!K(USE