/ OCTAL MEMORY DUMPER 3/25/77 VERS=1 VERS2=1 / / THIS PACKAGE CONTAINS 2 RTS/8 TASKS TO DUMP USER / SPECIFIED PORTIONS OF MEMORY IN OCTAL. ONE TASK IS / CALLABLE FROM TASK LEVEL (VIA RTS/8 MESSAGES) AND / THE OTHER FROM USER LEVEL. THE DUMP PRESENTATION IS / A NINE COLUMN TABLE FORMAT WITH COLUMN HEADINGS. / EACH LINE BEGINS WITH THE MEMORY FIELD AND THE / STARTING ADDRESS FOR THAT LINE FOLLOWED BY THE / CONTENTS OF 8 MEMORY LOCATIONS. COLUMN HEADINGS ARE / REPEATED AT THE BEGINNING OF EACH MEMORY PAGE. / / /EDIT HISTORY / TASK= SNAP CUR= SNAPFLD INIWT= 0 IFDEF DUMP < IFNDEF DUMPFLD IFNDEF DUMPLOC TASK2= DUMP CUR2= DUMPFLD INIWT2= RUNWT > IFNDEF DMPOUT /DEFAULT OUTPUT TASK FOR DUMP CLB= CLL CLA / / / THE BASIC TASK, "SNAP" IS CALLED AT TASK LEVEL VIA / STANDARD RTS/8 MESSAGES. THE MESSAGE SENT TO "SNAP" / SPECIFIES THE STARTING ADDRESS, MEMORY FIELD AND / LENGTH OF THE AREA TO DUMP, ALONG WITH THE OUTPUT / TASK. DETAILS OF THE MESSAGE FORMAT ARE GIVEN BELOW. / / THE SECOND TASK, "DUMP" REQUESTS USER INPUT VIA THE / "TTY" DEVICE, REFORMATS THE ARGUMENTS, AND THEN / CALLS THE "SNAP" TASK. "DUMP" CAN BE EVOKED AT USER / LEVEL VIA THE MCR, OR RUN DIRECTLY BY ANOTHER TASK. / THE CODE REQUIRED FOR THE "DUMP" TASK IS CONDITION- / ALIZED, AND IS ONLY ASSEMBLED IF "DUMP" IS DEFINED. / DETAILS OF THE CALLING ARGUMENTS ARE GIVEN BELOW. / THE OUTPUT TASK FOR "DUMP" IS DEFINED BY THE / ASSEMBLY PARAMETER "DMPOUT". / / THE MINIMUM DUMP AREA IS ONE HALF OF A MEMORY PAGE, / AND THE ARGUMENTS TO "SNAP" ARE ROUNDED TO THE NEXT / LARGER HALF PAGE WHICH INCLUDES THE SPECIFIED AREA. / FOR EXAMPLE, A STARTING ADDRESS OF 0250 IS ROUNDED / DOWN TO 0200, WHILE A LENGTH OF 150, IS ROUNDED UP / TO 200. / / THE "SNAP" TASK REQUIRES TWO MEMORY PAGES, AND THE / "DUMP" TASK USES ONE ADDITIONAL MEMORY PAGE. THE / MEMORY AND FIELD ORIGINS FOR THIS PACKAGE ARE / SYMBOLICALLY DEFINED TO EASE RELOCATION. THE TASKS / DO NOT NEED TO BE IN THE SAME MEMORY FIELD. / / / / "SNAP" TASK / / CALLING MESSAGE FORMAT: / / ZBLOCK 3 /RTS8 OVERHEAD / OUTPUT TASK^10 + FIELD / STARTING ADDRESS FOR DUMP / LENGTH OF MEMORY TO DUMP / / / WHERE: "OUTPUT TASK" IS THE NUMBER OF THE TASK TO / RECEIVE THE FORMATTED ASCII DUMP / TEXT, USUALLY THE "TTY" OR "LPT" / TASK. / / "FIELD" IS THE MEMORY FIELD IN WHICH TO / START THE DUMP; 1, 2, ETC. / / / / / "DUMP" TASK / / TTY ENTRY FORMAT: SSSSS,LLLLT / / / WHERE: "SSSSS" IS THE ADDRESS TO START DUMP, 1 TO / 5 DIGITS. / / "LLLL" IS THE LENGTH OF MEMORY TO DUMP, 0 / TO 4 DIGITS. / / "T" IS THE LINE TERMINATOR, EITHER: / - CARRIAGE RETURN - DUMP AND RETURN / TO USER. / - ALT MODE - DUMP AND EXIT. / / LHN 12-14-71 / FOR RTS8 5/1/75 FIELD CUR%10 *SNAPLOC / / / / SNAP - OCTAL MEMORY DUMP TASK / / START, CLL CLA CAL /GO TO SLEEP 'TIL SOMEONE WANTS US. RECEIVE MADDR, 0 DCA EFCDF /SAVE THE CDF FOR POSTING EVENT FLAG TAD EFCDF DCA .+1 HLT /SET DATA FIELD TO CALLING FIELD. TAD I MADDR /GET THE FIRST WORD OF THE MESSAGE, RTR /AND GET THE OUTPUT DEVICE TASK RAR /NUMBER. AND (0177) DCA FORMDV /SAVE IN THE FORM FEED SUBROUTINE. TAD I MADDR /GET THE FIRST MESSAGE WORD AND CLL RTL /CREATE A CDF TO THE FIELD TO DUMP. RAL AND (0070) TAD (CDF) DCA XFLD+1 ISZ MADDR TAD I MADDR /ROUND THE STARTING ADDRESS DOWN TO AND (7700) /THE NEXT HALF MEMORY PAGE. DCA STADDR ISZ MADDR TAD I MADDR /GET THE LENGTH OF MEMORY TO DUMP, TAD (77) /AND ROUND UP TO NEXT HALF PAGE. CLL RTR RTR /RIGHT JUSTIFY, AND COMPUTE THE RTR /NUMBER OF HALF PAGES TO DUMP. AND (0077) SNA /NUMBER ZERO ? IAC /YES, THEN MAKE IT 1. CIA DCA LENGTH /SAVE AS LOOP COUNTER. CDF CUR TAD FORMDV /MOVE THE OUTPUT TASK NUMBER TO THE DCA I (OUTDEV) /BUFFER OUTPUT CODE. CLA CMA /FORCE A FORM FEED ON START UP. DCA THREE / / / / DUMP CONTROL LOOP / / SNAP1, JMS FORM /SEE IF WE NEED A FORM FEED. JMS I (DHEAD) /PUT OUT A HEADING LINE. JMS DPAGE /GO DUMP A HALF A MEMORY PAGE. ISZ LENGTH /DUMP FINISHED ? SKP JMP SNAP2 /YES, DO EXIT STUFF. TAD STADDR /NO, THIS MEMORY PAGE DONE ? AND (0177) SZA CLA JMP SNAP1+2 /NO, DO SECOND HALF PAGE. JMP SNAP1 /YES, WE NEED ANOTHER HEADING. SNAP2, TAD (-5) /THE DUMP IS ALL DONE, POST THE TAD MADDR /USER'S MESSAGE EVENT FLAG. CAL POST EFCDF, 0 JMP START /GO BACK AND WAIT FOR THE NEXT CALL. LENGTH, 0 /-# OF HALF MEMORY PAGES TO DUMP. STADDR, 0 /POINTER TO THE NEXT WORD TO DUMP. / / / OUTPUT A FORM FEED AFTER DUMPING / THREE CORE PAGES. / / FORM, 0 ISZ THREE /THIRD TIME THRU ? JMP I FORM /NO, JUST RETURN. CLB CMA RTL /YES, RESET THE COUNTER. DCA THREE CAL /SEND THE FORM FEED MESSAGE OUT. SENDW FORMDV, LPT FORMMG JMP I FORM /RETURN. THREE, 0 / / / / OUTPUT DUMP FOR HALF A PAGE OF MEMORY / / DPAGE, 0 TAD XFLD+1 /GET THE TARGET MEMORY FIELD, AND (0070) CLL RTR /MAKE IT PRINTABLE, RAR TAD (4060) JMS I (PUTD) /AND PUT IT TO THE OUTPUT BUFFER. TAD STADDR /ADD THE STARTING ADDRESS OF THIS JMS I (OCTOUT) /LINE TO THE OUTPUT BUFFER. JMS I (PUTD) /ADD 2 SPACES DPA1, JMS I (PUTD) /AND 2 MORE SPACES. JMS XFLD /SET THE DF TO THE TARGET FIELD. TAD I STADDR /GET THE CONTENTS OF THE CURRENT CDF CUR /MEMORY LOCATION TO DUMP, AND JMS I (OCTOUT) /ADD IT TO THE OUTPUT BUFFER. ISZ STADDR /INCREMENT THE DUMP POINTER. JMP .+4 TAD (10) /THIS MEMORY FIELD IS EXHAUSTED, TAD XFLD+1 /GO ONTO THE NEXT MEMORY FIELD. DCA XFLD+1 TAD STADDR /IS THIS LINE FINISHED ? AND (0007) /(WE DUMP 10(8) WORDS PER LINE.) SZA CLA JMP DPA1 /NO, GO FINISH THIS LINE. JMS I (OUTMSG) /YES, SEND IT TO THE OUTPUT DEVICE. TAD STADDR /IS THIS HALF MEMORY PAGE DONE ? AND (0077) SZA CLA JMP DPAGE+1 /NO, FINISH IT. JMP I DPAGE /YES, RETURN. / / / / SET THE TARGET DATA FIELD / / XFLD, 0 HLT /WILL BE A CDF TO THE TARGET FIELD. JMP I XFLD / / / FORM FEED MESSAGE / / FORMMG, ZBLOCK 3 6000 0 214 0 PAGE / / / / CREATE THE HEADING LINE / / DHEAD, 0 JMS OUTMSG /SEND OUT 2 CR-LF'S. JMS OUTMSG JMS PUTD /START THIS LINE WITH 8 SPACES. JMS PUTD JMS PUTD JMS PUTD DHE1, TAD (6040) /SAVE THE CURRENT COLUMN NUMBER. DCA WKY JMS PUTD /ADD 2 MORE SPACES. TAD (4060) /AND A SPACE AND A ZERO JMS PUTD TAD WKY /NOW THE COLUMN NUMBER AND A SPACE. JMS PUTD TAD (100) /INCREMENT THE COLUMN NUMBER. TAD WKY AND (0700) /IS IT .GT. 700 ? SZA JMP DHE1 /NO, GO AROUND AGAIN. JMS OUTMSG /YES, OUTPUT THE HEADING LINE. JMP I DHEAD /HEADING LINE ALL DONE, RETURN. / / / PUT A WORD IN THE OUTPUT BUFFER / / PUTD, 0 SNA /DATA FOR THE BUFFER ZERO ? TAD (4040) /YES, THEN MAKE IT SPACES. DCA I BPTR /ADD THE WORD TO THE OUTPUT BUFFER ISZ BPTR JMP I PUTD /RETURN. BPTR, OUTBUF / / / / SEND THE BUFFER TO THE OUTPUT DEVICE / / OUTMSG, 0 DCA I BPTR /ADD A BUFFER TERMINATOR. CAL /GIVE THE BUFFER TO THE OUTPUT SENDW /DEVICE AND WAIT TILL DONE. OUTDEV, LPT /(OUTPUT TASK # FROM CALLING MSG) OUTTXT TAD (OUTBUF) /RESET THE BUFFER POINTER. DCA BPTR JMP I OUTMSG / / / CONVERT A BINARY WORD TO ASCII AND / PUT IT IN THE OUTPUT BUFFER / / OCTOUT, 0 DCA WKX /SAVE THE NUMBER TO BE OUTPUTTED. TAD WKX /GET THE MOST SIGNIFICANT 2 DIGITS. CLL RTR RTR RTR JMS OCT1 /GO DO THEM. TAD WKX /NOW THE LEAST SIGNIFICANT 2 DIGITS. JMS OCT1 JMP I OCTOUT /RETURN. OCT1, 0 AND (0077) /MASK OFF THE LOWER 2 DIGITS. DCA WKY TAD WKY /SHIFT HIGH ORDER DIGIT. CLL RTL RAL AND (0707) TAD WKY /MERGE IN LOWER ORDER DIGIT. AND (0707) TAD (6060) /MAKE THEM ASCII, AND JMS PUTD /PUT THEM IN THE OUTPUT BUFFER. JMP I OCT1 /RETURN. WKX, 0 WKY, 0 / / / / LINE OUTPUT BUFFER MESSAGE / / OUTTXT, ZBLOCK 3 0 0 OUTBUF, ZBLOCK 40 /OUTPUT BUFFER. PAGE / / / / MCR RUNNABLE DUMP TASK / / IFDEF DUMP < *DUMPLOC START2, CAL /AWAKE AGAIN, SEND MESSAGE TO TTY: SENDW /AND GET OUR ARGUMENTS. TTY DATAMG TAD (-5) /LOOP COUNTER. DCA WKC TAD (INBUF-1) /RESET DATA POINTER FOR THE MESSAGE DCA WKB /BUFFER. DCA ADDRFD /CLEAR THE "ADDRESS FOUND" FLAG. DCA STADFD /CLEAR THE STARTING ADDRESS FLAG. TAD (DMPOUT^10) /RESET THE OUTPUT TASK AND FIELD DCA SNAPMG+3 /MESSAGE WORD. / / / PROCESS USER INPUT / / GETCHR, DCA WKA /ACCUMULATE INPUT DIGITS. ISZ WKB /INCREMENT THE INPUT BUFFER POINTER. TAD I WKB /GET THE NEXT COMMAND CHARACTER. SPA SNA /CR OR ALT MODE ?, (END ADDRESS) JMP ENDADD TAD (-",) /"," ?, (STARTING ADDRESS) SNA CLA JMP STRADD /YES, GO SAVE THE STARTING ADDRESS ISZ ADDRFD /SET THE "ADDRESS FOUND" FLAG. TAD WKA /ROTATE PREVIOUS DIGITS TO ACCEPT CLL RTL /NEW DIGIT. RAL DCA WKA ISZ WKC JMP GET1 TAD WKA /SAVE FIFTH DIGIT (IF ANY) FOR THE RAL /TARGET DATA FIELD. AND (0007) TAD (DMPOUT^10) /ADD FIELD TO SNAP MESSAGE. DCA SNAPMG+3 GET1, TAD I WKB /GET THE NEW DIGIT AND AND (0007) TAD WKA /ADD INTO THE PREVIOUS DIGITS. JMP GETCHR /GO GET ANOTHER DIGIT. / / / / FORM STARTING ADDRESS / / STRADD, TAD WKA /GET THE STARTING ADDRESS AND DCA SNAPMG+4 /PUT IN "SNAP" MESSAGE. ISZ STADFD /SET THE STARTING ADDRESS FLAG. JMP GETCHR /NOW GO GET LENGTH ARGUMENT. / / / COME HERE FOR END OF COMMAND LINE / / ENDADD, CLB TAD STADFD /WAS A STARTING ADDRESS ENTERED ? SZA CLA JMP END1 /YES, WKA IS THE LENGTH TO DUMP. TAD ADDRFD /NO, WAS ANY ADDRESS ENTERED ? SNA CLA JMP DPERR /NO, DO ERROR SEQUENCE. TAD WKA /YES, THEN USE IT FOR THE STARTING DCA SNAPMG+4 /ADDRESS. SKP END1, TAD WKA /YES, GET THE LENGTH ARGUMENT AND DCA SNAPMG+5 /PUT IT IN THE "SNAP" MESSAGE. CAL /SEND THE DUMP PARAMETERS TO "SNAP" SENDW /AND WAIT 'TIL "SNAP" IS FINISHED. SNAP SNAPMG / / / LOOK AT THE USER'S INPUT LINE TERMINATOR / / TAD I WKB /CARRIAGE RETURN TERMINATOR ? SMA CLA JMP START2 /YES, GO GET SOMEMORE ARGUMENTS. END2, CAL /NO, ALT MODE TERMINATOR, GO TO SUSPND /S L E E P ! JMP START2 SNAPMG, ZBLOCK 3 /MESSAGE FOR SNAP TASK DMPOUT^10 /OUTPUT DEVICE AND FIELD 0 /STARTING ADDRESS 0 /LENGTH TO DUMP / / / / TELL THE USER HE GOOFED / / DPERR, TAD I WKB /FIRST CHECK FOR ALT MODE TERMINATOR SZA CLA JMP END2 /IT WAS ALT MODE, JUST EXIT. CAL /SEND THE ERROR MESSAGE TO THE TTY SENDW /DEVICE. TTY DPERMG JMP START2 /GO GIVE HIM (HER) ANOTHER TRY. DPERMG, ZBLOCK 3 /RTS8 OVERHEAD. 0 0 TEXT /DUMP ARGUMENT ERROR/ / / / MESSAGE FOR THE TTY HANDLER TO GET ARGUMENTS / / DATAMG, ZBLOCK 3 2014 /NO CRLF, INPUT LENGTH= 14 INBUF TEXT /DUMP: / INBUF, ZBLOCK 14 / WKA, 0 /LOCAL TEMPORARIES. WKB, 0 WKC, 0 ADDRFD, 0 /ADDRESS FOUND FLAG. STADFD, 0 /STARTING ADDRESS FLAG PAGE > /END OF "DUMP" CONDITIONAL. $=$=LHN=$=$