/BIT MAPPED GRAPHICS PLOTTING SYSTEM / LAST EDIT: 8/22/86 15:09:00 TR /THIS SYSTEM USES (X,Y) VALUES STORED IN FIELDS 2 AND 3 AND OUTPUTS /BIT MAPPED GRAPHICS POINTS OF A LOGICAL PAGE ON A DISK /IF ABSCISSANT OVERFLOWS THE THE MACHINE HALTS AND THE ERROR /IS INDICATED BY A <1> IN THE /IF THE ORDINATE OVERFLOWS THE MACHINE HALTS AND THE ERROR IS /INDICATED BY A <2> IN THE /SYSTEM PARAMETER DEFINITIONS CODFLD= 0^10 /FIELD WHERE CODE IS XFLD= 2^10 /X COORDINATE DATA FIELD. YFLD= 3^10 /Y COORDINATE DATA FIELD. ABSPNT= 1400 /NUMBER OF ABSSISSANT POINTS. ORDPNT= 3000 /NUMBER OF ORDINATE POINTS. ORDWRD= ORDPNT-1%14+1 /NUMBER OF Y AXIS WORDS. ABSOFFS=ABSPNT%2 /X AXIS OFFSET ORDOFFS=ORDPNT%2 /Y AXIS OFFSET XFLPNCN=14 /LOCATION IN XFLD OF NUMBER OF POINTS XPNSTR= 200 /LOCATION OF START OF (X,Y) VALUES FLDUTL= 3 /NUMBER OF FIELDS UTILIZED IN ONE BUFFER FLDBUF= 4^10 /STARTING FIELD FOR PUTTING POINTS SYSIO= 7640 /LOCATION OF I/O ROUTINES /PROCESSOR DEFINITIONS NL0000= CLA /LOAD A 0 INTO NL0001= CLA CLL CML RAL /LOAD A 1 INTO NL0002= CLA CLL CML RTL /LOAD A 2 INTO NL4000= CLA CLL CML RAR /LOAD A 4000 INTO NL7777=CLA CLL CMA /LOAD A 7777 INTO /START AT THE BEGINNING PAGE 0 ZBLOCK 10-. XR1, .-. /1ST AUTO INDEX REG XR2, .-. /2ND AUTO INDEX REG XR3, .-. /AUTO INDEX REG 3 XR4, .-. /AUTO INDEX REG 4 PAGE /ROUTINE FOR GENERATING BIT MAPPED GRAPHICS /EAE SIMULATION DEFINITIONS DVI=JMS I (XDVI) /CALL DIVIDE ROUTINE BEGIN, CLA /CLEAN UP NOP/SWBA /WILL BE NOP WHEN SIMULATOR IS USED JMS I (AUTOSET) /JUMP TO ROUTINE WHICH SETS THE /AUTO INDEX REGISTERS AND COUNTERS TAD PNTNUM /GET THE NUMBER OF X,Y, PAIRS CIA /COUNTER USED TO COUNT THE NUMBER OF DCA PTPNCN /POINTS NEEDED TO BE STORED ON DISK DCA I (FLDTAB) /ZERO FIRST ELEMENT OF TABLE JMS I (TABSET) /JUMP TO THE ROUTINE WHICH SETS THE /FIELD TABLE TO 0,1,2 START, TAD PNTNUM /GET NUMBER OF (X,Y) PAIRS CIA /STORE IN COUNTER USED TO COUNT THE NUMBER DCA PNTCNT /OF COORDINATES NEEDED TO BE PROCESSED JMS I (CLRFLDS) /JUMP TO ROUNTINE WHICH ZEROES FIELDS /4,5, AND 6. STRLUP, TAD (FLDTAB) /GET ADDRESS OF FIELD TABLE DCA PFLDTAB /POINTER TO FIELD TABLE CDF CODFLD /CHANGE TO CODING FIELD JMS I (GRPHPN) /CALCULATE FIELD, WORD, AND BIT FOR (X,Y) PAIR /AUTO INDEX REGISTERS XR1 AND XR2 ARE UTILIZED BY GRPHPN BACK, TAD I PFLDTAB /READ FIELD POINTER. SPA /IF NOT -1 THEN CONTINUE JMP ENDLST /ELSE LEAVE. CIA /NEGATE FIELD POINTER. TAD I (DSPFLD) /CHECK IF FOUND FIELD IS IN FLDTAB SNA CLA /IF FIELD IS NOT PRESENT THEN SKIP JMP OK /JUMP TO PUT POINT ON THE BIT MAP ISZ PFLDTAB /ELSE CHECK NEXT FIELD JMP BACK /TRY AGAIN. ENDLST, CLA /CLEAN UP ISZ PNTCNT /IF ALL POINTS HAVE BEEN LOOKED AT THEN SKIP JMP STRLUP /ELSE GO DO MORE GRPHFN, JMS I (SAVIO) /SAVE MEMORY FIELDS ON DISK /UPDATE THE FIELD TABLE TO THE NEXT FLDUTL FIELDS TAD (FLDUTL) /GET THE NUMBER OF FIELDS UTILIZED JMS I (TABSET) /UPDATE THE TABLE BY THAT AMOUNT JMS I (AUTOSET) /RESET THE COUNTER AND AUTO-INDEX REGISTERS JMP START /START ALL OVER AGAIN /COME HERE TO PUT POINTS ON THE BIT MAP OK, TAD I (DSPFLD) /GET THE FIELD NUMBER MQL /LOAD MULTIPLIER QUOTIENT DVI ; FLDUTL /DIVIDE BY NUMBER OF FIELDS USED CLL RTL;RAL /ROTATE AC 3 PLACES TO THE LEFT TAD (FLDBUF) /ADD STARTING MEMORY FIELD TO THE REMAINDER TAD (CDF 0) /ADD 6201 TO AC DCA SETFLD /STORE IN LINE TAD I (DSBIT) /GET BIT NUMBER TAD (BITTAB) /ADD ADDRESS OF BIT TABLE DCA PBIT /STORE IT AS BIT POINTER TAD I PBIT /GET THE CORRECT BIT TURNED ON MQL /LOAD MULTIPLIER QUOTIENT TAD I (DSPWRD) /GET THE DISPLAY WORD DCA PWRD /STORE IT SETFLD, .-. /CHANGE TO THE CORRECT BIT MAP FIELD TAD I PWRD /GET CONTENTS OF THE LOCATION MQA /OR THE AC AND MQ DCA I PWRD /STORE THE NEW CONTENTS OF THE LOCATION CDF CODFLD ISZ PTPNCN /IF ALL POINTS HAVE BEEN STORED THEN SKIP JMP ENDLST /ELSE GO BACK AND PROCESS AGAIN JMS I (SAVIO) /SAVE BUFFERS JMP I (7600) /GOOD BYE N3, 0003 FLDCNT, .-. /COUNTER FOR FIELDS PTPNCN, .-. /COUNT OF POINTS ACTUALLY STORED PWRD, .-. /POINTER TO THE WORD PBIT, .-. /POINTER TO THE BIT PNTCNT, .-. /NUMBER OF (X,Y) PAIRS PNTNUM, .-. /NUMBER OF (X,Y) PAIRS PFLDTAB,.-. /POINTER TO THE FIELD TABLE BITTAB, 4000 /CONVERTS BIT NUMBER TO BIT LOCATION 2000 1000 0400 0200 0100 0040 0020 0010 0004 0002 0001 PAGE / THIS SUBROUTINE FORMULATES THE FIELD, WORD AND BIT NUMBERS / WHICH CORRESPOND TO THE GIVEN X AND Y COORDINATES. /EAE SIMULATION DEFINITIONS MUY=JMS I (XMUL) /CALL TO MULTIPLY ROUTINE DVI=JMS I (XDVI) /CALL DIVIDE ROUTINE GRPHPN, .-. CDF YFLD /CHANGE TO Y DATA FIELD. TAD I XR1 /READ NEXT Y COORDINATE. TAD (ORDOFFS) /Y + ORDINATE OFFSET. CDF CODFLD /CHANGE TO CODING FIELD MQL /LOAD MQ. MQA /GET IT BACK INTO AC TAD (-ORDPNT) /SUBTRACT MAXIMUM ORDINATE SMA CLA /IF LESS THAN MAX THEN SKIP AND CONTINUE JMP ERRORY /ELSE GO TO ORDINATE OVERFLOW ERROR DVI ; 14 /DIVIDE BY 12 TO FIND WORD AND BIT NUM DCA DSBIT SWP DCA GRPHTM CDF XFLD /CHANGE TO X DATA FIELD. TAD I XR2 /READ IN NEXT X COORDINATE. TAD (ABSOFFS) /X + ABS OFFSET. CDF CODFLD /CHANGE TO CODING FIELD MQL /GET X POSITION INTO MQA /GET IT BACK INTO TAD (-ABSPNT) /COMPARE TO MAXIMUM ABSCISSA SMA CLA /IF NO OVERFLOW THEN SKIP AND CONTINUE JMP ERRORX /ELSE INDICATE ABSCISSANT OVERFLOW MUY; ORDWRD /(X + ABSOFFS) * ORDINATE WORD. SWP ;CLL /SWAP MQ AND AC AND CLEAR L. TAD GRPHTM /ADD (Y + ORDOFFS). SWP /SWAP AGAIN. SZL /IF LINK NOT 0 THEN ADD 1 TO FIELD. IAC DCA DSPFLD /STORE DISPLAY FIELD. SWP DCA DSPWRD /STORE DISPLAY WORD. JMP I GRPHPN /RETURN. DSBIT, .-. /HOLDS THE BIT NUMBER TO BE DISPLAYED DSPWRD, .-. /WORD AND BIT NUMBER OF (X,Y). DSPFLD, .-. /FIELD NUMBER OF (X,Y). GRPHTM, .-. /TEMPORARY ERRORX, NL0001 /INDICATE ABSCISSANT OVERFLOW HLT /HALT THE MACHINE JMP I (7600) /BOOTSTRAP IF CONTINUED ERRORY, NL0002 /INDICATE ORDINATE OVERFLOW HLT /HALT THE MACHINE JMP I (7600) /BOOTSTRAP IF CONTINUED PAGE /SUBROUTINE TO STORE THE DATA IN FIELDS 3,4,5, AND 6 ONTO A DISK SAVIO, .-. /SUBROUTINE HEADER /WRITE FIELD 4 ONTO THE DISK CLA TAD (4047) /I/O FUNCTION DEFINTION DCA IOFUN /STORE THE DEFINTION IN THE FUNCTION JMS IOCALL /JUMP TO WRITE THE DATA ONTO THE DISK /WRITE FIELD 5 ONTO THE DISK TAD (4057) /I/O FUNCTION DEFINITION DCA IOFUN /STORE THE DEFINITION IN THE FUNCTION JMS IOCALL /JUMP TO WRITE THE DATA ONTO THE DISK /WRITE FIELD 6 ONTO THE DISK TAD (4067) /I/O FUNCTION DEFINITION DCA IOFUN /STORE THE DEFINITION IN THE FUNCTION JMS IOCALL /JUMP TO WRITE THE DATA ONTO THE DISK JMP I SAVIO /RETURN TO PROCESS MORE DATA FLDADD, 0000 /ADDRESS OF THE FIELD TABLE /ITEMS IN THE FIELD TO BE UPDATED /ROUTINE WHICH CALLS THE INPUT-OUTPUT ROUTINE IOCALL, .-. /SUBROUTINE HEADER CLA TAD BLKNUM /GET THE CONTENTS OF BLKNUM TAD (40) /INCREMENT BY 40 BECAUSE EACH TIME THE /I/O ROUTINE WRITES 40 BLOCKS OF DATA /ONTO THE DISK DCA BLKNUM /RESTORE BLKNUM JMS I (SYSIO) /JUMP TO THE I/O ROUTINE WHICH WILL /PERFORM THE JOB DEFINED IN IOFUN IOTRN, .-. /THE ADDRESS IN MEMORY WHERE THE /PROGRAM WILL WRITE FROM IOFUN, .-. /I/O FUNCTION DEFINTION THAT TELLS /THE I/O ROUTINES WHAT TO DO BLKNUM, -40 /INITIAL BLOCK NUMBER SETTING JMP I IOCALL /RETURN TO SAVIO IN ORDER TO RESET THE /PARAMETERS IN IOCALL /ROUTINE WHICH INITIALIZES ALL OF THE MEMORY LOCATIONS IN FIELDS /4,5, AND 6 TO ZERO. /ROUTINE WHICH INITIALIZES THE AUTO INDEX REGISTERS AND COUNTERS AUTOSET,.-. /SUBROUTINE HEADER CDF XFLD /GET FIELD WHERE X VALUES ARE STORED TAD I (XFLPNCN) /GET THE NUMBER OF POINTS STORED CDF CODFLD /GET BACK TO WHERE WE ARE NOW DCA I (PNTNUM) /STORE IT AS NUMBER OF POINTS TO PROCESS TAD (XPNSTR-1) /PUT Y COORDINATE POINTER DCA XR1 /INTO AUTO INDEX REGISTER TAD (XPNSTR-1) /GET THE START OF WHERE POINTS ARE DCA XR2 /STORE IN ANOTHER AUTO INDEX REG JMP I AUTOSET /RETURN TO CALLING ROUTINE /ROUTINE FOR CLEARING BUFFER FIELDS CLRFLDS,.-. /SUBROUTINE HEADER TAD (FLDBUF-10) /SET UP POINTER TO THE DCA FLDNUM /FIELD TO BE ZEROED TAD (-FLDUTL) /SET UP LOOP COUNTER TO -FLDUTL WHICH DCA FLDCTR /IS THE NUMBER OF FIELDS TO ZERO PIKFLD, CDF CODFLD TAD FLDNUM /GET OFFSET PTR TO FIELD TO BE ZEROED TAD (10) /ADD 10 TO POINT TO NEXT FIELD DCA FLDNUM /SAVE NEW OFFSET POINTER TAD (CDF 0) /GET 6201 -> POINTER TO FIELD 0 TAD FLDNUM /ADD OFFSET DCA .+1 /SAVE FIELD CHANGE IN NEXT ADDRESS ZEROFLD, .-. /TO BE EXECUTED NL7777 /INITIALIZE AUTO INDEX REGISTER TO DCA XR3 /REFERENCE LOCATIONS TO BE ZEROED DCA XR4 /INITIALIZE AUTO INDEX REGISTER TO /COUNT THE NUMBER OF LOCATIONS TO ZERO CLRLUP, DCA I XR3 /STORE A ZERO IN THE LOCATION IN XR3 ISZ XR4 /IF XR4 NOT = 0 THEN CONTINUE JMP CLRLUP /ZEROING THE FIELD ISZ FLDCTR /ELSE IF FLDCTR NOT = 0 JMP PIKFLD /THEN THERE ARE MORE FIELDS TO ZERO JMP I CLRFLDS /ELSE THE FIELDS ARE ALL ZERO AND /RETURN TO THE CALLING PROGRAM FLDNUM, .-. /OFFSET USED TO INCREMENT 6201 TO THE /CORRECT FIELD TO CHANGE TO FLDCTR, .-. /HOLDS THE NUMBER OF FIELDS TO ZERO /ROUTINE WHICH ADDS THE CONTENTS OF TO THE FIELD TABLE VALUES TABSET, .-. /SUBROUTINE HEADER DCA TABTMP /STORE TEMPORARILY TAD (FLDTAB) /GET THE ADDRESS OF THE FIELD TABLE DCA TABPNT /STORE IT IN TABLE POINTER TAD (-FLDUTL+1) /GET NUMBER OF FIELDS -1 DCA TABCNT /STORE IN COUNTER TAD TABTMP /GET BACK TEMPORARY TAD I TABPNT /ADD PRESENT TABLE VALUE DCA I TABPNT /STORE BACK INTO TABLE VALUE TABLP, TAD I TABPNT /GET THE TABLE VALUE IAC /INCREMENT BY 1 ISZ TABPNT /MOVE POINTER TO NEXT TABLE POSITION DCA I TABPNT /STORE VALUE THERE ISZ TABCNT /IF ALL FIELDS ARE DONE THEN SKIP JMP TABLP /ELSE JUMP BACK AND DO MORE ISZ TABPNT /MOVE UP TABLE POINTER NL7777 /GET END OF TABLE CODE DCA I TABPNT /STORE IT JMP I TABSET /RETURN TO CALLING ROUTINE TABPNT, .-. /POINTER TO THE FIELD TABLE TABCNT, .-. /TABLE POINTER COUNT TABTMP, .-. /TEMPORARY FLDTAB, 0 /0 - 37. 1 /40 - 77. 2 /100 - 137. 7777 /END OF LIST PAGE 36 /EAE SIMULATION FOR THE PDP 8/E /MODE A OPERATION ONLY /THE FOLLOWING FUNCTIONS ARE IMPLEMENTED /MUY,DVI,DAD,DCM,SHL,SHR,ROTL,ROTR XMUL, .-. /MULTIPLY SUBROUTINE CLA CLL /CLEAN UP TAD (-15) /SET UP DCA ROTL /USE ROTL AS STEP COUNT XMROT, JMS ROTR /ROTATE RIGHT ISZ ROTL /COUNT STEPS(INIT STPCNT=-13 SKP JMP XMULFIN /FINISH THERE SNL /LOW ORDER BIT=1? JMP XMROT /NO,ROTATE AGAIN CLL /YES,GET RID OF LOW BIT TAD I XMUL /AND ADD MULTIPLIER JMP XMROT /GET NEXT BIT OF MULTIPLICAND XMULFIN,ISZ XMUL /GET TO NEXT WORD JMP I XMUL /GET BACK TO CALLER ROTR, .-. /ROTATION SUBROUTINE RAR /ROT AC SWP /GET MQ RAR /ROTATE IT SWP /FINISH ROT RIGHT JMP I ROTR /WITH LOW BIT IN LINK ROTL, .-. /ROT LEFT SUBROUTINE SWP /GET MQ RAL /ROTATE LEFT SWP /GET BACK AC RAL /ROTATE AGAIN JMP I ROTL /GET BACK TO CALLER XDVI, .-. /EAE SIMULATED DIVIDE DCA AC /STORE HIGH DIVIDEND IN AC MQA /GET MQ DCA MQ /STORE IN MQ TAD I XDVI /GET THE DIVISOR CIA /NEGATE IT DCA MDVSOR /STORE IT /NOW CHECK FOR OVERFLOW TAD AC /GET BACK AC STL CMA /SET LINK AND COMPLEMENT AC TAD I XDVI /ADD THE DIVISOR SNL CLA /IF NO OVERFLOW THEN SKIP SKP /ELSE SKIP AGAIN JMP XDVOUT /LEAVE ROUTINE WITH LINK SET IF OVERFLOW /IF THERE IS NO OVERFLOW START DIVISION ALGORITHM TAD (-14) /GET -12 DCA SFTCNTR /STORE AS SHIFT COUNTER XDIVLP, TAD MQ /GET THE MQ CLL RAL /SHIFT 25 PLACES DCA MQ /TO THE TAD AC /LEFT RAL DCA AC TAD AC /GET BACK HIGH PART OF DIVIDEND TAD MDVSOR /ADD -THE DIVISOR SZL /IF LINK IS ZERO, RESTORE BY LEAVING IT ALONE DCA AC /ELSE UPDATE THE DIVIDEND SZL CLA /IF LINK WAS ZERO DON'T SET BIT IN LOW MQ ISZ MQ /ELSE DO SET THE BIT ISZ SFTCNTR /SKIP IF DONE TWELVE TIMES JMP XDIVLP /ELSE GO BACK AND DO MORE TAD MQ MQL /PUT QUOTIENT IN REAL MQ TAD AC /GET BACK REAL AC XDVOUT, ISZ XDVI /TAKE SKIP RETURN JMP I XDVI /AND RETURN AC, .-. /HOLDS AC VALUE MQ, .-. /HOLDS MQ VALUE MDVSOR, .-. /HOLDS MINUS THE DIVISOR SFTCNTR,.-. /HOLDS STEP COUNTER VALUE XDCM, .-. /DOUBLE PREC. COMPL. SWP CIA SWP DCA XSHR RAL TAD XSHR JMP I XDCM XDAD, .-. /DOUBLE PRECISION ADD ROUTINE SWP /GET LOW ORDER BITS INTO AC TAD I XDAD /ADD LOW BITS ISZ XDAD /ADVANCE HIGHER ORDER BITS DCA XSHL /STORE SUM RAL /GET CARRY DCA XSHR /AND STORE IT AWAY MQA /GET HIGH BITS TAD XSHR /ADD CARRY TAD I XDAD /ADD HIGH ADDER ISZ XDAD /ADVANCE TO NEXT INSTR MQL /GET HIGH ADD INTO MQ TAD XSHL /GET LOW ORDER SUM SWP /PUT LOW IN MQ AND HIGH INTO AC JMP I XDAD /RETURN XSHL, .-. /SHIFT LEFT ROUTINE DCA XDCM /TEMP FOR HIGH BITS TAD (NOP) /GET NOP DCA XSHRE3 /STORE OVER (JMS ROTR) INSTRUCTION XSHRE1, TAD I XSHL CMA DCA XDAD TAD XDCM XSHRE3, JMS ROTR CLL XSHRE2, JMS ROTL ISZ XDAD JMP XSHRE3 ISZ XSHL JMP I XSHL XSHR, .-. /SHIFT RIGHT ROUTINE DCA XDCM TAD XSHR DCA XSHL TAD (NOP) DCA XSHRE2 TAD (JMS ROTR) /RESTORE THE ROTATE RIGHT INSTRUCTION DCA XSHRE3 /FOR USE BY THIS SUBROUTINE JMP XSHRE1 /ENTER THE LEFT SUBROUTINE AND CONTINUE