MSXMANIAp SY26V#61y}Qfpsvy !'*-69<FKORWZ]`cfknqt{~   #&).47<?BEHLORZ_bkr~      ) 1 < @ J P Y ] g t w }   " % . K g u x |   6 @ E K Y   + N Q ] i z  ! ' / 8 Z e h k q v "%/4>ADIN^oty~ !.2=PXcv%/!A(2!>(|  !"-"/#"!w#T!Q:W!GO!^#V#z( |g~w`."('ĜO{(k ʑ 4 Gŷ1xx(1,(͔+>*y, uCu+:iB(z*?#"?:>Ļ*?:?GÑ)*:>:?U<2?>*͖#ͨy,(:>=+G2>:>= 2>:>1!"P8C~#_~#W x S:<2 !w/ / !"P"R#"=>2> 2:8 ͘AUTOEXECBAT COMMAND version 1.11 $7:?(!͖W  B(?:?”+!"&?,7, "&?x(7, ~, #"&?, "&?y123rH͌!22A}>>}*Q": P> :Q8 >2Q> 2/0!"=1RͿ% .Ϳ%(' (#08 0!o~#fo(~#;(8 {S2QͿ/!' :12> !R0 }w:Q *"Q r!Rj~# x22\>j2l>j22|!~ &#~ ! #^#V### _#~ : /   !A(2!>(| !"-"/#"!w#T!QN#!T #~;8 ͒; #͒8 s#r#+! /%>2D͌*} 2*R0(!! ! %*'] !\> j:!w>(: <2526>2724:\2\ : !44:¥ :(  :=ʥ !ҥ *)[+(*%}(x:=(r!0h{}_L)))|W9! :(##*#}(3:=(-!0#{D888)))|?o`S:}!65(> }':526:= L͌r:( !75 6q  :4*5|(r :"{r:\__ͲͲi`(\!"}"#"j\!'}(( }+} rn\ !]>?#  r_NY \!]~O #~N( F # #~ .)s<2T24!">"L!\m "N]  m y2  ! @!]͕ !A_O!]O:T2S2P2U:ͧ :ͧ 2:U(rͻ !@! ͕ 2Q2R =:U;I >2Q:S(2R"# *>!!!6:U(E! V *N] (! ]T!V͕ y:2Sr $ (*N\` "N y {<*>"L r ͒+ &>2T#>j( :2<ͧ  ɯI  ~#? ~# 2S(2P:S*LR*L">!-"L!!w#*Lu%t& :Q] *>  #!"-"/2 *>)! !"[L!R '*L:S({( *LBK> +*>:R "Lu%t&R*>-R^!V"u!t"04# 4$R2R*L6!"L~<">-:(( !44*%!">!-"%"L:' <2'I I !"*>-*%R&:P !):Q I *>6(:ͧ *L6#"Lu%t&!i A *OO!) { : :0##S8QG:x B8Du8?W~# 9o84_Wu8+_~# >8  *:8{ZW+ oG͈8+oOHdͲ&H!lyP0! ~#G/(.(-7o!i " ,S *"S8AG~#: o82_~#: o8&W~k` (_A( P | 0( g-  | 0 g!͒o87(4Q00)8G:(%xG͒ x!0 2!o2!l*)h"@!h%@krO 6#W _ p#p#p#pG( ͒; #͒͛8(O#~+:y ##A8!38><~. #y͛8"( ͛(!8#(*( ?( {_>  >?6 # ͒; #͒/ #͛(8#!N(#80xOyBAVPW >  w!͒ ͈O͈8 yO y~0 ?#~#(+~a8{0 :."[]_/+=;, :\<!]= \ >?#>=dMD]Q:0"PY͆J!>-2> 2(xAO͆*"> 2> 2>-)| >a8>p2| 0  MG͆>.2> 2>:22!!xͣyͣzͣ{ͣ>0!6 / 0:p#w##!x0G!x8 R0?GɷR r! {~#}:4o&( :4=>sUC8C: )!8~'w# !;~g> O~+g(0 > }> > __DIR COPY TYPE % REN w DEL DATE TIME RENAME w ERASE PAUSE q REM VERIFY MODE BASIC RFORMAT X Insert disk with batch file and strike any key when ready $Strike a key when ready $Invalid drive specification$Bad command or file name$Program too big to fit in memory$ $ file$ bytes free$File not found$Are you sure (Y/N)? $Rename error$Invalid parameter$File cannot be copied onto itself$Content of destination lost before copy $File creation error$Write error$Insufficient disk space$ copied$Current date is $Invalid date$ Enter new date: $Current time is $Invalid time$ Enter new time: $SunMonTueWedThuFriSatCOMBATy5x5A COMDATA ?06DC4' COMMAND version 1.11 for MSX-DOS amended by Hal-F 07/30/85WORK AREAABLEDNDATCHERSA-DOS amended by Hal-F 07/30/85ELPS    (/4:Dcfs ;OTckn~)5 2Jy, uCu+:iB(z*?#"?:>Ļ*?:?GÑ)*:>:?U<2?>*͖#ͨy,(:>=+G2>:>= 2>6 MSX-DOS version 1.03 Copyright 1984 by Microsoft $1!0@:@! BRo|O!^#V#z( |g~w,(͔+>*y, uCu+:iB(z*?#"?:>Ļ*?:?GÑ)*:>:?U<2?>*͖#ͨy,(:>=+G2>:>= 2>:>! "#!"%!@~t2ê$_TTS:<2 !w/ / !"P"R#"=>2> 2:8 ͘ AUTOEXECBAT COMMAND version 1.11 $7:?(!͖W  B(?:?”+!"&?,7, "&?x(7, ~, #"&?, "&?y+mAy [2!yG(! (( ( ET̓Q_I R A2h1 ]S:(KET_N(Y 2k1 h! "!">22ͩP*K~#_~#W x *R *k[ bD( jNT!"| "~ #"i !"=[ !ͲG(kG>2y10s1  S [!! ~#F#fh27("8:O< ~O:hk:7(O[8!:< O:(o`{{ETSnTtTeTTTbTNTP=s1 hx@k{ys1 h͏@k{COMMAND COMQ5PBL+,K,S 10,M-,P-,U-,C 50 GEN80 (C) HISOFT 1987. PLEASE BUY DON'T STEAL!7!0ͼ':2=+:2?+2>+!"R+!3"+!7̈́'"**.|g"*R< T])**R̈́'"*͞%2J+2L+!%P$#͛n( *N+1 P$~g. w:4+h!S0͗$'Y '**F5> ͞%'NG(# 6 #6 6**+###> #2+,#<([,#< )F(!+",!/ͼ'!F56J$# ~#* %¿ !+~ F( 6R#6E#6L6C#6O#6M:X+2Y+w!!#n(,## '> '#**"*#>!+~a# ͔0n( >͡*+>L@*+>LF!"$+"+27+2+2+2+2C+$!+w#w++#**"*vij&~wv(x !T-͊nİ'ê*8+**#~(x8>#~a8{0 a[P+R7N#~(#(#~ +##!F56 ^l͔~ ;n> f>(DN >~ #~(#~a#~a͡f(~w#~(#6#6F 9!B-F5͢#~˿~(6 #n!m-(!f-͢6 l~#F5f^(,: >2!6+!t-0!"A+:=+!"!-!->F!'-> !1->2+ͼ'͔[P+R**F5j>^#V{(!###:8+G:+ >2( 0#~˿~(> #^#Vz%> = j>^#Vz(!^#Vz>##!6+ˎ**[P+R:6+0.O(##^#VR($O ###N#~(#(#~ +##26+O +[*R>j:5+((^ "͢!͢!h+!23#!#!N Fe**̈́' '+#~!+6S#6Y#6M2+2+2++#+#**"*͔0oN(#~#(^#V!4z%~ͧ#> ͧn  #~n( A8{0ͧ~ #~( > ͧ> > ͧ###**6#̈́' '+#:C+(O!/ͼ'!y%'*P+[*շR|!$0ͩ**ѷR|!/0ͩ!0ͼ'n(**6;v"c$6 lF5**w#:8+=(G>w#>w#!ÿ : +=(: +G>(G: + >2 +2 +F( F5!p0!V *$+#"$+!75"2+!256 #[+z%!" +"*"*"*!E5N(:+O% 01FÔ".+;(;( (*  ÍF#V%¿ 1 ++"N+!+, #> ++-!,:J+2K+! `i## +ʹ$qw w w!w"ÿ >ÿ :X+(2X+ |}+ (#~ (:>+.GH6 ~# y2@+> ++V"/Ú$>24+ "8+  ":+͛w+ +"D+# 66 !. !(z84q(.F (F "w>ڿ ~: #~+: **> w+!(Y9"* ͵0wF F9[*w**N7(MV ~ #~(#~2+#*+oS +s#r#[*s#z"+"*9>ڿ ڄ ~ʠW8F(  >ʿ W "{( f A(/ 1!7( .^ (Q >wF( /  Q f (ˆ9>F  +͐ #" +Ը ( O >ʿ y2+  (~>¿ :+2+*+"+>2+"+"+ *+[+R[+"+:+2+Å  8> w**wA# Q( A# +Y+" +>ʿ ʉ 8 0* 4 (;(͸ v" +~2 +S+!+",**627+9 (;A > ҿ ((4Alv" +?0f> ¿ ~(.**|> ÿ N>¿ *"+#"++4ͥq¿ ÄF>(~( *+6#"P+ uڮ(Cv" +f> ¿ >0v" +> ڿ e{[+|(w +>XF(~( G:+>¿ :+="+:C+<2C+ **|>ʿ 25z%**|(**~w~w*"+s#r9v" +x\ !(&np {w > ÿ S*v" +~w ST+0 e0 v" +x\ h&nC8{w F #~+ w  v" +xͯ>8vF F9Y(W8Q( ++[+R{QiIeA(~w ST+7y{zA7?z >[(e(|s(> ¿ E>ݵc >cw 0v> v¿ n>(~¿ F()~(#**B[+R!50Y$*.+> S+> v¿ F17V̫$Ö ;  @> "G> G> ( ,}<(x+> + @ *((> 4(ʿ G> (@(;( y@( (;((@( > *+:+:+*+"+#"+:+ :+(G6#"+:+ (; f -' 'f( '(6#'( (> (w#4R>ҿ VN V(^fN V @5*$+'!25~#* +|(+~ ( (#" +!F5~ ('No;(*o+:8+G.(@(q(W> z # ';^(''W> z #+W> zz ';^W> z ';(G(''F DF >v 8* +|(DMB (~#+ '; :D+( 8 '!F5~ '#ͅ > f'n N'^('n**H6R̾w#"*!5,"#5'*,#", > ^ n ' > ' (!?+5{> {{:2?+:=+=2=+:=+G> {*A+#"A+0':2=+:@+G:>+.8(O( !H6~{# (y(G'.!0~#{'':5+Gͤ͝'+6+6(#%?ʹ/8r#~ > #~08A8 { :!N #~ a7ɐ :,; +&@*!/?)$%#"'͜0H(S0828B(W0 T])8)88)8 _͜>ڿ !w08?8!͍͜)8)8)8)8ϵo0j00 ??  A8˯G~ y#~p82O0c8v~ ~8 ( =0 <(<wmR 01!*o|gx~O~#F#fhG !09~w(~#7+##~_#7wٷ~#VzzN!c*͊>ÿ !c*>w"0++. q . qd͵0.(q(:8+8x2V+**####:V+G#~(~a8{0 O #++++^#Vz(7~(~a8{0 O F "*v(="*F(#~(#""+n @ͅ;[+s#r**~w:+w~8>wf("* #~(#^#V<N>¿ F(`*P+6#6"*v("*#r+s~(:V+G~a8{0 #KV++#""+ͅ#"P+**R0**R|!>0ͩ!50Y$ѯ¿ N(^( xc {isc V>¿ Q#AA ,|o>gxp8G xp~>ÿ a i qº.ƀ"(' ,W_ #8+{( ##~ ( >\>ÿ !#(%(eT>p+[+:+͜pp/8~͜~'>^>h+͇ zh(b {0fg(| g0>¿ t>b'q(͵0W8 . ú>ÿ SHҁ̂NOԃMOĿANĦO҄XOҡEѽXЇGԾLԼO׉UGԅLԆHIGȈ|O{/_z/Wy!!((K(P | -!T7r>ҿ ~!́>¿ G(!G!|Z|!ACxb fp!ͅ2HO_x!I2H`ip|BK!80Hx( T]HpI(?(G(M().z(z(<z():H..Hp.~.~ͅ(4R!/y͠Ox͠__~Gr:H!8prptpprtrt!{_zWA({_zW:H{_zW](4( ($(ͺ:H0+;xp( r( t(\!]2H(-\ xp"SFEpx\"CFE\`i( Rp!NF#~(((>7(>"zR0BKW_ )80x Z> ÿ |(|ժDM!ʮ>)=0j 8B= ++++~NF &%ɿ[R+ zͧSR+*++:+0$os#r!"+"+"+>&o)+^#V2+"+O>~y}a|V!( *+: +O>L͏>a>a>[R+> zͧSR+**[*R8 '**w#"***|(5*T+~ ( ~ O>L**"*~#~(#^#V+ͅ~ [T+ {w zw w F(P~ @N >(>}a|a^ *2+{%z%~ 6R(6D#"2+*+##"+}w |~ 1N F(ͧ^ *2+%"2+*+#"+F>~w^!P$ !F ((F(~~O/:5+^ #h+!+ ##7"*ͭ&**",!2M+˿ :J+<=Gn(]:J+~#^( , f(+o͞%}!-/xA2&/6!/͔'͔$ ͞%:L+_͞%x2J+n(4y" /!,R ^  f F6͞%p"͜%͞%:M+!^#6 +ʹ$P$ (A;(==~# y2+++ʹ$y :+2++ !+; % 1 -y2+2++!+~ (6 !/ !|-͔'!͔'"?'n!/ė$2,2,2,2,,!\+ #<ˆ6!  x.7?%0y(>   ( +( ?%з~#a8{0 ( 80!-(#!-( #7z%{͈%Ɛ'@'O}yw#n&& &_O(('y###q#yI(~ ]#^#V!%d&+#^#V!%d& (B (+(- ~ "O(N(F F ѯ>#+W' T F S B K V D N / GC 9  C  з b Z I Hn E **"*T]!,:7+< = [,'####q#p!K*B(8S**,#'p+q !!!N#F[*R+"# *+#"+!!/Y$+#n(~ >ͧ;,#N~V+#}ƀo|g~ͼ'wͼ''~#> _͞%_͞%> !*0^V>/  ##ɀLD`x> :W_@b!*j1{ Ks"C21eɠҰĨҸlGnOJR PCPUSHŃBLIOPCALLP/ɡұĩҹC?ONSEMACR LIEQN ILSXhdkكTRERNAINCLUD`x@ɢҲĪҺMFDEF C EJNZA'SBCbB`UB LA RA( L8 ETzC7REME Sz LC o RC gSTORUTugAɣīTIҳDһADD`b C`bJNDSE XOR BITz@NEDOHALv.PHASDEPHASCOMMENZ8&b`h"d 0,fN*.Sj$(lb2b8642n`c(&$"f 8642f.,*jbd0hbd08**8*4*D*D*'d $YM 575HDE COMERR GEN GENTEMP $$$ GEN GEN GEN GEN PRN$$$ SUB+<>,?*[]_%|()/\.:= ; GENPRN MACROs PUBLICs EXTERNALs in *WARNING* Pass 1Pass 2 errors: Public Absent Symbols Command Line Format is: GEN80 [object=]source [;opts] [ ] means optional. 'opts' are: L +/- (list) M +/- (expand)P +/- (print) N (no object)T (print symbols) D (type in)S n (label length) B n (table size K)F (force 2nd pass) K (kill object)C n (comment posn) W (write PRN file)V (vir disking) Q +/- (ERR file)G n (SYM file) R +/- (REL file)U +/- (Upper case) Default: Please mount A: for Press any key (CTRL/C to abort) when ready: Symbol Table too Big!No Source File: Object File Exists...Delete(Y/N)?Disc Full!Directory Full!Please mount system disc..Bad source file!*WARNING* ORGs used: Symbol Table used: K out of K. Used all K of Symbol Table!Direct mode: At Front (Y/N)?*I GENTEMP.$$$ GEN80 2.04 Copyright (C) HiSoft 1987 HiSoft GEN80 Assembler 3 Oct 87 Page: 1Expression syntaxBad mnemonicRedefined symbolMissing )Bad commandIllegal symbolSymbol is Reserved WordMismatch of registersOut of rangeJP (IX+n), JP (IY+n) illegalBad directiveForward referenceDivision by zeroBad filenameMacro parameter stack overflowNested conditionalNested macro definitionBad ENDMToo many includesExpression too complexLabel missingBad Macro parameterIllegal digit after # or %Bad expressionIllegal indexBad dot operatorNumeric expectedRe-defined MacroIllegal for COM fileExpression must be absoluteString not terminatedIllegal DEFMError in Conditional:6{!7,#(͜%:5+26( !7ͼ'͞%7RDM2!6# Error(s) found, hit a key for editor:h+͇ zh(b {0fg(| g0>¿ t>b'*W ; MSLAVE.GEN VER 1.5 ;This program makes the CX5M a midi ;slave. DEFB 0FEH ;BINARY FILE DEFW CODSTT DEFW ENDCOD DEFW CODSTT ;This program allows eight instruments ;with unique midi channels to be played ;remotely by a synth or sequencer. ;While waiting for a midi byte it ;checks for the stop key. If the ;stop key is pressed, the program ;terminates and does a hard reboot. ;In coding this program I purposely ;chose run-speed over code-efficiency, ;which means instead of making ;loops I repeated code to make it ;run faster. PRESET EQU 8007H UVL1 EQU PRESET+648 UVL2 EQU UVL1+3111 STACK EQU 0DE76H BOTSTK EQU STACK-100H MIDB EQU BOTSTK-800H RXBUF EQU MIDB-100H TXBUF EQU RXBUF-100H IDB7BF EQU TXBUF-80H IDB6BF EQU IDB7BF-80H IDB5BF EQU IDB6BF-80H IDB4BF EQU IDB5BF-80H IDB3BF EQU IDB4BF-80H IDB2BF EQU IDB3BF-80H IDB1BF EQU IDB2BF-80H IDB0BF EQU IDB1BF-80H MSXFCB EQU IDB0BF-25H SCRARR EQU MSXFCB-300H CHARSET EQU SCRARR-400H MIDSTT EQU 3FF6H MIDDAT EQU 3FF5H IO_PPA EQU 0A8H ;PRIMARY SLOT REG IO_KBD EQU 0AAH ;KBD ROW SEL IN_KBD EQU 0A9H ;KBD READ MM_PPA EQU 0FFFFH ;secondary slot reg M_ICKA EQU MIDB+32H; AST01 EQU MIDB+3CH; ; for use when loading with BASIC ; as a binary file. So BASIC will ;know where to load it and run it. CODSTT ORG 0B090H ;INITIAL SETUP PROCEDURE JP MSINIT JP RWFILE JP MSLAVE JP SETMID JP SYSXTX JP SHOHEX JP SEARCH ;################################### ICALL DI CALL 00ABH RET ;################################### ECALL DI CALL 00B7H RET ;################################### RCALL EI CALL 0093H RET ;################################### PCALL EI LD A,0 CALL 0099H RET ;################################### SCALL EI CALL 009CH RET ;################################### MCALL EI CALL 00A5H RET ;################################### FCALL EI CALL 00B1H RET ;################################### KCALL EI CALL 0096H RET ;################################### CHKSTP ;check for stop key, return with ;zero flag set if pressed IN A,(IN_KBD) BIT 4,A RET Z AND 03H LD HL,LASKEY CP (HL) JP Z,NOCHG LD (HL),A ; IF F5 KEY ON THEN TOGGLE ; SCREEN UPDATE BIT 1,A JP NZ,CHKST0 PUSH AF LD A,(SCRUPD) CP 0C3H JP Z,CHKST1 LD A,0C3H CHKST2: LD (SCRUPD),A CALL SHOWUP POP AF JP CHKST0 CHKST1: LD A,0C9H JP CHKST2 CHKST0 BIT 0,A RET NZ LD A,(MIDIFG) CPL LD (MIDIFG),A CALL SETMID CALL SHOWMT NOCHG OR 0FFH RET ;%%%%%%%% SHOHEX: ; display space, then hex of value ; in A PUSH AF LD A,20H CALL OUTCHR POP AF PUSH AF SRL A SRL A SRL A SRL A ADD A,30H CP 3AH JP C,SHOHX1 ADD A,7 SHOHX1: CALL OUTCHR POP AF AND 0FH ADD A,30H CP 3AH JP C,SHOHX2 ADD A,7 SHOHX2: CALL OUTCHR LD A,20H CALL OUTCHR RET ;*********************************** GETPAK: ;given pointer in DE and ;first byte in A, returns 0 flag ; if midi in found stop key, ; or no carry if invalid packet. ; else carry = 1 ; puts count in C, checksum in B ; get count bytes LD C,A PUSH BC PUSH DE CALL MIDIIN POP DE POP BC RET Z ;combine them SLA A RR C RR A LD C,A LD B,0 GETPK0: PUSH DE PUSH BC CALL MIDIIN POP BC POP DE RET Z LD L,A ADD A,B LD B,A PUSH DE PUSH BC PUSH HL CALL MIDIIN POP HL POP BC POP DE RET Z PUSH AF ADD A,B LD B,A POP AF SLA A SLA A SLA A SLA A OR L ; store at pointer and increment LD (DE),A INC DE ; decrement count DEC C DEC C JP NZ,GETPK0 ; get checksum PUSH DE PUSH BC CALL MIDIIN POP BC POP DE RET Z ADD A,B AND 07FH OR A JP Z,PAKOK ;return not zero and no carry LD A,01H INC A RET ;return not zero and carry PAKOK: LD A,0FFH ADD A,2 RET ;******************************* ; get configuration data dump GETFIG: CALL MIDIIN JP Z,NOMORE LD DE,8000H JP GETVB0 ;*********************************** GETVBK: ; receive sys ex dump of voice bank CALL MIDIIN JP Z,NOMORE ; if bank number too high then ; return CP 2 JP NC,F7ERR; LD (BANKNM),A ; pointer for data in DE LD DE,UVL1 OR A JP Z,GETVB0 LD DE,UVL2 GETVB0: PUSH DE CALL MIDIIN POP DE JP Z,NOMORE CP 0F7H JP Z,SSXDON CALL GETPAK ; returns with de to next place ; if z then stop key pressed ; if carry then error JP Z,NOMORE JP NC,SUMERR JP GETVB0 SSXDON: LD A,(BANKNM) LD HL,UVL1 LD BC,8 LD DE,FCB1+6 OR A JP Z,SSXMV LD HL,UVL2 LD DE,FCB2+6 DEC A JP NZ,SSXEND SSXMV: LDIR SSXEND: CALL MKSCRN LD HL,REDLIT CALL OUTSTR JP GETSTAT ;################################### CVRTVC ; Given voice number 1-96 in C ; converts it to 64-112 and ; defines one of two voice banks. ; Returns converted value in A ; If voice >= 49 LD A,C CP 49 JP C,CVERT0 ;then PUSH BC ; define uvl 2 CALL DFUVL2 POP BC ; voice = voice + 15 LD A,C ADD A,15 RET CVERT0 ;else PUSH BC ; define uvl 1 CALL DFUVL1 POP BC ; voice = voice + 63 LD A,C ADD A,63 RET ;################################### INIUVL ; copies system voices to uvl ; do x= 1 to 48 LD B,0 LD DE,IDB0BF LD A,0 CALL SCALL LD E,48 INIU0 PUSH DE LD A,E DEC A LD C,A ;VOICE # LD B,0 ;IDB0 USED PUSH BC LD A,15H ;GETVOICE CALL SCALL POP BC LD A,C ADD A,64 ;VOICE = VOICE + 64 LD C,A LD A,16H ;PUT VOICE CALL SCALL POP DE DEC E JP NZ,INIU0 RET ;################################### SETVOC ; Given IDB number in B, voice in C, ; velocity in A, ; and pointer to IDB in DE ; initialize queue, and load voice. ; Define the IDB PUSH AF PUSH BC PUSH DE LD A,0 CALL SCALL POP DE POP BC ; Assign IDB to queue PUSH BC LD A,B OR 80H LD D,A LD A,0AH LD E,0 CALL SCALL POP BC ; Get and load voice PUSH BC CALL CVRTVC ;CONVERT VOICE POP BC LD C,A PUSH BC LD A,19H CALL SCALL POP BC ; Set volume POP AF LD C,A LD A,13H CALL SCALL RET ;################################## DFUVL1 ;defines uvl to uvl1 LD A,03H LD DE,UVL1 CALL SCALL RET ;################################## DFUVL2 ;defines uvl to uvl2 LD A,03H LD DE,UVL2 CALL SCALL RET ;$$$$$$$$$ SEARCH: ; find slot containing fm synth. ; put original slot settings in ; PRISLT and SECSLT, and put ; settings for sfg05 in NEWPRI ; and NEWSEC.HANG IF NOT FOUND. DI IN A,(IO_PPA) LD (PRISLT),A AND 0FCH LD C,A LD B,4 ; do while pcount <> 0 SRCHL1: LD A,C ; set to new slot OUT (IO_PPA),A ; get secondary setting LD A,(MM_PPA) CPL LD (SECSLT),A AND 0FCH LD E,A LD D,4 ; do while scount <> 0 SRCHL2: LD A,E ; set for new slot LD (MM_PPA),A ; look for string PUSH BC PUSH DE LD HL,FMNAME LD DE,80H LD B,6 CMPR: LD A,(DE) CP (HL) JP NZ,NOTFND INC HL INC DE DEC B JP NZ,CMPR ; when match found, put results ; away and restore to original ; slot settings. FOUND: POP DE POP BC LD A,C LD (NEWPRI),A LD A,E LD (NEWSEC),A LD A,(SECSLT) LD (MM_PPA),A LD A,(PRISLT) OUT (IO_PPA),A EI RET NOTFND: POP DE POP BC LD A,(SECSLT) LD (MM_PPA),A INC E DEC D JP NZ,SRCHL2 LD A,(PRISLT) OUT (IO_PPA),A INC C DEC B JP NZ,SRCHL1 HANG: JP HANG FMNAME: DEFM "MCHFM0" ;################################## SUBINI: ;Set memory page,mbios mode and ;midb location DI ;save original setting of primary ;slot selector IN A,(IO_PPA) LD (PRISLT),A ;set to slot 3 for low page LD A,(NEWPRI) OUT (IO_PPA),A ;save original setting of secondary ;slot selector LD A,(MM_PPA) CPL LD (SECSLT),A ;set to slot 3 for low page LD A,(NEWSEC) LD (MM_PPA),A ;Set mode 2.0 init LD DE,MIDB CALL ICALL ; disable clock B - not used LD C,01H LD A,0DH CALL SCALL RET ;********************************** MSLVXT: ; exit mslave. call e-call,set ;page = 0 and return. CALL ECALL LD A,(SECSLT) LD (MM_PPA),A LD A,(PRISLT) OUT (IO_PPA),A RET ;********************************** MSINIT CALL SUBINI ;Define user voice buffer CALL DFUVL1 ;Initialize to system voices CALL INIUVL CALL DFUVL2 CALL INIUVL CALL MSLVXT RET ;********************************** RWFILE: ;given ptr to FCB in HL, and ;0 for read, 01h for write file ; If filename starts with space ; then just ; initialize with mbios voices PUSH HL ; copy file name to oldnam to save LD DE,6 ADD HL,DE LD DE,OLDNAM LD BC,8 LDIR CALL SUBINI LD HL,LOADMS CALL OUTSTR POP HL PUSH HL LD DE,17 ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD A,03H ;DEF UVL CALL SCALL POP HL PUSH HL LD DE,6 ADD HL,DE LD A,(HL) CP 20H POP DE JP NZ,RWFIL1 CALL INIUVL JP RWFILX RWFIL1: PUSH DE ;save fcb ptr LD A,20H CALL SCALL POP HL JP C,RWFILQ ; restore name PUSH HL LD DE,6 ADD HL,DE EX DE,HL LD HL,OLDNAM LD BC,8 LDIR POP HL INC HL ;get device code LD A,(HL) DEC HL OR A ; if code = 0 for cassette ; then repeat JP NZ,RWFILX PUSH HL CALL CPNAME POP HL ; if ok then done JP NZ,RWFILQ ;else ignore difference RWFILX: CALL MSLVXT RET RWFILQ: CALL MSLVXT LD C,"?" CALL FILERR RET ;@@@@@@@@@@@@@@@@@@@@@@@@@@@ CPNAME: ;given FCB ptr in HL, compare ; name in FCb with name in UVL ; return 0 if the same, else NZ PUSH HL ;get uvl ptr LD DE,17 ADD HL,DE LD E,(HL) INC HL LD D,(HL) POP HL PUSH DE LD DE,6 ADD HL,DE POP DE LD C,8 CPNAM0: LD A,(DE) CP (HL) RET NZ INC HL INC DE DEC C JP NZ,CPNAM0 RET ;&&&&&&&&&&&&&&&&&&&&&&&&&&&& SHOUT: ; shows midi data being sent ; and sends it PUSH AF CALL SHOHEX POP AF CALL MIDOUT RET ;%%%%%%%%%%%%%%%%%%%%%%%%%%%% SYSXTX: ; given filenumber 0-2 in C ; puts pointer in DE ; and block size in HL ; sends block out via midi sys-ex ; transmit PUSH BC CALL SUBINI ; set to no midi thru ; and check transmit LD HL,MIDI05 LD (MIDIXX+1),HL LD HL,MIDI08 LD (MIDI04+1),HL ; init midi for transmit only LD A,05H LD BC,TXBUF LD DE,0 CALL SCALL ; initialize buffers LD HL,0 LD (BUFIFL),HL LD (BUFOFL),HL ; set midi vector DI LD HL,MIDINT LD (0F975H),HL EI ; send header LD BC,0101H CALL SETCRS LD A,0F0H CALL SHOUT LD A,43H CALL SHOUT LD A,75H CALL SHOUT LD A,(SYSCHN) CALL SHOUT XOR A CALL SHOUT POP BC LD B,0; next byte to send LD DE,UVL1 LD HL,3104 LD A,C OR A JP Z,SYSXT0 LD DE,UVL2 LD A,C DEC A JP Z,SYSXT0 LD DE,8000H LD HL,CLS-8000H; end of data LD BC,0400H SYSXT0: PUSH HL PUSH DE PUSH BC LD A,B CALL SHOUT POP BC LD A,C CALL SHOUT POP DE POP HL ; now send packets ; do while block count (hl) > 0 DO1: LD A,H OR L JP Z,ENDO1 ; if hl > 64 LD A,H OR A JP NZ,THEN LD A,L CP 65 JP C,ELSE ; then count = 64 THEN: LD B,64 JP ENDIF ; else count = hl ELSE: LD B,L ENDIF: LD A,B SLA A; packetCOUNT * 2 PUSH BC PUSH DE PUSH HL CALL SNDCNT POP HL POP DE POP BC ; init checksum LD C,0; ; do while packetcount > 0 DO2: LD A,B OR A JP Z,ENDO2 ; get low half of byte LD A,(DE) AND 0FH PUSH AF ; add to checksum ADD A,C LD C,A POP AF PUSH BC PUSH DE PUSH HL ; send low half CALL SHOUT POP HL POP DE POP BC LD A,(DE) ; get high half SRL A SRL A SRL A SRL A AND 0FH PUSH AF ; add to checksum ADD A,C LD C,A POP AF PUSH BC PUSH DE PUSH HL ; send high half CALL SHOUT POP HL POP DE POP BC ; dec block count, packet count ; inc pointer DEC HL DEC B INC DE JP DO2 ; end ENDO2: ; send checksum LD A,C CPL INC A AND 7FH PUSH BC PUSH DE PUSH HL CALL SHOUT POP HL POP DE POP BC ; end JP DO1 ENDO1: LD A,0F7H CALL SHOUT WAIT: LD HL,(BUFOFL) LD A,H CP L JP NZ,WAIT CALL MSLVXT CALL MKSCRN RET ;%%%%%%%%%%%%%%%%%%%%%%%%%%%% SNDCNT: ; given count in A ; sends it as two bytes 7 bits each LD C,A XOR A BIT 7,C JP Z,SNDCN2 LD A,01H SNDCN2: PUSH BC CALL SHOUT POP BC LD A,C AND 07FH CALL SHOUT RET ;&&&&&&&&&&&&&&&&&&&&&&&&&&&& INITMD: ;Init scan for STOP key IN A,(IO_KBD) AND 0F0H OR 07H OUT (IO_KBD),A ; setup hook for clock-A handler ; for portamento and pitchbend and ; detune LD HL,IRQA LD (M_ICKA),HL ;set vector for midithru or not CALL SETMID ;set vector for interrupt driven ;midi transmit CALL SETTX ; setup midi interrupt vector ; and init circular buffers LD HL,0 LD (BUFIFL),HL LD (BUFOFL),HL ;Init FIFO'S LD BC,TXBUF PUSH BC CALL ISYKON POP BC JP NZ, FIF1 LD BC,0 FIF1: LD A,05H LD DE,RXBUF CALL SCALL DI LD HL,MIDINT LD (0F975H),HL EI RET ;################################# SETMID: ; depending upon midifg, set ; midi vector ; default is no midi thru LD HL,MIDI05 LD A,(MIDIFG) OR A JP Z,SETVEC ; set to midi thru LD HL,MIDI02 SETVEC: LD (MIDIXX+1),HL RET ;############## SETTX: ; default is no transmit LD HL,MIDI07 PUSH HL CALL ISYKON POP HL JP Z,SETTX1 ; set for midi transmit check LD HL,MIDI08 SETTX1: LD (MIDI04+1),HL RET ;*********************************** OTHRIN: ;other initialization ;Init voices from VOICES table ; LD DE,IDB0BF LD B,0 LD A,(VOICES) LD C,A LD A,(VELTBL) CALL SETVOC LD HL,(DETUNE) LD (IDB0BF+3),HL LD DE,IDB1BF LD B,1 LD A,(VOICES+1) LD C,A LD A,(VELTBL+1) CALL SETVOC LD HL,(DETUNE+2) LD (IDB1BF+3),HL LD DE,IDB2BF LD B,2 LD A,(VOICES+2) LD C,A LD A,(VELTBL+2) CALL SETVOC LD HL,(DETUNE+4) LD (IDB2BF+3),HL LD DE,IDB3BF LD B,3 LD A,(VOICES+3) LD C,A LD A,(VELTBL+3) CALL SETVOC LD HL,(DETUNE+6) LD (IDB3BF+3),HL LD DE,IDB4BF LD B,4 LD A,(VOICES+4) LD C,A LD A,(VELTBL+4) CALL SETVOC LD HL,(DETUNE+8) LD (IDB4BF+3),HL LD DE,IDB5BF LD B,5 LD A,(VOICES+5) LD C,A LD A,(VELTBL+5) CALL SETVOC LD HL,(DETUNE+10) LD (IDB5BF+3),HL LD DE,IDB6BF LD B,6 LD A,(VOICES+6) LD C,A LD A,(VELTBL+6) CALL SETVOC LD HL,(DETUNE+12) LD (IDB6BF+3),HL LD DE,IDB7BF LD B,7 LD A,(VOICES+7) LD C,A LD A,(VELTBL+7) CALL SETVOC LD HL,(DETUNE+14) LD (IDB7BF+3),HL ; ;Assign fm channels to IDB'S LD A,(ALLOC) LD B,A LD A,(ALLOC+1) LD C,A LD A,(ALLOC+2) LD D,A LD A,(ALLOC+3) LD E,A LD A,09H CALL SCALL ; set up MIDIUS table. ; for x = 0 to 7 ; if poly(x) = 0 ; then midius (x) = 0ffh ; play routines use midius LD BC,8 OTHR01: LD HL,POLY ADD HL,BC DEC HL LD A,(HL) OR A LD A,0FFH JP Z,OTHR02 LD HL,MIDITB ADD HL,BC DEC HL LD A,(HL) OTHR02: LD HL,MIDIUS ADD HL,BC DEC HL LD (HL),A DEC C JP NZ,OTHR01 ; init YK keyboard LD HL,MKIDBS LD B,8 INITY0: LD A,(HL) OR A JP NZ,INITYK INC HL DEC B JP NZ,INITY0 JP OTHRX INITYK: LD HL,MKIN LD (AST01),HL LD HL,MIDII0 LD (MIDIIN+1),HL LD A,0 LD BC,0 LD D,0A0H; default vel. CALL KCALL OTHRX: CALL INITSU CALL INITPO CALL STERIO RET ;END OF INIT ;***** INITSU: ; initialize sustain on/off ;set IDB to sustain LD HL,SUSTDAT LD BC,1 INSU01: LD A,(HL) OR A JP Z,INSU00 PUSH BC PUSH HL LD A,12H CALL SCALL POP HL POP BC INSU00: INC HL INC B LD A,B CP 8 RET Z JP INSU01 ;***** STERIO: ; initialize stereo LD HL,STEREO LD B,0 STERI0: LD C,(HL) PUSH BC PUSH HL LD A,17H CALL SCALL POP HL POP BC INC HL INC B LD A,B CP 8 RET Z JP STERI0 ;***** INITPO: ; if portamento on turns ; it on by loading idbx+5 ; with clock speed LD BC,0 LD DE,IDB0BF+5 INITP1: LD HL,PORTON ADD HL,BC LD A,(HL) OR A JP Z,INPO0 LD HL,PORTCK ADD HL,BC LD A,(HL) LD (DE),A INPO0: INC BC LD A,C CP 8 RET Z LD HL,128 ADD HL,DE EX DE,HL JP INITP1 ;############ MIDOUT: ;send char in A to txbuf LD C,A LD HL,(BUFOFL) LD A,L INC A CP H JP Z,MIDOUT LD HL,TXBUF LD E,A LD D,0 ADD HL,DE LD (HL),C LD (BUFOFL),A LD A,(0F9A5H) SET 1,A LD (0F9A5H),A LD (MIDSTT),A RET ;################################### ;MIDIIN ; Poll for midi byte. returning ; it in A and D ; If stop key pressed,issue all ; note off and abort program. MIDIIN: JP MIDII1 MIDII0: LD A,01H CALL KCALL MIDII1: ;If stop key pressed CALL CHKSTP ;then RET Z else POLL: LD HL,(BUFIFL) LD A,L SUB H JP Z,MIDIIN LD A,H INC A LD (BUFIEM),A LD E,A LD D,0 LD HL,RXBUF ADD HL,DE LD A,(HL) CP 0FCH RET NZ LD A,0 CALL RCALL JP MIDIIN ;########## CVOPM: ;given OPM FORMAT ;event in DE, fills STAT ;and MINOTE for midi equivalent LD B,80H LD A,D BIT 7,A JP Z,CVOP1 LD B,90H CVOP1: LD A,B LD (STAT),A LD HL,0691H LD B,0 LD C,D RES 7,C ADD HL,BC LD A,(HL) LD (MINOTE),A RET ;################################### PLAYIT: ; DE contains note and veloc ; convert to opm event format LD A,(MIDICH) OR 90H LD C,A CALL 0C0H LD A,C AND 0FH LD C,A LD HL,0 ; LD A,(MIDIUS) CP C JP NZ,PLAY01 PUSH BC LD B,0 CALL PUTINQ POP BC SET 0,L PLAY01: LD A,(MIDIUS+1) CP C JP NZ,PLAY02 PUSH BC LD B,1 CALL PUTINQ POP BC SET 1,L PLAY02: LD A,(MIDIUS+2) CP C JP NZ,PLAY03 PUSH BC LD B,2 CALL PUTINQ POP BC SET 2,L PLAY03: LD A,(MIDIUS+3) CP C JP NZ,PLAY04 PUSH BC LD B,3 CALL PUTINQ POP BC SET 3,L PLAY04: LD A,(MIDIUS+4) CP C JP NZ,PLAY05 PUSH BC LD B,4 CALL PUTINQ POP BC SET 4,L PLAY05 LD A,(MIDIUS+5) CP C JP NZ,PLAY06 PUSH BC LD B,5 CALL PUTINQ POP BC SET 5,L PLAY06 LD A,(MIDIUS+6) CP C JP NZ,PLAY07 PUSH BC LD B,6 CALL PUTINQ POP BC SET 6,L PLAY07: LD A,(MIDIUS+7) CP C JP NZ,ENDPL PUSH HL ;Put in queue LD B,7 ;IDB# CALL QWRIT POP HL SET 7,L ;END DO forever ENDPL: ;play EX DE,HL CALL PCALL RET ;############################ CHGVOC: ; given midi channel in B ; and patch in C LD A,(MIDIUS) CP B JP NZ,OFF1 ;** PUSH BC ; issue note off to queue LD A,01H LD B,0 ;** CALL RCALL ; get/load voice POP BC PUSH BC LD B,0 ;** LD A,19H CALL SCALL LD A,(PATCH) LD (VOICES),A LD A,0 CALL SCRUPD POP BC OFF1: LD A,(MIDIUS+1) CP B JP NZ,OFF2 ;** PUSH BC ; issue note off to queue LD A,01H LD B,1 ;** CALL RCALL ; get/load voice POP BC PUSH BC LD B,1 ;** LD A,19H CALL SCALL LD A,(PATCH) LD (VOICES+1),A LD A,1 CALL SCRUPD POP BC OFF2: LD A,(MIDIUS+2) CP B JP NZ,OFF3 ;** PUSH BC ; issue note off to queue LD A,01H LD B,2 ;** CALL RCALL ; get/load voice POP BC PUSH BC LD B,2 ;** LD A,19H CALL SCALL LD A,(PATCH) LD (VOICES+2),A LD A,2 CALL SCRUPD POP BC OFF3: LD A,(MIDIUS+3) CP B JP NZ,OFF4 ;** PUSH BC ; issue note off to queue LD A,01H LD B,3 ;** CALL RCALL ; get/load voice POP BC PUSH BC LD B,3 ;** LD A,19H CALL SCALL LD A,(PATCH) LD (VOICES+3),A LD A,3 CALL SCRUPD POP BC OFF4: LD A,(MIDIUS+4) CP B JP NZ,OFF5 ;** PUSH BC ; issue note off to queue LD A,01H LD B,4 ;** CALL RCALL ; get/load voice POP BC PUSH BC LD B,4 ;** LD A,19H CALL SCALL LD A,(PATCH) LD (VOICES+4),A LD A,4 CALL SCRUPD POP BC OFF5: LD A,(MIDIUS+5) CP B JP NZ,OFF6 ;** PUSH BC ; issue note off to queue LD A,01H LD B,5 ;** CALL RCALL ; get/load voice POP BC PUSH BC LD B,5 ;** LD A,19H CALL SCALL LD A,(PATCH) LD (VOICES+5),A LD A,5 CALL SCRUPD POP BC OFF6: LD A,(MIDIUS+6) CP B JP NZ,OFF7 ;** PUSH BC ; issue note off to queue LD A,01H LD B,6 ;** CALL RCALL ; get/load voice POP BC PUSH BC LD B,6 ;** LD A,19H CALL SCALL LD A,(PATCH) LD (VOICES+6),A LD A,6 CALL SCRUPD POP BC OFF7: LD A,(MIDIUS+7) CP B JP NZ,OFF8 ;** PUSH BC ; issue note off to queue LD A,01H LD B,7 ;** CALL RCALL ; get/load voice POP BC PUSH BC LD B,7 ;** LD A,19H CALL SCALL LD A,(PATCH) LD (VOICES+7),A LD A,7 CALL SCRUPD POP BC OFF8: RET ;############################ ;NOTOFF ; Given midi channel ; in B,turns off all IDB's ; for that channel NOTOFF:: LD A,(MIDIUS);** CP B JP NZ,NOFF1;** PUSH BC ; issue note off to queue LD A,01H LD B,0 ;** CALL RCALL POP BC NOFF1: LD A,(MIDIUS+1);** CP B JP NZ,NOFF2;** PUSH BC ; issue note off to queue LD A,01H LD B,1 ;** CALL RCALL POP BC NOFF2: LD A,(MIDIUS+2);** CP B JP NZ,NOFF3;** PUSH BC ; issue note off to queue LD A,01H LD B,2 ;** CALL RCALL POP BC NOFF3: LD A,(MIDIUS+3);** CP B JP NZ,NOFF4;** PUSH BC ; issue note off to queue LD A,01H LD B,3 ;** CALL RCALL POP BC NOFF4: LD A,(MIDIUS+4);** CP B JP NZ,NOFF5;** PUSH BC ; issue note off to queue LD A,01H LD B,4 ;** CALL RCALL POP BC NOFF5: LD A,(MIDIUS+5);** CP B JP NZ,NOFF6;** PUSH BC ; issue note off to queue LD A,01H LD B,5 ;** CALL RCALL POP BC NOFF6: LD A,(MIDIUS+6);** CP B JP NZ,NOFF7;** PUSH BC ; issue note off to queue LD A,01H LD B,6 ;** CALL RCALL POP BC NOFF7: LD A,(MIDIUS+7);** CP B JP NZ,NOFF8;** ; issue note off to queue LD A,01H LD B,7 ;** CALL RCALL NOFF8: RET ;########################### PORT: ; given midi channel in B ; if portamento off turns ; it on by loading idbx+5 ; with clock speed, else ; turns it off by loading ; clock speed of 0 LD A,(MIDIUS) CP B JP NZ,PORT1 LD A,(IDB0BF+5) OR A LD A,(PORTCK) JP Z,P0SET XOR A P0SET: LD (IDB0BF+5),A PORT1: LD A,(MIDIUS+1) CP B JP NZ,PORT2 LD A,(IDB1BF+5) OR A LD A,(PORTCK+1) JP Z,P1SET XOR A P1SET: LD (IDB1BF+5),A PORT2: LD A,(MIDIUS+2) CP B JP NZ,PORT3 LD A,(IDB2BF+5) OR A LD A,(PORTCK+2) JP Z,P2SET XOR A P2SET: LD (IDB2BF+5),A PORT3: LD A,(MIDIUS+3) CP B JP NZ,PORT4 LD A,(IDB3BF+5) OR A LD A,(PORTCK+3) JP Z,P3SET XOR A P3SET: LD (IDB3BF+5),A PORT4: LD A,(MIDIUS+4) CP B JP NZ,PORT5 LD A,(IDB4BF+5) OR A LD A,(PORTCK+4) JP Z,P4SET XOR A P4SET: LD (IDB4BF+5),A PORT5: LD A,(MIDIUS+5) CP B JP NZ,PORT6 LD A,(IDB5BF+5) OR A LD A,(PORTCK+5) JP Z,P5SET XOR A P5SET: LD (IDB5BF+5),A PORT6: LD A,(MIDIUS+6) CP B JP NZ,PORT7 LD A,(IDB6BF+5) OR A LD A,(PORTCK+6) JP Z,P6SET XOR A P6SET: LD (IDB6BF+5),A PORT7: LD A,(MIDIUS+7) CP B JP NZ,PORT8 LD A,(IDB7BF+5) OR A LD A,(PORTCK+7) JP Z,P7SET XOR A P7SET: LD (IDB7BF+5),A PORT8: RET ;########################### PCLK: ; given midi channel in B ; and clock speed in c ; sets portamento clock ; (PORTCK) PCLK0: LD A,(MIDIUS) CP B JP NZ,PCLK1 LD A,C LD (PORTCK),A LD A,(IDB0BF+5) OR A JP Z,PCLK1 LD A,C LD (IDB0BF+5),A PCLK1: LD A,(MIDIUS + 1) CP B JP NZ,PCLK2 LD A,C LD (PORTCK+1),A LD A,(IDB1BF+5) OR A JP Z,PCLK2 LD A,C LD (IDB1BF+5),A PCLK2: LD A,(MIDIUS + 2) CP B JP NZ,PCLK3 LD A,C LD (PORTCK+2),A LD A,(IDB2BF+5) OR A JP Z,PCLK3 LD A,C LD (IDB2BF+5),A PCLK3: LD A,(MIDIUS + 3) CP B JP NZ,PCLK4 LD A,C LD (PORTCK+3),A LD A,(IDB3BF+5) OR A JP Z,PCLK4 LD A,C LD (IDB3BF+5),A PCLK4: LD A,(MIDIUS + 4) CP B JP NZ,PCLK5 LD A,C LD (PORTCK+4),A LD A,(IDB4BF+5) OR A JP Z,PCLK5 LD A,C LD (IDB4BF+5),A PCLK5: LD A,(MIDIUS + 5) CP B JP NZ,PCLK6 LD A,C LD (PORTCK+5),A LD A,(IDB5BF+5) OR A JP Z,PCLK6 LD A,C LD (IDB5BF+5),A PCLK6: LD A,(MIDIUS + 6) CP B JP NZ,PCLK7 LD A,C LD (PORTCK+6),A LD A,(IDB6BF+5) OR A JP Z,PCLK7 LD A,C LD (IDB6BF+5),A PCLK7: LD A,(MIDIUS + 7) CP B JP NZ,PCLK8 LD A,C LD (PORTCK+7),A LD A,(IDB7BF+5) OR A JP Z,PCLK8 LD A,C LD (IDB7BF+5),A PCLK8 RET ;########################### PITBND: ; given midi channel in B ; and pitch bend value in HL ; using only seven bits of ; each ; sets pitchbend into any ; IDB with that midi channel. ; normalize from 40,00 to 0100 LD A,(PITSHT) SLA L NORM: SRL H RR L DEC A JP NZ,NORM LD DE,(PITOFF) ; now subtract to get +/- ADD HL,DE EX DE,HL LD A,(MIDIUS) CP B JP NZ,PITB1 LD HL,(DETUNE) ADD HL,DE LD (IDB0BF+3),HL PITB1: LD A,(MIDIUS+1) CP B JP NZ,PITB2 LD HL,(DETUNE+2) ADD HL,DE LD (IDB1BF+3),HL PITB2: LD A,(MIDIUS+2) CP B JP NZ,PITB3 LD HL,(DETUNE+4) ADD HL,DE LD (IDB2BF+3),HL PITB3: LD A,(MIDIUS+3) CP B JP NZ,PITB4 LD HL,(DETUNE+6) ADD HL,DE LD (IDB3BF+3),HL PITB4: LD A,(MIDIUS+4) CP B JP NZ,PITB5 LD HL,(DETUNE+8) ADD HL,DE LD (IDB4BF+3),HL PITB5: LD A,(MIDIUS+5) CP B JP NZ,PITB6 LD HL,(DETUNE+10) ADD HL,DE LD (IDB5BF+3),HL PITB6: LD A,(MIDIUS+6) CP B JP NZ,PITB7 LD HL,(DETUNE+12) ADD HL,DE LD (IDB6BF+3),HL PITB7: LD A,(MIDIUS+7) CP B JP NZ,PITB8 LD HL,(DETUNE+14) ADD HL,DE LD (IDB7BF+3),HL PITB8: RET ;########################### ;SUSTAI ; Given midi channel ; in B, and on/off in C ; sets all IDB's ; for that channel sustain ; on or off depending on veloc SUSTAI: LD A,C CP 0 JP Z,SUST0 LD C,01 ;*********************************** SUST0: LD A,(MIDIUS) CP B JP NZ,SUSTY1 ;** PUSH BC ;set IDB to sustain LD B,0H ;** LD A,12H CALL SCALL POP BC SUSTY1: LD A,(MIDIUS+1) CP B JP NZ,SUSTY2 ;** PUSH BC ;set IDB to sustain LD B,01H;** LD A,12H CALL SCALL POP BC SUSTY2: LD A,(MIDIUS+2) CP B JP NZ,SUSTY3 ;** PUSH BC ;set IDB to sustain LD B,02H;** LD A,12H CALL SCALL POP BC SUSTY3: LD A,(MIDIUS+3) CP B JP NZ,SUSTY4 ;** PUSH BC ;set IDB to sustain LD B,03H;** LD A,12H CALL SCALL POP BC SUSTY4: LD A,(MIDIUS+4) CP B JP NZ,SUSTY5 ;** PUSH BC ;set IDB to sustain LD B,04H;** LD A,12H CALL SCALL POP BC SUSTY5: LD A,(MIDIUS+5) CP B JP NZ,SUSTY6 ;** PUSH BC ;set IDB to sustain LD B,05H;** LD A,12H CALL SCALL POP BC SUSTY6: LD A,(MIDIUS+6) CP B JP NZ,SUSTY7 ;** PUSH BC ;set IDB to sustain LD B,06H;** LD A,12H CALL SCALL POP BC SUSTY7: LD A,(MIDIUS+7) CP B JP NZ,SUSTY8 ;** ;set IDB to sustain LD B,07H ;** LD A,12H CALL SCALL SUSTY8: RET ;########################### ; ; ;VOLUME ; Given midi channel ; in B, and volume in C ; sets volume for ; all IDB's for that channel VOLUME: LD A,(MIDIUS) CP B JP NZ,VOLU1 ;** PUSH BC ;set IDB volume LD B,0H ;** LD A,13H CALL SCALL POP BC ; LD A,C ; LD (VELTBL),A VOLU1: LD A,(MIDIUS+1) CP B JP NZ,VOLU2 ;** PUSH BC ;set IDB volume LD B,01H;** LD A,13H CALL SCALL POP BC ; LD A,C ; LD (VELTBL+1),A VOLU2: LD A,(MIDIUS+2) CP B JP NZ,VOLU3 ;** PUSH BC ;set IDB volume LD B,02H;** LD A,13H CALL SCALL POP BC ; LD A,C ; LD (VELTBL+2),A VOLU3: LD A,(MIDIUS+3) CP B JP NZ,VOLU4 ;** PUSH BC ;set IDB volume LD B,03H;** LD A,13H CALL SCALL POP BC ; LD A,C ; LD (VELTBL+3),A VOLU4: LD A,(MIDIUS+4) CP B JP NZ,VOLU5 ;** PUSH BC ;set IDB volume LD B,04H;** LD A,13H CALL SCALL POP BC ; LD A,C ; LD (VELTBL+4),A VOLU5: LD A,(MIDIUS+5) CP B JP NZ,VOLU6 ;** PUSH BC ;set IDB volume LD B,05H;** LD A,13H CALL SCALL POP BC ; LD A,C ; LD (VELTBL+5),A VOLU6: LD A,(MIDIUS+6) CP B JP NZ,VOLU7 ;** PUSH BC ;set IDB volume LD B,06H;** LD A,13H CALL SCALL ; LD A,C ; LD (VELTBL+6),A POP BC VOLU7: LD A,(MIDIUS+7) CP B JP NZ,VOLU8 ;** ;set IDB volume ; LD A,C ; LD (VELTBL+7),A LD B,07H ;** LD A,13H CALL SCALL VOLU8: RET ;########################### ; ;PANLRS ; Given midi channel ; in B, and stereo in C ; sets it for ; all IDB's for that channel PANLRS: LD A,(MIDIUS) CP B JP NZ,PANLR1 ;** PUSH BC ;set IDB stereo l/r LD B,0H ;** LD A,17H CALL SCALL POP BC PANLR1: LD A,(MIDIUS+1) CP B JP NZ,PANLR2 ;** PUSH BC ;set IDB stereo l/r LD B,01H;** LD A,17H CALL SCALL POP BC PANLR2: LD A,(MIDIUS+2) CP B JP NZ,PANLR3 ;** PUSH BC ;set IDB stereo l/r LD B,02H;** LD A,17H CALL SCALL POP BC PANLR3: LD A,(MIDIUS+3) CP B JP NZ,PANLR4 ;** PUSH BC ;set IDB stereo l/r LD B,03H;** LD A,17H CALL SCALL POP BC PANLR4: LD A,(MIDIUS+4) CP B JP NZ,PANLR5 ;** PUSH BC ;set IDB stereo l/r LD B,04H;** LD A,17H CALL SCALL POP BC PANLR5: LD A,(MIDIUS+5) CP B JP NZ,PANLR6 ;** PUSH BC ;set IDB stereo l/r LD B,05H;** LD A,17H CALL SCALL POP BC PANLR6: LD A,(MIDIUS+6) CP B JP NZ,PANLR7 ;** PUSH BC ;set IDB stereo l/r LD B,06H;** LD A,17H CALL SCALL POP BC PANLR7: LD A,(MIDIUS+7) CP B JP NZ,PANLR8 ;** ;set IDB stereo l/r LD B,07H ;** LD A,17H CALL SCALL PANLR8: RET ;########################### ; ;AMSPMS ; Given midi channel ; in B, and pms/ams in C ; sets it for ; all IDB's for that channel AMSPMS: LD A,(MIDIUS) CP B JP NZ,AMSPM1 ;** PUSH BC ;set IDB amspms LD B,0H ;** LD A,18H CALL SCALL POP BC AMSPM1: LD A,(MIDIUS+1) CP B JP NZ,AMSPM2 ;** PUSH BC ;set IDB amspms LD B,01H;** LD A,18H CALL SCALL POP BC AMSPM2: LD A,(MIDIUS+2) CP B JP NZ,AMSPM3 ;** PUSH BC ;set IDB amspms LD B,02H;** LD A,18H CALL SCALL POP BC AMSPM3: LD A,(MIDIUS+3) CP B JP NZ,AMSPM4 ;** PUSH BC ;set IDB amspms LD B,03H;** LD A,18H CALL SCALL POP BC AMSPM4: LD A,(MIDIUS+4) CP B JP NZ,AMSPM5 ;** PUSH BC ;set IDB amspms LD B,04H;** LD A,18H CALL SCALL POP BC AMSPM5: LD A,(MIDIUS+5) CP B JP NZ,AMSPM6 ;** PUSH BC ;set IDB amspms LD B,05H;** LD A,18H CALL SCALL POP BC AMSPM6: LD A,(MIDIUS+6) CP B JP NZ,AMSPM7 ;** PUSH BC ;set IDB amspms LD B,06H;** LD A,18H CALL SCALL POP BC AMSPM7: LD A,(MIDIUS+7) CP B JP NZ,AMSPM8 ;** ;set IDB amspms LD B,07H ;** LD A,18H CALL SCALL AMSPM8: RET ;########################### ; ;BRILLI ; Given midi channel ; in B, and brilliance in C ; sets it for system ; if midi channel applies ; to any midi defined in ; this slave. BRILLI: LD D,8 LD HL,MIDIUS LD A,B BRILL1: CP (HL) JP NZ,BRILL0 LD A,10H CALL SCALL RET BRILL0: DEC D RET Z INC HL JP BRILL1 ;################################## WHICHC: ; decides which controller has ; come in. LD A,(MIDICH) LD B,A LD A,(CTRLVA) LD C,A LD A,(CTRLNO) CP 123 JP C,WHIC00 CALL NOTOFF RET WHIC00: LD HL,CNTRLS CP (HL) JP NZ,WHIC01 CALL SUSTAI RET WHIC01: INC HL CP (HL) JP NZ,WHIC02 SLA C CALL VOLUME RET WHIC02: INC HL CP (HL) JP NZ,WHIC03 SLA C CALL PCLK RET WHIC03: INC HL CP (HL) JP NZ,WHIC04 CALL PORT RET WHIC04: INC HL CP (HL) JP NZ,WHIC05 SLA C CALL BRILLI RET WHIC05: INC HL CP (HL) JP NZ,WHIC06 LD A,C AND 070H;MASK LOW BITS LD E,A LD A,C SRA A SRA A SRA A SRA A SRA A OR E LD C,A CALL AMSPMS RET WHIC06: INC HL CP (HL) JP NZ,WHIC07 LD A,C LD C,40H CP 2BH JP C,DOLR LD C,0C0H CP 55H JP C,DOLR LD C,80H DOLR: CALL PANLRS RET WHIC07: RET ;################################## MSLAVE: LD HL,REDLIT CALL OUTSTR CALL SUBINI CALL INITMD MSLAV1: CALL OTHRIN ; wait for midi status byte GETSTAT CALL MIDIIN JP Z,NOMORE BIT 7,A JP Z, GETSTAT GOTSTAT LD C,A CP 0F0H JP Z,STATF0 AND 0F0H CP 0A0H JP Z,GETSTAT CP 0D0H JP Z,GETSTAT LD B,A LD A,C AND 0FH LD HL,NOTINUS LD E,A LD D,0 ADD HL,DE LD A,(HL) OR A JP NZ,GETSTAT LD A,E LD (MIDICH),A LD A,B CP 0E0H JP Z,STATE0 CP 0B0H JP Z,STATB0 CP 80H JP Z,STAT80 CP 90H JP Z,STAT90 CP 0C0H JP Z,STATC0 JP GETSTAT ;############################# STAT80 CALL MIDIIN JP Z,NOMORE BIT 7,A JP NZ,GOTSTAT LD D,A LD E,0 CALL PLAYIT JP STAT80 ;############################### STAT90 CALL MIDIIN JP Z,NOMORE BIT 7,A JP NZ,GOTSTAT LD D,A PUSH DE CALL MIDIIN POP DE JP Z,NOMORE BIT 7,A JP NZ,GOTSTAT LD E,A CALL PLAYIT JP STAT90 ;############################### STATB0 CALL MIDIIN JP Z,NOMORE BIT 7,A JP NZ,GOTSTAT LD (CTRLNO),A CALL MIDIIN BIT 7,A JP NZ,GOTSTAT LD (CTRLVA),A CALL WHICHC JP STATB0 ;############################### STATC0 CALL MIDIIN JP Z,NOMORE BIT 7,A JP NZ,GOTSTAT INC A CP 97 JP NC,STATC0 LD C,A LD (PATCH),A CALL CVRTVC LD C,A LD A,(MIDICH) LD B,A CALL CHGVOC JP STATC0 ;############################### STATE0 CALL MIDIIN JP Z,NOMORE BIT 7,A JP NZ,GOTSTAT LD L,A PUSH HL CALL MIDIIN POP HL JP Z,NOMORE BIT 7,A JP NZ,GOTSTAT LD H,A LD A,(MIDICH) LD B,A CALL PITBND JP STATE0 ;******************************** STATF0: ; handles sys ex receives only ; CALL CLS ;STATFI: CALL MIDIIN ; JP Z,NOMORE ; CP 0F7H ; JP Z,GETSTAT ; CALL SHOHEX ; JP STATFI CALL MIDIIN JP Z,NOMORE CP 43H JP NZ,GETF7 CALL MIDIIN JP Z,NOMORE CP 75H JP NZ,GETF7 CALL MIDIIN JP Z,NOMORE LD HL,SYSCHN CP (HL) JP NZ,GETF7 CALL MIDIIN JP Z,NOMORE CP 0 JP NZ,TRYRQS CALL MIDIIN JP Z,NOMORE CP 04H; CONFIG DUMP JP Z,GETFIG CP 0; VOICE BANK DUMP JP Z,GETVBK JP GETF7 SUMERR: PUSH AF LD HL,CSUMER JP ALERR F7ERR: PUSH AF LD HL,ERRMS ALERR: CALL OUTSTR POP AF CALL SHOHUN GETF7: CALL MIDIIN JP Z,NOMORE CP 0F7H JP NZ,GETF7 JP MSLAV1 ; see if its a dump request TRYRQS: CP 20H JP NZ,GETF7 CALL MIDIIN JP Z,NOMORE CP 00H JP NZ,GETF7 CALL MIDIIN JP Z,NOMORE CP 2 JP NC, GETF7 ; its a valid request for a voice ; bank dump (0 or 1) LD C,A PUSH BC CALL MSLVXT POP BC CALL SYSXTX JP MSLAVE NOMORE: ; issue system all-note-off LD A,0 CALL RCALL CALL MSLVXT RET ;################################## ; This is a replacement for R-call ; 02, put event into Q, with less ; overhead QWRIT: JP QWREAL LD A,02H CALL RCALL RET QWREAL: LD HL,(0F981H) LD A,B ADD A,A ADD A,L LD L,A JP NC,QWR000 INC H QWR000: LD C,(HL) INC HL LD B,(HL) PUSH BC POP IX BIT 7,(IX+0) JP NZ,QWR226 LD A,(IX+2) ADD A,03H LD L,A LD H,0 ADD HL,BC LD (HL),E INC HL LD (HL),D LD A,(IX+2) ADD A,02H CP 20H JP NZ,QWR215 XOR A QWR215: LD (IX+2),A CP (IX+1) JP NZ,QWR221 SET 7,(IX+0) QWR221: RES 0,(IX+0) QWR226: XOR A SCF RET ;********************************** PUTINQ: PUSH DE PUSH HL CALL QWRIT POP HL POP DE RET ;********************************** DOMDOU: ;send midi event to txbuf ;given midi channel in A, ; and event in DE (velocity in ;E in OPM format), uses ;STAT and MINOTE PUSH DE PUSH AF LD A,(STAT) LD C,A POP AF OR C CALL MIDOUT LD A,(MINOTE) CALL MIDOUT POP DE LD A,E RR A CALL MIDOUT RET ;############### MKIN: ; if event on MK keyboard then ; vector goes here. ; DE has event. ;convert to midi format PUSH DE CALL CVOPM POP DE LD HL,0 LD A,(MKIDBS) OR A JP Z,MKIN1 LD B,0 BIT 7,D JP Z,MK0 LD A,(VELTBL) LD E,A MK0: CALL PUTINQ LD A,(MIDITB) PUSH DE PUSH HL CALL DOMDOU POP HL POP DE SET 0,L MKIN1: LD A,(MKIDBS+1) OR A JP Z,MKIN2 LD B,1 BIT 7,D JP Z,MK1 LD A,(VELTBL+1) LD E,A MK1: CALL PUTINQ LD A,(MIDITB+1) PUSH DE PUSH HL CALL DOMDOU POP HL POP DE SET 1,L MKIN2: LD A,(MKIDBS+2) OR A JP Z,MKIN3 LD B,2 BIT 7,D JP Z,MK2 LD A,(VELTBL+2) LD E,A MK2: CALL PUTINQ LD A,(MIDITB+2) PUSH DE PUSH HL CALL DOMDOU POP HL POP DE SET 2,L MKIN3: LD A,(MKIDBS+3) OR A JP Z,MKIN4 LD B,3 BIT 7,D JP Z,MK3 LD A,(VELTBL+3) LD E,A MK3: CALL PUTINQ LD A,(MIDITB+3) PUSH DE PUSH HL CALL DOMDOU POP HL POP DE SET 3,L MKIN4: LD A,(MKIDBS+4) OR A JP Z,MKIN5 LD B,4 BIT 7,D JP Z,MK4 LD A,(VELTBL+4) LD E,A MK4: CALL PUTINQ LD A,(MIDITB+4) PUSH DE PUSH HL CALL DOMDOU POP HL POP DE SET 4,L MKIN5: LD A,(MKIDBS+5) OR A JP Z,MKIN6 LD B,5 BIT 7,D JP Z,MK5 LD A,(VELTBL+5) LD E,A MK5: CALL PUTINQ LD A,(MIDITB+5) PUSH DE PUSH HL CALL DOMDOU POP HL POP DE SET 5,L MKIN6: LD A,(MKIDBS+6) OR A JP Z,MKIN7 LD B,6 BIT 7,D JP Z,MK6 LD A,(VELTBL+6) LD E,A MK6: CALL PUTINQ LD A,(MIDITB+6) PUSH DE PUSH HL CALL DOMDOU POP HL POP DE SET 6,L MKIN7: LD A,(MKIDBS+7) OR A JP Z,MKIN8 LD B,7 BIT 7,D JP Z,MK7 LD A,(VELTBL+7) LD E,A MK7: CALL PUTINQ LD A,(MIDITB+7) PUSH DE PUSH HL CALL DOMDOU POP HL POP DE SET 7,L MKIN8: EX DE,HL CALL PCALL RET ;********************************** MIDINT: ; Interrupt routine for midi input DI PUSH IX PUSH IY PUSH AF PUSH BC PUSH DE PUSH HL LD A,(MIDSTT) BIT 1,A JP Z,MIDI04 LD A,(MIDDAT) LD B,A MIDIXX: JP MIDI02 MIDI02: LD A,(MIDSTT) BIT 0,A JP Z,MIDI02 LD A,B LD (MIDDAT),A MIDI05: LD A,B SUB 0F8H JP C,MIDI06 CP 04H JP Z,MIDI06 JP MIDI04 MIDI06: LD HL,(BUFIFL) LD A,L INC A CP H JP Z,MIDI04 MIDI03: LD HL,RXBUF LD E,A LD D,0 ADD HL,DE LD (HL),B LD (BUFIFL),A MIDI04: JP MIDI07 MIDI08: LD A,(MIDSTT) BIT 0,A;check tx ready JP Z,MIDI07 LD HL,(BUFOFL) LD A,H CP L JP Z,MIDI10 LD A,H INC A LD (BUFOEM),A LD HL,TXBUF LD E,A LD D,0 ADD HL,DE LD A,(HL) LD (MIDDAT),A JP MIDI07 ; turn off interrupt enable MIDI10: LD A,(0F9A5H) RES 1,A LD (0F9A5H),A LD (MIDSTT),A MIDI07: POP HL POP DE POP BC POP AF POP IY POP IX EI RETI ;********************************** IRQA ; handler for clock-A interrupt PUSH IX PUSH IY PUSH DE PUSH BC PUSH HL PUSH AF LD A,19H CALL RCALL POP AF POP HL POP BC POP DE POP IY POP IX EI RETI ;******* DATA AREAS ******** MIDICH DEFB 0 CTRLNO DEFB 0 CTRLVA DEFB 0 PATCH DEFB 0 MIDIUS DEFB 0,1,2,3,4,5,6,7 BUFIFL DEFB 0 BUFIEM DEFB 0 BUFOFL DEFB 0 BUFOEM DEFB 0 LOADMS DEFB 0FFH,1,15,18 DEFM "LOADING" DEFB 0 ERRMS DEFB 0FFH,1,24,1 DEFM "MIDI ERROR " DEFB 0 CSUMER DEFB 0FFH,1,24,1 DEFM "CHECKSUM " DEFB 0 REDLIT DEFB 0FFH,1,15,15 DEFB 0FFH,3,0F8H ;WH ON RED DEFM " * PLAYING * " DEFB 0FFH,1,16,15 DEFM "To edit hit STOP" DEFB 0FFH,4 DEFB 0 PRISLT DEFB 0 SECSLT DEFB 0 NEWPRI DEFB 0 NEWSEC DEFB 0 LASKEY DEFB 03H MINOTE DEFB 0 STAT DEFB 0 CHKSUM DEFB 0 OLDNAM DEFB 0,0,0,0,0,0,0,0 BANKNM ENDCOD DEFB 0 ORG UVL2+3111 ; PUBLIC DATA AREA FCB1 DEFB 02H ;READ UVL DEFB 21H ;DRIVE A DEFW 0 DEFW 0 DEFM "VOICEFILVOG" UVL1PT DEFW UVL1 FCB2 DEFB 02H DEFB 21H DEFW 0 DEFW 0 DEFM "VCSET01 VOG" UVL2PT DEFW UVL2 FCB3 DEFB 00H DEFB 21H DEFW 8000H DEFW (SCRARR-8000H) DEFM "MIDISLAV " UVL3PT DEFW UVL2 DEVICS DEFB 2,2,2 PITOFF DEFW 0E000H PORTCK DEFB 80H,80H,80H,80H DEFB 80H,80H,80H,80H PLYTMP DEFB 1,1,1,1,1,1,1,1 ALLOC DEFB 01H,23H,45H,67H MIDIVC DEFW 0 MIDIFG DEFB 0 ; this is changed if no screen ; update is desired during ; play. If no update desired, ; then change jump to return. ; If update on then put back to jump. SCRUPD JP DSPATC SYSCHN DEFB 0; INSTRMENT # ; controller numbers incase ; they are changable later CNTRLS DEFB 64,7,5,65,3,1,8 NOTINUS DEFB 0,0,0,0,0,0,0,0 DEFB 0,0,0,0,0,0,0,0 ;-------------------- VOICES DEFB 4,1,17,18 DEFB 52,64,74,77 MIDITB DEFB 0,1,2,3,4,5,6,7 VELTBL DEFB 200,200,200,200 DEFB 200,200,200,200 POLY DEFB 1,1,1,1,1,1,1,1 DETUNE DEFW 0,0,0,0,0,0,0,0 ;this will be address of either ;the place to do midi out or ;to code beyond it. If the flag ;is 0 then no midi out, else ;if flag is 0ffh the midi out. PITSHT DEFB 1 ;array for which idb's the YKxx is ;playing MKIDBS DEFB 0,0,0,0,0,0,0,0 ; initial sustain on/off for idbs SUSTDAT DEFB 0,0,0,0,0,0,0,0 ;initial setting of portamento on/off PORTON DEFB 0,0,0,0,0,0,0,0 ; to make sure that code is after ; first block read from disk ; to keep later versions able ; to use early setup files. STEREO DEFB 0C0H,0C0H,0C0H,0C0H DEFB 0C0H,0C0H,0C0H,0C0H ;------------ CLS: JP VECTOR SETCLR: JP VECTOR SETCRS: JP VECTOR HLX32: JP VECTOR HLX8: JP VECTOR INCCRS: JP VECTOR DECCRS: JP VECTOR OUTCHR: JP VECTOR CONOUT: JP VECTOR OUTSTR: JP VECTOR OUTMES: JP VECTOR GETUVL: JP VECTOR SHOHUN: JP VECTOR SHONUM: JP VECTOR SHONAM: JP VECTOR GETNAM: JP VECTOR GETFCB: JP VECTOR MSXWRI: JP VECTOR MSXRDF: JP VECTOR MKSCRN: JP VECTOR ONINV: JP VECTOR OFFINV: JP VECTOR GOPLAY: JP VECTOR MKNUMB: JP VECTOR GETLIN: JP VECTOR HELP: JP VECTOR DSPATC: JP VECTOR SHOWMT: JP VECTOR SHOWUP: JP VECTOR FILERR: JP VECTOR SCRNPR: JP VECTOR PROUT: JP VECTOR CHGET: JP VECTOR TXTBUF: DEFW 0 DEVTBL: DEFW 0 VECTOR EQU 0 ORG 0C1C0H LISTER: JP LISTER MORHLP: JP MORHLP WRTVRM: JP WRTVRM FILVRM: JP FILVRM LDIRVM: JP LDIRVM FDIR: JP FDIR BLOAD: JP BLOAD BSAVE: JP BSAVE CHEKYK: JP CHEKYK ISYKON: JP ISYKON WRTEEP: JP WRTEEP RDEEP: JP RDEEP END  FDIR BLOAD: JP BLOAD BSAVE: JP BSAVE CHEKYK: JP CHEKYK ISYKON: JP ISYKON HiSoft GEN80 Assembler 3 Oct 87 Page: 1 Pass 1 errors: 00 0100 1 *W 0100 2 ; MSLAVE.GEN VER 1.5 0100 3 ;This program makes the CX5M a midi 0100 4 ;slave. 0100 5 0100 FE 6 DEFB 0FEH ;BINARY FILE 0101 90B0 7 DEFW CODSTT 0103 B8C1 8 DEFW ENDCOD 0105 90B0 9 DEFW CODSTT 0107 10 0107 11 0107 12 ;This program allows eight instruments 0107 13 ;with unique midi channels to be played 0107 14 ;remotely by a synth or sequencer. 0107 15 0107 16 ;While waiting for a midi byte it 0107 17 ;checks for the stop key. If the 0107 18 ;stop key is pressed, the program 0107 19 ;terminates and does a hard reboot. 0107 20 0107 21 ;In coding this program I purposely 0107 22 ;chose run-speed over code-efficiency, 0107 23 ;which means instead of making 0107 24 ;loops I repeated code to make it 0107 25 ;run faster. 8007 26 PRESET EQU 8007H 828F 27 UVL1 EQU PRESET+648 8EB6 28 UVL2 EQU UVL1+3111 0107 29 DE76 30 STACK EQU 0DE76H DD76 31 BOTSTK EQU STACK-100H D576 32 MIDB EQU BOTSTK-800H D476 33 RXBUF EQU MIDB-100H D376 34 TXBUF EQU RXBUF-100H D2F6 35 IDB7BF EQU TXBUF-80H D276 36 IDB6BF EQU IDB7BF-80H D1F6 37 IDB5BF EQU IDB6BF-80H D176 38 IDB4BF EQU IDB5BF-80H D0F6 39 IDB3BF EQU IDB4BF-80H D076 40 IDB2BF EQU IDB3BF-80H CFF6 41 IDB1BF EQU IDB2BF-80H CF76 42 IDB0BF EQU IDB1BF-80H CF51 43 MSXFCB EQU IDB0BF-25H CC51 44 SCRARR EQU MSXFCB-300H C851 45 CHARSET EQU SCRARR-400H 0107 46 3FF6 47 MIDSTT EQU 3FF6H 3FF5 48 MIDDAT EQU 3FF5H 0107 49 00A8 50 IO_PPA EQU 0A8H ;PRIMARY SLOT REG 00AA 51 IO_KBD EQU 0AAH ;KBD ROW SEL 00A9 52 IN_KBD EQU 0A9H ;KBD READ FFFF 53 MM_PPA EQU 0FFFFH ;secondary slot reg D5A8 54 M_ICKA EQU MIDB+32H ; D5B2 55 AST01 EQU MIDB+3CH ; 0107 56 0107 57 HiSoft GEN80 Assembler 3 Oct 87 Page: 2 0107 58 ; for use when loading with BASIC 0107 59 ; as a binary file. So BASIC will 0107 60 ;know where to load it and run it. 0107 61 B090 62 CODSTT ORG 0B090H B090 63 B090 64 ;INITIAL SETUP PROCEDURE B090 65 B090 66 B090 C316B3 67 JP MSINIT B093 C329B3 68 JP RWFILE B096 C39ABD 69 JP MSLAVE B099 C3FEB4 70 JP SETMID B09C C3B9B3 71 JP SYSXTX B09F C310B1 72 JP SHOHEX B0A2 C377B2 73 JP SEARCH B0A5 74 B0A5 75 ;################################### B0A5 76 B0A5 77 B0A5 F3 78 ICALL DI B0A6 CDAB00 79 CALL 00ABH B0A9 C9 80 RET B0AA 81 B0AA 82 ;################################### B0AA 83 B0AA F3 84 ECALL DI B0AB CDB700 85 CALL 00B7H B0AE C9 86 RET B0AF 87 B0AF 88 ;################################### B0AF 89 B0AF FB 90 RCALL EI B0B0 CD9300 91 CALL 0093H B0B3 C9 92 RET B0B4 93 B0B4 94 ;################################### B0B4 95 B0B4 FB 96 PCALL EI B0B5 3E00 97 LD A,0 B0B7 CD9900 98 CALL 0099H B0BA C9 99 RET B0BB 100 ;################################### B0BB 101 B0BB FB 102 SCALL EI B0BC CD9C00 103 CALL 009CH B0BF C9 104 RET B0C0 105 B0C0 106 ;################################### B0C0 107 B0C0 FB 108 MCALL EI B0C1 CDA500 109 CALL 00A5H B0C4 C9 110 RET B0C5 111 B0C5 112 ;################################### B0C5 113 B0C5 FB 114 FCALL EI B0C6 CDB100 115 CALL 00B1H B0C9 C9 116 RET HiSoft GEN80 Assembler 3 Oct 87 Page: 3 B0CA 117 B0CA 118 ;################################### B0CA FB 119 KCALL EI B0CB CD9600 120 CALL 0096H B0CE C9 121 RET B0CF 122 B0CF 123 ;################################### B0CF 124 B0CF 125 B0CF 126 CHKSTP B0CF 127 ;check for stop key, return with B0CF 128 ;zero flag set if pressed B0CF 129 B0CF DBA9 130 IN A,(IN_KBD) B0D1 CB67 131 BIT 4,A B0D3 C8 132 RET Z B0D4 E603 133 AND 03H B0D6 21ACC1 134 LD HL,LASKEY B0D9 BE 135 CP (HL) B0DA CA0DB1 136 JP Z,NOCHG B0DD 77 137 LD (HL),A B0DE 138 ; IF F5 KEY ON THEN TOGGLE B0DE 139 ; SCREEN UPDATE B0DE 140 B0DE CB4F 141 BIT 1,A B0E0 C2FDB0 142 JP NZ,CHKST0 B0E3 F5 143 PUSH AF B0E4 3A329B 144 LD A,(SCRUPD) B0E7 FEC3 145 CP 0C3H B0E9 CAF8B0 146 JP Z,CHKST1 B0EC 3EC3 147 LD A,0C3H B0EE 32329B 148 CHKST2 LD (SCRUPD),A B0F1 CDF29B 149 CALL SHOWUP B0F4 F1 150 POP AF B0F5 C3FDB0 151 JP CHKST0 B0F8 152 CHKST1 B0F8 3EC9 153 LD A,0C9H B0FA C3EEB0 154 JP CHKST2 B0FD 155 CHKST0 B0FD CB47 156 BIT 0,A B0FF C0 157 RET NZ B100 3A319B 158 LD A,(MIDIFG) B103 2F 159 CPL B104 32319B 160 LD (MIDIFG),A B107 CDFEB4 161 CALL SETMID B10A CDEF9B 162 CALL SHOWMT B10D 163 B10D 164 B10D F6FF 165 NOCHG OR 0FFH B10F C9 166 RET B110 167 B110 168 ;%%%%%%%% B110 169 B110 170 SHOHEX B110 171 ; display space, then hex of value B110 172 ; in A B110 F5 173 PUSH AF B111 3E20 174 LD A,20H B113 CDB39B 175 CALL OUTCHR HiSoft GEN80 Assembler 3 Oct 87 Page: 4 B116 F1 176 POP AF B117 F5 177 PUSH AF B118 CB3F 178 SRL A B11A CB3F 179 SRL A B11C CB3F 180 SRL A B11E CB3F 181 SRL A B120 C630 182 ADD A,30H B122 FE3A 183 CP 3AH B124 DA29B1 184 JP C,SHOHX1 B127 C607 185 ADD A,7 B129 CDB39B 186 SHOHX1 CALL OUTCHR B12C F1 187 POP AF B12D E60F 188 AND 0FH B12F C630 189 ADD A,30H B131 FE3A 190 CP 3AH B133 DA38B1 191 JP C,SHOHX2 B136 C607 192 ADD A,7 B138 CDB39B 193 SHOHX2 CALL OUTCHR B13B 3E20 194 LD A,20H B13D CDB39B 195 CALL OUTCHR B140 C9 196 RET B141 197 B141 198 ;*********************************** B141 199 GETPAK B141 200 ;given pointer in DE and B141 201 ;first byte in A, returns 0 flag B141 202 ; if midi in found stop key, B141 203 ; or no carry if invalid packet. B141 204 ; else carry = 1 B141 205 ; puts count in C, checksum in B B141 206 B141 207 B141 208 ; get count bytes B141 4F 209 LD C,A B142 C5 210 PUSH BC B143 D5 211 PUSH DE B144 CDA7B6 212 CALL MIDIIN B147 D1 213 POP DE B148 C1 214 POP BC B149 C8 215 RET Z B14A 216 ;combine them B14A 217 B14A CB27 218 SLA A B14C CB19 219 RR C B14E CB1F 220 RR A B150 4F 221 LD C,A B151 222 B151 0600 223 LD B,0 B153 224 GETPK0 B153 D5 225 PUSH DE B154 C5 226 PUSH BC B155 CDA7B6 227 CALL MIDIIN B158 C1 228 POP BC B159 D1 229 POP DE B15A C8 230 RET Z B15B 231 B15B 6F 232 LD L,A B15C 80 233 ADD A,B B15D 47 234 LD B,A HiSoft GEN80 Assembler 3 Oct 87 Page: 5 B15E D5 235 PUSH DE B15F C5 236 PUSH BC B160 E5 237 PUSH HL B161 CDA7B6 238 CALL MIDIIN B164 E1 239 POP HL B165 C1 240 POP BC B166 D1 241 POP DE B167 C8 242 RET Z B168 F5 243 PUSH AF B169 80 244 ADD A,B B16A 47 245 LD B,A B16B F1 246 POP AF B16C 247 B16C CB27 248 SLA A B16E CB27 249 SLA A B170 CB27 250 SLA A B172 CB27 251 SLA A B174 B5 252 OR L B175 253 B175 254 ; store at pointer and increment B175 12 255 LD (DE),A B176 13 256 INC DE B177 257 ; decrement count B177 0D 258 DEC C B178 0D 259 DEC C B179 C253B1 260 JP NZ,GETPK0 B17C 261 ; get checksum B17C D5 262 PUSH DE B17D C5 263 PUSH BC B17E CDA7B6 264 CALL MIDIIN B181 C1 265 POP BC B182 D1 266 POP DE B183 C8 267 RET Z B184 80 268 ADD A,B B185 E67F 269 AND 07FH B187 B7 270 OR A B188 CA8FB1 271 JP Z,PAKOK B18B 272 ;return not zero and no carry B18B 3E01 273 LD A,01H B18D 3C 274 INC A B18E C9 275 RET B18F 276 B18F 277 ;return not zero and carry B18F 3EFF 278 PAKOK LD A,0FFH B191 C602 279 ADD A,2 B193 C9 280 RET B194 281 B194 282 ;******************************* B194 283 ; get configuration data dump B194 284 GETFIG B194 CDA7B6 285 CALL MIDIIN B197 CA19BF 286 JP Z,NOMORE B19A 110080 287 LD DE,8000H B19D C3B8B1 288 JP GETVB0 B1A0 289 B1A0 290 ;*********************************** B1A0 291 GETVBK B1A0 292 ; receive sys ex dump of voice bank B1A0 CDA7B6 293 CALL MIDIIN HiSoft GEN80 Assembler 3 Oct 87 Page: 6 B1A3 CA19BF 294 JP Z,NOMORE B1A6 295 B1A6 296 ; if bank number too high then B1A6 297 ; return B1A6 298 B1A6 FE02 299 CP 2 B1A8 D2D9BE 300 JP NC,F7ERR ; B1AB 32B8C1 301 LD (BANKNM),A B1AE 302 ; pointer for data in DE B1AE 118F82 303 LD DE,UVL1 B1B1 B7 304 OR A B1B2 CAB8B1 305 JP Z,GETVB0 B1B5 11B68E 306 LD DE,UVL2 B1B8 307 B1B8 308 GETVB0 B1B8 D5 309 PUSH DE B1B9 CDA7B6 310 CALL MIDIIN B1BC D1 311 POP DE B1BD CA19BF 312 JP Z,NOMORE B1C0 FEF7 313 CP 0F7H B1C2 CAD1B1 314 JP Z,SSXDON B1C5 CD41B1 315 CALL GETPAK B1C8 316 ; returns with de to next place B1C8 317 ; if z then stop key pressed B1C8 318 ; if carry then error B1C8 CA19BF 319 JP Z,NOMORE B1CB D2D2BE 320 JP NC,SUMERR B1CE C3B8B1 321 JP GETVB0 B1D1 322 B1D1 3AB8C1 323 SSXDON LD A,(BANKNM) B1D4 218F82 324 LD HL,UVL1 B1D7 010800 325 LD BC,8 B1DA 11E39A 326 LD DE,FCB1+6 B1DD B7 327 OR A B1DE CAEBB1 328 JP Z,SSXMV B1E1 21B68E 329 LD HL,UVL2 B1E4 11F69A 330 LD DE,FCB2+6 B1E7 3D 331 DEC A B1E8 C2EDB1 332 JP NZ,SSXEND B1EB EDB0 333 SSXMV LDIR B1ED CDD79B 334 SSXEND CALL MKSCRN B1F0 217AC1 335 LD HL,REDLIT B1F3 CDB99B 336 CALL OUTSTR B1F6 C3A9BD 337 JP GETSTAT B1F9 338 ;################################### B1F9 339 CVRTVC B1F9 340 ; Given voice number 1-96 in C B1F9 341 ; converts it to 64-112 and B1F9 342 ; defines one of two voice banks. B1F9 343 ; Returns converted value in A B1F9 344 B1F9 345 ; If voice >= 49 B1F9 79 346 LD A,C B1FA FE31 347 CP 49 B1FC DA08B2 348 JP C,CVERT0 B1FF 349 ;then B1FF 350 B1FF C5 351 PUSH BC B200 352 ; define uvl 2 HiSoft GEN80 Assembler 3 Oct 87 Page: 7 B200 353 B200 CD6EB2 354 CALL DFUVL2 B203 C1 355 POP BC B204 356 ; voice = voice + 15 B204 357 B204 79 358 LD A,C B205 C60F 359 ADD A,15 B207 C9 360 RET B208 361 B208 362 CVERT0 B208 363 ;else B208 C5 364 PUSH BC B209 365 ; define uvl 1 B209 CD65B2 366 CALL DFUVL1 B20C C1 367 POP BC B20D 368 ; voice = voice + 63 B20D 79 369 LD A,C B20E C63F 370 ADD A,63 B210 C9 371 RET B211 372 ;################################### B211 373 INIUVL B211 374 ; copies system voices to uvl B211 375 ; do x= 1 to 48 B211 0600 376 LD B,0 B213 1176CF 377 LD DE,IDB0BF B216 3E00 378 LD A,0 B218 CDBBB0 379 CALL SCALL B21B 380 B21B 1E30 381 LD E,48 B21D 382 INIU0 B21D D5 383 PUSH DE B21E 7B 384 LD A,E B21F 3D 385 DEC A B220 4F 386 LD C,A ;VOICE # B221 0600 387 LD B,0 ;IDB0 USED B223 C5 388 PUSH BC B224 3E15 389 LD A,15H ;GETVOICE B226 CDBBB0 390 CALL SCALL B229 C1 391 POP BC B22A 79 392 LD A,C B22B C640 393 ADD A,64 ;VOICE = VOICE + 64 B22D 4F 394 LD C,A B22E 3E16 395 LD A,16H ;PUT VOICE B230 CDBBB0 396 CALL SCALL B233 D1 397 POP DE B234 1D 398 DEC E B235 C21DB2 399 JP NZ,INIU0 B238 C9 400 RET B239 401 B239 402 B239 403 B239 404 ;################################### B239 405 B239 406 SETVOC B239 407 ; Given IDB number in B, voice in C, B239 408 ; velocity in A, B239 409 ; and pointer to IDB in DE B239 410 ; initialize queue, and load voice. B239 411 HiSoft GEN80 Assembler 3 Oct 87 Page: 8 B239 412 ; Define the IDB B239 413 B239 F5 414 PUSH AF B23A 415 B23A C5 416 PUSH BC B23B D5 417 PUSH DE B23C 3E00 418 LD A,0 B23E CDBBB0 419 CALL SCALL B241 D1 420 POP DE B242 C1 421 POP BC B243 422 B243 423 ; Assign IDB to queue B243 C5 424 PUSH BC B244 78 425 LD A,B B245 F680 426 OR 80H B247 57 427 LD D,A B248 3E0A 428 LD A,0AH B24A 1E00 429 LD E,0 B24C CDBBB0 430 CALL SCALL B24F C1 431 POP BC B250 432 B250 433 ; Get and load voice B250 434 B250 C5 435 PUSH BC B251 CDF9B1 436 CALL CVRTVC ;CONVERT VOICE B254 C1 437 POP BC B255 4F 438 LD C,A B256 C5 439 PUSH BC B257 440 B257 3E19 441 LD A,19H B259 CDBBB0 442 CALL SCALL B25C C1 443 POP BC B25D 444 B25D 445 ; Set volume B25D 446 B25D F1 447 POP AF B25E 4F 448 LD C,A B25F 3E13 449 LD A,13H B261 CDBBB0 450 CALL SCALL B264 451 B264 C9 452 RET B265 453 ;################################## B265 454 DFUVL1 B265 455 ;defines uvl to uvl1 B265 456 B265 3E03 457 LD A,03H B267 118F82 458 LD DE,UVL1 B26A CDBBB0 459 CALL SCALL B26D C9 460 RET B26E 461 B26E 462 ;################################## B26E 463 DFUVL2 B26E 464 ;defines uvl to uvl2 B26E 465 B26E 3E03 466 LD A,03H B270 11B68E 467 LD DE,UVL2 B273 CDBBB0 468 CALL SCALL B276 C9 469 RET B277 470 ;$$$$$$$$$ HiSoft GEN80 Assembler 3 Oct 87 Page: 9 B277 471 SEARCH B277 472 ; find slot containing fm synth. B277 473 ; put original slot settings in B277 474 ; PRISLT and SECSLT, and put B277 475 ; settings for sfg05 in NEWPRI B277 476 ; and NEWSEC.HANG IF NOT FOUND. B277 F3 477 DI B278 DBA8 478 IN A,(IO_PPA) B27A 32A8C1 479 LD (PRISLT),A B27D E6FC 480 AND 0FCH B27F 4F 481 LD C,A B280 0604 482 LD B,4 B282 483 ; do while pcount <> 0 B282 79 484 SRCHL1 LD A,C B283 485 ; set to new slot B283 D3A8 486 OUT (IO_PPA),A B285 487 ; get secondary setting B285 3AFFFF 488 LD A,(MM_PPA) B288 2F 489 CPL B289 32A9C1 490 LD (SECSLT),A B28C E6FC 491 AND 0FCH B28E 5F 492 LD E,A B28F 1604 493 LD D,4 B291 494 ; do while scount <> 0 B291 7B 495 SRCHL2 LD A,E B292 496 ; set for new slot B292 32FFFF 497 LD (MM_PPA),A B295 498 ; look for string B295 C5 499 PUSH BC B296 D5 500 PUSH DE B297 21DBB2 501 LD HL,FMNAME B29A 118000 502 LD DE,80H B29D 0606 503 LD B,6 B29F 1A 504 CMPR LD A,(DE) B2A0 BE 505 CP (HL) B2A1 C2C1B2 506 JP NZ,NOTFND B2A4 23 507 INC HL B2A5 13 508 INC DE B2A6 05 509 DEC B B2A7 C29FB2 510 JP NZ,CMPR B2AA 511 ; when match found, put results B2AA 512 ; away and restore to original B2AA 513 ; slot settings. B2AA D1 514 FOUND POP DE B2AB C1 515 POP BC B2AC 79 516 LD A,C B2AD 32AAC1 517 LD (NEWPRI),A B2B0 7B 518 LD A,E B2B1 32ABC1 519 LD (NEWSEC),A B2B4 3AA9C1 520 LD A,(SECSLT) B2B7 32FFFF 521 LD (MM_PPA),A B2BA 3AA8C1 522 LD A,(PRISLT) B2BD D3A8 523 OUT (IO_PPA),A B2BF FB 524 EI B2C0 C9 525 RET B2C1 526 B2C1 D1 527 NOTFND POP DE B2C2 C1 528 POP BC B2C3 3AA9C1 529 LD A,(SECSLT) HiSoft GEN80 Assembler 3 Oct 87 Page: 10 B2C6 32FFFF 530 LD (MM_PPA),A B2C9 1C 531 INC E B2CA 15 532 DEC D B2CB C291B2 533 JP NZ,SRCHL2 B2CE 3AA8C1 534 LD A,(PRISLT) B2D1 D3A8 535 OUT (IO_PPA),A B2D3 0C 536 INC C B2D4 05 537 DEC B B2D5 C282B2 538 JP NZ,SRCHL1 B2D8 C3D8B2 539 HANG JP HANG B2DB 540 B2DB 4D434846 541 FMNAME DEFM "MCHFM0" B2E1 542 B2E1 543 B2E1 544 ;################################## B2E1 545 SUBINI B2E1 546 ;Set memory page,mbios mode and B2E1 547 ;midb location B2E1 548 B2E1 549 B2E1 550 B2E1 F3 551 DI B2E2 552 ;save original setting of primary B2E2 553 ;slot selector B2E2 DBA8 554 IN A,(IO_PPA) B2E4 32A8C1 555 LD (PRISLT),A B2E7 556 ;set to slot 3 for low page B2E7 3AAAC1 557 LD A,(NEWPRI) B2EA D3A8 558 OUT (IO_PPA),A B2EC 559 ;save original setting of secondary B2EC 560 ;slot selector B2EC 3AFFFF 561 LD A,(MM_PPA) B2EF 2F 562 CPL B2F0 32A9C1 563 LD (SECSLT),A B2F3 564 ;set to slot 3 for low page B2F3 3AABC1 565 LD A,(NEWSEC) B2F6 32FFFF 566 LD (MM_PPA),A B2F9 567 B2F9 568 ;Set mode 2.0 init B2F9 1176D5 569 LD DE,MIDB B2FC CDA5B0 570 CALL ICALL B2FF 571 ; disable clock B - not used B2FF 0E01 572 LD C,01H B301 3E0D 573 LD A,0DH B303 CDBBB0 574 CALL SCALL B306 C9 575 RET B307 576 ;********************************** B307 577 MSLVXT B307 578 ; exit mslave. call e-call,set B307 579 ;page = 0 and return. B307 CDAAB0 580 CALL ECALL B30A 3AA9C1 581 LD A,(SECSLT) B30D 32FFFF 582 LD (MM_PPA),A B310 3AA8C1 583 LD A,(PRISLT) B313 D3A8 584 OUT (IO_PPA),A B315 C9 585 RET B316 586 B316 587 B316 588 ;********************************** HiSoft GEN80 Assembler 3 Oct 87 Page: 11 B316 589 MSINIT B316 CDE1B2 590 CALL SUBINI B319 591 B319 592 ;Define user voice buffer B319 CD65B2 593 CALL DFUVL1 B31C 594 ;Initialize to system voices B31C CD11B2 595 CALL INIUVL B31F 596 B31F CD6EB2 597 CALL DFUVL2 B322 CD11B2 598 CALL INIUVL B325 CD07B3 599 CALL MSLVXT B328 600 B328 C9 601 RET B329 602 ;********************************** B329 603 B329 604 RWFILE B329 605 ;given ptr to FCB in HL, and B329 606 ;0 for read, 01h for write file B329 607 ; If filename starts with space B329 608 ; then just B329 609 ; initialize with mbios voices B329 E5 610 PUSH HL B32A 611 ; copy file name to oldnam to save B32A 110600 612 LD DE,6 B32D 19 613 ADD HL,DE B32E 11B0C1 614 LD DE,OLDNAM B331 010800 615 LD BC,8 B334 EDB0 616 LDIR B336 CDE1B2 617 CALL SUBINI B339 618 B339 214EC1 619 LD HL,LOADMS B33C CDB99B 620 CALL OUTSTR B33F 621 B33F E1 622 POP HL B340 E5 623 PUSH HL B341 111100 624 LD DE,17 B344 19 625 ADD HL,DE B345 5E 626 LD E,(HL) B346 23 627 INC HL B347 56 628 LD D,(HL) B348 3E03 629 LD A,03H ;DEF UVL B34A CDBBB0 630 CALL SCALL B34D 631 B34D E1 632 POP HL B34E E5 633 PUSH HL B34F 110600 634 LD DE,6 B352 19 635 ADD HL,DE B353 7E 636 LD A,(HL) B354 FE20 637 CP 20H B356 D1 638 POP DE B357 C260B3 639 JP NZ,RWFIL1 B35A CD11B2 640 CALL INIUVL B35D C388B3 641 JP RWFILX B360 642 RWFIL1 B360 D5 643 PUSH DE ;save fcb ptr B361 3E20 644 LD A,20H B363 CDBBB0 645 CALL SCALL B366 E1 646 POP HL B367 DA8CB3 647 JP C,RWFILQ HiSoft GEN80 Assembler 3 Oct 87 Page: 12 B36A 648 ; restore name B36A E5 649 PUSH HL B36B 110600 650 LD DE,6 B36E 19 651 ADD HL,DE B36F EB 652 EX DE,HL B370 21B0C1 653 LD HL,OLDNAM B373 010800 654 LD BC,8 B376 EDB0 655 LDIR B378 E1 656 POP HL B379 23 657 INC HL B37A 658 ;get device code B37A 7E 659 LD A,(HL) B37B 2B 660 DEC HL B37C B7 661 OR A B37D 662 ; if code = 0 for cassette B37D 663 ; then repeat B37D C288B3 664 JP NZ,RWFILX B380 E5 665 PUSH HL B381 CD95B3 666 CALL CPNAME B384 E1 667 POP HL B385 668 ; if ok then done B385 C28CB3 669 JP NZ,RWFILQ B388 670 ;else ignore difference B388 671 RWFILX B388 CD07B3 672 CALL MSLVXT B38B C9 673 RET B38C CD07B3 674 RWFILQ CALL MSLVXT B38F 0E3F 675 LD C,"?" B391 CDF59B 676 CALL FILERR B394 C9 677 RET B395 678 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@ B395 679 CPNAME B395 680 ;given FCB ptr in HL, compare B395 681 ; name in FCb with name in UVL B395 682 ; return 0 if the same, else NZ B395 683 B395 E5 684 PUSH HL B396 685 ;get uvl ptr B396 111100 686 LD DE,17 B399 19 687 ADD HL,DE B39A 5E 688 LD E,(HL) B39B 23 689 INC HL B39C 56 690 LD D,(HL) B39D E1 691 POP HL B39E D5 692 PUSH DE B39F 110600 693 LD DE,6 B3A2 19 694 ADD HL,DE B3A3 D1 695 POP DE B3A4 0E08 696 LD C,8 B3A6 1A 697 CPNAM0 LD A,(DE) B3A7 BE 698 CP (HL) B3A8 C0 699 RET NZ B3A9 23 700 INC HL B3AA 13 701 INC DE B3AB 0D 702 DEC C B3AC C2A6B3 703 JP NZ,CPNAM0 B3AF C9 704 RET B3B0 705 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&& B3B0 706 SHOUT HiSoft GEN80 Assembler 3 Oct 87 Page: 13 B3B0 707 ; shows midi data being sent B3B0 708 ; and sends it B3B0 F5 709 PUSH AF B3B1 CD10B1 710 CALL SHOHEX B3B4 F1 711 POP AF B3B5 CD86B6 712 CALL MIDOUT B3B8 C9 713 RET B3B9 714 B3B9 715 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%% B3B9 716 SYSXTX B3B9 717 ; given filenumber 0-2 in C B3B9 718 ; puts pointer in DE B3B9 719 ; and block size in HL B3B9 720 ; sends block out via midi sys-ex B3B9 721 ; transmit B3B9 722 B3B9 C5 723 PUSH BC B3BA CDE1B2 724 CALL SUBINI B3BD 725 B3BD 726 ; set to no midi thru B3BD 727 ; and check transmit B3BD 728 B3BD 21C8C0 729 LD HL,MIDI05 B3C0 22BAC0 730 LD (MIDIXX+1),HL B3C3 731 B3C3 21EDC0 732 LD HL,MIDI08 B3C6 22EBC0 733 LD (MIDI04+1),HL B3C9 734 ; init midi for transmit only B3C9 3E05 735 LD A,05H B3CB 0176D3 736 LD BC,TXBUF B3CE 110000 737 LD DE,0 B3D1 CDBBB0 738 CALL SCALL B3D4 739 ; initialize buffers B3D4 210000 740 LD HL,0 B3D7 224AC1 741 LD (BUFIFL),HL B3DA 224CC1 742 LD (BUFOFL),HL B3DD 743 ; set midi vector B3DD F3 744 DI B3DE 21A4C0 745 LD HL,MIDINT B3E1 2275F9 746 LD (0F975H),HL B3E4 FB 747 EI B3E5 748 ; send header B3E5 010101 749 LD BC,0101H B3E8 CDA49B 750 CALL SETCRS B3EB 3EF0 751 LD A,0F0H B3ED CDB0B3 752 CALL SHOUT B3F0 3E43 753 LD A,43H B3F2 CDB0B3 754 CALL SHOUT B3F5 3E75 755 LD A,75H B3F7 CDB0B3 756 CALL SHOUT B3FA 3A359B 757 LD A,(SYSCHN) B3FD CDB0B3 758 CALL SHOUT B400 AF 759 XOR A B401 CDB0B3 760 CALL SHOUT B404 761 B404 C1 762 POP BC B405 0600 763 LD B,0 ; next byte to send B407 118F82 764 LD DE,UVL1 B40A 21200C 765 LD HL,3104 HiSoft GEN80 Assembler 3 Oct 87 Page: 14 B40D 79 766 LD A,C B40E B7 767 OR A B40F CA23B4 768 JP Z,SYSXT0 B412 11B68E 769 LD DE,UVL2 B415 79 770 LD A,C B416 3D 771 DEC A B417 CA23B4 772 JP Z,SYSXT0 B41A 110080 773 LD DE,8000H B41D 219E1B 774 LD HL,CLS-8000H; end of data B420 010004 775 LD BC,0400H B423 776 SYSXT0 B423 E5 777 PUSH HL B424 D5 778 PUSH DE B425 C5 779 PUSH BC B426 78 780 LD A,B B427 CDB0B3 781 CALL SHOUT B42A C1 782 POP BC B42B 79 783 LD A,C B42C CDB0B3 784 CALL SHOUT B42F D1 785 POP DE B430 E1 786 POP HL B431 787 B431 788 ; now send packets B431 789 ; do while block count (hl) > 0 B431 7C 790 DO1 LD A,H B432 B5 791 OR L B433 CA99B4 792 JP Z,ENDO1 B436 793 ; if hl > 64 B436 7C 794 LD A,H B437 B7 795 OR A B438 C241B4 796 JP NZ,THEN B43B 7D 797 LD A,L B43C FE41 798 CP 65 B43E DA46B4 799 JP C,ELSE B441 800 ; then count = 64 B441 0640 801 THEN LD B,64 B443 C347B4 802 JP ENDIF B446 803 ; else count = hl B446 45 804 ELSE LD B,L B447 805 ENDIF B447 78 806 LD A,B B448 CB27 807 SLA A ; packetCOUNT * 2 B44A C5 808 PUSH BC B44B D5 809 PUSH DE B44C E5 810 PUSH HL B44D CDADB4 811 CALL SNDCNT B450 E1 812 POP HL B451 D1 813 POP DE B452 C1 814 POP BC B453 815 ; init checksum B453 0E00 816 LD C,0 ; B455 817 ; do while packetcount > 0 B455 818 DO2 B455 78 819 LD A,B B456 B7 820 OR A B457 CA88B4 821 JP Z,ENDO2 B45A 822 ; get low half of byte B45A 1A 823 LD A,(DE) B45B E60F 824 AND 0FH HiSoft GEN80 Assembler 3 Oct 87 Page: 15 B45D F5 825 PUSH AF B45E 826 ; add to checksum B45E 81 827 ADD A,C B45F 4F 828 LD C,A B460 F1 829 POP AF B461 C5 830 PUSH BC B462 D5 831 PUSH DE B463 E5 832 PUSH HL B464 833 ; send low half B464 CDB0B3 834 CALL SHOUT B467 E1 835 POP HL B468 D1 836 POP DE B469 C1 837 POP BC B46A 1A 838 LD A,(DE) B46B 839 ; get high half B46B CB3F 840 SRL A B46D CB3F 841 SRL A B46F CB3F 842 SRL A B471 CB3F 843 SRL A B473 E60F 844 AND 0FH B475 F5 845 PUSH AF B476 846 ; add to checksum B476 81 847 ADD A,C B477 4F 848 LD C,A B478 F1 849 POP AF B479 C5 850 PUSH BC B47A D5 851 PUSH DE B47B E5 852 PUSH HL B47C 853 ; send high half B47C CDB0B3 854 CALL SHOUT B47F E1 855 POP HL B480 D1 856 POP DE B481 C1 857 POP BC B482 858 ; dec block count, packet count B482 859 ; inc pointer B482 2B 860 DEC HL B483 05 861 DEC B B484 13 862 INC DE B485 C355B4 863 JP DO2 B488 864 ; end B488 865 ENDO2 B488 866 ; send checksum B488 79 867 LD A,C B489 2F 868 CPL B48A 3C 869 INC A B48B E67F 870 AND 7FH B48D C5 871 PUSH BC B48E D5 872 PUSH DE B48F E5 873 PUSH HL B490 CDB0B3 874 CALL SHOUT B493 E1 875 POP HL B494 D1 876 POP DE B495 C1 877 POP BC B496 878 ; end B496 C331B4 879 JP DO1 B499 880 B499 3EF7 881 ENDO1 LD A,0F7H B49B CDB0B3 882 CALL SHOUT B49E 2A4CC1 883 WAIT LD HL,(BUFOFL) HiSoft GEN80 Assembler 3 Oct 87 Page: 16 B4A1 7C 884 LD A,H B4A2 BD 885 CP L B4A3 C29EB4 886 JP NZ,WAIT B4A6 CD07B3 887 CALL MSLVXT B4A9 CDD79B 888 CALL MKSCRN B4AC 889 B4AC C9 890 RET B4AD 891 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%% B4AD 892 SNDCNT B4AD 893 ; given count in A B4AD 894 ; sends it as two bytes 7 bits each B4AD 4F 895 LD C,A B4AE AF 896 XOR A B4AF CB79 897 BIT 7,C B4B1 CAB6B4 898 JP Z,SNDCN2 B4B4 3E01 899 LD A,01H B4B6 C5 900 SNDCN2 PUSH BC B4B7 CDB0B3 901 CALL SHOUT B4BA C1 902 POP BC B4BB 79 903 LD A,C B4BC E67F 904 AND 07FH B4BE CDB0B3 905 CALL SHOUT B4C1 C9 906 RET B4C2 907 B4C2 908 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&& B4C2 909 INITMD B4C2 910 B4C2 911 ;Init scan for STOP key B4C2 912 B4C2 DBAA 913 IN A,(IO_KBD) B4C4 E6F0 914 AND 0F0H B4C6 F607 915 OR 07H B4C8 D3AA 916 OUT (IO_KBD),A B4CA 917 B4CA 918 ; setup hook for clock-A handler B4CA 919 ; for portamento and pitchbend and B4CA 920 ; detune B4CA 2126C1 921 LD HL,IRQA B4CD 22A8D5 922 LD (M_ICKA),HL B4D0 923 ;set vector for midithru or not B4D0 CDFEB4 924 CALL SETMID B4D3 925 ;set vector for interrupt driven B4D3 926 ;midi transmit B4D3 CD0FB5 927 CALL SETTX B4D6 928 ; setup midi interrupt vector B4D6 929 ; and init circular buffers B4D6 930 B4D6 210000 931 LD HL,0 B4D9 224AC1 932 LD (BUFIFL),HL B4DC 224CC1 933 LD (BUFOFL),HL B4DF 934 B4DF 935 ;Init FIFO'S B4DF 0176D3 936 LD BC,TXBUF B4E2 C5 937 PUSH BC B4E3 CDDBC1 938 CALL ISYKON B4E6 C1 939 POP BC B4E7 C2EDB4 940 JP NZ, FIF1 B4EA 941 B4EA 010000 942 LD BC,0 HiSoft GEN80 Assembler 3 Oct 87 Page: 17 B4ED 943 B4ED 3E05 944 FIF1 LD A,05H B4EF 1176D4 945 LD DE,RXBUF B4F2 CDBBB0 946 CALL SCALL B4F5 947 B4F5 F3 948 DI B4F6 21A4C0 949 LD HL,MIDINT B4F9 2275F9 950 LD (0F975H),HL B4FC FB 951 EI B4FD 952 B4FD C9 953 RET B4FE 954 ;################################# B4FE 955 SETMID B4FE 956 ; depending upon midifg, set B4FE 957 ; midi vector B4FE 958 ; default is no midi thru B4FE 21C8C0 959 LD HL,MIDI05 B501 3A319B 960 LD A,(MIDIFG) B504 B7 961 OR A B505 CA0BB5 962 JP Z,SETVEC B508 963 ; set to midi thru B508 21BCC0 964 LD HL,MIDI02 B50B 22BAC0 965 SETVEC LD (MIDIXX+1),HL B50E C9 966 RET B50F 967 B50F 968 ;############## B50F 969 SETTX B50F 970 ; default is no transmit B50F 971 B50F 211BC1 972 LD HL,MIDI07 B512 E5 973 PUSH HL B513 CDDBC1 974 CALL ISYKON B516 E1 975 POP HL B517 CA1DB5 976 JP Z,SETTX1 B51A 977 ; set for midi transmit check B51A 978 B51A 21EDC0 979 LD HL,MIDI08 B51D 22EBC0 980 SETTX1 LD (MIDI04+1),HL B520 C9 981 RET B521 982 ;*********************************** B521 983 OTHRIN B521 984 ;other initialization B521 985 B521 986 ;Init voices from VOICES table B521 987 ; B521 1176CF 988 LD DE,IDB0BF B524 0600 989 LD B,0 B526 3A4D9B 990 LD A,(VOICES) B529 4F 991 LD C,A B52A 3A5D9B 992 LD A,(VELTBL) B52D CD39B2 993 CALL SETVOC B530 2A6D9B 994 LD HL,(DETUNE) B533 2279CF 995 LD (IDB0BF+3),HL B536 996 B536 11F6CF 997 LD DE,IDB1BF B539 0601 998 LD B,1 B53B 3A4E9B 999 LD A,(VOICES+1) B53E 4F 1000 LD C,A B53F 3A5E9B 1001 LD A,(VELTBL+1) HiSoft GEN80 Assembler 3 Oct 87 Page: 18 B542 CD39B2 1002 CALL SETVOC B545 2A6F9B 1003 LD HL,(DETUNE+2) B548 22F9CF 1004 LD (IDB1BF+3),HL B54B 1005 B54B 1176D0 1006 LD DE,IDB2BF B54E 0602 1007 LD B,2 B550 3A4F9B 1008 LD A,(VOICES+2) B553 4F 1009 LD C,A B554 3A5F9B 1010 LD A,(VELTBL+2) B557 CD39B2 1011 CALL SETVOC B55A 2A719B 1012 LD HL,(DETUNE+4) B55D 2279D0 1013 LD (IDB2BF+3),HL B560 1014 B560 11F6D0 1015 LD DE,IDB3BF B563 0603 1016 LD B,3 B565 3A509B 1017 LD A,(VOICES+3) B568 4F 1018 LD C,A B569 3A609B 1019 LD A,(VELTBL+3) B56C CD39B2 1020 CALL SETVOC B56F 2A739B 1021 LD HL,(DETUNE+6) B572 22F9D0 1022 LD (IDB3BF+3),HL B575 1023 B575 1024 B575 1176D1 1025 LD DE,IDB4BF B578 0604 1026 LD B,4 B57A 3A519B 1027 LD A,(VOICES+4) B57D 4F 1028 LD C,A B57E 3A619B 1029 LD A,(VELTBL+4) B581 CD39B2 1030 CALL SETVOC B584 2A759B 1031 LD HL,(DETUNE+8) B587 2279D1 1032 LD (IDB4BF+3),HL B58A 1033 B58A 1034 B58A 11F6D1 1035 LD DE,IDB5BF B58D 0605 1036 LD B,5 B58F 3A529B 1037 LD A,(VOICES+5) B592 4F 1038 LD C,A B593 3A629B 1039 LD A,(VELTBL+5) B596 CD39B2 1040 CALL SETVOC B599 2A779B 1041 LD HL,(DETUNE+10) B59C 22F9D1 1042 LD (IDB5BF+3),HL B59F 1043 B59F 1044 B59F 1176D2 1045 LD DE,IDB6BF B5A2 0606 1046 LD B,6 B5A4 3A539B 1047 LD A,(VOICES+6) B5A7 4F 1048 LD C,A B5A8 3A639B 1049 LD A,(VELTBL+6) B5AB CD39B2 1050 CALL SETVOC B5AE 2A799B 1051 LD HL,(DETUNE+12) B5B1 2279D2 1052 LD (IDB6BF+3),HL B5B4 1053 B5B4 1054 B5B4 1055 B5B4 11F6D2 1056 LD DE,IDB7BF B5B7 0607 1057 LD B,7 B5B9 3A549B 1058 LD A,(VOICES+7) B5BC 4F 1059 LD C,A B5BD 3A649B 1060 LD A,(VELTBL+7) HiSoft GEN80 Assembler 3 Oct 87 Page: 19 B5C0 CD39B2 1061 CALL SETVOC B5C3 2A7B9B 1062 LD HL,(DETUNE+14) B5C6 22F9D2 1063 LD (IDB7BF+3),HL B5C9 1064 ; B5C9 1065 B5C9 1066 ;Assign fm channels to IDB'S B5C9 1067 B5C9 3A2B9B 1068 LD A,(ALLOC) B5CC 47 1069 LD B,A B5CD 3A2C9B 1070 LD A,(ALLOC+1) B5D0 4F 1071 LD C,A B5D1 3A2D9B 1072 LD A,(ALLOC+2) B5D4 57 1073 LD D,A B5D5 3A2E9B 1074 LD A,(ALLOC+3) B5D8 5F 1075 LD E,A B5D9 3E09 1076 LD A,09H B5DB CDBBB0 1077 CALL SCALL B5DE 1078 B5DE 1079 ; set up MIDIUS table. B5DE 1080 ; for x = 0 to 7 B5DE 1081 ; if poly(x) = 0 B5DE 1082 ; then midius (x) = 0ffh B5DE 1083 ; play routines use midius B5DE 1084 B5DE 010800 1085 LD BC,8 B5E1 1086 OTHR01 B5E1 21659B 1087 LD HL,POLY B5E4 09 1088 ADD HL,BC B5E5 2B 1089 DEC HL B5E6 7E 1090 LD A,(HL) B5E7 B7 1091 OR A B5E8 3EFF 1092 LD A,0FFH B5EA CAF3B5 1093 JP Z,OTHR02 B5ED 21559B 1094 LD HL,MIDITB B5F0 09 1095 ADD HL,BC B5F1 2B 1096 DEC HL B5F2 7E 1097 LD A,(HL) B5F3 1098 OTHR02 B5F3 2142C1 1099 LD HL,MIDIUS B5F6 09 1100 ADD HL,BC B5F7 2B 1101 DEC HL B5F8 77 1102 LD (HL),A B5F9 0D 1103 DEC C B5FA C2E1B5 1104 JP NZ,OTHR01 B5FD 1105 B5FD 1106 ; init YK keyboard B5FD 217E9B 1107 LD HL,MKIDBS B600 0608 1108 LD B,8 B602 7E 1109 INITY0 LD A,(HL) B603 B7 1110 OR A B604 C20FB6 1111 JP NZ,INITYK B607 23 1112 INC HL B608 05 1113 DEC B B609 C202B6 1114 JP NZ,INITY0 B60C C325B6 1115 JP OTHRX B60F 1116 B60F 1117 INITYK B60F 1118 B60F 218FBF 1119 LD HL,MKIN HiSoft GEN80 Assembler 3 Oct 87 Page: 20 B612 22B2D5 1120 LD (AST01),HL B615 21AAB6 1121 LD HL,MIDII0 B618 22A8B6 1122 LD (MIDIIN+1),HL B61B 1123 B61B 3E00 1124 LD A,0 B61D 010000 1125 LD BC,0 B620 16A0 1126 LD D,0A0H ; default vel. B622 CDCAB0 1127 CALL KCALL B625 1128 B625 1129 OTHRX B625 CD2FB6 1130 CALL INITSU B628 CD64B6 1131 CALL INITPO B62B CD4CB6 1132 CALL STERIO B62E C9 1133 RET ;END OF INIT B62F 1134 B62F 1135 ;***** B62F 1136 INITSU B62F 1137 ; initialize sustain on/off B62F 1138 ;set IDB to sustain B62F 21869B 1139 LD HL,SUSTDAT B632 010100 1140 LD BC,1 B635 7E 1141 INSU01 LD A,(HL) B636 B7 1142 OR A B637 CA43B6 1143 JP Z,INSU00 B63A C5 1144 PUSH BC B63B E5 1145 PUSH HL B63C 3E12 1146 LD A,12H B63E CDBBB0 1147 CALL SCALL B641 E1 1148 POP HL B642 C1 1149 POP BC B643 23 1150 INSU00 INC HL B644 04 1151 INC B B645 78 1152 LD A,B B646 FE08 1153 CP 8 B648 C8 1154 RET Z B649 C335B6 1155 JP INSU01 B64C 1156 ;***** B64C 1157 STERIO B64C 1158 ; initialize stereo B64C 21969B 1159 LD HL,STEREO B64F 0600 1160 LD B,0 B651 4E 1161 STERI0 LD C,(HL) B652 C5 1162 PUSH BC B653 E5 1163 PUSH HL B654 3E17 1164 LD A,17H B656 CDBBB0 1165 CALL SCALL B659 E1 1166 POP HL B65A C1 1167 POP BC B65B 23 1168 INC HL B65C 04 1169 INC B B65D 78 1170 LD A,B B65E FE08 1171 CP 8 B660 C8 1172 RET Z B661 C351B6 1173 JP STERI0 B664 1174 ;***** B664 1175 INITPO B664 1176 ; if portamento on turns B664 1177 ; it on by loading idbx+5 B664 1178 ; with clock speed HiSoft GEN80 Assembler 3 Oct 87 Page: 21 B664 010000 1179 LD BC,0 B667 117BCF 1180 LD DE,IDB0BF+5 B66A 218E9B 1181 INITP1 LD HL,PORTON B66D 09 1182 ADD HL,BC B66E 7E 1183 LD A,(HL) B66F B7 1184 OR A B670 CA79B6 1185 JP Z,INPO0 B673 211B9B 1186 LD HL,PORTCK B676 09 1187 ADD HL,BC B677 7E 1188 LD A,(HL) B678 12 1189 LD (DE),A B679 03 1190 INPO0 INC BC B67A 79 1191 LD A,C B67B FE08 1192 CP 8 B67D C8 1193 RET Z B67E 218000 1194 LD HL,128 B681 19 1195 ADD HL,DE B682 EB 1196 EX DE,HL B683 C36AB6 1197 JP INITP1 B686 1198 B686 1199 B686 1200 B686 1201 ;############ B686 1202 MIDOUT B686 1203 ;send char in A to txbuf B686 4F 1204 LD C,A B687 2A4CC1 1205 LD HL,(BUFOFL) B68A 7D 1206 LD A,L B68B 3C 1207 INC A B68C BC 1208 CP H B68D CA86B6 1209 JP Z,MIDOUT B690 2176D3 1210 LD HL,TXBUF B693 5F 1211 LD E,A B694 1600 1212 LD D,0 B696 19 1213 ADD HL,DE B697 71 1214 LD (HL),C B698 324CC1 1215 LD (BUFOFL),A B69B 3AA5F9 1216 LD A,(0F9A5H) B69E CBCF 1217 SET 1,A B6A0 32A5F9 1218 LD (0F9A5H),A B6A3 32F63F 1219 LD (MIDSTT),A B6A6 C9 1220 RET B6A7 1221 B6A7 1222 ;################################### B6A7 1223 B6A7 1224 ;MIDIIN B6A7 1225 ; Poll for midi byte. returning B6A7 1226 ; it in A and D B6A7 1227 ; If stop key pressed,issue all B6A7 1228 ; note off and abort program. B6A7 1229 B6A7 1230 B6A7 1231 MIDIIN B6A7 C3AFB6 1232 JP MIDII1 B6AA 1233 MIDII0 B6AA 3E01 1234 LD A,01H B6AC CDCAB0 1235 CALL KCALL B6AF 1236 B6AF 1237 MIDII1 HiSoft GEN80 Assembler 3 Oct 87 Page: 22 B6AF 1238 ;If stop key pressed B6AF CDCFB0 1239 CALL CHKSTP B6B2 1240 ;then B6B2 C8 1241 RET Z B6B3 1242 else B6B3 1243 POLL B6B3 2A4AC1 1244 LD HL,(BUFIFL) B6B6 7D 1245 LD A,L B6B7 94 1246 SUB H B6B8 CAA7B6 1247 JP Z,MIDIIN B6BB 1248 B6BB 7C 1249 LD A,H B6BC 3C 1250 INC A B6BD 324BC1 1251 LD (BUFIEM),A B6C0 5F 1252 LD E,A B6C1 1600 1253 LD D,0 B6C3 2176D4 1254 LD HL,RXBUF B6C6 19 1255 ADD HL,DE B6C7 7E 1256 LD A,(HL) B6C8 FEFC 1257 CP 0FCH B6CA C0 1258 RET NZ B6CB 3E00 1259 LD A,0 B6CD CDAFB0 1260 CALL RCALL B6D0 C3A7B6 1261 JP MIDIIN B6D3 1262 B6D3 1263 ;########## B6D3 1264 CVOPM B6D3 1265 ;given OPM FORMAT B6D3 1266 ;event in DE, fills STAT B6D3 1267 ;and MINOTE for midi equivalent B6D3 1268 B6D3 0680 1269 LD B,80H B6D5 7A 1270 LD A,D B6D6 CB7F 1271 BIT 7,A B6D8 CADDB6 1272 JP Z,CVOP1 B6DB 0690 1273 LD B,90H B6DD 1274 CVOP1 B6DD 78 1275 LD A,B B6DE 32AEC1 1276 LD (STAT),A B6E1 219106 1277 LD HL,0691H B6E4 0600 1278 LD B,0 B6E6 4A 1279 LD C,D B6E7 CBB9 1280 RES 7,C B6E9 09 1281 ADD HL,BC B6EA 7E 1282 LD A,(HL) B6EB 32ADC1 1283 LD (MINOTE),A B6EE C9 1284 RET B6EF 1285 B6EF 1286 ;################################### B6EF 1287 PLAYIT B6EF 1288 ; DE contains note and veloc B6EF 1289 ; convert to opm event format B6EF 3A3EC1 1290 LD A,(MIDICH) B6F2 F690 1291 OR 90H B6F4 4F 1292 LD C,A B6F5 CDC000 1293 CALL 0C0H B6F8 79 1294 LD A,C B6F9 E60F 1295 AND 0FH B6FB 4F 1296 LD C,A HiSoft GEN80 Assembler 3 Oct 87 Page: 23 B6FC 210000 1297 LD HL,0 B6FF 1298 ; B6FF 1299 B6FF 3A42C1 1300 LD A,(MIDIUS) B702 B9 1301 CP C B703 C20FB7 1302 JP NZ,PLAY01 B706 C5 1303 PUSH BC B707 0600 1304 LD B,0 B709 CD6EBF 1305 CALL PUTINQ B70C C1 1306 POP BC B70D CBC5 1307 SET 0,L B70F 1308 PLAY01 B70F 1309 B70F 3A43C1 1310 LD A,(MIDIUS+1) B712 B9 1311 CP C B713 C21FB7 1312 JP NZ,PLAY02 B716 C5 1313 PUSH BC B717 0601 1314 LD B,1 B719 CD6EBF 1315 CALL PUTINQ B71C C1 1316 POP BC B71D CBCD 1317 SET 1,L B71F 1318 PLAY02 B71F 1319 B71F 3A44C1 1320 LD A,(MIDIUS+2) B722 B9 1321 CP C B723 C22FB7 1322 JP NZ,PLAY03 B726 C5 1323 PUSH BC B727 0602 1324 LD B,2 B729 CD6EBF 1325 CALL PUTINQ B72C C1 1326 POP BC B72D CBD5 1327 SET 2,L B72F 1328 PLAY03 B72F 3A45C1 1329 LD A,(MIDIUS+3) B732 B9 1330 CP C B733 C23FB7 1331 JP NZ,PLAY04 B736 C5 1332 PUSH BC B737 0603 1333 LD B,3 B739 CD6EBF 1334 CALL PUTINQ B73C C1 1335 POP BC B73D CBDD 1336 SET 3,L B73F 1337 PLAY04 B73F 1338 B73F 3A46C1 1339 LD A,(MIDIUS+4) B742 B9 1340 CP C B743 C24FB7 1341 JP NZ,PLAY05 B746 C5 1342 PUSH BC B747 0604 1343 LD B,4 B749 CD6EBF 1344 CALL PUTINQ B74C C1 1345 POP BC B74D CBE5 1346 SET 4,L B74F 1347 PLAY05 B74F 1348 B74F 3A47C1 1349 LD A,(MIDIUS+5) B752 B9 1350 CP C B753 C25FB7 1351 JP NZ,PLAY06 B756 C5 1352 PUSH BC B757 0605 1353 LD B,5 B759 CD6EBF 1354 CALL PUTINQ B75C C1 1355 POP BC HiSoft GEN80 Assembler 3 Oct 87 Page: 24 B75D CBED 1356 SET 5,L B75F 1357 PLAY06 B75F 1358 B75F 3A48C1 1359 LD A,(MIDIUS+6) B762 B9 1360 CP C B763 C26FB7 1361 JP NZ,PLAY07 B766 C5 1362 PUSH BC B767 0606 1363 LD B,6 B769 CD6EBF 1364 CALL PUTINQ B76C C1 1365 POP BC B76D CBF5 1366 SET 6,L B76F 1367 PLAY07 B76F 1368 B76F 3A49C1 1369 LD A,(MIDIUS+7) B772 B9 1370 CP C B773 C27FB7 1371 JP NZ,ENDPL B776 E5 1372 PUSH HL B777 1373 ;Put in queue B777 1374 B777 0607 1375 LD B,7 ;IDB# B779 CD22BF 1376 CALL QWRIT B77C 1377 B77C E1 1378 POP HL B77D CBFD 1379 SET 7,L B77F 1380 B77F 1381 ;END DO forever B77F 1382 ENDPL B77F 1383 ;play B77F EB 1384 EX DE,HL B780 CDB4B0 1385 CALL PCALL B783 1386 B783 C9 1387 RET B784 1388 ;############################ B784 1389 CHGVOC B784 1390 ; given midi channel in B B784 1391 ; and patch in C B784 3A42C1 1392 LD A,(MIDIUS) B787 B8 1393 CP B B788 C2A8B7 1394 JP NZ,OFF1 ;** B78B C5 1395 PUSH BC B78C 1396 ; issue note off to queue B78C 3E01 1397 LD A,01H B78E 0600 1398 LD B,0 ;** B790 CDAFB0 1399 CALL RCALL B793 1400 ; get/load voice B793 C1 1401 POP BC B794 C5 1402 PUSH BC B795 0600 1403 LD B,0 ;** B797 3E19 1404 LD A,19H B799 CDBBB0 1405 CALL SCALL B79C 3A41C1 1406 LD A,(PATCH) B79F 324D9B 1407 LD (VOICES),A B7A2 3E00 1408 LD A,0 B7A4 CD329B 1409 CALL SCRUPD B7A7 C1 1410 POP BC B7A8 1411 B7A8 1412 OFF1 B7A8 1413 B7A8 3A43C1 1414 LD A,(MIDIUS+1) HiSoft GEN80 Assembler 3 Oct 87 Page: 25 B7AB B8 1415 CP B B7AC C2CCB7 1416 JP NZ,OFF2 ;** B7AF C5 1417 PUSH BC B7B0 1418 ; issue note off to queue B7B0 3E01 1419 LD A,01H B7B2 0601 1420 LD B,1 ;** B7B4 CDAFB0 1421 CALL RCALL B7B7 1422 ; get/load voice B7B7 C1 1423 POP BC B7B8 C5 1424 PUSH BC B7B9 0601 1425 LD B,1 ;** B7BB 3E19 1426 LD A,19H B7BD CDBBB0 1427 CALL SCALL B7C0 3A41C1 1428 LD A,(PATCH) B7C3 324E9B 1429 LD (VOICES+1),A B7C6 3E01 1430 LD A,1 B7C8 CD329B 1431 CALL SCRUPD B7CB C1 1432 POP BC B7CC 1433 B7CC 1434 OFF2 B7CC 1435 B7CC 3A44C1 1436 LD A,(MIDIUS+2) B7CF B8 1437 CP B B7D0 C2F0B7 1438 JP NZ,OFF3 ;** B7D3 C5 1439 PUSH BC B7D4 1440 ; issue note off to queue B7D4 3E01 1441 LD A,01H B7D6 0602 1442 LD B,2 ;** B7D8 CDAFB0 1443 CALL RCALL B7DB 1444 ; get/load voice B7DB C1 1445 POP BC B7DC C5 1446 PUSH BC B7DD 0602 1447 LD B,2 ;** B7DF 3E19 1448 LD A,19H B7E1 CDBBB0 1449 CALL SCALL B7E4 3A41C1 1450 LD A,(PATCH) B7E7 324F9B 1451 LD (VOICES+2),A B7EA 3E02 1452 LD A,2 B7EC CD329B 1453 CALL SCRUPD B7EF C1 1454 POP BC B7F0 1455 B7F0 1456 OFF3 B7F0 1457 B7F0 3A45C1 1458 LD A,(MIDIUS+3) B7F3 B8 1459 CP B B7F4 C214B8 1460 JP NZ,OFF4 ;** B7F7 C5 1461 PUSH BC B7F8 1462 ; issue note off to queue B7F8 3E01 1463 LD A,01H B7FA 0603 1464 LD B,3 ;** B7FC CDAFB0 1465 CALL RCALL B7FF 1466 ; get/load voice B7FF C1 1467 POP BC B800 C5 1468 PUSH BC B801 0603 1469 LD B,3 ;** B803 3E19 1470 LD A,19H B805 CDBBB0 1471 CALL SCALL B808 3A41C1 1472 LD A,(PATCH) B80B 32509B 1473 LD (VOICES+3),A HiSoft GEN80 Assembler 3 Oct 87 Page: 26 B80E 3E03 1474 LD A,3 B810 CD329B 1475 CALL SCRUPD B813 C1 1476 POP BC B814 1477 B814 1478 OFF4 B814 1479 B814 3A46C1 1480 LD A,(MIDIUS+4) B817 B8 1481 CP B B818 C238B8 1482 JP NZ,OFF5 ;** B81B C5 1483 PUSH BC B81C 1484 ; issue note off to queue B81C 3E01 1485 LD A,01H B81E 0604 1486 LD B,4 ;** B820 CDAFB0 1487 CALL RCALL B823 1488 ; get/load voice B823 C1 1489 POP BC B824 C5 1490 PUSH BC B825 0604 1491 LD B,4 ;** B827 3E19 1492 LD A,19H B829 CDBBB0 1493 CALL SCALL B82C 3A41C1 1494 LD A,(PATCH) B82F 32519B 1495 LD (VOICES+4),A B832 3E04 1496 LD A,4 B834 CD329B 1497 CALL SCRUPD B837 C1 1498 POP BC B838 1499 B838 1500 OFF5 B838 1501 B838 3A47C1 1502 LD A,(MIDIUS+5) B83B B8 1503 CP B B83C C25CB8 1504 JP NZ,OFF6 ;** B83F C5 1505 PUSH BC B840 1506 ; issue note off to queue B840 3E01 1507 LD A,01H B842 0605 1508 LD B,5 ;** B844 CDAFB0 1509 CALL RCALL B847 1510 ; get/load voice B847 C1 1511 POP BC B848 C5 1512 PUSH BC B849 0605 1513 LD B,5 ;** B84B 3E19 1514 LD A,19H B84D CDBBB0 1515 CALL SCALL B850 3A41C1 1516 LD A,(PATCH) B853 32529B 1517 LD (VOICES+5),A B856 3E05 1518 LD A,5 B858 CD329B 1519 CALL SCRUPD B85B C1 1520 POP BC B85C 1521 B85C 1522 OFF6 B85C 1523 B85C 3A48C1 1524 LD A,(MIDIUS+6) B85F B8 1525 CP B B860 C280B8 1526 JP NZ,OFF7 ;** B863 C5 1527 PUSH BC B864 1528 ; issue note off to queue B864 3E01 1529 LD A,01H B866 0606 1530 LD B,6 ;** B868 CDAFB0 1531 CALL RCALL B86B 1532 ; get/load voice HiSoft GEN80 Assembler 3 Oct 87 Page: 27 B86B C1 1533 POP BC B86C C5 1534 PUSH BC B86D 0606 1535 LD B,6 ;** B86F 3E19 1536 LD A,19H B871 CDBBB0 1537 CALL SCALL B874 3A41C1 1538 LD A,(PATCH) B877 32539B 1539 LD (VOICES+6),A B87A 3E06 1540 LD A,6 B87C CD329B 1541 CALL SCRUPD B87F C1 1542 POP BC B880 1543 B880 1544 OFF7 B880 1545 B880 3A49C1 1546 LD A,(MIDIUS+7) B883 B8 1547 CP B B884 C2A4B8 1548 JP NZ,OFF8 ;** B887 C5 1549 PUSH BC B888 1550 ; issue note off to queue B888 3E01 1551 LD A,01H B88A 0607 1552 LD B,7 ;** B88C CDAFB0 1553 CALL RCALL B88F 1554 ; get/load voice B88F C1 1555 POP BC B890 C5 1556 PUSH BC B891 0607 1557 LD B,7 ;** B893 3E19 1558 LD A,19H B895 CDBBB0 1559 CALL SCALL B898 3A41C1 1560 LD A,(PATCH) B89B 32549B 1561 LD (VOICES+7),A B89E 3E07 1562 LD A,7 B8A0 CD329B 1563 CALL SCRUPD B8A3 C1 1564 POP BC B8A4 1565 B8A4 C9 1566 OFF8 RET B8A5 1567 B8A5 1568 ;############################ B8A5 1569 ;NOTOFF B8A5 1570 ; Given midi channel B8A5 1571 ; in B,turns off all IDB's B8A5 1572 ; for that channel B8A5 1573 NOTOFF B8A5 3A42C1 1574 LD A,(MIDIUS) ;** B8A8 B8 1575 CP B B8A9 C2B5B8 1576 JP NZ,NOFF1 ;** B8AC C5 1577 PUSH BC B8AD 1578 ; issue note off to queue B8AD 3E01 1579 LD A,01H B8AF 0600 1580 LD B,0 ;** B8B1 CDAFB0 1581 CALL RCALL B8B4 C1 1582 POP BC B8B5 1583 NOFF1 B8B5 1584 B8B5 3A43C1 1585 LD A,(MIDIUS+1);** B8B8 B8 1586 CP B B8B9 C2C5B8 1587 JP NZ,NOFF2 ;** B8BC C5 1588 PUSH BC B8BD 1589 ; issue note off to queue B8BD 3E01 1590 LD A,01H B8BF 0601 1591 LD B,1 ;** HiSoft GEN80 Assembler 3 Oct 87 Page: 28 B8C1 CDAFB0 1592 CALL RCALL B8C4 C1 1593 POP BC B8C5 1594 NOFF2 B8C5 1595 B8C5 3A44C1 1596 LD A,(MIDIUS+2);** B8C8 B8 1597 CP B B8C9 C2D5B8 1598 JP NZ,NOFF3 ;** B8CC C5 1599 PUSH BC B8CD 1600 ; issue note off to queue B8CD 3E01 1601 LD A,01H B8CF 0602 1602 LD B,2 ;** B8D1 CDAFB0 1603 CALL RCALL B8D4 C1 1604 POP BC B8D5 1605 NOFF3 B8D5 1606 B8D5 3A45C1 1607 LD A,(MIDIUS+3);** B8D8 B8 1608 CP B B8D9 C2E5B8 1609 JP NZ,NOFF4 ;** B8DC C5 1610 PUSH BC B8DD 1611 ; issue note off to queue B8DD 3E01 1612 LD A,01H B8DF 0603 1613 LD B,3 ;** B8E1 CDAFB0 1614 CALL RCALL B8E4 C1 1615 POP BC B8E5 1616 NOFF4 B8E5 1617 B8E5 3A46C1 1618 LD A,(MIDIUS+4);** B8E8 B8 1619 CP B B8E9 C2F5B8 1620 JP NZ,NOFF5 ;** B8EC C5 1621 PUSH BC B8ED 1622 ; issue note off to queue B8ED 3E01 1623 LD A,01H B8EF 0604 1624 LD B,4 ;** B8F1 CDAFB0 1625 CALL RCALL B8F4 C1 1626 POP BC B8F5 1627 NOFF5 B8F5 1628 B8F5 3A47C1 1629 LD A,(MIDIUS+5);** B8F8 B8 1630 CP B B8F9 C205B9 1631 JP NZ,NOFF6 ;** B8FC C5 1632 PUSH BC B8FD 1633 ; issue note off to queue B8FD 3E01 1634 LD A,01H B8FF 0605 1635 LD B,5 ;** B901 CDAFB0 1636 CALL RCALL B904 C1 1637 POP BC B905 1638 NOFF6 B905 1639 B905 3A48C1 1640 LD A,(MIDIUS+6);** B908 B8 1641 CP B B909 C215B9 1642 JP NZ,NOFF7 ;** B90C C5 1643 PUSH BC B90D 1644 ; issue note off to queue B90D 3E01 1645 LD A,01H B90F 0606 1646 LD B,6 ;** B911 CDAFB0 1647 CALL RCALL B914 C1 1648 POP BC B915 1649 NOFF7 B915 1650 HiSoft GEN80 Assembler 3 Oct 87 Page: 29 B915 3A49C1 1651 LD A,(MIDIUS+7);** B918 B8 1652 CP B B919 C223B9 1653 JP NZ,NOFF8 ;** B91C 1654 ; issue note off to queue B91C 3E01 1655 LD A,01H B91E 0607 1656 LD B,7 ;** B920 CDAFB0 1657 CALL RCALL B923 1658 NOFF8 B923 C9 1659 RET B924 1660 ;########################### B924 1661 PORT B924 1662 ; given midi channel in B B924 1663 ; if portamento off turns B924 1664 ; it on by loading idbx+5 B924 1665 ; with clock speed, else B924 1666 ; turns it off by loading B924 1667 ; clock speed of 0 B924 3A42C1 1668 LD A,(MIDIUS) B927 B8 1669 CP B B928 C239B9 1670 JP NZ,PORT1 B92B 3A7BCF 1671 LD A,(IDB0BF+5) B92E B7 1672 OR A B92F 3A1B9B 1673 LD A,(PORTCK) B932 CA36B9 1674 JP Z,P0SET B935 AF 1675 XOR A B936 327BCF 1676 P0SET LD (IDB0BF+5),A B939 1677 PORT1 B939 3A43C1 1678 LD A,(MIDIUS+1) B93C B8 1679 CP B B93D C24EB9 1680 JP NZ,PORT2 B940 3AFBCF 1681 LD A,(IDB1BF+5) B943 B7 1682 OR A B944 3A1C9B 1683 LD A,(PORTCK+1) B947 CA4BB9 1684 JP Z,P1SET B94A AF 1685 XOR A B94B 32FBCF 1686 P1SET LD (IDB1BF+5),A B94E 1687 PORT2 B94E 3A44C1 1688 LD A,(MIDIUS+2) B951 B8 1689 CP B B952 C263B9 1690 JP NZ,PORT3 B955 3A7BD0 1691 LD A,(IDB2BF+5) B958 B7 1692 OR A B959 3A1D9B 1693 LD A,(PORTCK+2) B95C CA60B9 1694 JP Z,P2SET B95F AF 1695 XOR A B960 327BD0 1696 P2SET LD (IDB2BF+5),A B963 1697 PORT3 B963 3A45C1 1698 LD A,(MIDIUS+3) B966 B8 1699 CP B B967 C278B9 1700 JP NZ,PORT4 B96A 3AFBD0 1701 LD A,(IDB3BF+5) B96D B7 1702 OR A B96E 3A1E9B 1703 LD A,(PORTCK+3) B971 CA75B9 1704 JP Z,P3SET B974 AF 1705 XOR A B975 32FBD0 1706 P3SET LD (IDB3BF+5),A B978 1707 PORT4 B978 3A46C1 1708 LD A,(MIDIUS+4) B97B B8 1709 CP B HiSoft GEN80 Assembler 3 Oct 87 Page: 30 B97C C28DB9 1710 JP NZ,PORT5 B97F 3A7BD1 1711 LD A,(IDB4BF+5) B982 B7 1712 OR A B983 3A1F9B 1713 LD A,(PORTCK+4) B986 CA8AB9 1714 JP Z,P4SET B989 AF 1715 XOR A B98A 327BD1 1716 P4SET LD (IDB4BF+5),A B98D 1717 PORT5 B98D 3A47C1 1718 LD A,(MIDIUS+5) B990 B8 1719 CP B B991 C2A2B9 1720 JP NZ,PORT6 B994 3AFBD1 1721 LD A,(IDB5BF+5) B997 B7 1722 OR A B998 3A209B 1723 LD A,(PORTCK+5) B99B CA9FB9 1724 JP Z,P5SET B99E AF 1725 XOR A B99F 32FBD1 1726 P5SET LD (IDB5BF+5),A B9A2 1727 PORT6 B9A2 3A48C1 1728 LD A,(MIDIUS+6) B9A5 B8 1729 CP B B9A6 C2B7B9 1730 JP NZ,PORT7 B9A9 3A7BD2 1731 LD A,(IDB6BF+5) B9AC B7 1732 OR A B9AD 3A219B 1733 LD A,(PORTCK+6) B9B0 CAB4B9 1734 JP Z,P6SET B9B3 AF 1735 XOR A B9B4 327BD2 1736 P6SET LD (IDB6BF+5),A B9B7 1737 PORT7 B9B7 3A49C1 1738 LD A,(MIDIUS+7) B9BA B8 1739 CP B B9BB C2CCB9 1740 JP NZ,PORT8 B9BE 3AFBD2 1741 LD A,(IDB7BF+5) B9C1 B7 1742 OR A B9C2 3A229B 1743 LD A,(PORTCK+7) B9C5 CAC9B9 1744 JP Z,P7SET B9C8 AF 1745 XOR A B9C9 32FBD2 1746 P7SET LD (IDB7BF+5),A B9CC 1747 PORT8 B9CC C9 1748 RET B9CD 1749 ;########################### B9CD 1750 PCLK B9CD 1751 ; given midi channel in B B9CD 1752 ; and clock speed in c B9CD 1753 ; sets portamento clock B9CD 1754 ; (PORTCK) B9CD 1755 B9CD 1756 B9CD 1757 PCLK0 B9CD 3A42C1 1758 LD A,(MIDIUS) B9D0 B8 1759 CP B B9D1 C2E3B9 1760 JP NZ,PCLK1 B9D4 79 1761 LD A,C B9D5 321B9B 1762 LD (PORTCK),A B9D8 3A7BCF 1763 LD A,(IDB0BF+5) B9DB B7 1764 OR A B9DC CAE3B9 1765 JP Z,PCLK1 B9DF 79 1766 LD A,C B9E0 327BCF 1767 LD (IDB0BF+5),A B9E3 1768 PCLK1 HiSoft GEN80 Assembler 3 Oct 87 Page: 31 B9E3 3A43C1 1769 LD A,(MIDIUS + 1) B9E6 B8 1770 CP B B9E7 C2F9B9 1771 JP NZ,PCLK2 B9EA 79 1772 LD A,C B9EB 321C9B 1773 LD (PORTCK+1),A B9EE 3AFBCF 1774 LD A,(IDB1BF+5) B9F1 B7 1775 OR A B9F2 CAF9B9 1776 JP Z,PCLK2 B9F5 79 1777 LD A,C B9F6 32FBCF 1778 LD (IDB1BF+5),A B9F9 1779 PCLK2 B9F9 3A44C1 1780 LD A,(MIDIUS + 2) B9FC B8 1781 CP B B9FD C20FBA 1782 JP NZ,PCLK3 BA00 79 1783 LD A,C BA01 321D9B 1784 LD (PORTCK+2),A BA04 3A7BD0 1785 LD A,(IDB2BF+5) BA07 B7 1786 OR A BA08 CA0FBA 1787 JP Z,PCLK3 BA0B 79 1788 LD A,C BA0C 327BD0 1789 LD (IDB2BF+5),A BA0F 1790 PCLK3 BA0F 3A45C1 1791 LD A,(MIDIUS + 3) BA12 B8 1792 CP B BA13 C225BA 1793 JP NZ,PCLK4 BA16 79 1794 LD A,C BA17 321E9B 1795 LD (PORTCK+3),A BA1A 3AFBD0 1796 LD A,(IDB3BF+5) BA1D B7 1797 OR A BA1E CA25BA 1798 JP Z,PCLK4 BA21 79 1799 LD A,C BA22 32FBD0 1800 LD (IDB3BF+5),A BA25 1801 PCLK4 BA25 3A46C1 1802 LD A,(MIDIUS + 4) BA28 B8 1803 CP B BA29 C23BBA 1804 JP NZ,PCLK5 BA2C 79 1805 LD A,C BA2D 321F9B 1806 LD (PORTCK+4),A BA30 3A7BD1 1807 LD A,(IDB4BF+5) BA33 B7 1808 OR A BA34 CA3BBA 1809 JP Z,PCLK5 BA37 79 1810 LD A,C BA38 327BD1 1811 LD (IDB4BF+5),A BA3B 1812 PCLK5 BA3B 3A47C1 1813 LD A,(MIDIUS + 5) BA3E B8 1814 CP B BA3F C251BA 1815 JP NZ,PCLK6 BA42 79 1816 LD A,C BA43 32209B 1817 LD (PORTCK+5),A BA46 3AFBD1 1818 LD A,(IDB5BF+5) BA49 B7 1819 OR A BA4A CA51BA 1820 JP Z,PCLK6 BA4D 79 1821 LD A,C BA4E 32FBD1 1822 LD (IDB5BF+5),A BA51 1823 PCLK6 BA51 3A48C1 1824 LD A,(MIDIUS + 6) BA54 B8 1825 CP B BA55 C267BA 1826 JP NZ,PCLK7 BA58 79 1827 LD A,C HiSoft GEN80 Assembler 3 Oct 87 Page: 32 BA59 32219B 1828 LD (PORTCK+6),A BA5C 3A7BD2 1829 LD A,(IDB6BF+5) BA5F B7 1830 OR A BA60 CA67BA 1831 JP Z,PCLK7 BA63 79 1832 LD A,C BA64 327BD2 1833 LD (IDB6BF+5),A BA67 1834 PCLK7 BA67 3A49C1 1835 LD A,(MIDIUS + 7) BA6A B8 1836 CP B BA6B C27DBA 1837 JP NZ,PCLK8 BA6E 79 1838 LD A,C BA6F 32229B 1839 LD (PORTCK+7),A BA72 3AFBD2 1840 LD A,(IDB7BF+5) BA75 B7 1841 OR A BA76 CA7DBA 1842 JP Z,PCLK8 BA79 79 1843 LD A,C BA7A 32FBD2 1844 LD (IDB7BF+5),A BA7D C9 1845 PCLK8 RET BA7E 1846 ;########################### BA7E 1847 PITBND BA7E 1848 ; given midi channel in B BA7E 1849 ; and pitch bend value in HL BA7E 1850 ; using only seven bits of BA7E 1851 ; each BA7E 1852 ; sets pitchbend into any BA7E 1853 ; IDB with that midi channel. BA7E 1854 BA7E 1855 ; normalize from 40,00 to 0100 BA7E 3A7D9B 1856 LD A,(PITSHT) BA81 CB25 1857 SLA L BA83 1858 NORM BA83 CB3C 1859 SRL H BA85 CB1D 1860 RR L BA87 3D 1861 DEC A BA88 C283BA 1862 JP NZ,NORM BA8B 1863 BA8B ED5B199B 1864 LD DE,(PITOFF) BA8F 1865 ; now subtract to get +/- BA8F 19 1866 ADD HL,DE BA90 EB 1867 EX DE,HL BA91 1868 BA91 3A42C1 1869 LD A,(MIDIUS) BA94 B8 1870 CP B BA95 C29FBA 1871 JP NZ,PITB1 BA98 2A6D9B 1872 LD HL,(DETUNE) BA9B 19 1873 ADD HL,DE BA9C 2279CF 1874 LD (IDB0BF+3),HL BA9F 1875 BA9F 1876 PITB1 BA9F 3A43C1 1877 LD A,(MIDIUS+1) BAA2 B8 1878 CP B BAA3 C2ADBA 1879 JP NZ,PITB2 BAA6 2A6F9B 1880 LD HL,(DETUNE+2) BAA9 19 1881 ADD HL,DE BAAA 22F9CF 1882 LD (IDB1BF+3),HL BAAD 1883 PITB2 BAAD 3A44C1 1884 LD A,(MIDIUS+2) BAB0 B8 1885 CP B BAB1 C2BBBA 1886 JP NZ,PITB3 HiSoft GEN80 Assembler 3 Oct 87 Page: 33 BAB4 2A719B 1887 LD HL,(DETUNE+4) BAB7 19 1888 ADD HL,DE BAB8 2279D0 1889 LD (IDB2BF+3),HL BABB 1890 PITB3 BABB 3A45C1 1891 LD A,(MIDIUS+3) BABE B8 1892 CP B BABF C2C9BA 1893 JP NZ,PITB4 BAC2 2A739B 1894 LD HL,(DETUNE+6) BAC5 19 1895 ADD HL,DE BAC6 22F9D0 1896 LD (IDB3BF+3),HL BAC9 1897 PITB4 BAC9 3A46C1 1898 LD A,(MIDIUS+4) BACC B8 1899 CP B BACD C2D7BA 1900 JP NZ,PITB5 BAD0 2A759B 1901 LD HL,(DETUNE+8) BAD3 19 1902 ADD HL,DE BAD4 2279D1 1903 LD (IDB4BF+3),HL BAD7 1904 PITB5 BAD7 3A47C1 1905 LD A,(MIDIUS+5) BADA B8 1906 CP B BADB C2E5BA 1907 JP NZ,PITB6 BADE 2A779B 1908 LD HL,(DETUNE+10) BAE1 19 1909 ADD HL,DE BAE2 22F9D1 1910 LD (IDB5BF+3),HL BAE5 1911 PITB6 BAE5 3A48C1 1912 LD A,(MIDIUS+6) BAE8 B8 1913 CP B BAE9 C2F3BA 1914 JP NZ,PITB7 BAEC 2A799B 1915 LD HL,(DETUNE+12) BAEF 19 1916 ADD HL,DE BAF0 2279D2 1917 LD (IDB6BF+3),HL BAF3 1918 PITB7 BAF3 3A49C1 1919 LD A,(MIDIUS+7) BAF6 B8 1920 CP B BAF7 C201BB 1921 JP NZ,PITB8 BAFA 2A7B9B 1922 LD HL,(DETUNE+14) BAFD 19 1923 ADD HL,DE BAFE 22F9D2 1924 LD (IDB7BF+3),HL BB01 1925 PITB8 BB01 C9 1926 RET BB02 1927 BB02 1928 ;########################### BB02 1929 ;SUSTAI BB02 1930 ; Given midi channel BB02 1931 ; in B, and on/off in C BB02 1932 ; sets all IDB's BB02 1933 ; for that channel sustain BB02 1934 ; on or off depending on veloc BB02 1935 BB02 1936 SUSTAI BB02 79 1937 LD A,C BB03 FE00 1938 CP 0 BB05 CA0ABB 1939 JP Z,SUST0 BB08 0E01 1940 LD C,01 BB0A 1941 ;*********************************** BB0A 3A42C1 1942 SUST0 LD A,(MIDIUS) BB0D B8 1943 CP B BB0E C21ABB 1944 JP NZ,SUSTY1 ;** BB11 C5 1945 PUSH BC HiSoft GEN80 Assembler 3 Oct 87 Page: 34 BB12 1946 ;set IDB to sustain BB12 0600 1947 LD B,0H ;** BB14 3E12 1948 LD A,12H BB16 CDBBB0 1949 CALL SCALL BB19 1950 BB19 C1 1951 POP BC BB1A 1952 BB1A 1953 SUSTY1 BB1A 1954 BB1A 3A43C1 1955 LD A,(MIDIUS+1) BB1D B8 1956 CP B BB1E C22ABB 1957 JP NZ,SUSTY2 ;** BB21 C5 1958 PUSH BC BB22 1959 ;set IDB to sustain BB22 0601 1960 LD B,01H ;** BB24 3E12 1961 LD A,12H BB26 CDBBB0 1962 CALL SCALL BB29 1963 BB29 C1 1964 POP BC BB2A 1965 BB2A 1966 SUSTY2 BB2A 1967 BB2A 3A44C1 1968 LD A,(MIDIUS+2) BB2D B8 1969 CP B BB2E C23ABB 1970 JP NZ,SUSTY3 ;** BB31 C5 1971 PUSH BC BB32 1972 ;set IDB to sustain BB32 0602 1973 LD B,02H ;** BB34 3E12 1974 LD A,12H BB36 CDBBB0 1975 CALL SCALL BB39 1976 BB39 C1 1977 POP BC BB3A 1978 BB3A 1979 SUSTY3 BB3A 1980 BB3A 3A45C1 1981 LD A,(MIDIUS+3) BB3D B8 1982 CP B BB3E C24ABB 1983 JP NZ,SUSTY4 ;** BB41 C5 1984 PUSH BC BB42 1985 ;set IDB to sustain BB42 0603 1986 LD B,03H ;** BB44 3E12 1987 LD A,12H BB46 CDBBB0 1988 CALL SCALL BB49 1989 BB49 C1 1990 POP BC BB4A 1991 BB4A 1992 SUSTY4 BB4A 1993 BB4A 3A46C1 1994 LD A,(MIDIUS+4) BB4D B8 1995 CP B BB4E C25ABB 1996 JP NZ,SUSTY5 ;** BB51 C5 1997 PUSH BC BB52 1998 ;set IDB to sustain BB52 0604 1999 LD B,04H ;** BB54 3E12 2000 LD A,12H BB56 CDBBB0 2001 CALL SCALL BB59 2002 BB59 C1 2003 POP BC BB5A 2004 HiSoft GEN80 Assembler 3 Oct 87 Page: 35 BB5A 2005 SUSTY5 BB5A 2006 BB5A 3A47C1 2007 LD A,(MIDIUS+5) BB5D B8 2008 CP B BB5E C26ABB 2009 JP NZ,SUSTY6 ;** BB61 C5 2010 PUSH BC BB62 2011 ;set IDB to sustain BB62 0605 2012 LD B,05H ;** BB64 3E12 2013 LD A,12H BB66 CDBBB0 2014 CALL SCALL BB69 2015 BB69 C1 2016 POP BC BB6A 2017 BB6A 2018 SUSTY6 BB6A 2019 BB6A 3A48C1 2020 LD A,(MIDIUS+6) BB6D B8 2021 CP B BB6E C27ABB 2022 JP NZ,SUSTY7 ;** BB71 C5 2023 PUSH BC BB72 2024 ;set IDB to sustain BB72 0606 2025 LD B,06H ;** BB74 3E12 2026 LD A,12H BB76 CDBBB0 2027 CALL SCALL BB79 2028 BB79 C1 2029 POP BC BB7A 2030 SUSTY7 BB7A 2031 BB7A 3A49C1 2032 LD A,(MIDIUS+7) BB7D B8 2033 CP B BB7E C288BB 2034 JP NZ,SUSTY8 ;** BB81 2035 ;set IDB to sustain BB81 0607 2036 LD B,07H ;** BB83 3E12 2037 LD A,12H BB85 CDBBB0 2038 CALL SCALL BB88 2039 BB88 2040 BB88 C9 2041 SUSTY8 RET BB89 2042 ;########################### BB89 2043 ; BB89 2044 ; BB89 2045 ;VOLUME BB89 2046 ; Given midi channel BB89 2047 ; in B, and volume in C BB89 2048 ; sets volume for BB89 2049 ; all IDB's for that channel BB89 2050 BB89 2051 VOLUME BB89 3A42C1 2052 LD A,(MIDIUS) BB8C B8 2053 CP B BB8D C299BB 2054 JP NZ,VOLU1 ;** BB90 C5 2055 PUSH BC BB91 2056 ;set IDB volume BB91 0600 2057 LD B,0H ;** BB93 3E13 2058 LD A,13H BB95 CDBBB0 2059 CALL SCALL BB98 C1 2060 POP BC BB99 2061 ; LD A,C BB99 2062 ; LD (VELTBL),A BB99 2063 HiSoft GEN80 Assembler 3 Oct 87 Page: 36 BB99 2064 VOLU1 BB99 2065 BB99 3A43C1 2066 LD A,(MIDIUS+1) BB9C B8 2067 CP B BB9D C2A9BB 2068 JP NZ,VOLU2 ;** BBA0 C5 2069 PUSH BC BBA1 2070 ;set IDB volume BBA1 0601 2071 LD B,01H ;** BBA3 3E13 2072 LD A,13H BBA5 CDBBB0 2073 CALL SCALL BBA8 2074 BBA8 C1 2075 POP BC BBA9 2076 ; LD A,C BBA9 2077 ; LD (VELTBL+1),A BBA9 2078 BBA9 2079 VOLU2 BBA9 2080 BBA9 3A44C1 2081 LD A,(MIDIUS+2) BBAC B8 2082 CP B BBAD C2B9BB 2083 JP NZ,VOLU3 ;** BBB0 C5 2084 PUSH BC BBB1 2085 ;set IDB volume BBB1 0602 2086 LD B,02H ;** BBB3 3E13 2087 LD A,13H BBB5 CDBBB0 2088 CALL SCALL BBB8 2089 BBB8 C1 2090 POP BC BBB9 2091 ; LD A,C BBB9 2092 ; LD (VELTBL+2),A BBB9 2093 BBB9 2094 VOLU3 BBB9 2095 BBB9 3A45C1 2096 LD A,(MIDIUS+3) BBBC B8 2097 CP B BBBD C2C9BB 2098 JP NZ,VOLU4 ;** BBC0 C5 2099 PUSH BC BBC1 2100 ;set IDB volume BBC1 0603 2101 LD B,03H ;** BBC3 3E13 2102 LD A,13H BBC5 CDBBB0 2103 CALL SCALL BBC8 2104 BBC8 C1 2105 POP BC BBC9 2106 ; LD A,C BBC9 2107 ; LD (VELTBL+3),A BBC9 2108 BBC9 2109 VOLU4 BBC9 2110 BBC9 3A46C1 2111 LD A,(MIDIUS+4) BBCC B8 2112 CP B BBCD C2D9BB 2113 JP NZ,VOLU5 ;** BBD0 C5 2114 PUSH BC BBD1 2115 ;set IDB volume BBD1 0604 2116 LD B,04H ;** BBD3 3E13 2117 LD A,13H BBD5 CDBBB0 2118 CALL SCALL BBD8 2119 BBD8 C1 2120 POP BC BBD9 2121 ; LD A,C BBD9 2122 ; LD (VELTBL+4),A HiSoft GEN80 Assembler 3 Oct 87 Page: 37 BBD9 2123 BBD9 2124 VOLU5 BBD9 2125 BBD9 3A47C1 2126 LD A,(MIDIUS+5) BBDC B8 2127 CP B BBDD C2E9BB 2128 JP NZ,VOLU6 ;** BBE0 C5 2129 PUSH BC BBE1 2130 ;set IDB volume BBE1 0605 2131 LD B,05H ;** BBE3 3E13 2132 LD A,13H BBE5 CDBBB0 2133 CALL SCALL BBE8 2134 BBE8 C1 2135 POP BC BBE9 2136 ; LD A,C BBE9 2137 ; LD (VELTBL+5),A BBE9 2138 BBE9 2139 VOLU6 BBE9 2140 BBE9 3A48C1 2141 LD A,(MIDIUS+6) BBEC B8 2142 CP B BBED C2F9BB 2143 JP NZ,VOLU7 ;** BBF0 C5 2144 PUSH BC BBF1 2145 ;set IDB volume BBF1 0606 2146 LD B,06H ;** BBF3 3E13 2147 LD A,13H BBF5 CDBBB0 2148 CALL SCALL BBF8 2149 BBF8 2150 ; LD A,C BBF8 2151 ; LD (VELTBL+6),A BBF8 C1 2152 POP BC BBF9 2153 VOLU7 BBF9 2154 BBF9 3A49C1 2155 LD A,(MIDIUS+7) BBFC B8 2156 CP B BBFD C207BC 2157 JP NZ,VOLU8 ;** BC00 2158 ;set IDB volume BC00 2159 ; LD A,C BC00 2160 ; LD (VELTBL+7),A BC00 0607 2161 LD B,07H ;** BC02 3E13 2162 LD A,13H BC04 CDBBB0 2163 CALL SCALL BC07 2164 BC07 2165 BC07 C9 2166 VOLU8 RET BC08 2167 ;########################### BC08 2168 ; BC08 2169 ;PANLRS BC08 2170 ; Given midi channel BC08 2171 ; in B, and stereo in C BC08 2172 ; sets it for BC08 2173 ; all IDB's for that channel BC08 2174 BC08 2175 PANLRS BC08 3A42C1 2176 LD A,(MIDIUS) BC0B B8 2177 CP B BC0C C218BC 2178 JP NZ,PANLR1 ;** BC0F C5 2179 PUSH BC BC10 2180 ;set IDB stereo l/r BC10 0600 2181 LD B,0H ;** HiSoft GEN80 Assembler 3 Oct 87 Page: 38 BC12 3E17 2182 LD A,17H BC14 CDBBB0 2183 CALL SCALL BC17 C1 2184 POP BC BC18 2185 BC18 2186 PANLR1 BC18 2187 BC18 3A43C1 2188 LD A,(MIDIUS+1) BC1B B8 2189 CP B BC1C C228BC 2190 JP NZ,PANLR2 ;** BC1F C5 2191 PUSH BC BC20 2192 ;set IDB stereo l/r BC20 0601 2193 LD B,01H ;** BC22 3E17 2194 LD A,17H BC24 CDBBB0 2195 CALL SCALL BC27 2196 BC27 C1 2197 POP BC BC28 2198 BC28 2199 PANLR2 BC28 2200 BC28 3A44C1 2201 LD A,(MIDIUS+2) BC2B B8 2202 CP B BC2C C238BC 2203 JP NZ,PANLR3 ;** BC2F C5 2204 PUSH BC BC30 2205 ;set IDB stereo l/r BC30 0602 2206 LD B,02H ;** BC32 3E17 2207 LD A,17H BC34 CDBBB0 2208 CALL SCALL BC37 2209 BC37 C1 2210 POP BC BC38 2211 BC38 2212 PANLR3 BC38 2213 BC38 3A45C1 2214 LD A,(MIDIUS+3) BC3B B8 2215 CP B BC3C C248BC 2216 JP NZ,PANLR4 ;** BC3F C5 2217 PUSH BC BC40 2218 ;set IDB stereo l/r BC40 0603 2219 LD B,03H ;** BC42 3E17 2220 LD A,17H BC44 CDBBB0 2221 CALL SCALL BC47 2222 BC47 C1 2223 POP BC BC48 2224 BC48 2225 PANLR4 BC48 2226 BC48 3A46C1 2227 LD A,(MIDIUS+4) BC4B B8 2228 CP B BC4C C258BC 2229 JP NZ,PANLR5 ;** BC4F C5 2230 PUSH BC BC50 2231 ;set IDB stereo l/r BC50 0604 2232 LD B,04H ;** BC52 3E17 2233 LD A,17H BC54 CDBBB0 2234 CALL SCALL BC57 2235 BC57 C1 2236 POP BC BC58 2237 BC58 2238 PANLR5 BC58 2239 BC58 3A47C1 2240 LD A,(MIDIUS+5) HiSoft GEN80 Assembler 3 Oct 87 Page: 39 BC5B B8 2241 CP B BC5C C268BC 2242 JP NZ,PANLR6 ;** BC5F C5 2243 PUSH BC BC60 2244 ;set IDB stereo l/r BC60 0605 2245 LD B,05H ;** BC62 3E17 2246 LD A,17H BC64 CDBBB0 2247 CALL SCALL BC67 2248 BC67 C1 2249 POP BC BC68 2250 BC68 2251 PANLR6 BC68 2252 BC68 3A48C1 2253 LD A,(MIDIUS+6) BC6B B8 2254 CP B BC6C C278BC 2255 JP NZ,PANLR7 ;** BC6F C5 2256 PUSH BC BC70 2257 ;set IDB stereo l/r BC70 0606 2258 LD B,06H ;** BC72 3E17 2259 LD A,17H BC74 CDBBB0 2260 CALL SCALL BC77 2261 BC77 C1 2262 POP BC BC78 2263 PANLR7 BC78 2264 BC78 3A49C1 2265 LD A,(MIDIUS+7) BC7B B8 2266 CP B BC7C C286BC 2267 JP NZ,PANLR8 ;** BC7F 2268 ;set IDB stereo l/r BC7F 0607 2269 LD B,07H ;** BC81 3E17 2270 LD A,17H BC83 CDBBB0 2271 CALL SCALL BC86 2272 BC86 2273 BC86 C9 2274 PANLR8 RET BC87 2275 ;########################### BC87 2276 ; BC87 2277 ;AMSPMS BC87 2278 ; Given midi channel BC87 2279 ; in B, and pms/ams in C BC87 2280 ; sets it for BC87 2281 ; all IDB's for that channel BC87 2282 BC87 2283 AMSPMS BC87 3A42C1 2284 LD A,(MIDIUS) BC8A B8 2285 CP B BC8B C297BC 2286 JP NZ,AMSPM1 ;** BC8E C5 2287 PUSH BC BC8F 2288 ;set IDB amspms BC8F 0600 2289 LD B,0H ;** BC91 3E18 2290 LD A,18H BC93 CDBBB0 2291 CALL SCALL BC96 C1 2292 POP BC BC97 2293 BC97 2294 AMSPM1 BC97 2295 BC97 3A43C1 2296 LD A,(MIDIUS+1) BC9A B8 2297 CP B BC9B C2A7BC 2298 JP NZ,AMSPM2 ;** BC9E C5 2299 PUSH BC HiSoft GEN80 Assembler 3 Oct 87 Page: 40 BC9F 2300 ;set IDB amspms BC9F 0601 2301 LD B,01H ;** BCA1 3E18 2302 LD A,18H BCA3 CDBBB0 2303 CALL SCALL BCA6 2304 BCA6 C1 2305 POP BC BCA7 2306 BCA7 2307 AMSPM2 BCA7 2308 BCA7 3A44C1 2309 LD A,(MIDIUS+2) BCAA B8 2310 CP B BCAB C2B7BC 2311 JP NZ,AMSPM3 ;** BCAE C5 2312 PUSH BC BCAF 2313 ;set IDB amspms BCAF 0602 2314 LD B,02H ;** BCB1 3E18 2315 LD A,18H BCB3 CDBBB0 2316 CALL SCALL BCB6 2317 BCB6 C1 2318 POP BC BCB7 2319 BCB7 2320 AMSPM3 BCB7 2321 BCB7 3A45C1 2322 LD A,(MIDIUS+3) BCBA B8 2323 CP B BCBB C2C7BC 2324 JP NZ,AMSPM4 ;** BCBE C5 2325 PUSH BC BCBF 2326 ;set IDB amspms BCBF 0603 2327 LD B,03H ;** BCC1 3E18 2328 LD A,18H BCC3 CDBBB0 2329 CALL SCALL BCC6 2330 BCC6 C1 2331 POP BC BCC7 2332 BCC7 2333 AMSPM4 BCC7 2334 BCC7 3A46C1 2335 LD A,(MIDIUS+4) BCCA B8 2336 CP B BCCB C2D7BC 2337 JP NZ,AMSPM5 ;** BCCE C5 2338 PUSH BC BCCF 2339 ;set IDB amspms BCCF 0604 2340 LD B,04H ;** BCD1 3E18 2341 LD A,18H BCD3 CDBBB0 2342 CALL SCALL BCD6 2343 BCD6 C1 2344 POP BC BCD7 2345 BCD7 2346 AMSPM5 BCD7 2347 BCD7 3A47C1 2348 LD A,(MIDIUS+5) BCDA B8 2349 CP B BCDB C2E7BC 2350 JP NZ,AMSPM6 ;** BCDE C5 2351 PUSH BC BCDF 2352 ;set IDB amspms BCDF 0605 2353 LD B,05H ;** BCE1 3E18 2354 LD A,18H BCE3 CDBBB0 2355 CALL SCALL BCE6 2356 BCE6 C1 2357 POP BC BCE7 2358 HiSoft GEN80 Assembler 3 Oct 87 Page: 41 BCE7 2359 AMSPM6 BCE7 2360 BCE7 3A48C1 2361 LD A,(MIDIUS+6) BCEA B8 2362 CP B BCEB C2F7BC 2363 JP NZ,AMSPM7 ;** BCEE C5 2364 PUSH BC BCEF 2365 ;set IDB amspms BCEF 0606 2366 LD B,06H ;** BCF1 3E18 2367 LD A,18H BCF3 CDBBB0 2368 CALL SCALL BCF6 2369 BCF6 C1 2370 POP BC BCF7 2371 AMSPM7 BCF7 2372 BCF7 3A49C1 2373 LD A,(MIDIUS+7) BCFA B8 2374 CP B BCFB C205BD 2375 JP NZ,AMSPM8 ;** BCFE 2376 ;set IDB amspms BCFE 0607 2377 LD B,07H ;** BD00 3E18 2378 LD A,18H BD02 CDBBB0 2379 CALL SCALL BD05 2380 BD05 2381 BD05 C9 2382 AMSPM8 RET BD06 2383 ;########################### BD06 2384 ; BD06 2385 ;BRILLI BD06 2386 ; Given midi channel BD06 2387 ; in B, and brilliance in C BD06 2388 ; sets it for system BD06 2389 ; if midi channel applies BD06 2390 ; to any midi defined in BD06 2391 ; this slave. BD06 2392 BRILLI BD06 1608 2393 LD D,8 BD08 2142C1 2394 LD HL,MIDIUS BD0B 78 2395 LD A,B BD0C 2396 BRILL1 BD0C BE 2397 CP (HL) BD0D C216BD 2398 JP NZ,BRILL0 BD10 3E10 2399 LD A,10H BD12 CDBBB0 2400 CALL SCALL BD15 C9 2401 RET BD16 2402 BRILL0 BD16 15 2403 DEC D BD17 C8 2404 RET Z BD18 23 2405 INC HL BD19 C30CBD 2406 JP BRILL1 BD1C 2407 ;################################## BD1C 2408 WHICHC BD1C 2409 ; decides which controller has BD1C 2410 ; come in. BD1C 3A3EC1 2411 LD A,(MIDICH) BD1F 47 2412 LD B,A BD20 3A40C1 2413 LD A,(CTRLVA) BD23 4F 2414 LD C,A BD24 3A3FC1 2415 LD A,(CTRLNO) BD27 FE7B 2416 CP 123 BD29 DA30BD 2417 JP C,WHIC00 HiSoft GEN80 Assembler 3 Oct 87 Page: 42 BD2C CDA5B8 2418 CALL NOTOFF BD2F C9 2419 RET BD30 2420 WHIC00 BD30 21369B 2421 LD HL,CNTRLS BD33 BE 2422 CP (HL) BD34 C23BBD 2423 JP NZ,WHIC01 BD37 CD02BB 2424 CALL SUSTAI BD3A C9 2425 RET BD3B 2426 WHIC01 BD3B 23 2427 INC HL BD3C BE 2428 CP (HL) BD3D C246BD 2429 JP NZ,WHIC02 BD40 CB21 2430 SLA C BD42 CD89BB 2431 CALL VOLUME BD45 C9 2432 RET BD46 2433 WHIC02 BD46 23 2434 INC HL BD47 BE 2435 CP (HL) BD48 C251BD 2436 JP NZ,WHIC03 BD4B CB21 2437 SLA C BD4D CDCDB9 2438 CALL PCLK BD50 C9 2439 RET BD51 2440 WHIC03 BD51 23 2441 INC HL BD52 BE 2442 CP (HL) BD53 C25ABD 2443 JP NZ,WHIC04 BD56 CD24B9 2444 CALL PORT BD59 C9 2445 RET BD5A 2446 WHIC04 BD5A 23 2447 INC HL BD5B BE 2448 CP (HL) BD5C C265BD 2449 JP NZ,WHIC05 BD5F CB21 2450 SLA C BD61 CD06BD 2451 CALL BRILLI BD64 C9 2452 RET BD65 2453 WHIC05 BD65 23 2454 INC HL BD66 BE 2455 CP (HL) BD67 C27FBD 2456 JP NZ,WHIC06 BD6A 79 2457 LD A,C BD6B E670 2458 AND 070H ;MASK LOW BITS BD6D 5F 2459 LD E,A BD6E 79 2460 LD A,C BD6F CB2F 2461 SRA A BD71 CB2F 2462 SRA A BD73 CB2F 2463 SRA A BD75 CB2F 2464 SRA A BD77 CB2F 2465 SRA A BD79 B3 2466 OR E BD7A 4F 2467 LD C,A BD7B CD87BC 2468 CALL AMSPMS BD7E C9 2469 RET BD7F 23 2470 WHIC06 INC HL BD80 BE 2471 CP (HL) BD81 C299BD 2472 JP NZ,WHIC07 BD84 79 2473 LD A,C BD85 0E40 2474 LD C,40H BD87 FE2B 2475 CP 2BH BD89 DA95BD 2476 JP C,DOLR HiSoft GEN80 Assembler 3 Oct 87 Page: 43 BD8C 0EC0 2477 LD C,0C0H BD8E FE55 2478 CP 55H BD90 DA95BD 2479 JP C,DOLR BD93 0E80 2480 LD C,80H BD95 CD08BC 2481 DOLR CALL PANLRS BD98 C9 2482 RET BD99 2483 BD99 2484 WHIC07 BD99 C9 2485 RET BD9A 2486 BD9A 2487 ;################################## BD9A 2488 MSLAVE BD9A 217AC1 2489 LD HL,REDLIT BD9D CDB99B 2490 CALL OUTSTR BDA0 2491 BDA0 CDE1B2 2492 CALL SUBINI BDA3 CDC2B4 2493 CALL INITMD BDA6 2494 MSLAV1 BDA6 CD21B5 2495 CALL OTHRIN BDA9 2496 ; wait for midi status byte BDA9 2497 GETSTAT BDA9 2498 BDA9 CDA7B6 2499 CALL MIDIIN BDAC CA19BF 2500 JP Z,NOMORE BDAF 2501 BDAF CB7F 2502 BIT 7,A BDB1 CAA9BD 2503 JP Z, GETSTAT BDB4 2504 BDB4 2505 GOTSTAT BDB4 4F 2506 LD C,A BDB5 2507 BDB5 FEF0 2508 CP 0F0H BDB7 CA91BE 2509 JP Z,STATF0 BDBA 2510 BDBA E6F0 2511 AND 0F0H BDBC FEA0 2512 CP 0A0H BDBE CAA9BD 2513 JP Z,GETSTAT BDC1 FED0 2514 CP 0D0H BDC3 CAA9BD 2515 JP Z,GETSTAT BDC6 47 2516 LD B,A BDC7 2517 BDC7 79 2518 LD A,C BDC8 E60F 2519 AND 0FH BDCA 213D9B 2520 LD HL,NOTINUS BDCD 5F 2521 LD E,A BDCE 1600 2522 LD D,0 BDD0 19 2523 ADD HL,DE BDD1 7E 2524 LD A,(HL) BDD2 B7 2525 OR A BDD3 C2A9BD 2526 JP NZ,GETSTAT BDD6 7B 2527 LD A,E BDD7 323EC1 2528 LD (MIDICH),A BDDA 78 2529 LD A,B BDDB 2530 BDDB FEE0 2531 CP 0E0H BDDD CA6DBE 2532 JP Z,STATE0 BDE0 2533 BDE0 FEB0 2534 CP 0B0H BDE2 CA2BBE 2535 JP Z,STATB0 HiSoft GEN80 Assembler 3 Oct 87 Page: 44 BDE5 2536 BDE5 FE80 2537 CP 80H BDE7 CAF7BD 2538 JP Z,STAT80 BDEA 2539 BDEA FE90 2540 CP 90H BDEC CA0BBE 2541 JP Z,STAT90 BDEF 2542 BDEF FEC0 2543 CP 0C0H BDF1 CA4ABE 2544 JP Z,STATC0 BDF4 2545 BDF4 2546 BDF4 C3A9BD 2547 JP GETSTAT BDF7 2548 BDF7 2549 ;############################# BDF7 2550 STAT80 BDF7 CDA7B6 2551 CALL MIDIIN BDFA CA19BF 2552 JP Z,NOMORE BDFD CB7F 2553 BIT 7,A BDFF C2B4BD 2554 JP NZ,GOTSTAT BE02 57 2555 LD D,A BE03 1E00 2556 LD E,0 BE05 CDEFB6 2557 CALL PLAYIT BE08 C3F7BD 2558 JP STAT80 BE0B 2559 BE0B 2560 ;############################### BE0B 2561 STAT90 BE0B CDA7B6 2562 CALL MIDIIN BE0E CA19BF 2563 JP Z,NOMORE BE11 CB7F 2564 BIT 7,A BE13 C2B4BD 2565 JP NZ,GOTSTAT BE16 57 2566 LD D,A BE17 D5 2567 PUSH DE BE18 CDA7B6 2568 CALL MIDIIN BE1B D1 2569 POP DE BE1C CA19BF 2570 JP Z,NOMORE BE1F CB7F 2571 BIT 7,A BE21 C2B4BD 2572 JP NZ,GOTSTAT BE24 5F 2573 LD E,A BE25 CDEFB6 2574 CALL PLAYIT BE28 C30BBE 2575 JP STAT90 BE2B 2576 BE2B 2577 ;############################### BE2B 2578 STATB0 BE2B CDA7B6 2579 CALL MIDIIN BE2E CA19BF 2580 JP Z,NOMORE BE31 CB7F 2581 BIT 7,A BE33 C2B4BD 2582 JP NZ,GOTSTAT BE36 323FC1 2583 LD (CTRLNO),A BE39 CDA7B6 2584 CALL MIDIIN BE3C CB7F 2585 BIT 7,A BE3E C2B4BD 2586 JP NZ,GOTSTAT BE41 3240C1 2587 LD (CTRLVA),A BE44 CD1CBD 2588 CALL WHICHC BE47 C32BBE 2589 JP STATB0 BE4A 2590 BE4A 2591 ;############################### BE4A 2592 STATC0 BE4A CDA7B6 2593 CALL MIDIIN BE4D CA19BF 2594 JP Z,NOMORE HiSoft GEN80 Assembler 3 Oct 87 Page: 45 BE50 CB7F 2595 BIT 7,A BE52 C2B4BD 2596 JP NZ,GOTSTAT BE55 3C 2597 INC A BE56 FE61 2598 CP 97 BE58 D24ABE 2599 JP NC,STATC0 BE5B 4F 2600 LD C,A BE5C 3241C1 2601 LD (PATCH),A BE5F 2602 BE5F CDF9B1 2603 CALL CVRTVC BE62 4F 2604 LD C,A BE63 3A3EC1 2605 LD A,(MIDICH) BE66 47 2606 LD B,A BE67 CD84B7 2607 CALL CHGVOC BE6A C34ABE 2608 JP STATC0 BE6D 2609 ;############################### BE6D 2610 STATE0 BE6D CDA7B6 2611 CALL MIDIIN BE70 CA19BF 2612 JP Z,NOMORE BE73 CB7F 2613 BIT 7,A BE75 C2B4BD 2614 JP NZ,GOTSTAT BE78 6F 2615 LD L,A BE79 E5 2616 PUSH HL BE7A CDA7B6 2617 CALL MIDIIN BE7D E1 2618 POP HL BE7E CA19BF 2619 JP Z,NOMORE BE81 CB7F 2620 BIT 7,A BE83 C2B4BD 2621 JP NZ,GOTSTAT BE86 67 2622 LD H,A BE87 3A3EC1 2623 LD A,(MIDICH) BE8A 47 2624 LD B,A BE8B CD7EBA 2625 CALL PITBND BE8E C36DBE 2626 JP STATE0 BE91 2627 BE91 2628 ;******************************** BE91 2629 STATF0 BE91 2630 ; handles sys ex receives only BE91 2631 ; CALL CLS BE91 2632 ;STATFI: CALL MIDIIN BE91 2633 ; JP Z,NOMORE BE91 2634 ; CP 0F7H BE91 2635 ; JP Z,GETSTAT BE91 2636 ; CALL SHOHEX BE91 2637 ; JP STATFI BE91 2638 BE91 CDA7B6 2639 CALL MIDIIN BE94 CA19BF 2640 JP Z,NOMORE BE97 FE43 2641 CP 43H BE99 C2E4BE 2642 JP NZ,GETF7 BE9C 2643 BE9C CDA7B6 2644 CALL MIDIIN BE9F CA19BF 2645 JP Z,NOMORE BEA2 FE75 2646 CP 75H BEA4 C2E4BE 2647 JP NZ,GETF7 BEA7 2648 BEA7 CDA7B6 2649 CALL MIDIIN BEAA CA19BF 2650 JP Z,NOMORE BEAD 21359B 2651 LD HL,SYSCHN BEB0 BE 2652 CP (HL) BEB1 C2E4BE 2653 JP NZ,GETF7 HiSoft GEN80 Assembler 3 Oct 87 Page: 46 BEB4 2654 BEB4 CDA7B6 2655 CALL MIDIIN BEB7 CA19BF 2656 JP Z,NOMORE BEBA FE00 2657 CP 0 BEBC C2F2BE 2658 JP NZ,TRYRQS BEBF 2659 BEBF CDA7B6 2660 CALL MIDIIN BEC2 CA19BF 2661 JP Z,NOMORE BEC5 FE04 2662 CP 04H ; CONFIG DUMP BEC7 CA94B1 2663 JP Z,GETFIG BECA 2664 BECA FE00 2665 CP 0 ; VOICE BANK DUMP BECC CAA0B1 2666 JP Z,GETVBK BECF C3E4BE 2667 JP GETF7 BED2 2668 BED2 F5 2669 SUMERR PUSH AF BED3 216AC1 2670 LD HL,CSUMER BED6 C3DDBE 2671 JP ALERR BED9 2672 BED9 F5 2673 F7ERR PUSH AF BEDA 215AC1 2674 LD HL,ERRMS BEDD CDB99B 2675 ALERR CALL OUTSTR BEE0 F1 2676 POP AF BEE1 CDC29B 2677 CALL SHOHUN BEE4 2678 GETF7 BEE4 CDA7B6 2679 CALL MIDIIN BEE7 CA19BF 2680 JP Z,NOMORE BEEA FEF7 2681 CP 0F7H BEEC C2E4BE 2682 JP NZ,GETF7 BEEF C3A6BD 2683 JP MSLAV1 BEF2 2684 ; see if its a dump request BEF2 2685 BEF2 2686 TRYRQS BEF2 FE20 2687 CP 20H BEF4 C2E4BE 2688 JP NZ,GETF7 BEF7 CDA7B6 2689 CALL MIDIIN BEFA CA19BF 2690 JP Z,NOMORE BEFD FE00 2691 CP 00H BEFF C2E4BE 2692 JP NZ,GETF7 BF02 2693 BF02 CDA7B6 2694 CALL MIDIIN BF05 CA19BF 2695 JP Z,NOMORE BF08 FE02 2696 CP 2 BF0A D2E4BE 2697 JP NC, GETF7 BF0D 2698 ; its a valid request for a voice BF0D 2699 ; bank dump (0 or 1) BF0D 4F 2700 LD C,A BF0E C5 2701 PUSH BC BF0F CD07B3 2702 CALL MSLVXT BF12 C1 2703 POP BC BF13 CDB9B3 2704 CALL SYSXTX BF16 C39ABD 2705 JP MSLAVE BF19 2706 BF19 2707 NOMORE BF19 2708 ; issue system all-note-off BF19 3E00 2709 LD A,0 BF1B CDAFB0 2710 CALL RCALL BF1E CD07B3 2711 CALL MSLVXT BF21 C9 2712 RET HiSoft GEN80 Assembler 3 Oct 87 Page: 47 BF22 2713 ;################################## BF22 2714 ; This is a replacement for R-call BF22 2715 ; 02, put event into Q, with less BF22 2716 ; overhead BF22 2717 QWRIT BF22 C32BBF 2718 JP QWREAL BF25 2719 BF25 3E02 2720 LD A,02H BF27 CDAFB0 2721 CALL RCALL BF2A C9 2722 RET BF2B 2723 BF2B 2724 QWREAL BF2B 2A81F9 2725 LD HL,(0F981H) BF2E 78 2726 LD A,B BF2F 87 2727 ADD A,A BF30 85 2728 ADD A,L BF31 6F 2729 LD L,A BF32 D236BF 2730 JP NC,QWR000 BF35 24 2731 INC H BF36 2732 QWR000 BF36 4E 2733 LD C,(HL) BF37 23 2734 INC HL BF38 46 2735 LD B,(HL) BF39 C5 2736 PUSH BC BF3A DDE1 2737 POP IX BF3C DDCB007E 2738 BIT 7,(IX+0) BF40 C26BBF 2739 JP NZ,QWR226 BF43 DD7E02 2740 LD A,(IX+2) BF46 C603 2741 ADD A,03H BF48 6F 2742 LD L,A BF49 2600 2743 LD H,0 BF4B 09 2744 ADD HL,BC BF4C 73 2745 LD (HL),E BF4D 23 2746 INC HL BF4E 72 2747 LD (HL),D BF4F DD7E02 2748 LD A,(IX+2) BF52 C602 2749 ADD A,02H BF54 FE20 2750 CP 20H BF56 C25ABF 2751 JP NZ,QWR215 BF59 AF 2752 XOR A BF5A 2753 QWR215 BF5A DD7702 2754 LD (IX+2),A BF5D DDBE01 2755 CP (IX+1) BF60 C267BF 2756 JP NZ,QWR221 BF63 DDCB00FE 2757 SET 7,(IX+0) BF67 DDCB0086 2758 QWR221 RES 0,(IX+0) BF6B AF 2759 QWR226 XOR A BF6C 37 2760 SCF BF6D C9 2761 RET BF6E 2762 ;********************************** BF6E 2763 PUTINQ BF6E D5 2764 PUSH DE BF6F E5 2765 PUSH HL BF70 CD22BF 2766 CALL QWRIT BF73 E1 2767 POP HL BF74 D1 2768 POP DE BF75 C9 2769 RET BF76 2770 ;********************************** BF76 2771 DOMDOU HiSoft GEN80 Assembler 3 Oct 87 Page: 48 BF76 2772 ;send midi event to txbuf BF76 2773 ;given midi channel in A, BF76 2774 ; and event in DE (velocity in BF76 2775 ;E in OPM format), uses BF76 2776 ;STAT and MINOTE BF76 D5 2777 PUSH DE BF77 F5 2778 PUSH AF BF78 3AAEC1 2779 LD A,(STAT) BF7B 4F 2780 LD C,A BF7C F1 2781 POP AF BF7D B1 2782 OR C BF7E CD86B6 2783 CALL MIDOUT BF81 3AADC1 2784 LD A,(MINOTE) BF84 CD86B6 2785 CALL MIDOUT BF87 D1 2786 POP DE BF88 7B 2787 LD A,E BF89 CB1F 2788 RR A BF8B CD86B6 2789 CALL MIDOUT BF8E C9 2790 RET BF8F 2791 BF8F 2792 ;############### BF8F 2793 BF8F 2794 MKIN BF8F 2795 ; if event on MK keyboard then BF8F 2796 ; vector goes here. BF8F 2797 ; DE has event. BF8F 2798 BF8F 2799 ;convert to midi format BF8F D5 2800 PUSH DE BF90 CDD3B6 2801 CALL CVOPM BF93 D1 2802 POP DE BF94 2803 BF94 210000 2804 LD HL,0 BF97 3A7E9B 2805 LD A,(MKIDBS) BF9A B7 2806 OR A BF9B CAB8BF 2807 JP Z,MKIN1 BF9E 0600 2808 LD B,0 BFA0 CB7A 2809 BIT 7,D BFA2 CAA9BF 2810 JP Z,MK0 BFA5 3A5D9B 2811 LD A,(VELTBL) BFA8 5F 2812 LD E,A BFA9 CD6EBF 2813 MK0 CALL PUTINQ BFAC 3A559B 2814 LD A,(MIDITB) BFAF D5 2815 PUSH DE BFB0 E5 2816 PUSH HL BFB1 CD76BF 2817 CALL DOMDOU BFB4 E1 2818 POP HL BFB5 D1 2819 POP DE BFB6 CBC5 2820 SET 0,L BFB8 2821 MKIN1 BFB8 3A7F9B 2822 LD A,(MKIDBS+1) BFBB B7 2823 OR A BFBC CAD9BF 2824 JP Z,MKIN2 BFBF 0601 2825 LD B,1 BFC1 CB7A 2826 BIT 7,D BFC3 CACABF 2827 JP Z,MK1 BFC6 3A5E9B 2828 LD A,(VELTBL+1) BFC9 5F 2829 LD E,A BFCA CD6EBF 2830 MK1 CALL PUTINQ HiSoft GEN80 Assembler 3 Oct 87 Page: 49 BFCD 3A569B 2831 LD A,(MIDITB+1) BFD0 D5 2832 PUSH DE BFD1 E5 2833 PUSH HL BFD2 CD76BF 2834 CALL DOMDOU BFD5 E1 2835 POP HL BFD6 D1 2836 POP DE BFD7 CBCD 2837 SET 1,L BFD9 2838 MKIN2 BFD9 3A809B 2839 LD A,(MKIDBS+2) BFDC B7 2840 OR A BFDD CAFABF 2841 JP Z,MKIN3 BFE0 0602 2842 LD B,2 BFE2 CB7A 2843 BIT 7,D BFE4 CAEBBF 2844 JP Z,MK2 BFE7 3A5F9B 2845 LD A,(VELTBL+2) BFEA 5F 2846 LD E,A BFEB CD6EBF 2847 MK2 CALL PUTINQ BFEE 3A579B 2848 LD A,(MIDITB+2) BFF1 D5 2849 PUSH DE BFF2 E5 2850 PUSH HL BFF3 CD76BF 2851 CALL DOMDOU BFF6 E1 2852 POP HL BFF7 D1 2853 POP DE BFF8 CBD5 2854 SET 2,L BFFA 2855 MKIN3 BFFA 3A819B 2856 LD A,(MKIDBS+3) BFFD B7 2857 OR A BFFE CA1BC0 2858 JP Z,MKIN4 C001 0603 2859 LD B,3 C003 CB7A 2860 BIT 7,D C005 CA0CC0 2861 JP Z,MK3 C008 3A609B 2862 LD A,(VELTBL+3) C00B 5F 2863 LD E,A C00C CD6EBF 2864 MK3 CALL PUTINQ C00F 3A589B 2865 LD A,(MIDITB+3) C012 D5 2866 PUSH DE C013 E5 2867 PUSH HL C014 CD76BF 2868 CALL DOMDOU C017 E1 2869 POP HL C018 D1 2870 POP DE C019 CBDD 2871 SET 3,L C01B 2872 MKIN4 C01B 3A829B 2873 LD A,(MKIDBS+4) C01E B7 2874 OR A C01F CA3CC0 2875 JP Z,MKIN5 C022 0604 2876 LD B,4 C024 CB7A 2877 BIT 7,D C026 CA2DC0 2878 JP Z,MK4 C029 3A619B 2879 LD A,(VELTBL+4) C02C 5F 2880 LD E,A C02D CD6EBF 2881 MK4 CALL PUTINQ C030 3A599B 2882 LD A,(MIDITB+4) C033 D5 2883 PUSH DE C034 E5 2884 PUSH HL C035 CD76BF 2885 CALL DOMDOU C038 E1 2886 POP HL C039 D1 2887 POP DE C03A CBE5 2888 SET 4,L C03C 2889 MKIN5 HiSoft GEN80 Assembler 3 Oct 87 Page: 50 C03C 3A839B 2890 LD A,(MKIDBS+5) C03F B7 2891 OR A C040 CA5DC0 2892 JP Z,MKIN6 C043 0605 2893 LD B,5 C045 CB7A 2894 BIT 7,D C047 CA4EC0 2895 JP Z,MK5 C04A 3A629B 2896 LD A,(VELTBL+5) C04D 5F 2897 LD E,A C04E CD6EBF 2898 MK5 CALL PUTINQ C051 3A5A9B 2899 LD A,(MIDITB+5) C054 D5 2900 PUSH DE C055 E5 2901 PUSH HL C056 CD76BF 2902 CALL DOMDOU C059 E1 2903 POP HL C05A D1 2904 POP DE C05B CBED 2905 SET 5,L C05D 2906 MKIN6 C05D 3A849B 2907 LD A,(MKIDBS+6) C060 B7 2908 OR A C061 CA7EC0 2909 JP Z,MKIN7 C064 0606 2910 LD B,6 C066 CB7A 2911 BIT 7,D C068 CA6FC0 2912 JP Z,MK6 C06B 3A639B 2913 LD A,(VELTBL+6) C06E 5F 2914 LD E,A C06F CD6EBF 2915 MK6 CALL PUTINQ C072 3A5B9B 2916 LD A,(MIDITB+6) C075 D5 2917 PUSH DE C076 E5 2918 PUSH HL C077 CD76BF 2919 CALL DOMDOU C07A E1 2920 POP HL C07B D1 2921 POP DE C07C CBF5 2922 SET 6,L C07E 2923 MKIN7 C07E 3A859B 2924 LD A,(MKIDBS+7) C081 B7 2925 OR A C082 CA9FC0 2926 JP Z,MKIN8 C085 0607 2927 LD B,7 C087 CB7A 2928 BIT 7,D C089 CA90C0 2929 JP Z,MK7 C08C 3A649B 2930 LD A,(VELTBL+7) C08F 5F 2931 LD E,A C090 CD6EBF 2932 MK7 CALL PUTINQ C093 3A5C9B 2933 LD A,(MIDITB+7) C096 D5 2934 PUSH DE C097 E5 2935 PUSH HL C098 CD76BF 2936 CALL DOMDOU C09B E1 2937 POP HL C09C D1 2938 POP DE C09D CBFD 2939 SET 7,L C09F 2940 MKIN8 C09F EB 2941 EX DE,HL C0A0 CDB4B0 2942 CALL PCALL C0A3 C9 2943 RET C0A4 2944 ;********************************** C0A4 2945 MIDINT C0A4 2946 ; Interrupt routine for midi input C0A4 2947 C0A4 F3 2948 DI HiSoft GEN80 Assembler 3 Oct 87 Page: 51 C0A5 DDE5 2949 PUSH IX C0A7 FDE5 2950 PUSH IY C0A9 F5 2951 PUSH AF C0AA C5 2952 PUSH BC C0AB D5 2953 PUSH DE C0AC E5 2954 PUSH HL C0AD 3AF63F 2955 LD A,(MIDSTT) C0B0 CB4F 2956 BIT 1,A C0B2 CAEAC0 2957 JP Z,MIDI04 C0B5 2958 C0B5 3AF53F 2959 LD A,(MIDDAT) C0B8 47 2960 LD B,A C0B9 C3BCC0 2961 MIDIXX JP MIDI02 C0BC 2962 MIDI02 C0BC 3AF63F 2963 LD A,(MIDSTT) C0BF CB47 2964 BIT 0,A C0C1 CABCC0 2965 JP Z,MIDI02 C0C4 78 2966 LD A,B C0C5 32F53F 2967 LD (MIDDAT),A C0C8 2968 MIDI05 C0C8 78 2969 LD A,B C0C9 D6F8 2970 SUB 0F8H C0CB DAD6C0 2971 JP C,MIDI06 C0CE FE04 2972 CP 04H C0D0 CAD6C0 2973 JP Z,MIDI06 C0D3 C3EAC0 2974 JP MIDI04 C0D6 2975 MIDI06 C0D6 2A4AC1 2976 LD HL,(BUFIFL) C0D9 7D 2977 LD A,L C0DA 3C 2978 INC A C0DB BC 2979 CP H C0DC CAEAC0 2980 JP Z,MIDI04 C0DF 2981 MIDI03 C0DF 2176D4 2982 LD HL,RXBUF C0E2 5F 2983 LD E,A C0E3 1600 2984 LD D,0 C0E5 19 2985 ADD HL,DE C0E6 70 2986 LD (HL),B C0E7 324AC1 2987 LD (BUFIFL),A C0EA 2988 C0EA C31BC1 2989 MIDI04 JP MIDI07 C0ED 2990 MIDI08 C0ED 3AF63F 2991 LD A,(MIDSTT) C0F0 CB47 2992 BIT 0,A ;check tx ready C0F2 CA1BC1 2993 JP Z,MIDI07 C0F5 2994 C0F5 2A4CC1 2995 LD HL,(BUFOFL) C0F8 7C 2996 LD A,H C0F9 BD 2997 CP L C0FA CA10C1 2998 JP Z,MIDI10 C0FD 7C 2999 LD A,H C0FE 3C 3000 INC A C0FF 324DC1 3001 LD (BUFOEM),A C102 2176D3 3002 LD HL,TXBUF C105 5F 3003 LD E,A C106 1600 3004 LD D,0 C108 19 3005 ADD HL,DE C109 7E 3006 LD A,(HL) C10A 32F53F 3007 LD (MIDDAT),A HiSoft GEN80 Assembler 3 Oct 87 Page: 52 C10D C31BC1 3008 JP MIDI07 C110 3009 ; turn off interrupt enable C110 3010 MIDI10 C110 3AA5F9 3011 LD A,(0F9A5H) C113 CB8F 3012 RES 1,A C115 32A5F9 3013 LD (0F9A5H),A C118 32F63F 3014 LD (MIDSTT),A C11B 3015 C11B 3016 MIDI07 C11B E1 3017 POP HL C11C D1 3018 POP DE C11D C1 3019 POP BC C11E F1 3020 POP AF C11F FDE1 3021 POP IY C121 DDE1 3022 POP IX C123 FB 3023 EI C124 ED4D 3024 RETI C126 3025 C126 3026 ;********************************** C126 3027 IRQA C126 3028 ; handler for clock-A interrupt C126 DDE5 3029 PUSH IX C128 FDE5 3030 PUSH IY C12A D5 3031 PUSH DE C12B C5 3032 PUSH BC C12C E5 3033 PUSH HL C12D F5 3034 PUSH AF C12E 3E19 3035 LD A,19H C130 CDAFB0 3036 CALL RCALL C133 F1 3037 POP AF C134 E1 3038 POP HL C135 C1 3039 POP BC C136 D1 3040 POP DE C137 FDE1 3041 POP IY C139 DDE1 3042 POP IX C13B FB 3043 EI C13C ED4D 3044 RETI C13E 3045 C13E 3046 C13E 3047 ;******* DATA AREAS ******** C13E 3048 C13E 00 3049 MIDICH DEFB 0 C13F 00 3050 CTRLNO DEFB 0 C140 00 3051 CTRLVA DEFB 0 C141 00 3052 PATCH DEFB 0 C142 3053 C142 00010203 3054 MIDIUS DEFB 0,1,2,3,4,5,6,7 C14A 3055 C14A 3056 C14A 00 3057 BUFIFL DEFB 0 C14B 00 3058 BUFIEM DEFB 0 C14C 00 3059 BUFOFL DEFB 0 C14D 00 3060 BUFOEM DEFB 0 C14E 3061 C14E FF010F12 3062 LOADMS DEFB 0FFH,1,15,18 C152 4C4F4144 3063 DEFM "LOADING" C159 00 3064 DEFB 0 C15A FF011801 3065 ERRMS DEFB 0FFH,1,24,1 C15E 4D494449 3066 DEFM "MIDI ERROR " HiSoft GEN80 Assembler 3 Oct 87 Page: 53 C169 00 3067 DEFB 0 C16A 3068 C16A FF011801 3069 CSUMER DEFB 0FFH,1,24,1 C16E 43484543 3070 DEFM "CHECKSUM " C179 00 3071 DEFB 0 C17A 3072 C17A FF010F0F 3073 REDLIT DEFB 0FFH,1,15,15 C17E FF03F8 3074 DEFB 0FFH,3,0F8H;WH ON RED C181 202A2020 3075 DEFM " * PLAYING * " C191 FF01100F 3076 DEFB 0FFH,1,16,15 C195 546F2065 3077 DEFM "To edit hit STOP" C1A5 FF04 3078 DEFB 0FFH,4 C1A7 00 3079 DEFB 0 C1A8 3080 C1A8 00 3081 PRISLT DEFB 0 C1A9 00 3082 SECSLT DEFB 0 C1AA 00 3083 NEWPRI DEFB 0 C1AB 00 3084 NEWSEC DEFB 0 C1AC 03 3085 LASKEY DEFB 03H C1AD 00 3086 MINOTE DEFB 0 C1AE 00 3087 STAT DEFB 0 C1AF 00 3088 CHKSUM DEFB 0 C1B0 00000000 3089 OLDNAM DEFB 0,0,0,0,0,0,0,0 C1B8 3090 BANKNM C1B8 00 3091 ENDCOD DEFB 0 C1B9 3092 C1B9 3093 9ADD 3094 ORG UVL2+3111 9ADD 3095 ; PUBLIC DATA AREA 9ADD 02 3096 FCB1 DEFB 02H ;READ UVL 9ADE 21 3097 DEFB 21H ;DRIVE A 9ADF 0000 3098 DEFW 0 9AE1 0000 3099 DEFW 0 9AE3 564F4943 3100 DEFM "VOICEFILVOG" 9AEE 8F82 3101 UVL1PT DEFW UVL1 9AF0 3102 9AF0 02 3103 FCB2 DEFB 02H 9AF1 21 3104 DEFB 21H 9AF2 0000 3105 DEFW 0 9AF4 0000 3106 DEFW 0 9AF6 56435345 3107 DEFM "VCSET01 VOG" 9B01 B68E 3108 UVL2PT DEFW UVL2 9B03 3109 9B03 00 3110 FCB3 DEFB 00H 9B04 21 3111 DEFB 21H 9B05 0080 3112 DEFW 8000H 9B07 514C 3113 DEFW (SCRARR-8000H) 9B09 4D494449 3114 DEFM "MIDISLAV " 9B14 B68E 3115 UVL3PT DEFW UVL2 9B16 020202 3116 DEVICS DEFB 2,2,2 9B19 00E0 3117 PITOFF DEFW 0E000H 9B1B 80808080 3118 PORTCK DEFB 80H,80H,80H,80H 9B1F 80808080 3119 DEFB 80H,80H,80H,80H 9B23 01010101 3120 PLYTMP DEFB 1,1,1,1,1,1,1,1 9B2B 01234567 3121 ALLOC DEFB 01H,23H,45H,67H 9B2F 0000 3122 MIDIVC DEFW 0 9B31 00 3123 MIDIFG DEFB 0 9B32 3124 ; this is changed if no screen 9B32 3125 ; update is desired during HiSoft GEN80 Assembler 3 Oct 87 Page: 54 9B32 3126 ; play. If no update desired, 9B32 3127 ; then change jump to return. 9B32 3128 ; If update on then put back to jump. 9B32 3129 9B32 C3EC9B 3130 SCRUPD JP DSPATC 9B35 00 3131 SYSCHN DEFB 0 ; INSTRMENT # 9B36 3132 9B36 3133 ; controller numbers incase 9B36 3134 ; they are changable later 9B36 3135 9B36 40070541 3136 CNTRLS DEFB 64,7,5,65,3,1,8 9B3D 3137 9B3D 00000000 3138 NOTINUS DEFB 0,0,0,0,0,0,0,0 9B45 00000000 3139 DEFB 0,0,0,0,0,0,0,0 9B4D 3140 9B4D 3141 ;-------------------- 9B4D 04011112 3142 VOICES DEFB 4,1,17,18 9B51 34404A4D 3143 DEFB 52,64,74,77 9B55 3144 9B55 00010203 3145 MIDITB DEFB 0,1,2,3,4,5,6,7 9B5D C8C8C8C8 3146 VELTBL DEFB 200,200,200,200 9B61 C8C8C8C8 3147 DEFB 200,200,200,200 9B65 3148 9B65 01010101 3149 POLY DEFB 1,1,1,1,1,1,1,1 9B6D 3150 9B6D 3151 9B6D 00000000 3152 DETUNE DEFW 0,0,0,0,0,0,0,0 9B7D 3153 9B7D 3154 ;this will be address of either 9B7D 3155 ;the place to do midi out or 9B7D 3156 ;to code beyond it. If the flag 9B7D 3157 ;is 0 then no midi out, else 9B7D 3158 ;if flag is 0ffh the midi out. 9B7D 3159 9B7D 01 3160 PITSHT DEFB 1 9B7E 3161 ;array for which idb's the YKxx is 9B7E 3162 ;playing 9B7E 3163 9B7E 00000000 3164 MKIDBS DEFB 0,0,0,0,0,0,0,0 9B86 3165 ; initial sustain on/off for idbs 9B86 3166 9B86 00000000 3167 SUSTDAT DEFB 0,0,0,0,0,0,0,0 9B8E 3168 ;initial setting of portamento on/off 9B8E 3169 9B8E 00000000 3170 PORTON DEFB 0,0,0,0,0,0,0,0 9B96 3171 9B96 3172 ; to make sure that code is after 9B96 3173 ; first block read from disk 9B96 3174 ; to keep later versions able 9B96 3175 ; to use early setup files. 9B96 3176 9B96 C0C0C0C0 3177 STEREO DEFB 0C0H,0C0H,0C0H,0C0H 9B9A C0C0C0C0 3178 DEFB 0C0H,0C0H,0C0H,0C0H 9B9E 3179 ;------------ 9B9E 3180 9B9E 3181 9B9E C30000 3182 CLS JP VECTOR 9BA1 C30000 3183 SETCLR JP VECTOR 9BA4 C30000 3184 SETCRS JP VECTOR HiSoft GEN80 Assembler 3 Oct 87 Page: 55 9BA7 C30000 3185 HLX32 JP VECTOR 9BAA C30000 3186 HLX8 JP VECTOR 9BAD C30000 3187 INCCRS JP VECTOR 9BB0 C30000 3188 DECCRS JP VECTOR 9BB3 C30000 3189 OUTCHR JP VECTOR 9BB6 C30000 3190 CONOUT JP VECTOR 9BB9 C30000 3191 OUTSTR JP VECTOR 9BBC C30000 3192 OUTMES JP VECTOR 9BBF C30000 3193 GETUVL JP VECTOR 9BC2 C30000 3194 SHOHUN JP VECTOR 9BC5 C30000 3195 SHONUM JP VECTOR 9BC8 C30000 3196 SHONAM JP VECTOR 9BCB C30000 3197 GETNAM JP VECTOR 9BCE C30000 3198 GETFCB JP VECTOR 9BD1 C30000 3199 MSXWRI JP VECTOR 9BD4 C30000 3200 MSXRDF JP VECTOR 9BD7 C30000 3201 MKSCRN JP VECTOR 9BDA C30000 3202 ONINV JP VECTOR 9BDD C30000 3203 OFFINV JP VECTOR 9BE0 C30000 3204 GOPLAY JP VECTOR 9BE3 C30000 3205 MKNUMB JP VECTOR 9BE6 C30000 3206 GETLIN JP VECTOR 9BE9 C30000 3207 HELP JP VECTOR 9BEC C30000 3208 DSPATC JP VECTOR 9BEF C30000 3209 SHOWMT JP VECTOR 9BF2 C30000 3210 SHOWUP JP VECTOR 9BF5 C30000 3211 FILERR JP VECTOR 9BF8 C30000 3212 SCRNPR JP VECTOR 9BFB C30000 3213 PROUT JP VECTOR 9BFE C30000 3214 CHGET JP VECTOR 9C01 0000 3215 TXTBUF DEFW 0 9C03 0000 3216 DEVTBL DEFW 0 9C05 3217 0000 3218 VECTOR EQU 0 9C05 3219 C1C0 3220 ORG 0C1C0H C1C0 C3C0C1 3221 LISTER JP LISTER C1C3 C3C3C1 3222 MORHLP JP MORHLP C1C6 C3C6C1 3223 WRTVRM JP WRTVRM C1C9 C3C9C1 3224 FILVRM JP FILVRM C1CC C3CCC1 3225 LDIRVM JP LDIRVM C1CF C3CFC1 3226 FDIR JP FDIR C1D2 C3D2C1 3227 BLOAD JP BLOAD C1D5 C3D5C1 3228 BSAVE JP BSAVE C1D8 C3D8C1 3229 CHEKYK JP CHEKYK C1DB C3DBC1 3230 ISYKON JP ISYKON C1DE C3DEC1 3231 WRTEEP JP WRTEEP C1E1 C3E1C1 3232 RDEEP JP RDEEP C1E4 )Úùwͫͷ͓>͙ͥ͜ͱ͖۩g! wO:2>22>G:1/21> ͳ????0:)ͳ0:8ͳ> ͳOͧ'OͧoGͧG'''' SͧȀʏ><>ͧøͧپ2ʸͧѱAҾø:!㚷!=כ!z͹éy1nyey?v>ͻ0{=O>ͻy@O>ͻ>ͻxW> ͻO>ͻO>ͻ>ͻ>ͻۨ2OyӨ:/2_{2!۲#Ÿy2{2:2:Ө:2‘:Ө ‚زMCHFM0ۨ2:Ө:/2:2vͥ> ͻͪ:2:Өen!N͹^#V>ͻ~ `È> ͻڌ!#~+ˆ͕Œ?^#V# ¦͆!"!">vͻ!"J"L!"uͤ>Ͱ>CͰ>uͰ:5ͰͰ! y#y=#!xͰyͰ|ʙ|A}AF@GEx'ͭxʈOͰ????OͰ+Uy/<Ͱ1>Ͱ*L|žכOyʶ>ͰyͰ۪Ӫ!&"!"J"Lv>vͻ!"u!:1 !"!!"v:MO:]9*m"y:NO:^9*o"v:OO:_9*q"y:PO:`9*s"v:QO:a9*u"y:RO:b9*w"v:SO:c9*y"y:TO:d9*{":+G:,O:-W:._> ͻ!e +~>!U +~!B +w !~~#%!"!">ʰ/dL!~C>ͻ#x5!N>ͻ#xQ{! ~y! ~y!jO*L}<ʆ!v_q2L:22?ï>ʰϰ*J}ʧ|<2K_!v~>ͯçzݶx2!J˹ ~2:>OyO!:Bn:Cn:D/n:E?n:FOn:G_n:Hon:I"ʹ:B¨>ͯ>ͻ:A2M>2:C̷>ͯ>ͻ:A2N>2:D>ͯ>ͻ:A2O>2:E>ͯ>ͻ:A2P>2:F8>ͯ>ͻ:A2Q>2:G\>ͯ>ͻ:A2R>2:H€>ͯ>ͻ:A2S>2:I¤>ͯ>ͻ:A2T>2:Bµ>ͯ:CŸ>ͯ:Dո>ͯ:E>ͯ:F>ͯ:G>ͯ:H>ͯ:I#>ͯ:B9:{Ϸ:62{:CN:Ϸ:K2:Dc:{з:`2{:Ex:з:u2:F:{ѷ:ʊ2{:G¢:ѷ: ʟ2:H·:{ҷ:!ʴ2{:I̹:ҷ:"ɹ2:By2:{Ϸy2{:Cy2:Ϸy2:Dy2:{зy2{:E%y2:з%y2:F;y2:{ѷ;y2{:GQy2 :ѷQy2:Hgy2!:{ҷgy2{:I}y2":ҷ}y2:}%<=ƒ[:BŸ*m"y:C­*o":D»*q"y:Eɺ*s":F׺*u"y:G*w":H*y"y:I*{"y :B>ͻ:C*>ͻ:D:>ͻ:EJ>ͻ:FZ>ͻ:Gj>ͻ:Hz>ͻ:Iˆ>ͻ:B™>ͻ:C©>ͻ:D¹>ͻ:Eɻ>ͻ:Fٻ>ͻ:G>ͻ:H>ͻ:I>ͻ:B>ͻ:C(>ͻ:D8>ͻ:EH>ͻ:FX>ͻ:Gh>ͻ:Hx>ͻ:I†>ͻ:B—>ͻ:C§>ͻ:D·>ͻ:EǼ>ͻ:F׼>ͻ:G>ͻ:H>ͻ:I>ͻ!Bx>ͻ# :>G:@O:?{0ͥ!6;#F!͉#Q!͹#Z$#e!#yp_y/////O͇#™y@+ڕUڕ!z͹´!ͧʩOʑʩʩGy!=_~©{2>xm+ Jéͧ´Wͧ´Wͧ´_ ͧ´2?ͧ´2@+ͧ´G̈́Jͧ´oͧ´g:>G~mͧCͧuͧ!5ͧͧʔʠ!jݾ!Z͹›ͧæ ͧͧO͹Ú>ͯ+>ͯ*xo6$N#F~k~o& s#r~ Zwݾg7":O͆:͆{͆Ӷ!:~ʸzʩ:]_n:Uv:ٿzʿ:^_n:Vv:z:__n:Wv:z :`_n:Xv:<z-:a_n:Yv:]zN:b_n:Zv:~zo:c_n:[v:ʟzʐ:d_n:\vʹ:?O:?Gü:?Gʼx2?x*J}ͯMLOADINGMIDI ERROR CHECKSUM  * PLAYING * To edit hit STOP!VOICEFILVOG!VCSET01 VOG!QLMIDISLAV #Eg@A4@JMRdDdUFIFL),A MIDI04: JP MIDI07 MIDI08: LD A,(MIDSTT) BIT 0,A;check tx ready JP Z,MIDI07 LD HL,(BUFOFL) LD A,H ING * To edit hit STOP!VOICEFILVOG!VCSET01 VOG!QLMIDISLAV #Eg@A4@JMB090 CODSTT C1B8 ENDCOD 8007 PRESET 828F UVL1 8EB6 UVL2 DE76 STACK DD76 BOTSTK D576 MIDB D476 RXBUF D376 TXBUF D2F6 IDB7BF D276 IDB6BF D1F6 IDB5BF D176 IDB4BF D0F6 IDB3BF D076 IDB2BF CFF6 IDB1BF CF76 IDB0BF CF51 MSXFCB CC51 SCRARR C851 CHARSET 3FF6 MIDSTT 3FF5 MIDDAT 00A8 IO_PPA 00AA IO_KBD 00A9 IN_KBD FFFF MM_PPA D5A8 M_ICKA D5B2 AST01 B316 MSINIT B329 RWFILE BD9A MSLAVE B4FE SETMID B3B9 SYSXTX B110 SHOHEX B277 SEARCH B0A5 ICALL B0AA ECALL B0AF RCALL B0B4 PCALL B0BB SCALL B0C0 MCALL B0C5 FCALL B0CA KCALL B0CF CHKSTP C1AC LASKEY B10D NOCHG B0FD CHKST0 9B32 SCRUPD B0F8 CHKST1 B0EE CHKST2 9BF2 SHOWUP 9B31 MIDIFG 9BEF SHOWMT 9BB3 OUTCHR B129 SHOHX1 B138 SHOHX2 B141 GETPAK B6A7 MIDIIN B153 GETPK0 B18F PAKOK B194 GETFIG BF19 NOMORE B1B8 GETVB0 B1A0 GETVBK BED9 F7ERR C1B8 BANKNM B1D1 SSXDON BED2 SUMERR 9ADD FCB1 B1EB SSXMV 9AF0 FCB2 B1ED SSXEND 9BD7 MKSCRN C17A REDLIT 9BB9 OUTSTR BDA9 GETSTAT B1F9 CVRTVC B208 CVERT0 B26E DFUVL2 B265 DFUVL1 B211 INIUVL B21D INIU0 B239 SETVOC C1A8 PRISLT B282 SRCHL1 C1A9 SECSLT B291 SRCHL2 B2DB FMNAME B29F CMPR B2C1 NOTFND B2AA FOUND C1AA NEWPRI C1AB NEWSEC B2D8 HANG B2E1 SUBINI B307 MSLVXT C1B0 OLDNAM C14E LOADMS B360 RWFIL1 B388 RWFILX B38C RWFILQ B395 CPNAME 9BF5 FILERR B3A6 CPNAM0 B3B0 SHOUT B686 MIDOUT C0C8 MIDI05 C0B9 MIDIXX C0ED MIDI08 C0EA MIDI04 C14A BUFIFL C14C BUFOFL C0A4 MIDINT 9BA4 SETCRS 9B35 SYSCHN B423 SYSXT0 9B9E CLS B431 DO1 B499 ENDO1 B441 THEN B446 ELSE B447 ENDIF B4AD SNDCNT B455 DO2 B488 ENDO2 B49E WAIT B4B6 SNDCN2 B4C2 INITMD C126 IRQA B50F SETTX C1DB ISYKON B4ED FIF1 B50B SETVEC C0BC MIDI02 C11B MIDI07 B51D SETTX1 B521 OTHRIN 9B4D VOICES 9B5D VELTBL 9B6D DETUNE 9B2B ALLOC B5E1 OTHR01 9B65 POLY B5F3 OTHR02 9B55 MIDITB C142 MIDIUS 9B7E MKIDBS B602 INITY0 B60F INITYK B625 OTHRX BF8F MKIN B6AA MIDII0 B62F INITSU B664 INITPO B64C STERIO 9B86 SUSTDAT B635 INSU01 B643 INSU00 9B96 STEREO B651 STERI0 B66A INITP1 9B8E PORTON B679 INPO0 9B1B PORTCK B6AF MIDII1 B6B3 else B6B3 POLL C14B BUFIEM B6D3 CVOPM B6DD CVOP1 C1AE STAT C1AD MINOTE B6EF PLAYIT C13E MIDICH B70F PLAY01 BF6E PUTINQ B71F PLAY02 B72F PLAY03 B73F PLAY04 B74F PLAY05 B75F PLAY06 B76F PLAY07 B77F ENDPL BF22 QWRIT B784 CHGVOC B7A8 OFF1 C141 PATCH B7CC OFF2 B7F0 OFF3 B814 OFF4 B838 OFF5 B85C OFF6 B880 OFF7 B8A4 OFF8 B8A5 NOTOFF B8B5 NOFF1 B8C5 NOFF2 B8D5 NOFF3 B8E5 NOFF4 B8F5 NOFF5 B905 NOFF6 B915 NOFF7 B923 NOFF8 B924 PORT B939 PORT1 B936 P0SET B94E PORT2 B94B P1SET B963 PORT3 B960 P2SET B978 PORT4 B975 P3SET B98D PORT5 B98A P4SET B9A2 PORT6 B99F P5SET B9B7 PORT7 B9B4 P6SET B9CC PORT8 B9C9 P7SET B9CD PCLK B9CD PCLK0 B9E3 PCLK1 B9F9 PCLK2 BA0F PCLK3 BA25 PCLK4 BA3B PCLK5 BA51 PCLK6 BA67 PCLK7 BA7D PCLK8 BA7E PITBND 9B7D PITSHT BA83 NORM 9B19 PITOFF BA9F PITB1 BAAD PITB2 BABB PITB3 BAC9 PITB4 BAD7 PITB5 BAE5 PITB6 BAF3 PITB7 BB01 PITB8 BB02 SUSTAI BB0A SUST0 BB1A SUSTY1 BB2A SUSTY2 BB3A SUSTY3 BB4A SUSTY4 BB5A SUSTY5 BB6A SUSTY6 BB7A SUSTY7 BB88 SUSTY8 BB89 VOLUME BB99 VOLU1 BBA9 VOLU2 BBB9 VOLU3 BBC9 VOLU4 BBD9 VOLU5 BBE9 VOLU6 BBF9 VOLU7 BC07 VOLU8 BC08 PANLRS BC18 PANLR1 BC28 PANLR2 BC38 PANLR3 BC48 PANLR4 BC58 PANLR5 BC68 PANLR6 BC78 PANLR7 BC86 PANLR8 BC87 AMSPMS BC97 AMSPM1 BCA7 AMSPM2 BCB7 AMSPM3 BCC7 AMSPM4 BCD7 AMSPM5 BCE7 AMSPM6 BCF7 AMSPM7 BD05 AMSPM8 BD06 BRILLI BD0C BRILL1 BD16 BRILL0 BD1C WHICHC C140 CTRLVA C13F CTRLNO BD30 WHIC00 9B36 CNTRLS BD3B WHIC01 BD46 WHIC02 BD51 WHIC03 BD5A WHIC04 BD65 WHIC05 BD7F WHIC06 BD99 WHIC07 BD95 DOLR BDA6 MSLAV1 BDB4 GOTSTAT BE91 STATF0 9B3D NOTINUS BE6D STATE0 BE2B STATB0 BDF7 STAT80 BE0B STAT90 BE4A STATC0 BEE4 GETF7 BEF2 TRYRQS C16A CSUMER BEDD ALERR C15A ERRMS 9BC2 SHOHUN BF2B QWREAL BF36 QWR000 BF6B QWR226 BF5A QWR215 BF67 QWR221 BF76 DOMDOU BFB8 MKIN1 BFA9 MK0 BFD9 MKIN2 BFCA MK1 BFFA MKIN3 BFEB MK2 C01B MKIN4 C00C MK3 C03C MKIN5 C02D MK4 C05D MKIN6 C04E MK5 C07E MKIN7 C06F MK6 C09F MKIN8 C090 MK7 C0D6 MIDI06 C0DF MIDI03 C110 MIDI10 C14D BUFOEM C1AF CHKSUM 9AEE UVL1PT 9B01 UVL2PT 9B03 FCB3 9B14 UVL3PT 9B16 DEVICS 9B23 PLYTMP 9B2F MIDIVC 9BEC DSPATC 0000 VECTOR 9BA1 SETCLR 9BA7 HLX32 9BAA HLX8 9BAD INCCRS 9BB0 DECCRS 9BB6 CONOUT 9BBC OUTMES 9BBF GETUVL 9BC5 SHONUM 9BC8 SHONAM 9BCB GETNAM 9BCE GETFCB 9BD1 MSXWRI 9BD4 MSXRDF 9BDA ONINV 9BDD OFFINV 9BE0 GOPLAY 9BE3 MKNUMB 9BE6 GETLIN 9BE9 HELP 9BF8 SCRNPR 9BFB PROUT 9BFE CHGET 9C01 TXTBUF 9C03 DEVTBL C1C0 LISTER C1C3 MORHLP C1C6 WRTVRM C1C9 FILVRM C1CC LDIRVM C1CF FDIR C1D2 BLOAD C1D5 BSAVE C1D8 CHEKYK C1DE WRTEEP C1E1 RDEEP 4@JM~ #ٯ ]$ ]N!!!! b]P b] #XZZZ]Z_ZcZfZjZlZoZ:LO:LZ(Z!!FZ N#fiͧZ(ZZ#~ Z!$M1M ~( ( 7ݾ +!DXX!XX!yXX**@[.@"*@[!XX!`XX*,@[.@",@[!XX!".@([[**@dR8 y:0@Wu[(a:2@O !!tT N#fi**@ "*@͜YX ʥ[y z[:2@_#!T^#fkXz {22@[>24@y[:2@[= **@"*@_#!T^#fk͜YX22@( ů20@*,@dR8 y:1@W2\( 3233 C1E4 3234 END Pass 2 errors: 00 *WARNING* ORGs used: 03 Symbol Table used: 04K out of 14K.  3233 C1E4 3234 END Pass 2 errors: 00 *WARNING* ORGs used: 03 Symbol Table used: 04K out of 14K. BUF 9C03 DEVTBL C1C0 LISTER C1C3 MORHLP C1C6 WRTVRM C1C9 FILVRM C1CC LDIRVM C1CF FDIR C1D2 BLOAD C1D5 BSAVE C1D8 CHEKYK C1DE WRTEEP C1E1 RDEEP 4@JM "MIDISLAV",R8lfff>|~L2~ @   @K( MIDISLAV V1.5@&p&&&& &P&p&&&&0&y zP&&&&&&0&P&&&&& COMMANDS The list displayed when the ESC key is hit shows what commands are available for the field on which the cursor sits. Different fields have different commands available. The next screens show a brief summary of all available commands. For more detail, when prompted for the next subject, enter CTRL followed by the letter (i.e. CTRLW will display more help on that command.) For brevity the CTRL key is abbreviated '^'. ^A - increment or add 1 to a parameter. ^B - go to next pitchbend range. ^C - copy a patch from one position to another. ^D - load the default voices ROM'd in the SFG-05. ^E - exit from MIDISLAV. ^F - list disk files. ^G - get the file on which the cursor rests. ^I - increment the system instrument number. ^K - enable brilliance for a voice or bank(s). ^L - set output to left,right or center. ^O - enable sustain,portamento, both or neither. ^P - print the screen. ^Q - save or retreive quick setup 1-8. ^S - decrement or subtract 1 from a parameter. ^T - toggle MIDI thru on or off. ^U - toggle screen update on or off. ^V - list voices by name. ^W - write out file on which the cursor rests. ^X - go to Play mode. ^Y - toggle YK on or off. ^Z - send MIDI Sys-Ex dump. SELECT - same as CTRL X. Next file: LINENTRY to Play mode. ^Y - to"!@"F!Z:%=2%*^#V#N#F#"å2(!BE ]v !"#*@!3@~w#ۨO?Ө:/G2yӨ%]} 001!*$FEROBEv4$}͍/͍!]#*"Reset the computer and hold down the [CTRL] key until a 'beep' is heard.$Remove one of the disk drives and Startup again...$ THE CONTROL A COMMAND Hitting CTRL and the A key increments or ADDS one to the value IF the resulting value is in range. This operation will not affect filenames. For devices, this command causes the parameter to cycle to the next available value in the order: CAS,CTR, A, B, default drive (and back to CAS). For setup files, only CAS, A,B and the default drive are valid. In the P column, for instru- ments 1-7, this command will have no effect IF THERE ARE NO CHANNELS ALLOCATED TO INSTRUMENT 8 from which to take one away. So to add 1 polyphonic channel to, for example, instrument 1, first take one away (CTRLS) from instrument 3. The extra will go into instrument 8. Now ^A will take it away from instrument 8 and add it to instrument 1. For filenames this command has no effect. Next file: CTRLB it away from instruP&&&&& THE CONTROL B COMMAND Hitting CTRL and B steps through the possible pitchbend range choices. These range from 32 to 1 half steps. Pitchbend affects all voices with the same range. Pitchbend is relative to (added to) any settings for tuning/transposition. NOTE! Pitchbend sends a lot of MIDI data to the CX5M. Beware of overloading the program. Next file: CTRLC  NOTE! Pitchbend sends a lot of MIDI data to the CX5M. Beware of overloading the program. (؅56y:"!# 6456 :%>(x:"%!$ 64568O:%y==(8>i%%&=##w=:jֹDw#:hw=6_ gehk?|2#2$<22>2o!~wḯ!N\e!@##q#w#!~(%o&)))MD# #~o&)))[#\*HM#͗<2%!vyY$w}w## v!~ʍ#F#ze:fցD2g! )  =y=`xL y $|*( GM#͍>͓͓>͖7:&2&>2'!IO:&2&> THE CONTROL D COMMAND Hitting CTRL and D, when the cursor is on a voice filename field, will load the patch data contained in the SFG-05 ROM and blank the filename. These patches will be resident in writable memory (RAM) so patches can be copied over them to configure new voice files. When the filename is blanked, you cannot write a bank out to a file. Either reading or writing when the name is blank causes the ROM voices to be copied into the bank. Next file: CTRLE ither reading or writing when the name is blank causes the ROM voices to be copied into the bank. Next file: CTRLE take one away (CTRLS) from instrument 3. The extra will go into instrument 8. Now ^A will take it away from instrument 8 and add it to instrument 1. For filenames this command has no effect. Next file: CTRLB it away from instruP&&&&& THE CONTROL E COMMAND Hitting CTRL and E causes a cold boot which is a jump to location 0 in the page containing the BASIC ROM. If your machine normally boots MSXDOS, you will be returned to that, otherwise you will be returned to BASIC. All setup data is lost because the CX5's do a memory test and overwrite all ram.) Next file: CTRLF  to BASICP&&&&&80`iR0'`iwR8 `iR8:nZD2nY:j78>&jK>Kh!7V+^B0<+G:jsx0!aN!Y wh`"l"nV _ ؇!a5:Y2c>2b!:c_N#F#^#VClSn>͑͞*hR0L*jR0DͲ8<*hR02͔ߑΒQЏ:hD/2h:jD/2j=Βc:c2crCC#w#7w777K:a#:b:a5:b0:aG:bB:aY:bTo&)!)N#FCh!9N#FCjo&)!)N#FCl!9N#FCno&)Kh!)q#pKj!9q#po&)Kl!)q#pKn!9q#p THE CONTROL F COMMAND Hitting CTRL and F allows you to see a list of all the files on the disk defined by the device or filename field on which the cursor rests. If the device block is empty, this command will show the files on the default drive. If more than 48 files are on the disk, you will see the first 48 and a prompt. Hitting CTRL F allows you to see the next 48, etc. Any other key returns you to the main screen. Next file: CTRLG Hitting CTRL F allows you ~+~6#w##*h[l"h*j[n"j*h[lR"h*j[nR"j*h[j"h:h[j!0"h2t8x͑Ͳ?*hR@O@8րD_!,n&!0!R"j*l"h*n"h*p"h*n"j͍*r"j*h"l*j"l*p"l*h"nͨ*j"nͶ*r"n*h"pؒ*j"r                &,28>DJPV\bhmsy~|*!$\͍!)6!~ >2j26!'5 2&!w,.w,{_:2:2. THE CONTROL G COMMAND Hitting CTRL and G gets or reads in the file on which the cursor rests. Previously loaded data will be overwrit- ten. The load operation is indicated with the word "LOADING" on the screen. See FILERROR.DOC for the possible error indications and their meaning. Next file: CTRLI "LOADING" on the screen. See FILERROR.DOC for thP&&&&&::: ,:"(C)1983 HAL Japan";3nD:GM:NT:DZ:,:"Hit [space] or [trigger]": ƙExJY(): D_SOFF:_POCKET():_SCRI:T$(,):Q$():W$Q$(,):,:):,:TI$::T$"PLAY GAME"::T$"Friction"Q$W$FR:T$T$"(0-128)":T$"No. of shots"W$NS:T$T$"(9-99)"}T$"Score to win"W$SW:T$T$"(10-9999)":T$"Lucky Pocket"W$LP:T$T$"(0-100)":T$"Place cueball"W$;QS:T$T$"(0-1)":ZC:ZC():MC:MN՗,MN:">"();:_JOY(JY();X):XMC:" ":XMN(MN):XMNM THE CONTROL I COMMAND Holding CTRL and hitting I increments the system instru- ment number from 1-16 and back to 1 again. This number is used for System Exclusive transmissions. When sending from one CX5 with MIDISLAV to another or to an FB01, set this number to the same value on both the receiver and the transmitter. On the FB01 it is called system exclusive channel number. This value is only used during Sys-Ex dumps. Next file: CTRLK FB01 it is called system exT:PQ:_FIELDI:D,:TI$:, :"by S.Matsuoka": ,:"M.Kanai": ,:"S.Iwata"S@Dڍ :_POCKET(): :GMCT JX:PQڋQSD_PLACEQ(()0,()n=;X):M$"Place cueball": }:_PLACEQ(,JY(PL);X):Xڍ ڟ͚TX R^()dLPSP:SP():_POCKET(SP)hDM$"Set target": }Qr_TARGET(JY(PL),D;X,Y):Z(XXYY):Zڍ ڟ: p|DM$"Set strength": }_STRSET(JY(PL),D;S):XXZS:YYZSDM$"Shoot!": }ћ_SHOT(X,Y,FR,D;B(),JY(PL) THE CONTROL K COMMAND Hitting CTRL and K together enables brilliance control. If the cursor is on any of the fields in the top eight instrument lines, CTRL K turns on brilliance for the patch selected for that instrument. If the cursor is on either of the voice bank filenames, brilliance is enabled for the entire bank. If the cursor is on the setup filename, brilliance is enabled for both banks, all voices all at once. What is brilliance? Changes in "brilliance" change the output level of the MODULATOR of the operator. By increasing or decreasing the output level of the MODULATOR the amount of modulation is increased or decreased. If the operator is brilliance- enabled, a MIDI continuous controller change will be applied to the output level of all four of the MODULATORS of all four operators. The sound will vary from a simple sine wave or waves, to complex waves. For some voices, this will have little or no effect, and others may change drasti- cally. Voices that have been enabled cannot be disabled by this program. BUT the change is not saved to the file on disk or cassette until you write (CTRL W) out the file. This allows you to experiment, and still recover by reloading the bank. Next file: CTRLL (CTRL W) out the file. This allows you to experiment, and still reP&&&&&{50>5_M####M{5 _ͱ2 qk5:(!: (:!(!"6~ !"5h+ >Vy=`x!X ~OL :! ^ͯu`xߒOE?{|qL*l[hR*n[jR(88Sj( (88Sh!^kSh*j##"jLΒ:h !:j2":) !Y")!9"9fͯĒx`>8͔_Lʑ͘>2Y_W͔ʑ͘{8!Y~h*$! \#hyO??5M####My8 8 :! G(ɘ8H *`xĒyEL(: THE CONTROL L COMMAND Hitting CTRL and L redirects the output of an instrument to left or right channels. Repeatedly hitting these keys steps through the sequence: Left channel, right channel, both, and back to left,etc. On screen, left channel is shown as "<". Right channel is a ">". Both is the default so there is no indication on screen. With MIDI, a modified panning effect is caused by sending continuous controller codes. The low control value sends output to left channel, the middle of the control range sends it to both and high values send it to the right channel. It is not a gradual change. Next file: CTRLO ange sends it to both and high values send it to the right channel. It is not cover by reloading the bank. Next file: CTRLL (CTRL W) out the file. This allows you to experiment, and still reP&&&&& THE CONTROL O COMMAND When the cursor is in the top 8 instrument fields, sustain and portamento can be turned on or off with the CTRL and O keys. Repeatedly hitting these keys steps through the sequence: sustain on/portamento off, sustain off/portamento on, both on and both off. The screen displays a small "s" when sustain is set, and a small "p" for portamento. Portamento on will have no effect if more than one voice polyphony is assigned to that instrument. Portamento speed is still only set via MIDI. The default values can be changed along with controller numbers. (See CUSTOMIZ). Next file: CTRLP  set via MIDI. The default values can be changed along with controller numbers. (See CUScover by reloading the bank. Next file: CTRLL (CTRL W) out the file. This allows you to experiment, and still reP&&&&& THE CONTROL P COMMAND Holding CTRL and hitting P causes the contents of the screen to be dumped to the printer. The program will not return until it is done print- ing so be sure you have a printer on-line. If you want to exit, the only way is to reset the computer. Next file: CTRLQ e you have a printer on-line. If you want to exit, theP&&&&&nf %"a@:e:g6 -"a@:e:f" $"a@:f:h,"a@:g:h ( D5(>ݾ>fn"aÎI~2'6~2%͊U*"Ì^=wa8G>V8> 8 ~ HJ=I6(xHJ~2'~2%>2/rXxÎI!(~J#T] $JM+!~M#: y2>!!jR0= = Z^ͱK!>X!  = !IX!GX>2/>2%>2'rX>2->2%FX!Z!KX( >((>(!p>>N> 0>#= = THE CONTROL Q COMMAND Hitting CTRL and Q enables the quick setup mode. Like the Copy command, quick setups or "quicksets" use the line entry mode. The prompt is shown at the bottom of the screen. Entering a number between 1 and 8 and hitting RETURN selects a preset. Backspace is used for editing the quickset number until it is correct. To write a quickset, set up the screen with all parameters desired. All settings that define the 8 instruments, that is all parameters shown in the first 8 lines, as well as pitchbend range, will be saved to the quickset. To save it, hit CTRL and Q, followed by the quickset number (1-8) and a W (no spaces). Editing with Backspace is allowed. Upon hitting RETURN the setting shown will be written to the quickset memory area. THIS SETTING WILL BE LOST WHEN THE MACHINE IS RESET, TURNED OFF OR THE PROGRAM EXITED. To save it permanently, write a setup file to any of the storage devices. To put setups into the cartridge version, setups must be saved to "ROM, for quicksets to be saved. ROM has space for one setup file. Next file: CTRLS  setups must be saved to "ROM, for quicksets to be saved. ROM has space for one se only way is to reset the computer. Next file: CTRLQ e you have a printer on-line. If you want to exit, theP&&&&&)|Qg,>!!jR0= = y Yy X /^@d 7 9 ; @ @ A C  C A @ > > @ A  A @ > < < > @  @ > < ; ; < ;  > < ; 9 9 ; <  < ; 9 7 < @ C  C A @ A @ > < < ; 9 ; >  < <  $$ + ( + $ + ( + # + & + # + & + ! ( $ ( ! ( $ (  #  #  #  #  $ ! $  $ ! $ $ + ( + - 4 1 4 & - ) - + 2 ; 2 $ + ( + *4͔\:0 >23G <G>_!"4ͤS:=:3(*4͔\ "4ͤS:3=23>2*4:1\^W^^!6`d]!d͑]!eK]ͻ]: 2U!E THE CONTROL T COMMAND Hitting CTRL and T toggles (alternates) the MIDI thru switch on or off. For a little more speed, turn MIDI thru off. From the Play mode this is done with the F4 key. CTRL T will have no effect in Play mode. When on, MIDI thru passes all MIDI data received right through to MIDI out, even codes on which this program does not act (such as MIDI clock, aftertouch, etc). Next file: CTRLU o MIDI out, even codes on which this program does not actU<~o2'~g2%~> ̵V()=w wʹU> ͵V2`*###"Ì^>õV~‰V~($$+^,+^ %+^,+^( ~Vx( ~ lut|2%}2'jV8 0 ww2-FX~~~o2'~g2%~G=w͵V:T(ͦX ͦXww:U0 DGͦX8yqw !2W~of~ +,+^86+^0w(8X X>#^> #^Fp= x-8,= x$8% ,=( -%x8$6+^ 0(~ w6 ut6R THE CONTROL U COMMAND Hitting CTRL and U alternates the screen update mode on or off. When on, patch changes received via MIDI during Play mode are displayed IF there are any P channels allocat- ed to that instrument. This update takes time, so if you need more speed, turn off screen update. From Play mode the F5 key is the same as the CTRL U and CTRL U has no effect. The patch field is the only field updated during Play mode. Next file: CTRLV  CTRL U and CTRL U TU:TZM!D>M͟ ( (0 02TZ}ZTU!>M͍TUy2 ʣYdZ_!X)_!XS: =2 ãY0TT!X>M^X:_!mXK!X:㇇o&^^#VS #^#VS oYZg[:u{^Z͌^ͶZ[:u!_X!>VZZ##Z__^:G>_!!__^> 2w^Z2* ]M[:T<(2T>2* ]:w=2w* DM8) DM^2/!<"4!"6!"8!":^X!+_X!K_X[ ! SY" G2%g2'ox THE CONTROL V COMMAND CTRL V allows you to view the names of an entire bank of patches on screen at once. Hitting CTRL V will then alternate between the two banks. Any other key will return you to the main editor screen. No editing can be done on the patch names. Next file: CTRLW er key will return you to the main editor screen. No editing can bP&&&&&]]]\ >!%^^V @ x > !V@M@J>>>M#>M>M__M#M M#M* &ͺ^!VyX*ͺ^!3X:u*"+""|ͺ^x![X|7w'^^d^ ^}0>/= 6x THE CONTROL Y COMMAND Holding CTRL and hitting Y when the cursor is on any of the fields that apply to instruments 1-8 turns on or off the YK keyboard for that MIDI channel. When the YK is on, a lower case "y" is shown next to the MIDI channel for that instrument. Playing the YK will play that instrument AND send MIDI out for that channel number. No matter what the screen says, MIDI thru is OFF when any channel is linked to the YK keyboard. Even if no polyphonic channels are allocated to that instru- ment, MIDISLAV will still send MIDI out messages for any activity on the YK keyboard, if it is linked to a MIDI channel. The YK keyboard can send on multiple MIDI channels, as well as play multiple instru- ments. Separate note on/offs will be sent for each channel. If the YK keyboard is already selected, hitting ^Y again will deselect that channel. Next file: CTRLZ each channel. If the YK keyboard is already selected, hitting ^Y agai THE CONTROL Z COMMAND Holding CTRL and hitting Z, when the cursor is in any file field, causes a MIDI system exclusive dump of that data. When the cursor is on a voice bank, that bank is sent. When the cursor is on the setup filename, all of the setup parameters are sent, including both voice banks. During transmission, the MIDI data is shown on the screen. If sending to another CX5 with MIDISLAV, make sure the receiving CX5 is in the PLAY mode. For message formats, see MIDICODS.DOC. Voice bank dumps are compatible with the FB01, but setup dumps are not. Next file: SELECT s, senter the Play mode. The only way to exit the Play mode is to hit the STOP key. Next file: CTRLY e program to checksum is recomputed and checked to insure that the load was successful. Next file: CTRLX hen reloaded, thisP&&&&& CURSOR KEYS The cursor keys are used to move from one field to another. The current field is displayed in reverse video. Notice that going down from the eighth instrument gets you to filenames, instead of MIDI thru. Left and right cursor will toggle between filename and device, when in that region. Next file: MODES IDI thru. Left andP&&&&&B From the program save a new copy by writing out a setup file. Be sure to check quick- set 1, as it is sometimes corrupted by this operation. If necessary, rewrite quickset 1 and rewrite the setup file. Whenever a copy of the program is written out as a setup file, a checksum is added to the end of the file. When this file is reloaded and run, the checksum is verified to make sure everything loaded properly. The other aspect you can customize is this on-line help text. To add a subject or change any of the ones included, simply edit a text file. Any text editor will work. Or write a BASIC program with all REM's and save it with the ",A" option (for ASCII format). Name it filename.DOC and it can be accessed with this help feature. Page breaks occur automatically every 21 lines. Line length cannot exceed 32 characters. New filenames should be added to the table of contents in MIDISLAV.DOC. Next file: SPEED t exceed 32 characters. New filenameP&&&&& FILE ERRORS The message FILE ERROR and a number may show on the screen when writing or getting files. The numbers mean an error ocurred in the operations as shown below: 1 - Making a new file. 2 - Opening an existing file. 3 - Reading a file. 4 - Writing a file. 5 - Closing a file. They may indicate a full disk, a badly formatted or damaged disk or just door open or disk not installed. If an error ocurred during a Get command, then assume that the data was not read properly and repeat the command. An error in a Write command should not do any harm to the data in memory. If a "FILE ERROR" message appears when doing a disk operation AFTER BOOTING FROM A CARTRIDGE even when disk is installed, then do the follow- ing: Exit from Midislav with a CTRLE. While the computer reboots, hold the DEL key down. When the Basic OK appears, enter CALL SLAVE You will be back in Midislav with no change to your data. If a "FILE ERROR ?" appears after loading a voice file from cassette, it could mean that it didn't find the file on the tape yet. Due to a limitation in the SFG-05 software, reading a voice file from cassette doesn't look at the filename, it just loads the next voice file it finds. All voice files have a name imbedded in the first 8 bytes. Files made by MIDISLAV have the filename in these bytes. Files made by voicing software may have something else in these bytes. After getting a file, MIDISLAV compares the filename on screen with the name in the voice file. If they are diferent, then it shows "FILE ERROR ?". If this error appears, do a ^V to see what voices were loaded. It may be the desired file under a different name. Otherwise, just repeat the ^G until the desired file is found. WARNING! A fatal error can occur if this on-line help is accessed when NO DISK IS INSERTED. If this happens, enter the following BASIC command: DEFUSR=&H9C28:A=USR(0) This will restart the program without loss of data. Next file: MIDICODS mand: DEFUSR=&H9C28:A=USR(0) This will restart the program without loss of data. Next file: MIDICs should be added to the table of contents in MIDISLAV.DOC. Next file: SPEED t exceed 32 characters. New filenameP&&&&& FILE FORMATS Setup files are actually complete copies of the entire MIDISLAV program in binary (BLOAD,BSAVE) format. They can be run by entering: BLOAD "dev:filename",R just like the original program. This is useful for making autobooting disks for particular songs or performances. Contained in the setup data are all parameters shown on the editor screen, including voice bank data. User customizable settings, such as control codes for volume, brilliance, and others (see MIDICODS) are saved as well as the 8 quick setups. Voice files are in the same format as that used by the YRM-102/502 cartridge and the Music monitor (CALL MUSIC) in the SFG-05. Next file: FILERROR mat as that useds should be added to the table of contents in MIDISLAV.DOC. Next file: SPEED t exceed 32 characters. New filenameP&&&&& MIDISLAV V1.5 LICENSE MIDISLAV is copyright (C) 1988, 1989 by Carolyn Eng. Non-registered users are granted a limited license to use MIDISLAV on a trial basis for the purpose of determining whether MIDISLAV is suitable for their needs. Use, except for this limited purpose, requires registration. To register send name and address and $25.00 to Carolyn Eng 7724 Green Garland Drive Springfield, Virginia 22153 Copies made for distribution must include this LICENSE.DOC. Registered owners are notified of all upgrades. To receive upgrades, send a disk and $1.00 OR no disk and $3.50 to the above address and the latest version will be sent. (Money covers cost of shipping and cassette or disk if needed.) For questions or comments call (703) 455-4424 between 9 AM and 9PM EST, give the machine your name and time of call, and I will pick up (if I'm there). Or write to above address. I have put a lot of work into this program and will continue to support users. I hope you enjoy using it and that it makes your music better. Carolyn Eng, Feb. 3, 1989 Next file: SCREEN s. I hope you enjoy using it and that it makes your ms should be added to the table of contents in MIDISLAV.DOC. Next file: SPEED t exceed 32 characters. New filenameP&&&&& LINE ENTRY Line Entry mode allows you to enter numbers directly instead of incrementing or decrementing. It is also needed to enter filenames. It cannot be used to change patch names or devices. Hit- ting any character valid for that field (digits for numeric fields, letters for filenames) automatically puts you into Line Entry mode. A prompt (>) in reverse video is displayed on the last line of the screen along with the key you typed. Backspace deletes the last key entered. Hitting Return terminates Line Entry. The value or name entered is then put into the field on which the cursor rests. If the number is out of range for that field, no change is made. Only eight characters can be entered. Spaces are ignored. Filenames should start with a letter. In the Transposition/Tuning fields, a + or - will access Line Entry mode for entering. negative or flat values. This mode is also used for the CTRL C (copy) and CTRL Q (quickset) commands. Next file: FILES ative or flat values. This mode is also used for the CTRL C (copy) and CTRL Q (usic better. Carolyn Eng, Feb. 3, 1989 Next file: SCREEN s. I hope you enjoy using it and that it makes your ms should be added to the table of contents in MIDISLAV.DOC. Next file: SPEED t exceed 32 characters. New filenameP&&&&&10 PG=0 100 GOSUB 2000 110 FOR A = 1 TO 6 120 LPRINT 130 NEXT A 140 FOR A = 1 TO 21 150 IF EOF (1) THEN GOSUB 1000 ELSE LINE INPUT #1,LN$:LPRINT " ";LN$ 180 NEXT A 190 FOR A = 1 TO 4 200 LPRINT 210 NEXT A 220 LPRINT " ";PG 225 LPRINT 230 PG= PG+1 240 GOTO 110 1000 FOR C = A TO 21 1010 LPRINT 1020 NEXT C 1080 CLOSE 2000 READ B$: IF B$=""THEN GOTO 4000 2010 F$=B$+".DOC":OPEN F$ FOR INPUT AS 1 2020 A = 21:RETURN 3000 DATA TITLE,MIDISLAV, PURPOSE 3010 DATA LICENSE,SCREEN,CURSOR 3020 DATA MODES, COMMANDS,LINENTRY 3030 DATA FILES, FILERROR,MIDICODS 3040 DATA CUSTOMIZ,SPEED,CTRLA 3050 DATA CTRLB,CTRLC,CTRLD,CTRLE 3060 DATA CTRLF,CTRLG,CTRLI,CTRLK 3070 DATA CTRLL,CTRLO,CTRLP,CTRLQ 3080 DATA CTRLS,CTRLT,CTRLU,CTRLV 3090 DATA CTRLW,CTRLX,CTRLY,CTRLZ 3100 DATA SELECT 3110 DATA 4000 FOR A = 1 TO 4 4010 LPRINT:NEXT A 4020 LPRINT " ";PG 4030 LPRINT 4050 END 00 DATA SELECT 3110 DATA 4000 FOR A = 1 TO 4 4010 LPRINT:NEXT A 4020 LPRINT " 10 PG=0:LPRINT CHR$(&H1B);"G"; 100 GOSUB 2000 110 FOR A = 1 TO 6 120 LPRINT 130 NEXT A 140 FOR A = 1 TO 21 150 IF EOF (1) THEN GOSUB 1000 ELSE LINE INPUT #1,LN$:LPRINT " ";LN$ 180 NEXT A 190 FOR A = 1 TO 3 200 LPRINT 210 NEXT A 220 LPRINT " ";PG 225 LPRINT 226 LPRINT 230 PG= PG+1 240 GOTO 110 1000 FOR C = A TO 21 1010 LPRINT 1020 NEXT C 1080 CLOSE 2000 READ B$: IF B$=""THEN GOTO 4000 2010 F$=B$+".DOC":OPEN F$ FOR INPUT AS 1 2020 A = 21:RETURN 3000 DATA TITLE,MIDISLAV, PURPOSE 3010 DATA LICENSE,SCREEN,CURSOR 3020 DATA MODES, COMMANDS,LINENTRY 3030 DATA FILES, FILERROR,MIDICODS 3040 DATA CUSTOMIZ,SPEED,CTRLA 3050 DATA CTRLB,CTRLC,CTRLD,CTRLE 3060 DATA CTRLF,CTRLG,CTRLI,CTRLK 3070 DATA CTRLL,CTRLO,CTRLP,CTRLQ 3080 DATA CTRLS,CTRLT,CTRLU,CTRLV 3090 DATA CTRLW,CTRLX,CTRLY,CTRLZ 3100 DATA SELECT 3110 DATA 4000 FOR A = 1 TO 3 4010 LPRINT:NEXT A 4020 LPRINT " ";PG 4030 LPRINT 4040 LPRINT 4050 END & MIDI IMPLEMENTATION CHART DATE: 89-02-16 MIDISLAV V1.5 ------------------------------- FUNCTION | RECOGNIZED ------------------------------- Basic Default| 1-8 Channel Changed| 1-16 ------------------------------- Mode Default|Omni off,poly Messages| x Altered | x ------------------------------- Note | 0-127 Number | 0-127 ------------------------------- Velocity NoteOn| o Number NoteOff| o ------------------------------- o = yes x = no MIDI IMPLEMENTATION CHART cont. ------------------------------- FUNCTION | RECOGNIZED ------------------------------- After Key's | x Touch Ch's | x ------------------------------- Pitchbend | o ------------------------------- Control change:| Portamento | Speed 5| o Volume 7| o Sustain | on/off 64| o Portamento | on/off 65| o Brilliance 3| o Modulation 1| o Pan (l,c,r)8| o ------------------------------- MIDI IMPLEMENTATION CHART cont. ------------------------------- FUNCTION | RECOGNIZED ------------------------------- Prog | 0-95 Change: True # | 0-95 ------------------------------- SystemExclusive| o ------------------------------- System: clock | x Real time | x ------------------------------- Aux:localon/off| x Messages:Reset | x :All notesoff| 123-127 ------------------------------- o = yes x = no MIDI IMPLEMENTATION CHART cont. ------------------------------- MIDISLAV sends two system exclusive dumps: configuration data and a voice bank. Configuration data includes both voice banks as well as all of the setup data for patches, midi channels, tuning, etc. These dumps are comprised of a header, data packets and the termination byte defined by the MIDI spec. MIDISLAV also recognizes one dump request message block, a request for a dump of one of the voice banks. All values are given in hex. "SI" means System Instrument number. Data packets have the same format: 0000 000h h = byte count high 0lll llll l = byte count low 0000 yyyy y = first data low 0000 xxxx x = first data high ... 0000 yyyy y = last data low 0000 xxxx x = last data high 0eee eeee e = checksum Configuration Data: Header: F0 43 75 SI 00 04 00 data packets Terminator:F7 Voice Banks: Header: F0 43 75 SI 00 00 0x x = 0 or 1 for bank number. data packets Terminator: F7 Dump request: Header: F0 43 75 SI 20 00 0x x = 0 or 1 for bank number. Terminator: F7 Next file: CUSTOMIZ nator: F7 080 DATA CTRLS,CTRLT,CTRLU,CTRLV 3090 DATA CTRLW,CTRLX,CTRLY,CTRLZ 3100 DATA SELECT 3110 DATA 4000 FOR A = 1 TO 3 4010 LPRINT:NEXT A 4020 LPRINT " ";PG 4030 LPRINT 4040 LPRINT 4050 END &Q4@JM4@JM@@4@JM@@4@JM@@4@JM@@4@JM@@4@JM@@4@JM@@VOICEFILBrass Ȁ2x0@pP PD`OpDQ($R( Horn ̀x0@pA ))pE_pA pA $Trumpet̀x0@ A%0@B_ A9pAU $LoStrigʀ +P0L# `eP0A$EPiano2 x!@> pS_pW ^7"EPiano3Ȉ x!@p?p3ن'p0p1ل"EPiano4x0@@4r 1pQ!EPiano5Ȩ#x1@%P@E*PPP 0@6"HighTinx0@, `_ pq0Apq!HardTinx0@ 0@_pq0_pTq_!PercPf x0@ A #pM P&1P`AZ5pA]!WoodPf Àx0@0A pp_0A_p@_!EPStrngɀ?x0@ @1j pq##P Dpq%"EPBrass̀x@@P@1Hc'p q%"Pp Dp q%"Clav2 ̀x@C_4* I_ $ @_pAX Clav3 ̀x@ @ 0@p]0 pB7Clav4 ̀x0@p F opE p@ pA\"FuzzClv̀x@ @ .9p`@`)pC9MuteClv̀x@ p@  0pp6p pBX7MuteCl2̀x@p@  pp? p pBXSynClv1͂x1@00G '05006 1_"SynClv2̀x0@"@@<@@9@@0p01ߏL$SynClv3̀x0@ GzPV@@ pS,$SynClv4̀x0@ : : :p:$Harpsi2̀x@  p`6 pT6Harpsi3̀x @* pH*q$0Dݚ%$Harpsi4̀x@0c p150  p5Harpsi5̀x@ P&@C_ Q%Circust̀xP@ pEp(H;pBpA 'Celesteʀx0@ pqYp1_'p7_pq Squeezeˀ xP@0s@2 UVL! VOICEFILVOG! VCSET01 VOG!QLMIDISLAV #Egà@A 4@JM@@ã֜ڜ2CSÜ/HvcdqСÐ.39OØzàÝ}k(!~͢#LOAD ERROR͜4͟1v!ۨӨa͢MQͼ! >=V+|T:x>>2}>2~>2Ar>!>֜ͣڜ>2V>2!>>֜! :!Q> w# yŜ!"2ɯЯ! h& "))))ېOyӑӐ/Ӑ!Q ~O#  *#|?!"*+|O!" Q*w* o&Q  ::’2O:Ї_!^#Vy黝Ɲ՝ޝS>2Н><22>2O:Gڜ>2֜>2~͜#~͜# ͟y1)=1dΞ: Ξ>Ξ>ΞK :;y:Ξ>Ξy:Ξ>Ξ!ԩsc ?!=>w d!e ~ʃ!U ~_!=w yl!ë_~G:ӫOڜ!]_~/_!~>p͜:ΫG:׫Oڜ:}=!ث_~H!ë_~G:֫Oڜ!m_^#V!ë_~G:ҫOڜ!e_~0͜_!~>s͜!ë_~G:ѫOڜ!U_~y͜!ݚs=j!˫_~G:իOڜd!˫_~G:ԫOڜ!_~''!k_#!ë_F:ЫOڜ!M~H!~>>><͜:ϫOڜv!ë_~Gڜ{0͜!Ϫ!&!Q>%w#7!"_!Q~!  !"_!"]!q>w#j:>ϡ‹ϡ$0Q}1}W"O}Q!&}4}Q}5}:>++0Q}2}W}Q!8'}3}}8}Q}5}͐O9qyd#~w͓͐>wOdСyd#~22͝x>1j:}<O>2}=_!ث#^#VSͼxy͐x :5<25ͧx›͐͜xɯ2>%͘ W·>2O}=!QУ=ˣ Wݣ>2MQ:> ͘O}a| @O}a|}c{c@ɯ2>2͖͐:M0Mɯ!>2 +e-ʀf @ʏ)))_e2e|/g}/o#:‡> !w#.!!Ԥz$+> wC> ͜C$ 3!z_z${-+/$:A$[a${$w#͜ó!e#4!e#NyPx D#xC!#+~''''##`].y0_3y0+s{s{!U ~=ws{ե!U ~եͶ|{@.y03͘sO|s}ss!U =wss.y͋_3y͋+ { {h!] ~h=w {}!] ~}Ͷ|{@ʻ.y͋3͘ O| }!] w .yٟ_3yٟʾ{ʾ{!m ^#Vr+sþ{!m ^#Vr+sþ>Ͷ|{+5-5{@`.yٟ3͘ʾ!m {w#zwþþ]>;.y_3yc{c{ۧ!e ~ۧ=w.է:lҧ<2lէ~Ͷ|c.yt_3yt\>Ͷ|{Wy/yZy!{!=}{AӨ{Ө.yt3͘yd!y!ͨ=Ϩ{yyd> w#yd͓͐y͐y͜ <0y71`7.y͕_3y͕?>Ͷ|! ~G{ǩx=Gy›x‘>í­>íx¦>í­>w_!k##~yd#w?ѩx<?.yà_3yà+ԩ{ԩ!M ~=wԩ{0!M ~`0Ͷ|{@w.yà3͘ԩO|ԩ}ԩaԩ!M wԩԩOͣ!-ogҝ‹¬ͣ!Ѯ͐͐9ԩ̪Ǫ MIDISLAV V1.5 BY CAROLYN ENGPATCH #MCPVOLTRA/TUNpitchBndscrnUpdt OmidiThru OsysInstrFILESPATCHES 1-48= : .VOGPATCHES 49-96= : .VOG SETUP= :ESC for help   > Hit any keyFILE ERROR 3 Q EDITOR KEY COMMANDSCursor keys change fieldsESC=more help,any other=return.^X or Select=Play from MIDI^E=Exit program^V=list Voices^T=midiThru on/off ^U=screen Update on/off ^B=next pitchBend range ^C=Copy patch#-patch# ^P=Print screen ^I=next Instrument #^Q=Quick setup #(1-8)^K=Enable brilliance^A=Add 1^S=Subtract 1^Y=YK kbd on/off^O=On/off sustain,portamento^L=Line out(left,right,both)^D=Default(ROM)voices^Z=Sys Ex dump^W=Write file^G=Get file^F=disk File directoryenter line-edit mode til CR.BS deletes last char.Letters,Numbers,+ or -.iTHIS SOFTWARE ISNOT PUBLIC DOMAIN OR FREETo register as a user send$25.00, name and address to CAROLYN ENG 7724 Green Garland Drive Springfield, VA 22153  Registered users will receive notice of all updates, can get updates by sending $1.00 and a blank disk (or $3.50) to above address, can report bugs or get help by calling (703) 455-4424.Hit any key to returnN FFCTGCAS! A" B ROMD0)Úùwͫͷ͓>͙ͥ͜ͱ͖۩g! wO:2>22>G:1/21> ͳ????0:)ͳ0:8ͳ> ͳOͧ'OͧoGͧG'''' SͧȀʏ><>ͧøͧپ2ʸͧѱAҾø:!㚷!=כ!z͹éy1nyey?v>ͻ0{=O>ͻy@O>ͻ>ͻxW> ͻO>ͻO>ͻ>ͻ>ͻۨ2OyӨ:/2_{2!۲#Ÿy2{2:2:Ө:2‘:Ө ‚زMCHFM0ۨ2:Ө:/2:2vͥ> ͻͪ:2:Өen!N͹^#V>ͻ~ `È> ͻڌ!#~+ˆ͕Œ?^#V# ¦͆!"!">vͻ!"J"L!"uͤ>Ͱ>CͰ>uͰ:5ͰͰ! y#y=#!xͰyͰ|ʙ|A}AF@GEx'ͭxʈOͰ????OͰ+Uy/<Ͱ1>Ͱ*L|žכOyʶ>ͰyͰ۪Ӫ!&"!"J"Lv>vͻ!"u!:1 !"!!"v:MO:]9*m"y:NO:^9*o"v:OO:_9*q"y:PO:`9*s"v:QO:a9*u"y:RO:b9*w"v:SO:c9*y"y:TO:d9*{":+G:,O:-W:._> ͻ!e +~>!U +~!B +w !~~#%!"!">ʰ/dL!~C>ͻ#x5!N>ͻ#xQ{! ~y! ~y!jO*L}<ʆ!v_q2L:22?ê>ʰϰ*J}ʧ|<2K_!v~>ͯçzݶx2!J˹ ~2:>OyO!:Bn:Cn:D/n:E?n:FOn:G_n:Hon:I"ʹ:B¨>ͯ>ͻ:A2M>2:C̷>ͯ>ͻ:A2N>2:D>ͯ>ͻ:A2O>2:E>ͯ>ͻ:A2P>2:F8>ͯ>ͻ:A2Q>2:G\>ͯ>ͻ:A2R>2:H€>ͯ>ͻ:A2S>2:I¤>ͯ>ͻ:A2T>2:Bµ>ͯ:CŸ>ͯ:Dո>ͯ:E>ͯ:F>ͯ:G>ͯ:H>ͯ:I#>ͯ:B9:{Ϸ:62{:CN:Ϸ:K2:Dc:{з:`2{:Ex:з:u2:F:{ѷ:ʊ2{:G¢:ѷ: ʟ2:H·:{ҷ:!ʴ2{:I̹:ҷ:"ɹ2:By2:{Ϸy2{:Cy2:Ϸy2:Dy2:{зy2{:E%y2:з%y2:F;y2:{ѷ;y2{:GQy2 :ѷQy2:Hgy2!:{ҷgy2{:I}y2":ҷ}y2:}%<=ƒ[:BŸ*m"y:C­*o":D»*q"y:Eɺ*s":F׺*u"y:G*w":H*y"y:I*{"y :B>ͻ:C*>ͻ:D:>ͻ:EJ>ͻ:FZ>ͻ:Gj>ͻ:Hz>ͻ:Iˆ>ͻ:B™>ͻ:C©>ͻ:D¹>ͻ:Eɻ>ͻ:Fٻ>ͻ:G>ͻ:H>ͻ:I>ͻ:B>ͻ:C(>ͻ:D8>ͻ:EH>ͻ:FX>ͻ:Gh>ͻ:Hx>ͻ:I†>ͻ:B—>ͻ:C§>ͻ:D·>ͻ:EǼ>ͻ:F׼>ͻ:G>ͻ:H>ͻ:I>ͻ!Bx>ͻ# :>G:@O:?{0ͥ!6;#F!͉#Q!͹#Z$#e!#yp_y/////O͇#™y@+ڕUڕ!z͹´!ͧʩOʑʩʩGy!=_~©{2>xm+ Jéͧ´Wͧ´Wͧ´_ ͧ´2?ͧ´2@+ͧ´G̈́Jͧ´oͧ´g:>G~mͧCͧuͧ!5ͧͧʔʠ!jݾ!Z͹›ͧæ ͧͧO͹Ú>ͯ+>ͯ*xo6$N#F~k~o& s#r~ Zwݾg7":O͆:͆{͆Ӷ!:~ʸzʩ:]_n:Uv:ٿzʿ:^_n:Vv:z:__n:Wv:z :`_n:Xv:<z-:a_n:Yv:]zN:b_n:Zv:~zo:c_n:[v:ʟzʐ:d_n:\vʹ:?O:?G:?Gʼx2?x*J}ͯM LOADINGMIDI ERROR CHECKSUM  * PLAYING * To edit hit STOPVCSET01 =Add 1"ÇkuÄÚÔâ1Ë͞!͹ͤzś> Ͷzțz40w#“v}}:Eȷ!'}}>:E_!v{2E~ʬͤ:Gś>/Ͷ! ͼͤ͞2E2D2F<2Gͬ·  z:D >> Ͷ:D<2D'ï2D:F<2Fï2Fڛ!͹ݛj͞:G<2G͞Ͷ:D<2D!- t·>͡!p͹! ͼ!u͹!p͹<> Ͷͣ͞ڛ!͹ݛ* Ò͞!_~''_*~2>2!9  v}}C!͹ͤ!wͼ>.Ͷ!ͼyhÍxtÍڛ!͹ݛ͞}5! f ͸pr p p p3w#z»"O! f !!P"}!"o!~ ~/w͔ů21כ;! ~0/Kůw! ~/K O! ~@Ew !M ~O?}ә|?@ә^Ә^Ә y ^Ә y !~~#Ù|¾>+Ͷ|›>/Ͷ}›|/g}/o#>-é* -+>] /S]}/o|/g#ɯS"MO! _OxyJ?z2y˛!)ۨϲӨ:/ϳ2_W{2zӨ!' !=!w[H{͞!=͹V!N͹[H~Wwºo# y¯!_͹כw[H{[HW~ow# yESC=more, any other to return.^F=more, any other to return. SW.FRONT- WRITING-- SW. REAR-.DOC not on drive.  Hit any key to return. Enter next subject  ^V=other  page,and  anyother  =return. ???????????MIDISLAVDOC???????????Ա",-X<|0f8l8vv0 000 0 0f<c6f~`~c>0`~cc>c >cc?<0000000 0`0 ~~0  0`f>~~|``````~|||zx||~||8|8|fff<8p`0 `````<~ x |v`|fffff>|ff<`flxl8<l|vffffff<ll8lfff>|~L2~ @   @K( MIDISLAV V1.5 Dump request: Header: F0 43 75 SI 20 00 0x x = 0 or 1 for bank number. Terminator: F7 Next file: CUSTOMIZ nator: F7 080 DATA CTRLS,CTRLT,CTRLU,CTRLV 3090 DATA CTRLW,CTRLX,CTRLY,CTRLZ 3100 DATA SELECT 3110 DATA 4000 FOR A = 1 TO 3 4010 LPRINT:NEXT A 4020 LPRINT " ";PG 4030 LPRINT 4040 LPRINT 4050 END &NEXTGOOD LUCK!STEP)^: CP 1 ^: JR NZ,SALLXX$^: LD A,(IX+STAGE)4^: ADD A,1@^: DAAX^: LD (IX+STAGE),Ao^: LD L,(IX+ADDR)}^: INC L^: INC L^: LD (IX+ADDR),L^: LD A,(IX+ROUNO)̪^: ADD A,10H^: LD (IX+ROUNO),A_: CP 50H _: JR C,SALLX1_: AND 0FH/_: LD (IX+ROUNO),AG(_: LD A,(IX+STAGE)U2_: SUB 5a7_: DAAy<_: LD (IX+STAGE),AF_: LD A,(IX+ADDR)P_: SUB 10Z_: LD (IX+ADDR),Aͫd_:SALLX1:LD A,9AHn_: C MODES OF OPERATION MIDISLAV has two modes of operation: Screen edit and Play mode. From the screen editor, letter key commands change the parameters and new settings are displayed. NO MIDI DATA IS RECEIVED or processed in screen mode. System Exclusive transmis- sions (sends from MIDISLAV) can be initiated with the CTRL Z command. File access, file directories and voice lists can be displayed from the screen editor. Play mode is initiated by a CTRL X or the SELECT key. A red block shows on the screen to indicate Play mode. ONLY MIDI DATA is processed during Play mode, with the exception of the STOP key, the F4 key and the F5 key. The STOP key turns off Play mode and returns control to the editor. In Play mode the F4 function key toggles the MIDI thru on or off. Turning MIDI thru off squeezes a little extra speed from MIDISLAV. MIDI thru passes all data received at the MIDI In to the MIDI Out. The F5 function key toggles screen update on or off. With screen update on, any patch changes received via MIDI will be displayed IF THERE ARE ANY CHANNELS ASSIGNED to that instrument. (That means the number in the P column for that instrument is not zero.) Updating the screen takes a lot of time away from handling other MIDI data, so for faster response, turn it off. Next file: COMMANDS n takes a lot of time away from handling other MIDI data, so for faster response, turn it off. NexPA_: LD B,22(_:STGCL1:PUSH B:b2 2 >A/O>%c!>c(! 5#>c(! 4#@>c(! 4# >c(! 5#O>>c2: Rc!2 2 >A/OOO>A/O>%c>c(! 5#>c(! 4#@>c(! 4# >c(! 5#>A/(>O>>c2: >2 !5c_~ @P0(~ 04(>ɯw:(>2 *!͠c"*! ͠c"*! ͠c" ~#w~#=~ LD (ISDEMO),Aܳ5`:STNQUT:CALL C PURPOSE MIDISLAV is a machine language program that makes the CX5M and CX5MII computers a MIDI controlled sound source or slave module, similar to the FB01. Up to 8 voices can be allocated to up to 8 MIDI channels. MIDI channel assignment, poly- phonic allocation of how many voices per channel, patch selection, initial volume and tuning/transposition are all user definable from the main screen. Pitchbend range is selectable from 1 to 32 half steps. All MIDI data received can be passed through (or not) to the MIDI out of the CX5M. Up to 96 user definable patches can be resident. Voice files can be read from and written to disk, cassette or cartridge. Patch data can be copied from one position to another, for easy building of voice files. A list of patches, as well as a directory of the disk is easily produced. After setting up MIDISLAV for a particular song or perform- ance, all of these parameters can be saved to disk or cassette, to be reloaded anytime. Printouts of any screen can be made and MIDI system exclusive exchanges can be made that are compatible with the FB01. And the YK-01,YK-10 and YK-20 can play along, as well as send MIDI out on multiple channels. New commands in version 1.5 allow sustain and portamento to be set up from the screen. Output of each instruments can be routed to left, right or both channels, from the screen and changed via MIDI. And brilliance can be enabled on a voice, or for an entire voice bank. Then the brilliance can be changed real-time via MIDI. MIDISLAV lets you store 8 configurations of voice number, MIDI channel, volume, tuning, polyphonic allocation, sustain and portamento, and stereo line out for all instruments. These 8 "quicksetups" can be recalled with a few key strokes for quick changes without loading from disk or cassette. The cartridge version can save an entire configuration setup, including 96 user voices and 8 "quicksetups". Additional setups can be save to disk or cassette. Setup files are complete, bootable copies of the entire program. Next file: LICENSE n be save to disk or cassette. Setup files are complete, bootable copp6p pBX7MuteCl2̀x@p@  pp? p pBXSynClv1͂x1@00G '05006 1_"SynClv2̀x0@"@@<@@9@@0p01ߏL$SynClv3̀x0@ Gz @1JB2 J1R R甔甔CA{55-  CBBCBB{䄄gTTfTTg'RB"R"w" 'WttVTTW?   ?1ꄘh2„mWiuEH```1!!0H[[KJJHQ!111!Q &  chr m  q (   `P0 MIDISLAV requires the SFG-05 sound cartridge and Disk Basic. No memory expansion is required. n and advantapies of the entire program. Next file: LICENSE n be save to disk or cassette. Setup files are complete, bootable copp6p pBX7MuteCl2̀x@p@  pp? p pBXSynClv1͂x1@00G '05006 1_"SynClv2̀x0@"@@<@@9@@0p01ߏL$SynClv3̀x0@ Gz( |~x0x> x||6z|||0|l8Dl8lx0 8p FFV~4xx p؋~~ yy8||888@`px8>xp~~>> <80ppx  pt Ä8998 8>>8||ppx>p|<p8tvvwssqq88||@yy8||>>`~~|phHp08 x p8<<?0 0 0?()(B)%()(Q)= PG: ( );"G";Gd X A  W$"": ()  : #,W$X$"": ()  : #,X$ЀY$"": ()  : #,Y$Z$"": ()  : #,Z$ W$X$Y$Z$ A %> B$: B$"" ]F$B$".DOC": F$ AS 1jA : TITLE,MIDISLAV, PURPOSE LICENSE,SCREEN,CURSORÁ MODES, COMMANDS,LINENTRY FILES, FILERROR,MIDICODS CUSTOMIZ,SPEED,CTRLA CTRLB,CTRLC,CTRLD,CTRLE9 CTRLF,CTRLG,CTRLI,CTRLKW CTRLL,CTRLO,CTRLP,CTRLQu CTRLS,CTRLT,CTRLU,CTRLV CTRLW,CTRLX,CTRLY,CTRLZ SELECT& ICENSE n be save to disk or cassette. Setup files are complete, bootable copp6p pBX7MuteCl2̀x@p@  pp? p pBXSynClv1͂x1@00G '05006 1_"SynClv2̀x0@"@@<@@9@@0p01ߏL$SynClv3̀x0@ Gz Hitting SELECT is the same as hitting the CTRL and X keys. This command causes the program to enter the Play mode. The only way to exit the Play mode is to hit the STOP key. Next file: es the program to enter the Play mode.pp6p pBX7MuteCl2̀x@p@  pp? p pBXSynClv1͂x1@00G '05006 1_"SynClv2̀x0@"@@<@@9@@0p01ߏL$SynClv3̀x0@ Gz # ) 0 6 >    pI?  ".LL(+>"> ?L |dD!p"ppwp"ww?  00008 88::::? `)ee=eeeYU,kO^7xo,v- > {    c  s "tsr/MKf#|.|0S^5B9 k9Z?  !!! SPEED RESTRICTIONS Like all synthesizers that handle MIDI in, MIDISLAV can only handle so much MIDI data in. This means that if MIDISLAV gets more MIDI data than it can keep up with, it will save it in a buffer until it can get to it. When the buffer is overloaded, data will be lost, which may result in notes left on, patch changes not done, etc. As far as was possible, this has been minimized. If the rhythm seems sloppy or off, then MIDISLAV may be getting overloaded. At this point the data is not lost, just buffered. Try turning screen update and/or MIDI thru off. That makes it run a little faster. Scanning the YK keyboard will also slow it down. Don't enable the keyboard unless its being used. If that is not enough, then try only to send MIDI data that is to be played by this module. Pitchbend, and contin- uous controllers, such as volume and modulation wheels, send a lot of data that may overload this program. Next file: CTRLA trollers, such as volume and modulation wheels, send a lot of data that may overload this program. Next fi The only way to exit the Play mode is to hit the STOP key. Next file: es the program to enter the Play mode.pp6p pBX7MuteCl2̀x@p@  pp? p pBXSynClv1͂x1@00G '05006 1_"SynClv2̀x0@"@@<@@9@@0p01ߏL$SynClv3̀x0@ Gz $$,,>>?????8 C?  <<<<<=;7/?|ffff`fhff`f`ffff`?  ? >d > > ??ddUUU: _ MIDISLAV by Carolyn Eng Eng Systems Laboratories 7724 Green Garland Drive Springfield,VA 22153 USA (703) 455-4424 Version 1.5 Feb. 14, 1989 Green Garland Drive Springfield,VA 22153 USA (703) 455-4424 Version 1.5 05006 1_"SynClv2̀x0@"@@<@@9@@0p01ߏL$SynClv3̀x0@ Gz$ :1?  >>>|||>>>>>>?||||||9&?  ?!!!! ? D?  %5%5-= '? "" '" 'r;  'r" ""?  ? !# '73100?ĄUUP P PPPPUU? . t ' ?  ' (?"" U""?  '!!#'!!#'?ff```h5?  VCSET01 UpPianòx@! 4 4 4pӂ4SPiano ̀x@pp4p1ӂp K pq_Piano2 ̀x@0@U4 4pAբ4Piano3 ̀__&`$  L _@kkOMMߏ ݀ ; ݀ ; GD|1בPiano5 ̈́x!@p]TP]EPP^Fp@q]7%PhGrand̀x0@$ @ppAӝ%"Grand ̀x@ pX"@ PV4pA6DpGrand̀x@PX"@X 4pA5LPiano1̀x0@0_%0%pA $LPiano2ʀx@@ $@PVEGrand2̀x@0Spو03pA6Honkey1̀x@-X"@XD# 4p15Honkey2̀x@.XX4p15Pfbell x0@ pA_ Ppt"PfVibe x1@$ L_ pq_(0G_p1_!NewEP2 x0@8p?npA @_p5A_!NewEP3 ̀x0@8 P7pE1X& $peq%"NewEP4 Ȃx!@ p`p0"\9p`6p@18"NewEP5 ̀x @$ 07pe!Z& $pq%"EPiano1̀x0@> +P0L# `eP0A$EPiano2 x!@> pS_pW ^7"EPiano3Ȉ x!@p?p3ن'p0p1ل"EPiano4x0@@4r 1pQ!EPiano5Ȩ#x1@%P@E*PPP 0@6"HighTinx0@, `_ pq0Apq!HardTinx0@ 0@_pq0_pTq_!PercPf x0@ A #pM P&1P`AZ5pA]!WoodPf Àx0@0A pp_0A_p@_!EPStrngɀ?x0@ @1j pq##P Dpq%"EPBrass̀x@@P@1Hc'p q%"Pp Dp q%"Clav2 ̀x@C_4* I_ $ @_pAX Clav3 ̀x@ @ 0@p]0 pB7Clav4 ̀x0@p F opE p@ pA\"FuzzClv̀x@ @ .9p`@`)pC9MuteClv̀x@ p@  0pp6p pBX7MuteCl2̀x@p@  pp? p pBXSynClv1͂x1@00G '05006 1_"SynClv2̀x0@"@@<@@9@@0p01ߏL$SynClv3̀x0@ GzPV@@ pS,$SynClv4̀x0@ : : :p:$Harpsi2̀x@  p`6 pT6Harpsi3̀x @* pH*q$0Dݚ%$Harpsi4̀x@0c p150  p5Harpsi5̀x@ P&@C_ Q%Circust̀xP@ pEp(H;pBpA 'Celesteʀx0@ pqYp1_'p7_pq Squeezeˀ xP@0s@2 Clav3 ̀x@ @ 0@p]0 pB7Clav4 ̀x0@p F opE p@ pA\"FuzzClv̀x@ @ .9p`@`)pC9MuteClv̀x@ p@  0pp6p pBX7MuteCl2̀x@p@  pp? p pBXSynClv1͂x1@00G '05006 1_"SynClv2̀x0@"@@<@@9@@0p01ߏL$SynClv3̀x0@ Gzu0p3101?  $ !TD'<8 #/? < 000030A03Y?  ;111111,,,,<<1139 ?,,,,UUPP&UPP( PUP?  00 88<<>>?<<||  ""F O""""? '%$' $$$$ ?" ``P? !!!!!!!!!!!!!!!!? H?  08<>>>< <|||<80 $*5? $T2- VOICEFILBrass Ȁ2x0@pP PD`OpDQ($R( Horn ̀x0@pA ))pE_pA pA $Trumpet̀x0@ A%0@B_ A9pAU $LoStrigʀ"> ?L |dD!p"ppwp"ww?  00008 88::::? `)ee=eeeY?  0? ? < 3 ?| 30330ww0w?  2($"L$D$*2$(0?$L$@@ @@@<@@  ?  56+65Downloaded from http://www.cx5m.netpP Û:: :f:f2>2! ~(ͤ>2> 2!@~(ͤ>2> 2!`~(ͤ!~(:f:fͤ! ݶݶ ݶ@>ww w@ ߫~>wΪ~(=wnf:W~̅0 @Ҙ0pn f ^#Vs r nf ^#Vsr'O! ^#V:K#Ewl9ӠyӡӠۢOG:x !y0O!5x>P2:< 8>2x!#jB8 #^s> #!2ut #utÿ#^s#!Du t #utÿn f N>(3y !~0O:#ͦu t ˹7?Bu t nfN>y :q '˱˹nf7?BM:#!R"D!"F!"H!"J!"L!ɭ"N2242T2t252U2u/2666x626 6 D6 2o&)))Ҭnf"!!w#w hl 2Pv,r"4:_!C~_!C8*22=_!ӭ~#2~2*#~2##~2ABAABCDCBAABCBA@    8\AR:DIj: LD IX,0FA20H" <  s kNNv6W'];}hS@. xqke_ZUPLGC@<9520-*(&$"  WRSޮ: LD IX,0FA60H:; LD HL,(0FACCH) :; LD (IX+1),L :; LD (IX+2),H2: CALL WRSH: LD HL,NULSTR` : LD (0F932H),HLv: LD HL,FMDAT1: LD (0F934H),HL(: LD HL,FMDAT22: LD (0F936H),HLү<: LD HL,FMDAT3F: LD (0F938H),HLP: LD HL,FMDAT4Tt XYMKH KHKH KH KHRKH KH KH KHRKH KH KH KHRKHRKbKHTt XYMKHKHKHKHKHRKHR KHKHKHKHKHKHKHRRRRKHRRRKKHTt XYKHRKHKHKHKHKHYX YXRKHX XKHKHX XKHKHKHKHRRRRKHRRKKHTXYMKHKHKHRKKHT XYMKHKHKHRKKHT XYMKHKHKHRKKHTXYKHKHKHKHKpKHT XYMKHKHKHKHK:KHT X YKHKHKHKHKPKHTXYMKHKHKHKHKHKHKHKHKHKHRKKHT XYMKHKHKHKHKHKHKHKHKHKHRKKHT X YKHKHKHKHKHKHKHKHKHKHRRRRRRRRRKKHXYNM Td  Y KHXYNM Td  KHXYNM Tȫ {    c  s "tsr/MKf#|.|0S^5B9 k9Z?  !!!##''//?U:E3O" Z?  # D #""#'?D?=Q?  # $$ # #?d$$dDD; 6?  ,,,,,,? " I?  08<>?????? UUUUXwwxw?  !   ! ?< U2; ?  002222 LLLL222222?LLLLLLp(p 6)?  $D 5 5 5?TTT0 0D00 F ?  05 * %? \TpxP?  !#30003?3`"`P f?  ',,,,,,,'?ddd3300< 03O 7? 0 ( $   " ! ?$DP ?  ''''''''''?$1$f$$DD"?  !&((d08((&!? dD <08!06!:$!*@*)G^M 6nHN۳.FAIR4ic4MEȥ7\%!WLqRleSj+ QS!V&!@ji* R*&$@$ lC)J+*G*hF) wQ:`~[*ylSaJH: Gj):G~ju`0YiTjpeU`$NeȥUzoxTzoxF rAzL o9Ma-  :.Mk1,&%*ܲIAIEХ (`~&%*\ *EAHSA)(WQDAU@+H zM"SI1EȥoxWG3:#.ReȥAM"SI1Eȥ+H O"]Qx ;joxϳ"]Qx ;jಲ"9*` R#R1S%pѲ( uSe̽EHE!5)j) w) g.M"V*t$bj5W*a::`:1J%2K!II8(9MxL}`2$'<1`t,^@$ '

*Vc JAz!E !SeW)dG)Q4ʲR̥"4IR`Rj%@!4fb4䲻dD%W]An^Qxg&!$ 1E@D%W]An^Qxg&!$ <1EFAHDȥ॰tzˠȲԥ+EzȲDȥBC$Hox-FAHDȥ॰A@Q C I BMn䲩A 'R7RFaxT b4dfM5XJd4b.%X*amFE0c1\c!VmkxO *`aL D5Xdp(+l)@9%;*H"- )%J JL/$4|.eRfM5X5FZTISd*\$][:b>SaJL9q +$0(:ak%d+ NRN}IS%ȥA@A03RA#l-mAv..1)c*WEF'jf Ne#̲T`̨ IY &ܥ*8( EL+5pf +5pguamoX^WQ:l+pޖEOě?JamVX^I/J?J-^ALT^؏hElAZ\kY^*` GFA0/HQ:l+pޖEJ+5pe+5pdE t^AE -l-kA03RAS ??GƀF??֠jӠ??4Va(&b9 ^A@/J cI\4r]bA@/J cI\4r|bA@/J !Pb$,1pA@/J !PF4GzTd$ F0 1pmbgF8,&c $f(' !SeW) 1&4F6!NjD' !SeW)| 9*OF6(\.Mj$Jc^Ab cNe\9*)1*y9D[:+6%0GI1TO5^UF\(x#]($ei J*y5^HMTaۨAY cI\4r|b pArA03R4 -1p.*i`$t_-Ha4Rȥ :le FܲKq|-`A6cOjU*(#F<ȥ9A1s X:UG"c `t_-*S$$ ^H$be]EcN!tF4pA+_7) FH&.1S+AS$$ N>!Rb !qRE?PY!FHR Lx`>:le ^M%ȥKAK----A|@fln-`'(&NeW_UeI>:le FܲfT%; FȲAa'(&AS9KGu+eSLh]@ mR):l EAO@A|@t4h%Fg1(&TRg(``*1EAU@hɳ9E?PY9bfԴ$GQI h j _ 9E h j/MAAU"J9YGcM k%ȥA@'k9 R~gR1 V;.ReȥA@A1a(#&MDt'Q qa@e\RUE*$'tja+a!1nF*$L$aqR&RL`f!@9*V;* *y\!Aq*x5:j&\ *+8eUW4`r-Jd9*:h; $L \c"T`S ENnMM@a_  S-*Fbpc 5N1&`\$ )zF>_j$ 7:1)!=&U] $OaqRE1 97R) 6MaI3 Fܲ+:leYqRE!F0R*r*y*!\ w*M8-):l7]D(a6!NjD'S9R@*i)R*Xd{EX`4Q FܲAFAEU@]W5R*B QS]Iz_-*ȥX^\5R*&F*$T !NjIJ ]^^AmZ ]5R*&F*$T R*EA]W5R*&w+:le Fܲ ]5R*tp+` FܲAAA1T&k$GY">Fc*\O*d^qD R1Sȹ">Fc*\`Q(*9Xd"KXdRJ}-c%йwje$GY">Fc*\O*d^qDdEAzeAa"xKUWIeI(*y*] *1EAlAh$mWx*1xrUY䥻$GYeAa"xKUWIeI(*y*] *1E䥳"z)j\#p} H$eNzEA|^AZ$GY$mWx*1AO_"{F SPa@ 94x\$%AMuAq">Fc*\ 1W)!4K_S-viXd%(:l *iA|w8Mj1etU`w1j$9`; ed (*9XE$& b)tR.aP"a* M !.+A+w 7+) aV>3 R#"4M`ZEY#]0$ _M`R)Rji*RjH$q(:leck[M(+(] *1l`4EQK8JiƏ.AOi$8H:1:l(RU~h$ .%@a." d%A2@A@"x2NMJ$-S -:l`%_^ͳ )zE K5WAmF 32[&W R.eQx)zaX+Qk*ȥA+a[W">Fc*\g \+%ȥ">Fc*\]]EȥAW[T$GY [A@A03t_-%^& %S$ rAS$Fc%pY"]R!\FAK$GYA@Kq!`4 ^$(3cH M(9d'!QaQ,\F&A@&B@&'@&@&R@&@&MO!SLdi,A:@A@0N@+j\\+4M 1.e(l:d}qD*tc\'-*`(ITM@jq(50@jD'-^1)-4R rN) ,($$`(ಠMB,(d(S.!@!a &9KTISd$eL)mW?W/*\TISd$5@c&_8(bNE@1x' ; a`:xdd Ha(R*xebM!!R)FLS.Rx#)Q[&r`fHd^@HeW)'S1TL 5@K Hnp!MF*>:]0-j+]CH<!+P 5@``$9`]H1:ll2St]g*L:Jg2IY.($961  fV 9 eL "F@F*>5)UGE) ,( `  `$ R)FLx "d R,.*i A9k +9]AAK SM3+(E H Jc S] f(' K *`;DeM 3kE@y_XdH ".-a"I*TO\) c7*le1Six${4\'q[*( :fD+`SASPJAJ%qD$hRUEY(.+䧻9 ZMFCmW1)S9W!0 #eLUFC2mQx'"x2 :lF0:Jaz?YtoY^qD*Fm*qLj* 2>P aH]Y4e`xdP|PPSPMc&_8(EFm@ j`x9KG|E-1W3pM0'$& kR+  SGE@[TeXdZTISd*\$:i[ak9 費9&'D&D&BD&AD&RD&D&F&cXSS.!@OHeWS.F費 XX[ X">Fc*\):x費.">Fc*\ R1S費.UW6T  EUE-uUUUV6oUoUN aVWAVH  FŠA-  AWK /9  EnE -?Y-WVA@A0gM:i+&:nM:K\+ Sj^4RM 9Wx;!Z9k9G 7J( qJ.-G;!Lah( RR*cfEX`'5ng E`:j&\$

Fc*\g \+!*nM 8c&-a)S}@;$%m(R`RJqK*O `,:la!V̲AWA5$SA(SY4$R(P.\FA@A03] *1;88 #W*>fc*MI % G.&IX#bTA@g:iSLIO4h(E\FJ GR̲"4aIEA@q( dTUS`L(R5WLUYr;8 O*\'Bp`.&IX#bTA@)W4p'UYTgWO #INe\ M!#a O*\$ "& (x`4&@q&^$ERa!\FA@A03`(d "P.gWO I` *#qXeWL M8F8,H($ -+F\('%: (`$r*y*!^&EAWA !SeW)@GR(P.\FAM? AwTt S-*a($ O4f :*xb&]\]FE AM@T'^}@4" uM@!P&aHjG,eS)%ȥA@%2*)zF>]NM@s+qtji!`$'S1C*H*.}Xa(SA#``$$N/KGj$F {*+!jl*l&e(%cI@w9f>) V&!@a5R('-:l`'4MB{;*$(*)]Q(:lJ-KW%Sd7&W9f>e (1d,$KR.M +qQD!aS*1`$aj* h410$2q0E*\T]@c4R$'t\TISd3(k -*EH?2 OA)/pޖE D'^}@S AM@ 2;j6US`Q**c'Q ATd#LRISF.tA@A03|1T`+5F%0SY4YxSY5Fc!! &R*G mI:1) #~MX#re0LS,:.D3F1Eȥ FQ 4k1:j)P&*>naE@ ]f!@!"ȥao4n m@on mA APE$`7I&*$L "MWyNMY:b>4:qF@.]It'Qkw**yGȥ$}S) H&7I&*$$)UL "MW4&bt]0SIG^E(h($5@(#.:%ȥA2-At(PA"ə" R`TH%y `x(-zb4r>( 8  uX+qL (nM5I7`#($UW4`4r)P&5W( QgA_j$(R4$p}SN9 ,SYE($aH]Y4R5S%gWLx(E Hte(=X2  St&"k )zaX+Qk* S.Rx1^@x(3miE4E H/X+1j)iE EJԴA+PQ4E H&*> #a"t$-`(V-\TISgM ]7 +`$q!*`RL$(( 9d\+2`*Z$}S)!M 4M]3F] aRM[Ne@F&>EA>ePͳ _&FMȥ RME(`ܖE^tP߳ Q8r;- X)R:l(ZM*_RE )U:ljiGiQXK]XVybu4E H&^aI("aSXMX`' )W`H%yX.(Z!zM\^1W-`\DQ>#pg]UHe0P(4USE P$G`K8@&g&"A 2EKd$`jm)%P e 3aX()Y#A#4qWQz6*4r`ISMx$eL1xGtd+%LTj`${na`LWK,'R E St P&t@SS.!@$` 1*`)UEC+@7jj`03`h9Sdlh('I@UgW+Rl _S+*Ud D+6c&gJ`$k9]X)R)J̲At@B 2*ti*mW(gWL;8*+ N1k qE@#:^aq[*ȥA+q+D:ll&)R:lGfEX`` :1) 8J( qJEA@A@MAe A|J;>(*i+E(P( *i)viX䴲H 5;!t{St][*ȥh]@ hF( N1ȥA+@>Bp`UY#cS%D5]Eȥ_! *G(:ledˬ?0Ht@(RUa@*) &:G))) aSS$'HSQ$.c>:^`t\SjٖEA]AY\:12 O*\ F -c%ȥA)@AM4RjiEBAk&'R&"cR) f&:l.b(R4ܲZC+M'R::1aQ,US(UH9n R`aUgW(%N1@^KF*$\ h:E@+D('D1*y9Dj($`O4EF%0 HM9 O -) lR)*`E7!vEL*iMFe9j{Rqxd!:M ]FcWx$REAM@'R\ U*aIL q)y*eȥA)@B9R5X, A& EA3A)J&YkA/Q - AH   ˌ OXU<*\E`\+-1WಠͳA)4-%ȥq2%@B 2~eWEAU@A[X6E b!x8jy(WXA(%lJ#4-5W)uM@N[.\e ( QQ) g%Eȥ.\ec*$7Y#B**jmK)QI$]RR;-aF_-.TaX9GȥF y]RR;-aF_-Se(?  `:*yGqR( (dg 1- >SEȥAlA !Fc!(9d$ n\e&\$)y*xU+j.M`RL]F5ӤA2?($ 1O UD`jR:l ):# "DaX3:*)bTA@whEEХg `!xMFek)Y7*GEX Rh($y.]Hf>(A H)R1+.gcUVe0:1k1`T !bEХ L j Nt)y]EȥA@L *M &TOR*y 4D$/QD%:c i(4]H*yF_-[FAAi4&- Rk) ad' .g]7!q[*& M"*/ a"g)M!"*$]FEA03eE`&TOR*y 4D' !mE`7*JM4k:4 ( Wk) aJ JR̥"4IA@ Qkh( FL O7h( 1) Ri,:l 2 P(+ R*6aa4R.EF$ t_-+);jGv-\%@c*WEF$SY *y\!@pZaZH$ :jc l\%XdL (rD' !k-S-\* *y\!@p( ( \R =\* F*#.RavP(& g I??#EF'k j@$eH6tF'NS !Yk:4Rc*$7Y%`)ySmW"*/ a"Vm:lqXeWLSY(p-k jEȥN] !Yk:4R.k) a䲳 !Yk:4Rc*$7Y)y3Q]X*y*`deIanF*$L1_G*EA.]Hf>3.O !&E*L :j8X(r&OE@k^d' "b(a2*g## 8Nj#*$ e)Eq.0{%V&x:8KF!M@j;Mx5x Sjp9`$̨AgAcA[_A*d eR:x9* H5(g EeȥAgAHcR9d(E@Sj H5(xk :lٖEAcAV_A[[-A|J R79-:x9*ٖEAjA[eA+M2 :jOc8)(rfOE@"dM0M@k9 %DRs)) .b(KEA_W[-\:1Jb+ZMIt_&*[Og2 :jZc qN17S&'5SS'bJ ]ʤAUcX6E b!xL.%)8ek H5ӨAV@/B̡Ae -t_!%WX4F!M@_>SEȥd@q[* H5(h(Xk) F1@+G ,Q0mW c&:E O+AlgaM :j7EKdh(IF1IٖE O.[A@AzYh]@ lQ0OLc5FԲMUHO@/7u@F[A)4/O%@ :jEJ&Y[ZWFAWAARd7:l&"!FEIS%WMFe(ٖE JR4P9 9*S%W aFA^]-*NQ) Aj* ! %ȥH[A@JK:i ]0M*\ Adlek:l*ȥ.R JSS.!@F4p]FS%W aFA+S)8&aY(KEAt@AoÏUA+ dlz$D%ȥ-K)8&aY(KEUAH(`A#:^`yдA)4-%ХAU@KJIG IOFF[ճteMA 24US)%ȥKJiƑaNKUteMA 24US)%ȥbKMJv]M )`UW:)%R*y.Ra5S+m8e]Yjib\K %jSS%IORW)5Fmx^J$ h' &cxUJ!!; *@S,:.v"J8ec&_8rP(4#* D.#I!M Ix^L WWV*A_`T ^Ȳ?i?ifa]K %-$l39)E@#2M (*Jx$&.&d5F%IFL(:lxjc2*y`b]F@g1( `$ O&:nMHM9 O =\*84Cb+UEFaI+VaS!A?iÏK H?i+cW^M.MUF\ 2!M$'wR@SYa(4( bM8)3F]8&FMȥh]e`_@K?i+cW^M.MUF\ 2!M$'wR@SYa(4( bM8)3F]8&FMȥh_?hJv]M )`UW:)%R*y.Ra5S+m8e]Yj`$xjSS%3(I\4r9*ꤲ]afVKIhahf_`eVKIh`heKIhbhiNOKXdd!j* E7%q*$M!xq[*`eN%HRJJ+*G%R*y)!5S%]L3kG.+%]FE(<+cW^M.M2!M'hHEAKHT]KHTaTfUT UST SJ@RT R$Gl ÏNE BNR-H$Ghe(KH L L h g k N?J[_ZUTVSTR E Q TUS [_EJ D[RTJUTFST CKH C D-NK?iQ?hn'9NQ[_Y_Z_P_,NWDE[`Y`Z`P`Qa[eYeZePeQfDIe`_hSS.!@E*L :jX%()%ХN[D[[ HVWXaE%b SS.!@mW{-:l3 :j&2VWXn-? gU "("JO. d$+j_50]@6%0cfM5I4Х!SS.!@mW{-:l%qW( R):l&2n-?E/$4GiƉiƒE*2%$(E F(9DGF$ .Mn!@ S M($D S-*g%@Rd*n!EPmWx9 td N1aHjgL 9 tp$4] j*+9*y:cjneNM|4rq@MJ$$7*JM4k$("fD]9 mWG-SXi`%eXyX p`sS(4D1{EH'qRRy^@('t.;*1 \:1JqRRy^@, $T$eIA^R3j)Ld# SO&^J$-n!G"ad4[N"x9YG.}0<%*F*$Lc&O 9`)y ^ȲA@Bd#@?l@ BM(6g%@ Rh'H!Mx$e:n!Xf%0'/*\jpRJO8RNM"aaL`S )qJZc F7*JM4k&\'-*`d}:*M EiƓA1] RSj$Z9Gq)y F)%ȥt]EȥA&[d#$PdE( +n!@2.%X5Rk:l .4RrSj`'` (\+)qx`ox H5('$aIA4( x-*eMx'$b*(`ndUW:l1 :j`0L t(x) n ^+.k  ^S UCj R)F!MAM8,$;*yj\ gDdR``n*j`RASMP5$䲻 h g [eA@A03 9):l) !Hܥ Q39)E@!;g1SS$eJD8&aHjGFAI:`9)E@!1@%Xdea^L=\*8)2Apq!UfqQEI9j 2%SMv^}@V&[JSdM5IeE39)E@!8&)*c&D'"|&jk:na$Ft%. %`jS X@V&[J&,eS) F%ȥAOp/7u@N QFL/+GO%@Q) ̨AlAThfd%&Nc.M %XdіENTKA@/7u@B 2EA@ QMcSgbccgbC+@E%5Di@+DO _p( AI@!^L=\*8)2Apq6+j\$.F:l jjv) %(h($V!Q+M'W:l - c&1X)"c7i:F$.&e %H9*$" ]R:lqQ`L`*F.Ra:y*c.Mx N1.c7k) KX+R #W;>SSL4" EV}Ic aL$`:h]I8x Ix^L$q43Q) `(Ln PUH9n G6F) C/WWV"r`qQ`]X*y) !pZaZH2!k4]%$Dp dD$4$%I9eI*<0@(DS%WMFeDiA3+9*M& +]e)GRc9*Ud#( =\*8X:le(\* %[9 -eH6tF9DKX+R.jf`*^; $!.amW`,NR:lT%Qy*g*JF!M@pJ) ]5;%ȥCS%WMFeDiA3+9*M& +]e){*SXVM0 jM :fDd+(Rxf#. $ ZaZH$a8l!SqQ`*tji.b $7-)R\SeORjfeQx$ Ia0'2{*`+j\R;) aZaZHRMI*be@#.Rx)4] q-(/aHjgp4PȥA>MB&Y>rA:@BW(;/ E0g*O. [)fdіEA:MB&Y:guM@ h K A;R̲NkA\g!P&FAI^xx`-)xk%ȥ!P&N*eȥ h AMO(&FAIEA@(&hF)%ȥB]NV;Q+ikEI 8.gS*G >SE|*\+zex)R( AM*$ (e@ 4UȀ)/$4AE(MeMtAAY}+H5($aUII\4rE(S-+&*& M@a($ ^H' S-*a($ 4DV*j%r4RM&"H5($9dlE@<:`$U+#JREvV&[J&JO*$( &ܲbNM!2x :jo:^xd$^S Vc]*X) a I+!qF!M@^S hbNj\',R)*`H5(-W]I(eRV;\'D2tLrA0Q*G&*$x.}+%Sd>L$'q-(ɖE!re0f%ISmW B R*b"*x'9rH5+aJH Jg aUAc.Mr~S8EHOYFcm@b [*` RSjVUW4P (x JWX5IEAKU Aj;*%Xf#.*EA@YZ@-*tQ V&!@k 5WAOSG*$ pIJC+@bNMY5Di@IW*>*y9n+ :j`fIX-)4Nex2tLrA0Q*G*ue0d(Qes-(F!MW<A2[ACW!dAO*]XeI3l9y^Cٳ!dA&`.bM /]8E8TAP2G 2?r8@!dA9R`-j((g&"ȥ ;$Gr $GrA=ĕ=A<ĕ<U<<ji)%Х+9Eo><B<_tVMSdFCfg&".gc]%ȥ/$48;&C$Gr ;V< T dcC<d#Zs=d =!dAcM`r$ M8jqy0 2ji9611*-SaQ+A]F!`+c] mi`l~SAt%.M2J>E/$47U==B=J3Q]EO -NO WY`, h$$a98E`gc] YqJL."jVGȥB<q!dA9*Ug6c!L;8 MI*+jO8g.MzE/$46!en3W($,1xSS%IGRWSS$' L`TH%Rh($ae )`2.J(%**xRSj +`'.(\]F#! ;na`L"4i ++.$ܲC : 4AAFBCA+9]Ec6$`&^a&*;8f!A0Pa"4RS(4AO@BC@A<ҲXFG]RSj 6$4+GrM*$VMSd"DM^\H a7 !.L  (xji)!v,O bNE@"+.Wy5S ,(dg41AVb4r>T/&LE!}S) UWbf%X##l x$+4VMSd'(F@*F:xe ^M%ȥC :.B B.A AA<s!en3W($ei"*MSS'&c7RlSSL4!t] %B dF( N19!"J(Q%ȥAAgACcB dF( N1RS%WMFeFAO@AC@(F@fc*MIW))en3W(' A|J%-j9(]RSjEo5=AaAz]a4Y|FAI +9]EȥA@&C 4C:@&Cld#@;@ ;$Gr $Grd#YBq[N+ .g*jd#@C<@/qk4-^14SP) adAcch$4"M+5p4@*]a4 ^:l1G24q0r?t.C3G 3&ų.ųwR@N5W($r$4 ?S#. 3mi:)G24qӰxr$$24q0:)GCa-M%Х A@ 4A7@Ap@A;@fճh]@ mR):l-%ХN<%fF8( )E,*4A@A@']F$k ) \5W-`#Y+c]!#_Rag*\ qӤ"A@A)@3QxA7@7@* 0DJ!A !c 9y) SAR:lU``A4T$ ".-aF.M:y*yGAUA-AS"JG2$'h$ PPM!"+juEF`f>d4$3i]Sh'F!D*1~ + zd6*j`/1E 1  & *$Gy  ),($ ".-` >SAHUF_MFC&LH%xUFCF4S-*X)R(FP*A(^ *5h 7HB*`LSaYf.Mbd'x'$UW4`,.) 5Xd *i)R^I7 F*(&0oUaz-*aD*T]@eL x!FT MD1ӖE - 0$Gv8A7I-N$Gv8 -. f2`FC[Ne@%V* $'$115Sy+ITM@*8(pp` *5J (SS$$b_%PM%(಻$Gv8 -/$4/A@* * &$GuNApAzl&h*A){uE.M5Xd'7R&e$]ٖAa0^-[+X,G ,$GuNA@^@c7+*%j )19kg4H$ ".-`N5Wn/**`-Jd*4p'AJ.g1( R)".HMjE,  0%I7 F*(aGE@&L4}61;%c&+j SQ$+:^e&Rl) )^(&M:l4r`4T$ ".-`aeL+]F!ȥA^Z$Gy.  & * 'A]R(V3 jl*UW4`r7S&$ )YQ0:lE@aF_-]f!@:j9djx5(v-\ )1:l`4 rE mAz_:]I cSE7 t!aL:xIS51O f+FA0 mgFD3 + _ !<!id&5J\]H:!A7R:ljx 9yx )Y(<1I"Fx$&]I.%0[F!jGE04('<1I*nMaGk-qXd$:*-(;! (64R.-Q+#]SE&R&e$"($ ]J`t#lE0mW a($ ".-a :l4r` *+FEAud#m 7H(4$ A$ "MW)jyAlJ*JO TM]JA@d#@X)R(5F\$k-qXd$SS'! &QA(`~U@5WHO-o6di U@"m!X%l&aHjG,eS) Z )L\ #W*>eUEȥ2`ar8d^HFT$ ,x H/!c%HMVO8(5Xd(% *%EAmY_EUAL  f[*`!,c )kREArk޲(5Xdtp9I(RE *-+A2` !4R()!tp5W(`Q .*i-p% i M*)%PMWQG U@a +&EeI(R!9k# A'1q4 R&i( ;VdD(~f R:*d0EDdR಻  * &$Gy  -kȻ-_$?Xd \d! HF4sȥ-C2`FC"c y !c!Kzd (L`'$NR.E0\#T`oU䥳h]@jf*(e ^(_j*+Eh]@jf*(e ^(#-%ȥAv@* *(5Xdtp ;Rs)) UEȥ7Rwe$ {-:lE &A7@NE\Q(1` S(zd]@eD5W( 5@QF`D"_ &id*15S\U@|(F 4rq@ P 7R7R(q43w(ȴ -$GyA7$Gy:  ')'2`c&_8(5Fm@ U@|;-fjpRJO8%;jrR!9kFL*TmX Dd +lhEX-5Xd*]X(EFmAhm@ Q b_%P5W($d(5*mWQ n`^C/b1JMJ%0MEPM4'3d,4 f)5Xd 1` t:nM:+ȥ$Gy. ) &N::  (5Xd$RL RW>rk)YE ':$G{(S$qQD$ 21&x' (Wb+.IEH6*MEjD$5@%a71E -:  '$Gy2`nJeO!(I0T5S\S%Թ'ArUk!O%cQA@)@ BMnuM@-_2` G&L#h'$; |4rz(R:lt\ 5@ B*`$p:l+Sj\!"f(RL +0{Q)%ȥ(5Xd4" $ B TUS)%ȥA:֙ + - &$G{d#(Heew9S$SnM[N"x$&1X5$37)X#S-a7%ȥ - + &$G{eew9S$]NMXElhEX1 u]ɨA4g +Ri`5J]zF>dZM*]zD w;%Թ^2`6SL6>S2c $L +I. $EgbO *@ (A+m2`fCa&J%H )7!1a[*D 2s-)c:(E,(' ^:lORW)lhEXS%WE]XjF>-Sr*`!c%ȥ8@AҲ2` Lxj]( &4{!R5%y6s 2i\]FA0k3^.0%-; H-`&9-_Xd !c!M%`$i;e ]RR~3cFDg($ (rD'beIfGF*`*Fg)M%ȥ. $G{ +\SQ&ec 7Wd :@94ٖHO@:@2`]HQ`4V>d5X(w-:l`2NMAd`x5Xd-+b^fGF*`'hm@S 3*(_M -*@(/*\(nM: -%йHOV&7R&e$ fꨲAU7RLd(4 :EAv]7R& )]Qx9I#B+S&A@A@7R&H(&+9xSL4gK,Ldk%ȥA:k+ٳhm@Fd :@TM]JಳA(`~FL *E-QA(`~FL *EA2WF]S[*`"4a@ :EХA4Y2`p+L.*iGpޖE^9e *1`d4/Tx*5F\VqQIJ1xk.(U@ +#q@ 4ry*` MbNEXPGȥ%K8_ #-:phF cH!J$Hc%d!EȥAq@A9@f@%q9XUp$$ .jx *ti(4{aZ&`)R(Za@5SmWb!F>{TaXeM!`$+5F$'$qEbc.Me(S(Q -QF#e ^(%n6)m4-H?~A0I9.c p}&5@רAA@A0cA*;*FA@ Ag4H$ D(5]EHEA(`ji*j -5WAP$G~gAdAO_A#Z/8CWA)^/KH4M*_eWEJͳA+&A@ed#@%&z_ &TISd$ ^`4+2bȥA@d# i#7S2R:lnaqI0L MN1RREd#]Z$G|$G~3QR&#@a%d#(Ad$ "MW)jyAbFF! :~=Hd 3iZTISd*\$aMEХSd#FeH(49K:Ua@#S :~3iE(IY50TB.Ma e +jy@ &TIS䲻-%A.@Wj` A$\gWL cW,Ȩ90AS$G~g$@ $A@A6@@BxJcN.A)J)(.AN%. #%A"D"{ 86@%SeW:l .1eWXH(7R1+VaXaO&AEХE-rA2jxG) #p*%cHT !SeW) E90 "$G~"d# ]A0XT8dQ+nSXG5%SRl ^C&5F%09dS] zgJe0:l%EХ$G|0.$G~$G~g$G|A"s.#p*,d:l-)4F!"qD,J(!E Ri 4MܲA"kA0":lVqF@'M YeW*j p*7SA"@$G~$G~g$G|3QdA0@@$G~$G~g3Qu0O@&'d#2u#.' '- 'W(4 :~=Hd' AaV*E*LKQ+%Х85x# b.W-#L( F\$ D($p}amW) xiEA!UB!I@ShjzcFIJA+kNN( .4R!&AA]!Ud2y` 0ʖEAO@ XE`\+-1WA'@)5A=@1Uw/S#.RnM^x5m0 S9*`qYȥXi)*qx :i[L mq0R9+A^Lt! !YSH4&*#OyGfOR) N5W $Go/9,+@8j &T( j:]Q+3Sx$`:F1@d+aUEХo.H(FG,+ȥAE $GvA+@.M. R !&*q9*9KG-*`!M`o %ȥA@A03 G* mI3QD b( t{t_-JO*$(&(F*$d!S9nc&ed6( (jEX`j &lEI4p$SAM@I7 Q9[(< dE@pX) M. (Qg.O*]XdL mp4cbd$E(6( SS$NFOTCL5WM!+cW^M.M,,-b!kgxPfe )H:fej)cbd)O%W) a M`:i9fQ((`o %ȥA:A6J3QA[&97+1?ADSEȥAp@A8@A!e7R&$2.MSj\%@!9k]F'ȥfֲF]SE.MEN7%+Sj\9k#D'TMQ`*4AK7 #ǰAA7AaMjLd N1c7*leE9kE(E,Qz[9_SCR%E5RE,+d0ah( SP'e]AL;%c4$#*F%ȥA@3Q>A=@UQ+4] &qYEA=b )M;EٖEAHN9doeȥA.@ )^Rf1@ w.M; .&IEȥ ) B`; w.M; )%ȥA@ /8CF ŒAbgͳ"p:*Ugȥb4aMbM O%EȥAJ3Qf@A@ӳ7*F*O F 2n 8VxeCF}2>a +J*y`$eL ]gAR$G  8VxIQGE(Nw:]@4E bCgj:l\'^qW(i@a cW(d(ז -MR8(IQDZ!EX`jl*ytA@3QA+}&[J'HdFnJ+;jk`^xF>Je$'eW7xVdL %ȥA6@3QA+k!x& +-Jd )U#eSj+ q($^M*$ fEA@A]g.M>rE3J2i Xh]@ MS-*; ? KFe0NN$\Dl xQHO@4Ld+F>EA@A2tp($ dEXd] +!iIiji]I`%j+ &" ISax$ ):# V=HdT*y-5W('RjV_8a@".4R RFcm@5X;7j_ ]L8e@(be!p*q^:l>%@i)U$ ! f\*4p$rFA@ FEOkJA q(9\)[J'H䲻@!yS'jG,Pp}jR:lF&\ajGEI:l 4T !bEȥA@A2jR5WL M # 2JO !iIic*H' !IxE71xUF! Q@$ ):# FKRNNb>S]0D21AiR4$*\y7R)USXGjO*_Qx R*&JJ`.!L} _&:qx /MEsx]ՖE@#f_ !iIic*H+( i@F&W )Rj)*\F]0] +ȥM[Hx(Sj\TmI{M@a($][(:l R**.MMX಻ AO@(Sj\f\R5Fo EA@A0g*` Q#  _i:Qx4Sj+j.MRjeb4U0 S(+E(xmR*mWX Sj$"mFD&^ *4 4M@a($ mR*mWEAuAA^AYTI0+A"TE ;8*+(4($ F@'e*<;)miFcm@d ;j`ȥ AmؖE TAa0+J';8*+(QLqD/:^eȥAJ @0+.:neF> *J$*3 a4":41@aU@|:1K*y*+R*EA+@/$4\1A-SL4'0+A! l(4(Rxdf>EA+@.M. R]F'%o %ȥA'A0r6($Mji*? $R &FO)M TM;*yj_+qW(NL 2;j$Hcbd$k+\"gWL'5FocW, +&4q0La]A!D#]+c**x 9`#VmSgJ*JO k-[-9Nc "* Q `jw*M8* :1` (d'vT4 (`@Rl F!ȥ !O nA05&Ta0F0 RLE h_Xg`Fr *2EA@d#@@ $GcM4M9* a]@N&`R)!I;*y)`h9Sdm:l :d%0 Vp$ aT$ kxR*M TmW IgQ eȥ A4@ ۲8(`FCjrjkj_Prf R59Xb"x2peI-]J+ 8RJRj(`-S ]8#`((7:.M jM1+(V* !Ud /!"HnM zaKj%PMeSt1`(%aM!-*``GQk4p$c!MM;jGLb+ZMk-Rb .ADiճteM4US`OREteM4US`+%ȥteM4US` *E  AD@'Pr`Ga*yGNc c)a7%ȥ @3QA#G $GEe7:p Ry*y`N( j50NjzcFDh(M*j$`cQAR`A\ XUGRa #l; +ȥA+w K)Q`: -*t:x9*0%Ch+jL618&fOO%ȥAd[;8RMbJF8)YEO%@teMA!I@SYG-SL4)Y*1.`Cn! *NM*((\].>x,:lSe*>EA/SA+ *@k MٖEA$NJ&Y#AdNJ&YdAbso  kteMA!I@SYG-SL4n 9eWt𲻙AMO  ;8&R̲{0)YR;-an!T*yG":l- (x1m8(:9%ȥA+@ AbFF!7xT*yn [R` Jx0&c7l*>~E.1#*UgȥADѳt(]Eȥ)YA|JAEI VM.McWq@A@%fF85!FL &Fd RmWEi:lx wQEݲH%*$;-cl&`Qm4rMMA(JaW:AWASA)t] hRjEUOH]AY!X&,4P;j( RSjAA@M {B*TmId` (Btp4-*Etnam8(Sȥ6)J3Q+A^S9`#79A,@] *1%cy5WA)@"EA,SA*FA@ 7;EAd@ XIQGliQx9A!@-*Ne]EȥA@Z!f:*EA+@۳&] +1 S 9`%* ޖE&] xR L'4e_ap9`%* ޖEtE .*i&O*^a&A-j+%ȥ8eJDP&"4aIE>:le<&te@#2M%ȥ^nMt!W_~*&[Ne@$1WSX#ac*(HRJ7) q43;8MnMXV* 4K*y*kE@y*6_RqLk j@UWbMQ, u]X*yE$HIS$R]Eȥjc1) :x9* M5@LE ikxRE'R&rg*LLc7Rl#**0d a &/QD$|Ri^`9j`'9+&f4M(NS( &USMI3HxR4jb($ r'aJH! l(R4j(-*AR;8*+& E a1X7x ;9EEȥ">Fc*\9YGEFM0Ec&-`5WA0gAy*i)Rl:Qxm1$ be`a M MX`' !PP&:1jNL) f!`+ 54L pGb7(4'(&) YfEA)/pޖEAII@S$'&Jbd mSOc&M&]8\ S^'c!#gjx%Se T`+EF$4#NeX6!NjD$q( **)UG%X!S'_k-h&"*$FTcq9 *a#f:*(".H!^aX ^H$ *nMp}tM O.OJ$@&NQ) _G*E!z*nMFAI4O)(;ȥ!x&f)U#S4PEUW4DFE5IF\(1`' \9*Ob.1Gyj`dr;8t_-*#*M8E4DFE5IF\(1`' \9*Ob.1Gyj`4r;8t_-*#*M8EA|JWMI(]TNt.IEȥA03] *1;88 #W*>fc*MI % G.&IX#bTA@g:iSȥ!P&aHjG,eS)%ȥR9 GQeI3g(EQ'yEȥj_2$'tp\2 "$ \ɨm@]$ R:lW jl*Rԥ(S>:lj*+)J)J)J(P4%+)J(DڤX6E QR) *b@w/EFTri a|(wJE J9X..-@*cMk^d$++^:TEHEȥS.gS*G%qW( R):l{A.IEȥAĥ9"Mm0Mcx n%1:l1aM7y0!*c7SSaJH#^ȥwNx *5/QESrXN)k)E.yeRW%ȥA(JaW:eW+:l(HEFM W%Х1UCi:R*ȥ1U&%K:neQx :R*NE1U&MF^>%:x;EHV,$z( (ɖqX(I^E(.Rh(Ry) :Rȥ"H&JO*$ A8X US) SYpפ#(X US) SYpפ%Se diXf!@(4e\6%Xd`V;*%X)R94\'8diXVaSd3F].x)^I;&_R*&M*y.MF1A5^,VfyInGR$:`r(($4'"&b$]t^N$E@:%RxEΗR-Gj-G$3F].x  3UW-HdMRaYeWG%Xfx1e:GI1TO.an)!-+]XjJ-)c8E"H&JO*$(.J+b.1G:|%WX4$cxbqL*d P'"Ij*8wEEȥ"H&j~9Q%0$ je\ \:*E!`jJ+b.1G:|%WX4$cxbqL*d в#(&j~9Q%ӰNebebeNeDJ!A 8`(;ITM@_MMF@x5R3f#:]A5^ $$u*)S;L$4IW "eSg!tx3S-*r'zj5ex5ScR(5N\S`$`; 9IE%*N>r9*O. 64'6%0]R*iSXi,*`RJ7R!DmR*Ry*y`$ (WQT'-NMi*`SEȥ">Fc*\&ASTISd:>^; 54%`,S#eL$&.`VO*$ v+8e f!A; `k7 `J9eIg*^`a\'{"V*eX%"H(U:c%ȥ yjKpe0 AOf:a^KXd-m@j6 2,(2,]F'ȥa *@JF%@ ^]X`$'({b.1Ea-j++J+*@,R )Wa,":lj\S$$+F0iXcoF b*4MyYx2>a,MF^>>a*c%Хz$!Es "dP,$@$.%0d_(4r`dQS:@E7!-f!`$ + *`ac1Eȥ ScdEF%04(qX!H\$(7&A0(g9gc&DI+.Hf#:]I `&"S"c*$E{1:jt^FeO6U]X!SdS+j$x79E@<*\4ljx)Sj(($H({8SxTB*1(V"R!:gS0LUS:l(+ H*d5F'beȥ M &F4DDlG*$):lZ4M.EIF<EF' \dD] 961]t\jS ) b|&jhEF\$d}F]S%W:l)@()4] .KlD5F$) F%ȥ$aFDnO&1@q-(G2x)++jx mW{*iOc8)jSXG.&d5F%IAqF]0i>SjSS%I S+G!qE#- P&_XeI k%ȥ.\ec*$7YE,h'FAI :4M:i-*Eȥ8d_*i:iGk-ER̥"4IJv]M )`UW:)%R*y.Ra!\%A Jb9./MP^@ R.RxS 3 #\]F# 1S3Q-I3c4MEХ%jSS%InG) 3F]8P)R) u]X*h('($qa@XSQ$.c>J %$:XkEEr.A@:xfISdL+%)8efF 2`D%Rk^eI1 RGORW)Tej&^>j$FA0*E@&c $N#Q8S9t^@uQe0kEEr.A@P)`L+1S*D :#.RaM@gc8Ep.*#GRT 2ji(ɖE% `%S2:.dx*E@q,VM ` P-*!NmA2jZD;jeQE*h($ ~+ ]( \)wiRj)eH:Xp.*4) :UER*y3i:#. %HRJzHy5S\{$-*`%F UFC SIGjx (*nMRm _fO qa@'Yxl&/; +9Id'$5,93^eQD/q@MJ%IT]@aHjgPYP"19 K9* :) KX+RS%WEd ( %) x'+yF_D*+V`e:na$'A3&AS-**i ]Xd$+E(NNaW9DGm:`FA0 h$ O*_|#+`SAM2M8EeJefTc juEF`dF8p.*b"^JO!#lR}X%&q9):l*ȥ]5a$q*!R43vP(&E1.6eI eH6tF9D u`$ (rD'P(&p( + ,hק u cm@Lj)@Sj^ryPe)O_HeIp^*p(+#Y(]XTaWfgW(`)j^$jna*yae+jna*y)q)wPA03 #[Ne@"*p1T`+EFm0 NeFc!k-k-qXA0r *S$$$@$-FgW**cD')aF4p :1`'e(4#be6O*\"ȥ4qW:lF8)^@|ȥA034S! )FR1:lF8]Y!M A !k-! &%W) P;j6pD'!O |(5W)! ajGEISSL4J(Qd"^Cnc1EȥXG4" pޖEA03 #a&xi1W1O1( :1` J] 4smA ^%I3Id$p]Qx b):l) NJ`j^`T` Se(iEA03`RNNb>&^D#7R1:lF8oHRJ`Qy*k-E#<"+f/ 0ea=.]He̲A0reS$$a&xio;*/!#]F&cW^M*$xiC eJd9*`'t_-)eW\L)aF4p :16iC+jO8TmR*y3:#.ReȥA2jeS$$ D#84S! t&bdRlx$cl"+[N"a beR4 m#t,1Sf*R1:lF8YO1((+/8*eJV>RMT4 qXA03a%&^a&` 1S5G.c7+(431.]HeOi+! .Wa^A0g4T)U9kR:lYSj\fc Q aQS cW,SS'FM> $ ! mR1:lF8nF*$EJ] 4svT4k f!@!9k*a M84p$ $ dD[F!.*i`H ".-`),(' \P:b>:94M .]Hf>PS p}SQ$EmW _G*) )y01Eg*`Q`$q$$|j`$SQ&ec DdNOY6iC+jO8TmR*y]Eȥc&C(&>_ i)jO EX&7Wd$ngc7*lea J,:lEX SS'aP>K (%M*]0.TmR*yEX9dSS$9bec k)) ;8 *NMx/]S3-EX-* 8fM4$UW4`(50.̲R^xr$SS'en3Wi@fA@ !`94-`3F]%P4Q f"+&Ln3W(`^EХ!dAaD[N"b&aХrSj`.9SSL4Nc `F^ȥi@fAALdAER^($ d`Rb4R 0{IaXIѨH41ALdA?RWM>9*E!dA !`, h$ji`SEХA3ji) 9fnMekvi@)q+` Ren3W(`fAEPA1+rM*$d($ *-S$lc xeD[N"RRjO!FGh/QG 8dg*Tm@;8Q 1( ^M!*%ȥ!dAc&N!Df>1;8R#IaXEIQ,(`9(RJ`N4!dAf+MF@+3F]!LqdpޖE!dAek`$ n1~x*i{.>:l( ^M%ХA1*%ȥA0VaW:b>ji)!M@J(SS$|VE*>4%:eȥA1_ [Ne@GM@HRrM ^x:1AH-\ji`$P/ ]kxJ:xfMA3ji) E71x'AH2$ ()c7*lew+ _jEA03UW-Hd (eȥA0rS9R@& *NMx M1+:i:l`jz$/naL'J].1RNMF SAc8a&` pGi$& #q%0\IJ8d_M1+EA0rjhe)R4 ##`(d 5$ Ne%  bS9R@&p{mb$,]Q.mQx\UI0q*f: EF'c%ȥA0Y!M:"pjidq*xb&]Dr'ei D#^L$p`mL+&e(+be#t&9g'RjM*y#"H:l !k- !G )yISSL4!t^@`RM0$; *eNNc!vf: %`4V>5^CeW\L(R7c%ȥXG4"+pޖEA0r4Tje#c**xF:le]\LDj)*)l:`;`'5-:G`4V>4p$*b*3k-(d'k- !$}-M84r`a@&9kEA0r )eJTE,'.]Hf>Qq(),( f\D/ :\N.1\ X)S$ Ne4&eJV>:G:leaoHRJ`ixS] SYA)dT",Ȩ)^?ADSEȥ-*t7)@i(:G:lEFg*J ".H E(y4reȥA03 pd-EI1;x QvbRc1\EF'  q*T4 (`-`k-$ qXd$-*j`"jO*_`)W9A 4sDӤA039*mWL 6($ b(R.a$[** k- a*^@  +jO8xSjISd\ D( be+mWL.J>#l-mEȥ%]FF>O  O*\&AA%aj)xв85J\Qf!@VmSgJ*JO 4M  RE(R~_j$TMF\mWe ".-ai fe :l- #k-d'RzISdiIiV_*$x9g:10)3:l("H(4('K)QaSa@1S#`MX``M*\!ErSIDaf::]@!q."*$ #S-**l:j*MHmQ`'I@eU`(U(R7c%ȥ)^? K&IJA1qP:lej ) eW&9 E a,:.gj;j} 1Rl& iXeLEAvcHBgH+c&_.MVO!Ri;.Rx(4,V\&A@gWOpT'"d# 86+i(FMq[*ȥ8pTT`EEȥA0F cW,($ D(' Yj`/ &[Ne@aF4p f&Rqxjp )YFh'O%W:l .1*J\j)*\$6E VG uD]eS%I&A@f&`'fjp (gV&O8#,@E(5WA0;Ag4H$ DШA0e+* R) o;*]!L +aB>)8FL(!SMF\eWI1A!Rqx-*85Q(SY%pd!SeW D($6E `ETjy) M@.&I0R4$:1`_&q9*ME7%ȥ9H($(& o5W AhIGQ>X v!Sf>`l.a GMS(4M@!5W7)XE8d,c&O1xRxjJ$LD%qJRl1;%ȥ +F) qQ)!&GMTMSQ%W2`a J1Ye0RJqIT9Sk]M A9k4Tc) T:lj_tkx^M%ȥ$zP G`A:p)E,'$]R*G*IEԹ2` 9kmXrzdZk&A@RJO 9@R(5Xd'a Ri E)!#d}I7 +jL(tclaz+f+,D(+-Jd'QRU# -w9S$nM jLd S 1&x$-QD(Dcj5Xd%2` 9k(`-^J4i1x'"xHIFL J_X50SAL PHlVcM*lISgHEȹPvfIS&` ; c cF4qI%qEEХxfM4 ;j`k!#^LL .1eW7Qbfe +M`# aGS!ȥĸĸC GYeW) '^*`eW`']fIQx*nM + *`AS$$ ^ȲCex|1^1pG5**$_I*>eRjGzH\d!!RqxV]Sd t{A JGWECq(|1gjx%Se T`+EF%04#Ne[%@+*i`eJV>5|#A J4" $xhEEȥC :y*R&1@eRV*%QxRxf#*$$`dFCEAW:l4] + dF4pF:I. mWd:1dD 4Q -jFL9n!A`*;+ "*) jMk) ,RER x(g GS- -( RAL^j\]AYxb&%*\$EF%0 Sp$' R9d+-@ +*i@&8P ((:lUpפ\5W%@^H'(9*&S9R@&f)*id#$,T`+EFm0REȥAII@* *i3:jE0@U(% 5WF0 fT`($k9*$DR L:G*[%@ RJ`4 :^xreS$$ T c1\^ (RJ`^0 \B cl7 c1PɖE4W_j$)Qr M & RR`&"%Qx5**$zH\d!!RqxV]Sd u (d$A JGW#SI5]0SS$+ji`\ ^A2UQEI- t{ 9W!@qӤVxp&a^j\'Fg( EL*iwPF1_J*F*O%ȹPP|0\@(DDDLP:xf#.Rxak V>.W1x!(j( U^))!je))k)&ju]I9('X(N>3V&!@)(4t^O>]Vc $\J9I"q]V4%X#9@ R8xIQG%Feȥ"-8G&\ :y*R&1@eRV*)VI;jO_HeL'+.." ]0R5Xc 1S:1jNL8eSj\d8&c.F &M ) !R)7R``]9 M:i 9L NJ`di@&*Heh(]F!f`1&VM,3w\a^dRxZ4pQ()OM:ih$a:^`M7)8)7S!$ : `'k9jD4dc+5N\68MF\i`A&UI3PJ))U+\%501@c]!!!O 2sF%W ^) &VP5X 9!S8%fVP5XJL:lGM]F!`TE"4uj1`2!SM$1W6F8%Ra 9#&Z^Z\$Vl-6M9 `j1x"cf4ISEA0e' R) ^@ R.Rx+jO J*JO Yy5AS:lU(6FAX 2M1L:US8(' !k- J+8^@ R.Ra%  b db4U0eJV>Up$T ^8pT4P5%pd!5  SQ$bȥA+F) )IY%ȥ-R*&ff\D+5FA039*6!NjD$Td$ p*cUV>c*H (rD'8SW!@<*\*]fF k-8XF0:h( ]$T'eWqS$F0iIi(R4') #l-mAei b] )E7 ,T*yEA):G &)%sUeW,IJ&] xR ̲F0&LEȲ&] ($&ASEJuHk*UW-Hdp.m@"F19d4QA J.k $L !SeW)RM(+y0L 'X0+4Mm(xAQ+# 0+6dhx$aUI.A@NF@2+j\)SE0+SS$-:aT]@E(MD4A^E0+5xFFOVME0+4T`Lr!#_XeI&>E($ 9]XRH GS-d` (eQD%*N>]39j#"a`1Xi,*EJO*\9`#xFGa@ M\4pLmSgW:lE@1x' ; a`:xdd Ha(R*xebM!!R)FLS.Rx#)Q[&r`fHd^@HeW)'S1TL 5@K Hnp!MF*>:]0!06!:$!*@hitchika ~%ASa r;-`#ZaIJaAS$":KeRW!cR(5N\ 9*SX*Mȥ ; :?[<A@'*16aAR*$ SEAzork3