I have developed a simple minded patch librarian for my JX-8P in GW-BASIC for a PC6300. I used BASIC as my C knowledge is not too good and I appreciate the ablility of on-line hacking. I present it as someone may want to use it as a basis for their own synth. Some of the things done in the program look a bit strange, but they do work. If anyone can use it or has any questions, let me know. Art Todesco ihnp4!ihlpf!alt 8-367-1120 ----------------cut here-------------cut here-------------------- 1 REM INITIALIZATION*********************************************************** 5 OUT 817,255:OUT 817,63 6 FOR I%=1 TO 700:JUNK%=INP(816):NEXT I% 10 DIM PAR%(60) 20 DIM P$(60) 30 NULL$=CHR$(0) 50 CLS 60 PRINT:PRINT"J X - 8 P P A T C H L I B R A R I A N":PRINT 65 PRINT:PRINT"DIRECTORY OF LIBRARY FILES IN CURRENT DIRECTORY" 66 PRINT 70 GOSUB 400 90 REM SET FUNCTION KEY DESIGNATIONS ****************************************** 99 KEY (1) ON 100 KEY 1,"LSTLIB" 109 KEY (2) ON 110 KEY 2,"ENTLIB" 119 KEY (3) ON 120 KEY 3,"DELLIB" 129 KEY (4) ON 130 KEY 4,"LSTPAT" 139 KEY (5) ON 140 KEY 5,"ADD1P " 149 KEY (6) ON 150 KEY 6,"ADD32P" 159 KEY (7) ON 160 KEY 7,"DELPAT" 169 KEY (8) ON 170 KEY 8,"WRTSYN" 179 KEY (9) ON 180 KEY 9," " 189 KEY (10) ON 190 KEY 10,"EXIT " 195 KEY ON 200 REM MENU LOOP************************************************************** 210 CLS 220 PRINT:PRINT"J X - 8 P P A T C H L I B R A R I A N":PRINT 228 PRINT"LIBRARY FILE SELECTED: ";LIB$:PRINT:PRINT 230 PRINT"FUNCTION KEY 1 LIST ALL LIBRARY FILES" 235 PRINT"FUNCTION KEY 2 ENTER PATCH LIBRARY FILE NAME" 237 PRINT"FUNCTION KEY 3 DELETE A LIBRARY FILE" 240 PRINT"FUNCTION KEY 4 LIST PATCHES IN LIBRARY" 250 PRINT"FUNCTION KEY 5 ADD ONE PATCH TO LIBRARY" 255 PRINT"FUNCTION KEY 6 ADD BANK OF 32 PATCHES TO LIBRARY" 260 PRINT"FUNCTION KEY 7 DELETE PATCH FROM LIBRARY" 270 PRINT"FUNCTION KEY 8 WRITE PATCH TO SYNTH" 280 PRINT"FUCNTION KEY 0 EXIT" 285 PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT 286 FUNCT%=100 287 PRINT"SELECT FUNCTION: ", 290 JUNK$=INKEY$:ON KEY (1) GOSUB 1410 291 ON KEY (2) GOSUB 1420 292 ON KEY (3) GOSUB 1430 293 ON KEY (4) GOSUB 1440 294 ON KEY (5) GOSUB 1450 295 ON KEY (6) GOSUB 1460 296 ON KEY (7) GOSUB 1470 297 ON KEY (8) GOSUB 1480 298 ON KEY (9) GOSUB 1490 299 ON KEY (10) GOSUB 1500 300 IF FUNCT%>50 GOTO 290 310 PRINT USING "##";FUNCT% 390 ON FUNCT% GOSUB 1000,400,1100,500,600,600,700,800,900,900 395 GOTO 286 400 REM ENTER A PATCH LIBRARY FILE ******************************************** 410 ON ERROR GOTO 2000 415 PRINT:FILES"*.LIB" 416 OLD%=LIB% 420 PRINT:PRINT:INPUT "INPUT PATCH LIBRARY FILE WITHOUT '.LIB' EXTENSION: ",LIB$ 423 IF CVI(" "+LIB$+" ")<=8224 GOTO 495 425 LIB$=LIB$+".LIB" 426 CLOSE#1 427 PRINT"LIBRARY FILE SELECTED: ";LIB$:PRINT:PRINT 428 LRN%=0 430 OPEN "R",#1,LIB$,60 440 FOR I%=1 TO 59:FIELD#1,(I%*1) AS OFFSET$,1 AS P$(I%):NEXT I% 450 I%=1 455 GET#1,I% 460 IF EOF(1)<>-1 GOTO 490 465 IF I%=1 GOTO 480 470 LRN%=I%-1:I%=I%-1 472 GET#1,I%:SUM$=" " 474 FOR N%=1 TO 10:SUM$=SUM$+P$(N%):IF CVI(SUM$)<>32 GOTO 480 476 SUM$=" ":NEXT N% 478 GOTO 470 480 RETURN 490 I%=I%+1:GOTO 455 495 LIB%=OLD%:PRINT"INPUT ABORTED":PRINT:PRINT:RETURN 500 REM LIST PATCHES IN SELECTED LIBRARY*************************************** 506 PRINT:PRINT "PATCH LIBRARY LISTING FOR ";LIB$;": " 507 PRINT 508 J%=0 510 FOR N%=1 TO LRN% 512 J%=J%+1 520 GET#1,N% 525 PRINT USING "#### ";N%, 530 FOR I%=1 TO 10:PRINT USING "&";P$(I%),:NEXT I% 532 PRINT USING "&";" ", 535 IF J%<>4 GOTO 550 537 J%=0 540 PRINT 550 NEXT N% 570 PRINT:PRINT:PRINT 590 RETURN 600 REM ADD PATCH TO THE SELECTED LIBRARY************************************** 603 GOSUB 1600 605 OUT 817,255:OUT 817,63 607 IF FUNCT%=5 THEN NUMB%=1:ELSE NUMB%=32 608 FOR Q%=1 TO NUMB% 610 GOSUB 1600 615 PRINT:BEEP:PRINT"PRESS DESIRED PATCH BUTTON ON SYNTH" 620 IF INP(816)<>240 GOTO 620 621 IF INP(816)<>65 GOTO 620 622 IF INP(816)<>53 GOTO 620 623 IF INP(816)<>0 GOTO 620 624 IF INP(816)<>33 GOTO 620 625 IF INP(816)<>32 GOTO 620 627 IF INP(816)<>1 GOTO 620 630 FOR I%=1 TO 59 635 PAR%(I%)=INP(816) 640 NEXT I% 645 IF INP(816)=247 GOTO 650 647 PRINT"NO END OF DATA FROM SYNTH - RETURNING TO MAIN MENU" 648 FOR I%=1 TO 500:NEXT I%:RETURN 650 FOR I%=1 TO 59:RSET P$(I%)=MKI$(PAR%(I%)):NEXT I% 655 LRN%=LRN%+1:PUT#1,LRN% 660 PRINT"PATCH STORED AS RECORD NUMBER ";LRN%, 665 FOR I%=1 TO 10:PRINT USING "&";P$(I%),:NEXT I% 667 PRINT:NEXT Q% 680 PRINT:PRINT:PRINT 690 RETURN 700 REM DELETE PATCH FROM THE SELECTED LIBRARY********************************* 710 PRINT:PRINT:INPUT"ENTER RECORD NUMBER TO BE DELETED: ",DEL% 712 IF DEL%<=LRN% AND DEL%>=1 GOTO 715 713 PRINT"BAD RECORD NUMBER":PRINT:PRINT:RETURN 715 IF DEL%<1 GOTO 795 720 FOR I%=DEL%+1 TO LRN% 730 GET#1,I% 740 PUT#1,I%-1 750 NEXT I% 755 FOR I%=1 TO 59:RSET P$(I%)=NULL$:NEXT I% 760 PUT#1,LRN% 775 LRN%=LRN%-1 780 PRINT"RECORD ";DEL%;" DELETED AND DATABASE PACKED" 785 PRINT:PRINT 790 RETURN 795 PRINT"DELETE ABORTED":PRINT:PRINT:RETURN 800 REM WRITE A LIBRARY PATCH TO THE SYNTH************************************* 805 PRINT:PRINT:INPUT"ENTER RECORD NUMBER TO BE WRITTEN TO SYNTH ";RN% 807 IF RN%<=LRN% AND RN%>=1 GOTO 810 808 PRINT"BAD RECORD NUMBER":PRINT:PRINT:RETURN 810 GET#1,RN% 814 FOR I%=1 TO 59:PAR%(I%)=CVI(P$(I%)+NULL$):NEXT I% 815 GOSUB 1600 816 OUT 817,255 817 OUT 817,63 818 FOR I%=1 TO 1000:JUNK%=INP(816):NEXT I% 820 OUT 816,240 821 OUT 816,65 822 OUT 816,53 823 OUT 816,0 824 OUT 816,33 825 OUT 816,32 826 OUT 816,1 830 FOR I%=1 TO 59 840 OUT 816,PAR%(I%) 850 NEXT I% 860 OUT 816,247 890 PRINT"PATCH WRITTEN TO SYNTH":PRINT:PRINT 895 RETURN 900 REM EXIT THIS PROGRAM TO DOS*********************************************** 910 CLOSE#1 920 SYSTEM 1000 REM LIST ALL *.LIB FILES IN CURRENT DIRECTORY 1010 PRINT:PRINT:FILES"*.LIB" 1020 PRINT:PRINT 1090 RETURN 1100 REM ROUTINE TO REMOVE A LIBRARY FILE ************************************* 1105 FILES"*.LIB" 1110 PRINT:PRINT:INPUT"ENTER LIBRARY FILE TO BE REMOVED: ",DEL$ 1115 IF CVI(" "+DEL$+" ")<=8224 GOTO 1195 1120 DEL$=DEL$+".LIB" 1125 IF DEL$=LIB$ GOTO 1170 1130 KILL DEL$ 1140 PRINT"LIBRARY FILE ",DEL$,"REMOVED":PRINT:PRINT 1160 RETURN 1170 PRINT:PRINT"LIBRARY FILE ",DEL$,"REMOVED" 1175 CLOSE#1:KILL DEL$ 1190 RUN 1195 PRINT"DELETE ABORTED":PRINT:PRINT:RETURN 1410 FUNCT%=1:RETURN 1420 FUNCT%=2:RETURN 1430 FUNCT%=3:RETURN 1440 FUNCT%=4:RETURN 1450 FUNCT%=5:RETURN 1460 FUNCT%=6:RETURN 1470 FUNCT%=7:RETURN 1480 FUNCT%=8:RETURN 1490 FUNCT%=9:RETURN 1500 FUNCT%=10:RETURN 1600 REM ROUTINE TO FLUSH ACCUMULATED DATA FROM PORT ************************** 1610 JUNK%=INP(816):IF INP(817)<190 GOTO 1610 1620 RETURN 2000 REM INPUT ERROR ROUTINE ************************************************** 2010 PRINT"BAD FILE NAME" 2020 PRINT:PRINT 2030 RESUME 2090 2090 GOTO 90