INCLUDE "D:SYSLIB.ACT"› INCLUDE "D:SYSIO.ACT"› INCLUDE "D:SYSMISC.ACT"› INCLUDE "D:SYSBLK.ACT"› INCLUDE "D:SYSSTR.ACT"›;›; AMSTOAMP›;›; AMS II TO AMP File Converter›;›; ACTION! version by Bruce Smith›;› MODULE›;› BYTE POKMSK=$10,› IRQEN=$D20E,› IOCB1CMD=$352›;› CARD IOCB1BUF=$354› CARD IOCB1LEN=$358› CARD MEMTOP=$2E5›;› CARD HOLDERROR›;› INT CM,LEN,MEA,MLEN,MNUM,NC,TEMPO›; › BYTE OPOKMSK,› ERRORFLAG›;› BYTE ARRAY Xd(16),› Sd(12),› FILENMd(16),› MEASd(1876),› MUSd(30001)=18000›;› BYTE ARRAY AMPTEMPO=[› 3 5 7 10 14 16 20 24› 30 34 38 43 49 53 56 59› 62 66 68 71 73 75 78 80› 83 85 88 91 94 97 99 101› 104 106 108 109 110 111 112 113› 115 117 118 120 121 123 125 127› 128 129 130 131 132 133 134 135› 137 138 139 141 142 143 144 146› 147 148 149 150 151 151 152 153› 154 155 156 157 158 159 159 160› 161 162 163 164 165 167 168 169› 170 171 171 172 173 174 175 175› 176 176 177 177 177 177 178 178› 178 179 179 179 180 180 180 181› 181 181 182 182 183 183 184 184› 185 185 186 187 188 188 189 189› 190 191 191 192 192 193 193 194› 194 195 195 196 196 197 197 197 › 198 198 198 199 199 199 200 200› 201 201 201 202 202 202 203 203› 203 204 204 204 204 205 205 205› 205 206 206 207 207 208 208 209› 209 209 210 210 210 210 211 211› 211 211 212 212 212 212 212 213› 213 213 213 213 213 214 214 214› 214 214 214 214 215 215 215 215› 215 215 216 216 216 216 216 216› 217 217 217 217 217 218 218 218› 218 218 219 219 219 219 219 219 › 220 220 220 220 220 220 221 221› 221 221 221 221 221 221 222 222› 222 222 222 222 223 223 223 223]›;› INT ARRAY A(11),› VL(5),› LE(5),› AMSTEMPO=[› 1146 1123 1101 1079 1059 1038 1019 1000 › 982 964 947 931 915 899 884 870 › 855 841 828 815 802 790 778 766 › 755 743 732 722 712 701 692 682 › 673 663 654 646 637 629 620 612 › 604 597 589 582 575 567 561 554 › 547 541 534 528 522 516 510 504 › 498 492 487 481 476 471 466 461 › 456 451 446 441 437 432 427 423 › 419 414 410 406 402 398 394 390 › 386 382 378 375 371 368 364 361 › 357 354 350 347 344 341 337 334 › 331 328 325 322 319 317 314 311 › 308 305 303 300 297 295 292 290 › 287 285 282 280 277 275 273 270 › 268 266 264 261 259 257 255 253 › 251 249 247 245 243 241 239 237 › 235 233 231 229 227 225 224 222 › 220 218 217 215 213 212 210 208 › 207 205 203 202 200 199 197 196 › 194 193 191 190 188 187 185 184 › 183 181 180 178 177 176 174 173 › 172 171 169 168 167 165 164 163 › 162 161 159 158 157 156 155 154 › 152 151 150 149 148 147 146 145 › 144 143 141 140 139 138 137 136 › 135 134 133 132 131 130 129 128 › 128 127 126 125 124 123 122 121 › 120 119 118 118 117 116 115 114 › 113 112 112 111 110 109 108 108 › 107 106 105 104 104 103 102 101 › 101 100 99 98 98 97 96 95]›;›; CIO PROCEDURE›;› PROC CIO=$E456(BYTE areg,xreg)›;›; REPLACEMENT ERROR ROUTINE›;› PROC ERRORRTN(BYTE ERRCODE)› ERRORFLAG=ERRCODE› RETURN›;›; REPLACE ERROR ROUTINE›;› PROC SETERROR()› HOLDERROR=ERROR› ERROR=ERRORRTN› RETURN›;›; REINSTALL SYSTEM ERROR ROUTINE›;› PROC FREEERROR()› ERROR=HOLDERROR› RETURN›;›; FIX AMS TEMPO TO BE AMP FORMAT›;› INT FUNC FIXTEMPO(INT T)› INT I› FOR I=0 TO 255› DO› IF T>=AMSTEMPO(I) THEN EXIT FI› OD› IF I>255 THEN I=255 FI› I=AMPTEMPO(I)› RETURN(I)›;›; PROMPT FOR DISK INSERTION›;› PROC DISKSWAP(BYTE D)› BYTE X› PrintF("%EInsert %S disk in drive # %I,%Epress any key%E",Sd,D)› X=GetD(4)› RETURN›;›; PROMPT FOR A FILE NAME›; › PROC GETFILENAME()› BYTE I,J,X› Scopy(Xd,"D1:")› InputS(FILENMd)› X=0› IF FILENMd(0)>2 THEN› DO› IF FILENMd(2)=': THEN› X=2 › EXIT› FI› IF FILENMd(3)=': THEN› X=3› EXIT› FI› EXIT› OD› FI› IF X>0 THEN› IF FILENMd(X-1)>'1 AND› FILENMd(X-1)<'9 THEN› Xd(2)=FILENMd(X-1)› FI› FI› I=4 › FOR J=X+1 TO FILENMd(0) › DO› Xd(I)=FILENMd(J)› I==+1› OD› Xd(0)=I-1› RETURN›;›; READ IN PART OF THE AMS FILE›;› PROC READAMSFILE()› BYTE D› INT X› FOR D=1 TO 10› DO› X=InputID(1)› A(D)=X› OD › MEA=A(1)+A(3)+A(5)+A(7)› LEN=(A(8) RSH 1)+MEA › LEN=37+LEN+LEN+LEN› TEMPO=A(9)› IF TEMPO<54 THEN TEMPO=54 FI› IF TEMPO>309 THEN TEMPO=309 FI› TEMPO==-54› TEMPO=AMPTEMPO(TEMPO)› IF MEA>1875 OR LEN>30000 THEN› PrintE("ýNot enough RAM")› PrintF("%I %I %I %I%E%E",MEA,1875,LEN,30000)› BREAK()› FI›;› IOCB1CMD=7› IOCB1BUF=MEASd+1› IOCB1LEN=MEA› CIO(0,$10)›;› VL(1)=A(2)› VL(2)=A(4)-A(2)› VL(3)=A(6)-A(4)› VL(4)=A(8)-A(6)› RETURN›;›; READ IN MAIN PART OF AMS FILE›; AND CONVERT IT TO AMP FORMAT›;› PROC CONVERT()› INT LO,HI,C,D,V,X› BYTE ARRAY HOLDd(12)› MNUM=1› SCopy(MUSd,"AMP")› NC=0› LEN=13› FOR V=1 TO 4› DO› DO› CM=2› PrintF("Converting Notes For Voice #%I%E%E",V)› SCopy(HOLDd,"V")› FOR C=1 TO 3› DO› MUSd(LEN+C)=HOLDd(C)› OD› LEN==+3› X=LEN› IF VL(V)=0 THEN› SCopy(HOLDd,"˙˙˙")› FOR C=1 TO 3› DO› MUSd(LEN+C)=HOLDd(C)› OD› LEN==+3› EXIT› FI›; › FOR D=1 TO VL(V) STEP 2› DO› LO=GetD(1)› HI=GetD(1)› IF LO=67 THEN LO=85 FI› LO==-1› IF LO=-1 THEN LO=84 FI› IF LO=127 THEN LO=88 FI› IF LO>127 THEN LO==-128 HI==+48 FI› IF HI>=192 THEN HI==-176 FI› IF HI>=128 THEN HI==-96 FI› X==+1› MUSd(X)=LO› X==+2› MUSd(X)=HI› LEN=X› NC==+1› IF NC=MEASd(MNUM) THEN› MUSd(LEN+1)=86› HI=CM RSH 8› LO=CM-(HI LSH 8)› MUSd(LEN+2)=LO› MUSd(LEN+3)=HI› LEN==+3› X=LEN› MNUM==+1› NC=0› CM==+1› FI› OD›; › SCopy(HOLDd,"˙˙˙")› FOR C=1 TO 3› DO› MUSd(LEN-3+C)=HOLDd(C)› OD› X=LEN+1› EXIT› OD› LE(V)=LEN-13› OD› NC=0› MNUM=1› X=18› FOR V=1 TO 4› DO› DO› PrintF("Doing Durations for Voice #%I%E%E",V)› IF VL(V)=0 THEN› X==+3› EXIT› FI› FOR D=1 TO VL(V) STEP 2› DO› LO=GetD(1)› HI=GetD(1)› LO=(LO+(HI LSH 8))› IF MUSd(X-1)=88› THEN› LO=FIXTEMPO(LO)› ELSE› LO=LO/5› IF LO=0 THEN LO=1 FI› FI› MUSd(X)=LO› NC==+1› IF NC=MEASd(MNUM) THEN› X==+3› NC=0› MNUM==+1› FI› X==+3› OD› X==+3› EXIT› OD› OD› SCopy(HOLDd,"A0$")› HOLDd(4)=TEMPO› FOR C=1 TO 11› DO› MUSd(LEN+C)=HOLDd(C)› OD› LEN==+12› MUSd(LEN)=155› FOR D=1 TO 4› DO› CM=LE(D)› X=D+D› HI=CM RSH 8› LO=CM-(HI LSH 8)› MUSd(X+2)=LO› MUSd(X+3)=HI› OD› Close(1)› RETURN›;›; PROMPT FOR AMP FILE NAME›;› PROC NEWFILENAME()› BYTE X› SETERROR()› DO› PrintE("")› Print("Type new file name: ")› GETFILENAME()› FOR X=1 TO Xd(0)› DO› IF Xd(X)=46 THEN EXIT FI ; "."› OD› SAssign(Xd,".AMP",X,X+3)› SCopy(Sd,"destination")› DISKSWAP(Xd(2)-48)› PrintF("%EWriting %S ...%E%E",Xd)› ERRORFLAG=0› Open(1,Xd,8,0)› IF ERRORFLAG>0 › THEN› PrintF("ERROR %I OPENING OUTPUT FILE%E%E",ERRORFLAG)› Close(1)› ELSE› EXIT› FI› OD› FREEERROR()› RETURN›;›; WRITE OUT THE AMP FILE›;› PROC WRITEAMPFILE()› IOCB1CMD=11› IOCB1BUF=MUSd+1› IOCB1LEN=LEN› CIO(0,$10)› Close(1)› RETURN›; ›; THIS ROUTINE ORGANIZES THE CALLS›; NEEDED TO CONVERT AMS II TO AMP›;› PROC AMSTOAMP()› READAMSFILE()› CONVERT()› NEWFILENAME()› WRITEAMPFILE()› RETURN›; ›; PROGRAM INITIALIZATION›;› PROC INIT()› PrintE("")› PrintE("Select function:")› PrintE("1) AMS -> AMP")› PrintE("2) Quit")› RETURN›;›; THE MAINLINE PROGRAM›; › PROC MAIN()› BYTE X› OPOKMSK=POKMSK› POKMSK=64› IRQEN=64 › PrintE("}AMS II TO AMP FILE CONVERTER")› DO› INIT()› Close(4)› Open(4,"K:",4,0)› X=0› WHILE X=0› DO› X=GETD(4)› X==-48› IF X<0 OR X>2 THEN X=0 FI› OD› PrintE("")› IF X=2 THEN EXIT FI› SETERROR()› DO› Print("Type old file name: ") › GETFILENAME()› SCopy(Sd,"source")› DISKSWAP(Xd(2)-48)› PrintF("%EReading %S ...%E%E",Xd)› Close(1)› ERRORFLAG=0› Open(1,Xd,4,0)› IF ERRORFLAG>0› THEN› PrintF("ERROR %I OPENING INPUT FILE%E%E",ERRORFLAG)› ELSE› EXIT› FI› OD› FREEERROR()› AMSTOAMP()› OD› PrintE("")› PrintE("Done!")› Close(4)› POKMSK=OPOKMSK› IRQEN=OPOKMSK› RETURN››