/ IPL GENERATING PROGRAM / LAST EDIT: 08-OCT-1991 12:00:00 CJL / MUST BE ASSEMBLED WITH '/F' SWITCH SET. / THIS IS A UTILITY NAMED IPLGEN (AKA K12IPG) TO CREATE FIELD0.IPL (AKA / K12FL0.IPL) AND FIELD1.IPL (AKA K12FL1.IPL). THESE FILES ARE IN TURN MEANT / FOR USE WITH THE DIRECT LOADING PROGRAM IPLOAD (AKA K12IPL). FUTURE VERSIONS / OF K12MIT.SV MAY "GROW" TO USE FIELD TWO, IN WHICH CASE THIS PROGRAM WILL HAVE / TO BE CHANGED. / THIS PROGRAM ALWAYS RESIDES IN THE NEXT FIELD BEYOND K12MIT.SV, AND CREATES / FILES FOR ALL FIELDS LOWER THAN ITS LOADING FIELD. THIS CURRENTLY REQUIRES A / 12K MACHINE TO ENCODE ALL LOCATIONS 00000-07577 AND 10000-17577. / USAGE: / SINCE K12MIT.SV IS A COMPLETE IMAGE FILE, IT MUST BE LOADED FIRST IN IMAGE / MODE, AND THEN OVERLAYED WITH THE BINARY OF THIS ASSEMBLY: / .PAL IPLGEN TO TERMINATE / THE LINE; THEN LOAD IPLGEN AND START. / THE FILES SYS:FIELD0.IP AND SYS:FIELD1.IP WILL BE CREATED AND THE PROGRAM / EXITS TO THE KEYBOARD MONITOR. THE RESULTANT FILES MAY BE EDITED AS LONG AS / THE RULES OF .IPL FORMAT ENCODING ARE OBEYED (ADDITIONAL LOWER-CASE LEADER / COMMENTS SHOULD BE ADDED AT THE BEGINNING, AND UNRESTRICTED COMMENTS AT THE / END). / ERROR MESSAGES: / ERROR NUMBER PROBABLE CAUSE / 5 ERROR WHILE ATTEMPTING TO ENTER OUTPUT FILE. / 6 OUTPUT FILE LARGER THAN AVAILABLE FILE SPACE. / 7 ERROR WHILE CLOSING THE OUTPUT FILE. / 8 I/O ERROR WHILE ENCODING FILE DATA. / EQUATED SYMBOLS. CLOSE= 4 /CLOSE OUTPUT FILE DFIELD= 2 /PROGRAM LOADS INTO FIELD TWO (ALSO OUTPUT COUNT) DFLD= DFIELD^10 /PROGRAM FIELD FOR CDF INSTRUCTIONS ENTER= 3 /ENTER TENTATIVE FILE NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7777= CLA CMA /LOAD AC WITH 7777 SBOOT= 7600 /MONITOR EXIT SYSENTR=7607 /CALL SYS: HANDLER HERE USERROR=7 /USER SIGNALLED ERROR USRENT= 7700 /USR ENTRY POINT WHEN NON-RESIDENT USRFLD= 10 /USR FIELD WRITE= 4000 /I/O WRITE BIT FIELD DFIELD /WHERE WE LOAD *20 /GET PAST AUTO-INDEX AREA BUFPTR, .-. /OUTPUT BUFFER POINTER DANGCNT,.-. /DANGER COUNT FOR OUTPUT FILE FCNT, -DFIELD /FIELD, FILE COUNTER FNAME, FILENAM FIELD0.IP /OUTPUT FILE NAME FIELD LATEST, .-. /LATEST OUTPUT CHARACTER OUTRECO,.-. /OUTPUT RECORD SCRCASE,.-. /CURRENT MESSAGE CASE SCRCHAR,.-. /LATEST MESSAGE CHARACTER SCRPTR, .-. /MESSAGE POINTER TEMPTR, .-. /TEMPORARY OUTPUT POINTER WRDADR, .-. /WORD ADDRESS WRDCNT, .-. /WORD COUNTER DSETUP, .-. /DATA FIELD SETUP DATFLD, CDF 00+.-. /WILL BE LATEST DATA FIELD JMP I DSETUP /RETURN TO CALLER PAGE /START AT THE BEGINNING BEGIN, NOP /IN CASE WE'RE CHAINED TO LOOP, TAD (FNAME) /POINT TO DCA ENTAR1 /STORED FILENAME DCA ENTAR2 /CLEAR SECOND ARGUMENT NL0001 /SYS: IS ALWAYS DEVICE ONE CDF DFLD /INDICATE OUR CALLING FIELD CIF USRFLD /GOTO USR FIELD JMS I (USRENTRY) /CALL USR ROUTINE ENTER /ENTER TENTATIVE FILENAME ENTAR1, .-. /WILL POINT TO FILENAME ENTAR2, .-. /WILL BE ZERO JMP ENTERR /ENTER ERROR TAD ENTAR1 /GET RETURNED FIRST RECORD DCA OUTRECORD /STORE IT TAD ENTAR2 /GET RETURNED EMPTY LENGTH IAC /ADD 2-1 FOR OS/278 CRAZINESS DCA DANGCNT /STORE AS DANGER COUNT NL7777 /INDICATE INITIALIZATION JMS I [PUTBYTE] /INITIALIZE OUTPUT FILE JMS LEADER /OUTPUT LEADER JMS I (DOFLD) /OUTPUT LATEST FIELD'S DATA JMS TRAILER /OUTPUT TRAILER TAD ("Z&37) /GET <^Z> CLOSLUP,JMS I [PUTBYTE] /OUTPUT A BYTE (^Z OR NULL) TAD BUFPTR /GET THE OUTPUT BUFFER POINTER TAD (-OUTBUFFER) /COMPARE TO RESET VALUE SZA CLA /SKIP IF IT MATCHES JMP CLOSLUP /ELSE KEEP GOING NL0001 /GET SYS:'S DEVICE NUMBER CDF DFLD /INDICATE OUR CALLING FIELD CIF USRFLD /GOTO USR FIELD JMS I (USRENTRY) /CALL USR ROUTINE CLOSE /CLOSE OUTPUT FILE FNAME /POINTER TO FILENAME OUTCNT, .-. /WILL BE ACTUAL COUNT JMP CLSERR /CLOSE ERROR ISZ FNAME+2 /BUMP THE FILENAME TAD DATFLD /GET CURRENT DATA FIELD TAD (10) /BUMP TO NEXT FIELD DCA DATFLD /STORE BACK ISZ FCNT /DONE ALL FIELDS YET? JMP LOOP /NO, GO DO IT AGAIN CIF CDF 00 /YES, GOTO MONITOR FIELD JMP I [SBOOT] /EXIT TO MONITOR / ERROR WHILE OUTPUTTING THE FILE. PROCERR,NL0002 /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE CLOSING THE OUTPUT FILE. CLSERR, NL0001 /SET INCREMENT SKP /DON'T CLEAR IT / OUTPUT FILE TOO LARGE ERROR. SIZERR, CLA /CLEAN UP TAD (3) /SET INCREMENT SKP /DON'T USE NEXT / ENTER ERROR. ENTERR, NL0002 /SET INCREMENT TAD (3) /ADD ON OFFSET DCA ERRNUMBER /STORE ERROR NUMBER CDF DFLD /ENSURE OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I (USRENTRY) /CALL USR ROUTINE USERROR /USER ERROR ERRNUMB,.-. /WILL BE PASSED ERROR NUMBER / LEADER ROUTINE. LEADER, .-. /LEADER ROUTINE JMS I (SCRIBE) /CALL SCRIBE ROUTINE LEADMSG /FOR LEADER MESSAGE TAD DATFLD /GET CURRENT FIELD RTR;RAR /MOVE DOWN AND (7) /JUST FIELD NUMBER TAD (NTABLE) /POINT TO TABLE ELEMENT DCA MSGPTR /STASH THE POINTER TAD I MSGPTR /GET THE MESSAGE ADDRESS DCA MSGPTR /STORE IN-LINE JMS I (SCRIBE) /CALL SCRIBE ROUTINE MSGPTR, .-. /WILL POINT TO CORRECT MESSAGE JMP I LEADER /RETURN / TRAILER ROUTINE. TRAILER,.-. /TRAILER ROUTINE JMS I (SCRIBE) /CALL SCRIBE ROUTINE SAVEMSG /END OF FILE MESSAGE JMS OUTFLD /OUTPUT FIELD DIGIT JMS I (SCRIBE) /CALL SCRIBE ROUTINE SVMSG /.SV BRIDIGING MESSAGE JMS OUTFLD /OUTPUT FIELD DIGIT JMS I (SCRIBE) /CALL SCRIBE ROUTINE SV0MSG /0000 BRIDGING MESSAGE JMS OUTFLD /OUTPUT FIELD DIGIT JMS I (SCRIBE) /CALL SCRIBE ROUTINE SVEMSG /FINISHING MESSAGE JMP I TRAILER /RETURN OUTFLD, .-. /OUTPUT FIELD DIGIT ROUTINE TAD DATFLD /GET OUTPUT FIELD RTR;RAR /MOVE OVER AND (7) /JUST FIELD DIGIT TAD ("0&177) /MAKE IT ASCII JMS I [PUTBYTE] /OUTPUT IT JMP I OUTFLD /RETURN PAGE DOFLD, .-. /DO LATEST FIELD ROUTINE DCA WRDADR /CLEAR WORD ADDRESS TAD (-7600) /SETUP THE DCA WRDCNT /WORD COUNT WRDLUP, JMS DSETUP /GOTO DATA FIELD TAD I WRDADR /GET A WORD DCA DSETUP /SAVE IT CDF DFLD /BACK TO OUR FIELD TAD DSETUP /GET THE WORD AGAIN RTR;RTR;RTR /WANT HIGH-ORDER HALF FIRST JMS DOBYTE /OUTPUT HIGH-ORDER BYTE TAD DSETUP /GET THE WORD AGAIN JMS DOBYTE /OUTPUT LOW-ORDER BYTE ISZ WRDADR /BUMP TO NEXT ADDRESS TAD WRDADR /GET LATEST ADDRESS AND (37) /JUST LOW-ORDER BITS SNA CLA /SKIP IF NOT AT GOOD BOUNDARY JMS PUTCRLF /ELSE OUTPUT LINE BREAK ISZ WRDCNT /DONE ALL WORD YET? JMP WRDLUP /NO, KEEP GOING JMP I DOFLD /YES, RETURN TO CALLER DOBYTE, .-. /OUTPUT A SIX-BIT BYTE ROUTINE AND (77) /JUST SIX BITS TAD (41) /ADD ON OFFSET TO MAKE IT PRINTABLE JMS I [PUTBYTE] /OUTPUT IT JMP I DOBYTE /RETURN / / ROUTINE. PUTCRLF,.-. /OUTPUT / ROUTINE TAD ("M&37) /GET A JMS I [PUTBYTE] /OUTPUT IT TAD ("J&37) /GET A JMS I [PUTBYTE] /OUTPUT IT JMP I PUTCRLF /RETURN / MESSAGE PRINT ROUTINE. SCRIBE, .-. /MESSAGE PRINT ROUTINE TAD I SCRIBE /GET IN-LINE POINTER ARGUMENT DCA SCRPTR /STASH THE POINTER ISZ SCRIBE /BUMP PAST ARGUMENT TAD (140) /INITIALIZE TO DCA SCRCASE /LOWER-CASE SCRLUP, TAD I SCRPTR /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT TAD I SCRPTR /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLUP /KEEP GOING SCRPRNT,.-. /CHARACTER PRINT ROUTINE AND (77) /JUST SIX BITS SNA /END OF MESSAGE? JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER DCA SCRCHAR /NO, SAVE FOR NOW TAD SCRCHAR /GET IT BACK TAD (-"%!200) /IS IT "%"? SNA /SKIP IF NOT JMP SCRCRLF /JUMP IF IT MATCHES TAD (-"^+100+"%) /IS IT "^" SNA CLA /SKIP IF NOT JMP SCRFLIP /JUMP IF IT MATCHES TAD SCRCHAR /GET THE CHARACTER AND (40) /DOES CASE MATTER? SNA CLA /SKIP IF NOT TAD SCRCASE /ELSE GET PREVAILING CASE TAD SCRCHAR /GET THE CHARACTER JMS I [PUTBYTE] /OUTPUT THE CHARACTER JMP I SCRPRNT /RETURN SCRCRLF,JMS PUTCRLF /OUTPUT / JMP I SCRPRNT /RETURN SCRFLIP,TAD SCRCASE /GET CURRENT CASE CIA /INVERT IT TAD (140+100) /ADD SUM OF POSSIBLE VALUES DCA SCRCASE /STORE NEW INVERTED CASE JMP I SCRPRNT /RETURN PAGE PUTBYTE,.-. /OUTPUT A BYTE ROUTINE SPA /ARE WE INITIALIZING? JMP PUTINITIALIZE /YES AND (177) /JUST IN CASE DCA LATEST /SAVE LATEST CHARACTER TAD LATEST /GET LATEST CHARACTER JMP I PUTNEXT /GO WHERE YOU SHOULD GO PUTNEXT,.-. /EXIT ROUTINE JMP I PUTBYTE /RETURN TO MAIN CALLER PUTINIT,CLA /CLEAN UP TAD OUTRECORD /GET STARTING RECORD OF TENTATIVE FILE DCA PUTRECORD /STORE IN-LINE DCA I (OUTCNT) /CLEAR ACTUAL FILE LENGTH PUTNEWR,TAD (OUTBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER PUTLOOP,JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT TAD BUFPTR /GET POINTER VALUE DCA TEMPTR /SAVE FOR LATER ISZ BUFPTR /BUMP TO NEXT JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT JMS PUTNEXT /GET A CHARACTER RTL;RTL /MOVE UP AND (7400) /ISOLATE HIGH NYBBLE TAD I TEMPTR /ADD ON FIRST BYTE DCA I TEMPTR /STORE COMPOSITE TAD LATEST /GET LATEST CHARACTER RTR;RTR;RAR /MOVE UP AND AND (7400) /ISOLATE LOW NYBBLE TAD I BUFPTR /ADD ON SECOND BYTE DCA I BUFPTR /STORE COMPOSITE ISZ BUFPTR /BUMP TO NEXT TAD BUFPTR /GET LATEST POINTER VALUE TAD (-2^200-OUTBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP PUTLOOP /KEEP GOING ISZ DANGCNT /TOO MANY RECORDS? SKP /SKIP IF NOT JMP I (SIZERR) /JUMP IF SO CDF DFLD /SET OUR FIELD CIF 00 /GOING TO SYSTEM FIELD JMS I (SYSENTRY) /CALL I/O HANDLER 2^100+DFLD+WRITE /WRITE SOME PAGES FROM OUTPUT BUFFER OUTBUFFER /BUFFER ADDRESS PUTRECO,.-. /WILL BE LATEST RECORD NUMBER JMP I (PROCERR) /OUTPUT ERROR! ISZ I (OUTCNT) /BUMP ACTUAL LENGTH ISZ PUTRECORD /BUMP TO NEXT RECORD JMP PUTNEWRECORD /KEEP GOING PAGE / TEXT MESSAGES. LEADMSG,TEXT "LEADER FOR DIRECT LOAD FILE WHICH MUST BE IN LOWER CASE%" TEXT "%FILE CONTAINS KERMIT DATA IN IPL ENCODED FORMAT%%" TEXT "THIS FILE CONTAINS DATA FOR FIELD" ONEMSG, TEXT " ONE%%^" SAVEMSG,TEXT "END OF DATA%%^A^FTER THE PROGRAM EXITS BACK TO THE MONITOR, " TEXT "YOU SHOULD SAVE THE DATA WITH:%%.^SAVE SYS FIELD^" SVMSG, TEXT ".^SV " SV0MSG, TEXT "0000-" SVEMSG, TEXT "7577=0%" ZEROMSG,TEXT " ZERO%%" / DIGIT MESSAGE POINTER TABLE. NTABLE, ZEROMSG /POINTER TO ZERO MESSAGE ONEMSG /POINTER TO ONE MESSAGE PAGE /GET TO A GOOD BOUNDARY OUTBUFF=. /OUTPUT BUFFER HERE $ /THAT'S ALL FOLK!