EXEC10 IDENT PLAT36$ LCC OVERLAY(PLATO,1,0) END IDENT EXEC10 TITLE EXEC10 OVERLAYS FOR COMMAND EXECUTION CST SPACE 5,11 EXEC10$ OVFILE * /--- BLOCK CHARCNV 00 000 83/07/29 09.13 CHARCNV TITLE CHARCNV - CONVERT CHARACTER SETS. * CONVERT CHARACTERS FROM PLATO TO ASCII * * CHARCNV PLATO,BUF1,LEN1,BUF2,LEN2,LEN3 * * CONVERT CHARACTERS FROM ASCII TO PLATO * * CHARCNV ASCII,BUF1,LEN1,BUF2,LEN2,LEN3 * * LEN1 = SOURCE BUFFER LENGTH IN SOURCE CHARACTERS * LEN2 = MAXIMUM DESTINATION BUFFER LENGTH IN WORDS * LEN3 = DESTINATION BUFFER LENGTH IN CHARACTERS * /--- BLOCK CHARCNV 00 000 83/07/29 09.13 SPACE 5,11 CHARCNX OVRLAY SX6 6 (X6) = MAXIMUM OF 6 ARGUMENTS CALL GETARGS * DETERMINE TYPE OF CONVERSION SA1 VARBUF AX1 60-XCODEL SX6 X1 (X6) = 0 IF PLATO TO ASCII SA6 CVT SAVE CONVERSION TYPE * CHECK SOURCE MESSAGE BUFFER SA1 VARBUF+1 BX5 X1 NGETVAR SX6 A1 SA6 SBA * CHECK SOURCE MESSAGE BUFFER LENGTH SA1 VARBUF+2 BX5 X1 NGETVAR BX6 X1 SA6 SBL SA2 CVT SA2 CCH+X2 (X2) = CHARACTERS PER WORD PX1 X1 CONVERT CHARACTERS TO WORDS NX1 X1 FX1 X1+X2 FX1 X1/X2 UX1,B1 X1 LX1 B1 SA2 SBA SA0 X2 RJ =XBOUNDS VERIFY SOURCE BUFFER IN BOUNDS * CHECK DESTINATION MESSAGE BUFFER SA1 VARBUF+3 BX5 X1 NGETVAR SX6 A1 SA6 DBA * CHECK DESTINATION BUFFER LENGTH SA1 VARBUF+4 BX5 X1 NGETVAR BX6 X1 SA6 DBL SA2 DBA CHECK BUFFER IN BOUNDS SA0 X2 RJ =XBOUNDS SB1 1 (B1) = 1 * SAVE B REGISTERS SX6 B4 SA6 SBR SX6 B5 SA6 A6+B1 SX6 B6 SA6 A6+B1 SX6 B7 SA6 A6+B1 * SET UP REGISTERS SA1 SBA SA2 SBL (X2) = INPUT CHARACTER COUNT MX0 -6 (X0) = MASK 6 MX7 -8 (X7) = MASK 8 SB4 B0 (B4) = OUTPUT CHARACTER COUNT SA1 X1 (X1) = INPUT WORD BX6 X6-X6 (X6) = OUTPUT WORD SA3 DBA SB5 X3 (B5) = OUTPUT WORD ADDRESS SA3 DBL SB6 B5+X3 (B6) = LWA+1 OUTPUT BUFFER SA3 CVT NZ X3,CAS CONVERT TO ASCII * /--- BLOCK CPL 00 000 83/07/29 09.14 * CONVERT ASCII TO PLATO SB2 5 (B2) = CHARACTERS IN WORD SB3 60-6 (B3) = OUTPUT SHIFT COUNT CPL1 SX2 X2-1 NG X2,CPL6 IF CONVERSION COMPLETE LX1 12 BX5 -X7*X1 SB2 B2-B1 NZ B2,CPL2 IF MORE CHARACTERS SA1 A1+B1 SB2 5 CPL2 LX5 -1 SA3 XAP+X5 GET PLATO CODES NG X5,CPL3 IF ODD CHARACTER AX3 8 CPL3 BX5 -X0*X3 (X5) = PLATO CHARACTER LX3 59-7 ZR X5,CPL1 IF NO TRANSLATION PL X3,CPL4 IF NO SHIFT PREFIX SX4 70B LX4 B3 BX6 X6+X4 SB3 B3-6 SB4 B4+B1 GE B3,CPL4 IF WORD NOT FULL GE B5,B6,CAS8 IF BUFFER TOO SHORT SA6 B5 SB5 B5+B1 BX6 X6-X6 SB3 60-6 CPL4 LX3 1 PL X3,CPL5 IF NO ACCESS PREFIX SX4 76B LX4 B3 BX6 X6+X4 SB3 B3-6 SB4 B4+B1 GE B3,CPL5 IF WORD NOT FULL GE B5,B6,CAS8 IF BUFFER TOO SHORT SA6 B5 SB5 B5+B1 BX6 X6-X6 SB3 60-6 CPL5 LX5 B3 BX6 X6+X5 SB3 B3-6 SB4 B4+B1 GE B3,CPL1 IF WORD NOT FULL GE B5,B6,CAS8 IF BUFFER TOO SHORT SA6 B5 SB5 B5+B1 BX6 X6-X6 SB3 60-6 EQ CPL1 * CONVERSION COMPLETE CPL6 SB7 60-6 EQ CAS6 * /--- BLOCK CAS 00 000 83/07/29 09.18 * CONVERT PLATO TO ASCII CAS SB2 10 (B2) = CHARACTERS IN WORD SB3 60-12 (B3) = OUTPUT SHIFT COUNT BX4 X4-X4 (X4) = SHIFT/ACCESS FLAGS CAS1 SX2 X2-1 NG X2,CAS5 IF CONVERSION COMPLETE LX1 6 BX3 -X0*X1 SB2 B2-B1 NZ B2,CAS2 IF MORE CHARACTERS SA1 A1+B1 SB2 10 CAS2 SX5 X3-70B NZ X5,CAS3 IF NOT A SHIFT CODE SX3 8 BX4 X4-X3 EQ CAS1 CAS3 SX5 X3-76B NZ X5,CAS4 IF NOT AN ACCESS CODE SX3 16 BX4 X4-X3 EQ CAS1 CAS4 SA3 XAP+X3 GET ASCII CHARACTER SB7 X4+12+8 LX3 B7 BX3 -X7*X3 EXTRACT CHARACTER BX4 X4-X4 CLEAR SHIFT/ACCESS FLAG ZR X3,CAS1 IF NO TRANSLATION LX3 B3 BX6 X6+X3 SB3 B3-12 SB4 B4+B1 GE B3,CAS1 IF ROOM FOR MORE CHARACTERS GE B5,B6,CAS8 IF BUFFER TOO SHORT SA6 B5 SB5 B5+B1 SB3 60-12 BX6 X6-X6 EQ CAS1 PROCESS NEXT CHARACTER * CONVERSION COMPLETE CAS5 SB7 60-12 CAS6 EQ B7,B3,CAS7 IF NO PARTIAL WORD LEFT GE B5,B6,CAS8 IF BUFFER TOO SHORT SA6 B5 * RETURN CONVERTED CHARACTER COUNT CAS7 SA1 VARBUF+5 BX5 X1 SX6 B4 (X6) = OUTPUT CHARACTER COUNT RJ RBR RESTORE B REGISTERS NPUTVAR EQ =XCKPROC EXIT * PROCESS DESTINATION BUFFER TOO SHORT CAS8 RJ RBR RESTORE B REGISTERS EXECERR 46 * /--- BLOCK SUBS/DATA 00 000 83/07/29 09.20 RBR SPACE 5,11 ** RBR - RESTORE B REGISTERS * * B REGISTERS B4 - B7 ARE RESTORED TO INITIAL VALUES RBR PS SA1 SBR SB4 X1 SA1 A1+B1 SB5 X1 SA1 A1+B1 SB6 X1 SA1 A1+B1 SB7 X1 EQ RBR * DATA STORAGE CCH DATA 5.0 ASCII CHARACTERS PER WORD DATA 10.0 PLATO CHARACTERS PER WORD * /--- BLOCK TABLES 00 000 83/07/29 09.20 PLC SPACE 5,11 ** PLC - CYBIL ASCII CODES TO PLATO OUTPUT * * PLC (EVEN CODES,PLOT),(ODD CODES,PLOT) * * CODES = PLATO CHARACTER CODES TO PLOT CHARACTER * PLOT = CHARACTER PLOTTING ACTION PLC MACRO C0,C1 PLV .3,C0 PLV .4,C1 .2 OCTMIC .1,3 VFD 12/0,8/K".2",8/KS".2",8/KA".2",8/KSA".2",8/.3,8/.4 .1 SET .1+1 ENDM ** PLV - GENERATE VALUE FOR PLATO CODES * * PLV VALUE SYMBOL,PLATO CODES,PLOTTING ACTION PLV MACRO V,P,PA .5 SET 1 .7 SET 0 V SET 0 .S MICRO 1,, K DUP 99 .6 MICRO .5,2, P . IFC EQ,*".6"** V SET V+.7 STOPDUP . ELSE .. IFC EQ,*".6"*70* V SET V+200B .S MICRO 1,, ".S"S .. ELSE ... IFC EQ,*".6"*76* V SET V+100B .S MICRO 1,, ".S"A ... ELSE .7 SET ".6"_B ... ENDIF .. ENDIF .5 SET .5+2 . ENDIF ENDD .6 OCTMIC .7,3 . IF -DEF,".S"_".6" ".S"_".6" EQU .N . ENDIF .N SET .N+1 ENDM NOREF .N,.1,.2,.3,.4,.5,.6,.7 .1 SET 0 .N SET 0 LIST X *CALL PLATASC LIST * SPACE 5,11 * BUILD SYMBOLS FOR ALL UNDEFINED CHARACTERS .1 SET 0 DUP 128 .2 OCTMIC .1,3 NOREF K".2",KS".2",KA".2",KSA".2" IF -DEF,K".2",1 K".2" EQU 0 IF -DEF,KS".2",1 KS".2" EQU 0 IF -DEF,KA".2",1 KA".2" EQU 0 IF -DEF,KSA".2",1 KSA".2" EQU 0 .1 SET .1+1 ENDD SPACE 5,11 * TEMPORARY VARIABLES SBA EQU TBINTSV+0 SOURCE BUFFER ADDRESS SBL EQU TBINTSV+1 SOURCE BUFFER LENGTH DBA EQU TBINTSV+2 DESTINATION BUFFER ADDRESS DBL EQU TBINTSV+3 DESTINATION BUFFER LENGTH CVT EQU TBINTSV+4 CONVERSION TYPE SBR EQU TBINTSV+5 B-REGISTER SAVE (4 WORDS) ENDOV TITLE -NAPLPS- COMMAND EXECUTION ** * -NAPLPS- (CODE = 300) * * NAPLPS SET,BUFFER,COUNT * NAPLPS '7ASCII'7,VIDBUF,12 * * (NAPLPS = NORTH AMERICAN PRESENTATION LEVEL PROTOCOL SYNTAX) * * -NAPLPS- SENDS RAW NAPLPS (VIDEOTEX) DATA TO * A NAPLPS-SPEAKING TERMINAL VIA A SPECIAL * FORMATTER CODE. * * ',SET', IS A LEFT-JUSTIFIED STRING SPECIFYING THE * REPERTOIRE SET TO BE INVOKED. * * ',BUFFER', IS THE FIRST VARIABLE OF A BUFFER * CONTAINING NAPLPS CODES. CODES ARE PACKED * RIGHT-JUSTIFIED IN 12-BIT BYTES, 5 BYTES PER * 60-BIT WORD. * * ',COUNT', SPECIFIES THE NUMBER OF CODES TO BE * SENT TO THE TERMINAL. * * ON EXIT, *ZRETURN* = -1 IF EVERYTHING IS OK * 0 IF THE REPERTOIRE SET NAME * IS INVALID * 1 IF ',COUNT', IS INVALID ** EXT RETRNZ EXT PROCESS NAPLPSX OVRLAY SX6 -1 SA6 TRETURN INITIALLY OK SA5 A5 ENSURE COMMAND WORD UNCHANGED SX6 3 THREE VARS TO UNPACK RJ =XGETCODX IN EXEC1 * CHECK COUNT AGAINST FREE SPACE IN *MOUT* SA1 VARBUF+2 COUNT IN THIRD VAR BX5 X1 X5 = GETVAR CODE FOR -NGETVAR- NGETVAR RETURNS COUNT IN X1 MX0 -6 BX0 X0*X1 LIMIT MAX BYTES TO 0..127 NZ X0,BADCNT -> BAD COUNT ERRROR BX6 X1 SAVE COUNT SA6 COUNT ZR X1,MOUTCHK -> NO BYTES; CHECK BUFFER SPACE SA2 FIVEP0 X2 = 5.0 (BYTES / WORD) BX0 X2 X0 = 5.0 PX1 X1 FLOAT BYTES COUNT NX1 X1 FX3 X1/X0 X3 = COUNT / 5.0 UX2 X3,B2 X2 = WHOLE PART OF QUOTIENT LX2 B2 PX2 X2 RE-FLOAT FOR SUBTRACT NX2 X2 FX3 X2*X0 X3 = WHOLE PART * 5.0 FX3 X1-X3 X3 = REMAINDER UX3 X3,B2 LX3 B2 ZR X3,WDS -> BYTE COUNT EVENLY DIV. BY 5 SA1 ONEP0 X1 = 1.0 FX2 X1+X2 BUMP WORDS COUNT BY 1 WDS BSS 0 UX6 X2,B2 FIX WORDS COUNT LX6 B2 SA6 WORDS MOUTCHK BSS 0 SA1 MOUTLOC SX6 X6+1 ADD ONE FOR HEADER WORD IX1 X1+X6 COUNT + CURRENT *MOUT* CONTENTS SX1 X1-MOUTLTH SEE IF BUFFER CAN HOLD BYTES PL X1,RETRNZ -> BACK UP AND END TIMESLICE * DECODE FIRST VAR (SET NAME) SA1 VARBUF BX5 X1 NGETVAR WANTS IT IN X5 NGETVAR RETRIEVE ALPHA STRING SA2 SETLIST SET NAME TABLE FIRST ENTRY SETCHEK BSS 0 MAKE SURE IT'7S A VALID SET NAME BX0 X1-X2 CHECK NAME AGAINST TABLE ENTRY ZR X0,OKSET -> FOUND IT SA2 A2+B1 GET NEXT TABLE ENTRY NZ X2,SETCHEK -> CHECK NEXT TABLE ENTRY SX6 0 BAD SET NAME SA6 TRETURN EQ PROCESS -> END COMMAND NOW OKSET BSS 0 SET IS VALID SX6 A2-SETLIST+1 X6 = SET ORDINAL SA2 COUNT RETRIEVE BYTES COUNT LX6 18 POSITION ORDINAL FOR *MOUT* CODE BX1 X6+X2 ADD ORDINAL + COUNT * * ADD WORDS COUNT TO HEADER WORD SO FRAMAT KNOWS * HOW MANY WORDS TO SKIP IF USER IS ON A NON-NAPLPS * TERMINAL. * SA3 WORDS X3 = WORDS COUNT SX3 X3+1 ADD ONE FOR HEADER LX3 12 MAKE ROOM FOR *MOUT* CODE SX2 VTXCODE BX3 X3+X2 FORM *MOUT* CODE * * FINAL HEADER WORD FORMAT'; * 10/0,8/SET ORDINAL,18/BYTE COUNT,12/WORD COUNT,12/VTXCODE * OUTP X3 SEND TO FRAMAT * GET CODES FROM BUFFER. STORE IN *MOUT*. * (A6 MUST POINT TO CURRENT *MOUT* SLOT) * THIS ASSUMES THAT A1 CONTAINS THE ADDRESS OF THE * FIRST BUFFER VAR ON RETURN FROM -NGETVAR-. SA2 COUNT RE-READ BYTES COUNT ZR X2,PROCESS -> DONE IF NO BYTES SA2 WORDS X2 = WORDS COUNT SB2 X2 B2 = BUFFER WORD COUNT SA1 VARBUF+1 X1 = BUFFER GETVAR CODE BX5 X1 TO X5 FOR -NGETVAR- NGETVAR SB1 1 SA3 MOUTLOC CURRENT *MOUT* ENTRIES COUNTER BX7 X3 CODES BSS 0 BX6 X1 MOVE CODES FOR STORAGE SA6 A6+B1 STORE IN *MOUT* SX7 X7+B1 INCREMENT *MOUT* ENTRIES COUNT SA7 A3 UPDATE *MOUTLOC* SB2 B2-B1 DECREMENT WORDS COUNT ZR B2,PROCESS -> FINISHED BUFFER SA1 A1+B1 GET NEXT BUFFER WORD EQ CODES -> SEND TO *MOUT* BADCNT BSS 0 SX6 1 BAD BYTES COUNT SA6 TRETURN EQ PROCESS * * INVOKING SEQUENCE NAMES. * NOTE -- FRAMAT DEPENDS UPON THE ORDER OF THESE * STRINGS. * SETLIST BSS 0 DATA 0LASCII DATA 0LPDICODE DATA 0LSUPPLEMENT DATA 0LPDIMACRO DATA 0LDRCS DATA 0LMOSAIC DATA 0LG3 DATA 0LSUPCON DATA 0LASCIICON DATA 0LNONE DATA 0LSETUP DATA 0LSWITCH DATA 0 END OF TABLE COUNT BSS 1 COUNT OF BYTES TO SEND WORDS BSS 1 COUNT OF WORDS USED SETORD BSS 1 SET ORDINAL FIVEP0 DATA 5.0 ONEP0 DATA 1.0 ENDOV SPACE 5,11 OVTABLE END EXEC10$