DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 23072 (0x5a20) Types: TextFile Names: »CPMED«
└─⟦80dc9b589⟧ Bits:30005096 8" CR80 Floppy CR80FD_0053 ( HMDIR 6 VOL: BACKUP MD: CPM.D From: HMDIR*CPM.D ) └─⟦08785f861⟧ └─ ⟦this⟧ »CPM.D!CPMED«
;----------------------------------------------------------------------- ; MAIN PROGRAM "CPM_EVENT_DISTRIBUTION"(CPMED). ; ; NARRATIVE: ; CPMED IS THE 'CPM' MAIN PROGRAM,AND AS SUCH PERFORMES PROGRAM INI- ; TIALIZATION AND ERROR REPORTING. ; DURING INITIALIZATION,AN AMOS MESSAGE IS SENT TO THE CIP RTC-PROC- ; CESS (CIPRTC),WHICH HAS THE PURPOSE TO RUN THE CPM-TIMER,CPMTIM. ; ONCE INITIALIZED,CPMED AWAITS THE OCCURRENCE OF ONE OF THE FOLLOW- ; ING EVENTS: ; 1.AMOS SIGNAL: ; A AMOS SIGNAL SIGNALS TO CPM,THAT AN EVENT IS PENDING IN EITHER ; THE 'MDQ'-,'NM'- OR 'NC' QUEUE. ; ; A.MESSAGES RECIEVED IN THE MDQ QUEUE ARE: ; 1.MESSAGE FOR CONVERSION FROM SMF TO ACP ; 2.MESSAGES FOR CONVERSION FROM ACP TO SMF. ; 3.MESSAGES TO NICS TARE. ;. 4.SIP KEEP ALIVE MESSAGES (SIPKAM'S). ; 5.CHANNEL SYNCHRONIZATION MESSAGES (SYNMSG). ; 6.CONTROL MESSAGES TO NSC. ; ; B.EVENTS RECIEVED IN THE NM QUEUE ARE: ; 1.MESSAGES CONVERTED FROM SMF TO ACP (REAL/PSEUDO) ; 2.MESSAGES CONVERTED FROM ACP TO SMF (REAL/PSEUDO). ; 3.MESSAGES FROM NICS-TARE. ; ; C.EVENT RECIEVED IN THE NC QUEUE ARE: ; 1.CONTROL MESSAGES FROM NSC TO FIKS. ; 2.MSS CONTROL COMMANS/RESPONSES. ; 3.ACK'S FOR MESSAGES TO NICS-TARE. ; ; 2.AMOS MESSAGES: ; A.OPERATIONAL MODE CONTROL COMMANDS FROM THE LOCAL CIP WATCHDOG ; (CWD). ; ; 3.AMOS ANSWERS: ; A.RETURNED FROM THE CIPRTC PROCESS,WHEN THE REQUESTED DELAY HAS ; EXPIRED. ; B.RELEASE OF CPM TO CWD SIP-KAM'S. ; ; ALL EVENT ARE VALIDATED BY CPMED,AND PROCESSED BY CALLS TO SPECI- ; FIC EVENT PROCEDURES (PLEASE REF.TO RESP.PROCEDURE NARRATIVES),AND ; PROCESSED ONE AFTER ANOTHER. ; A SIP KEEP ALIVE MESSAGES MAY ACTUALLY CONTAIN SEVERAL EVENTS, ; AND IT IS ONLY THE INFORMATION PIGGYBACKED,E.I. ACK'S FOR NARRA- ; TIVE AND SYNC MESSAGES,THAT ARE AND PROCESSED BY CPM. ; THE KEEP-ALIVE-MESSAGE ITSELF IS FORWARDED IN AN AMOS MESSAGE TO ; CWD. ; IF SIPKAM OVERRUN OCCURS,I.E. THE RECEIPT OF AN 'KAM' WHILE ; CWD HAS NOT YET PROCESSED A PRIOR 'KAM,THEN THE 'KAM' IS IGNORED. ; ; CALLS TO: CPMM&C ; INMP ; INNMSG ; INCTRLMSG ; INTERCEPT ; TRANSMSG ; NMACKP ; NMACCNT ; ENQCMCM ; GETACK ; CPMTIMER ; MON WAITEVENT ; MON SENDANSWER ; MON SENDMESSAGE ; MON WAITANSWER ; MON TERMINATE ; MIO,MDEQQE ; MIO,MGETMTCB ; MIO,MPUTMTCB ; MIO,MENQQE ; RELMTCB ;----------------------------------------------------------------------- CPMSTART: ;BEGIN INITIALIZE CPM MOVC SIPMAILBOX R0 ; BEGIN PRESET SIPMAILBOX MON REGION,RENTER ; JMPI S4 URE004 ;E MOVC 0 R1 ; MOVC 0 R2 ; MOVC MBXCSL R3 ; Z0010: MON REGION,RPUT ; JMPI & S4 URE004 ;E ADDC 1 R1 ; SOB R3 Z0010 ; MOVC MBXNTS R1 ; MOVC OO R2 ; MON REGION,RPUT ; NICS-TARE:=STANDBY (OO) JMPI & S4 URE004 ;E MON REGION,RLEAVE ; JMPI & S4 URE004 ;E END ; MOVC CMESBUF R1 ; MOVC BMMSG R2 ; MON WAITEVENT ; AWAIT STARTMESSAGE FROM CWD ; 'AWAKED BY CWD' MOV R2 AMOSEVENT ; STORE MSG REF. JMP S5 MTCBINIT ; "INIT-MTCB" ; MOVC RTCMESBUF R5 ; START CPMCLOCK MOVC CRESTIM R0 ; BEGIN INT RTC MESSAGE MOV R0 MSCOMD.X5 ; MOVC CPMCLOCK R0 ; MOV R0 MSPARM.X5 ; MOV R5 R1 ; END MOVC RTCNAME R0 ; MON SENDMESSAGE ; "SENDMESSAGE" MOV R2 EVTRTC+AMOSEVENT ; SAVE CLOCK EVENT MOVC CMESBUF R1 ; RETRIEVE CWD MESSAGE JMP Z2010 ; GOTO PROCESS STARTMSG. ;----------------------------------------------------------------------- ; CPMED: ;BEGIN CPMED Z0100: ; WAITEVENT: MOVC CMESBUF R1 ; REF.TO MSG BUFFER MOVC BMSIG+BMMSG+BMANS R2 ; EVENTMASK MON WAITEVENT ; "WAITWEVENT" ; X0:R0=EVENTTYPE,R2=EVENT MOV R2 AMOSEVENT ; SAVE CURRENTEVENT ; SEQ R0 BNSIG ; CASE_OF_EVENTTYPE(1,2,3,X) JMP Z2000 ; Z1000: ; I . S I G N A L. ;-------------------------------- ; ; A. QUEUE 'M D Q'. ; -------------------------------- MOVC -1 R3 ; MOV R3 QDQN+QDMDQ ; Z1010: ; UNTIL QUEUE "MDQ" EMPTY DO ; BEGIN 'DEQUEUE NEXT ELEMENT' MOVC QDMDQ R4 ; QUEUE=MDQ INC QDQN. X4 ; UPDATE QN MOV QDQN. X4 R3 ; IEQ R3 7 ; IF LAT QN DONE THEN JMP Z1500 ; GOTO INSPECT NM: MON MIO,MDEQQE ; "DEQUEUE_ELEMENT"(R4=QD) JMPI & S4 URE001 ;E X0:ERRROR,REPORT ERROR JMP & Z1010 ; X1:NONE,GOTO NEXT QN:: MOV R0 CMTCBX ; X2:R0=MTCB INDEX,STORE IT MOVC MPMDQ R4 ; GET MTCB PARM.BLOCK MON MIO,MGETMTCB ; "GET_MTCB"(R0=MTCBX,R4=MPCB) JMPI & S4 URE001 ;E X0:ERROR,REPORT ERROR ; X1:MTCB LOADED TO MPCB MOV MPMBE0.X4 R1 ; READ MTCB-TYPE SEQ R1 MMTYPREAL ; IF NOT REAL MTCB THEN JMPI & S4 URE105 ;E REPORT ERROR ; END 'DEQUEUE NEXT ELEMENT' MOV MPRWD7.X4 R1 ; READ AND STORE MTCB STATUS MOV R1 CMSGSTATUS ; MOV MPRTYP.X4 R1 ; READ MSGTYPE(MTCB) ; SEQ R1 TNMSG ; CASE_OF_TYPE(1,2,X) JMP Z1200 ; Z1100: ; 1. NARRATIVE_MESSAGE. ; ----------------------------- JMP S5 INNMSG ; "INNARR.MSG"(R0=MTCBX) MOV CCHNO R2 ; READ CHANNELNO SLO R2 CH2+1 ; CASE_OF_CHNO(1,2,X) JMP Z1120 ; 1.INBOUND_CHANNEL(0-2) ; --------------------------- MOV CPMOPM R1 ; READ CPM_OPMODE IBN R1 FIACTIV ; IF INPUT ACTIVE THEN JMP S5 INMP ; "INBOUND_MSG_PROC" JMP Z1290 ; GOTO RELEASE_MTCB: Z1120: SLO R2 CH6+1 ; JMP Z1130 ; 2.OUTBOUND_CHANNEL(3-6) ; --------------------------- MOV CMSGSTATUS R1 ; READ MSG-STATUS SNE R1 CCNSSOK ; IF TRUNK_ERROR THEN JMP Z1130 ; 'STUCK OUTBOUND MSG' JMP S5 IMACKP ; "INB-NARR.MSG_ACK" MODC ECTRUNKERR-ECUNKNOWN ; EC=TRUNKERROR ; ELSE EC=UNKNOWN ; GOTO INTERCEPT_MSG: ; Z1130: ; X.UNKNOWN CHANNEL ; --------------------------- MOVC ECUNKNOWN R2 ; ERRCODE=UNKNOWN MOV CMTCBX R0 ; RETRIEVE MTCB INDEX JMP S5 INTERCEPT ; "INTERCEPT_MSG"(R0=MTCBX) JMP Z1010 ; GOTO RELEASE_MTCB: ; END CASE_OF_CHNO Z1200: SEQ R1 TCTRLMSG ; JMP Z1300 ; 2.CONTROL_MESSAGE. ; ----------------------------- JMP S5 INCTRLMSG ; "INCTRLMSG"(R0=MTCBX) MOV CCATTYP R1 ; X0:CTRLMSG READ,GET CAT,TYP ; SEQ R1 TSIPSYN ; CASE_OF_CAT+TYPE(1,2,3,4) JMP Z1220 ; 1.INBOUND_SYNCMESSAGE ; --------------------------- MOVC OPHUNT R0 ; OPCODE=HUNT JMP S5 CPMMC ; "CPMM&C"(RO=OPCODE) JMP Z1290 ; GOTO RELEASE-MTCB: Z1220: ; SEQ R1 TSCKAM ; JMP Z1240 ; 2.SIP_KEEP_ALIVE_MSG. ; --------------------------- MOV CPMOPM R1 ; READ CPM_OPMODE IBNP R1 FSYNC ; IF OPMODE=SYNC THEN MOVC OPACK R0 ; OPCODE=ACK JMP S5 CPMMC ; "CPMM&C"(OPCODE) MOVC CH3 R0 ; ENDIF MOV R0 CCHNO ; CCHNO=CH0 Z1232: ; FOR N=CH3,CH6 DO JMP S5 GETACK ; "GETACK"(N) JMP & Z1234 ; X0:NONE ; X1:GOT ACK(N) JMP S5 IMACKP ; "INMACKP"(ACK) Z1234: MOVC CCHNO R5 ; INEP X5 CH6 ; INC 0. X5 ; GET NEXT CHANNEL JMP Z1232 ; ENDDO ; JMP S5 RETSTA ; "RETREIVE_STATUS" MOV EVTSKAM+AMOSEVENT R0 ; READ SIPKAM STATUS SEQ R0 0 ; IF NOT SIPKAM OVERRUN THEN JMP Z1238 ; MOVC STATUSMSG R5 ; MOVC CSIPKAM X5 ; WRITE SIPKAM LETTER TO MOVC CMCDAT R4 ; MOV KAMSM. X4 R0 ; MOV R0 STAMSG.X5 ; MOV KAMSCC.X4 R0 ; MOV R0 SCCSTA.X5 ; MOV KAMNTS.X4 R0 ; MOV R0 NTSTAT.X5 ; MOV R5 R1 ; MOVC CWDNAME R0 ; CWD PROCESS MON SENDMESSAGE ; "SENDMESSAGE" ; X0:R2=EVENT MOV R2 EVTSKAM+AMOSEVENT; SAVE EVENT AS SIPKAM ; TRANSMIT STATUS Z1238: ; ENDIF JMP Z1290 ; GOTO RELEASE_MTCB: Z1240: SEQ R1 TCIPSYN ; SNE R1 TCSKAM ; 3.CONTROL_MSG TO 'NSC'. JMP Z1250 ; ---------------------------- JMP S5 ENQCMCM ; "ENQUEUE_CTRLMSG_CM" JMP Z1010 ; GOTO RELEASE_MTCB: ; Z1250: ; 4.STUCK OUTBOUND CTRLMSG ; (CIP-SYNC OR -KAM) ; --------------------------- Z1290: ; RELEASE_MTCB: JMP S5 RELMTCB ; "RELEASE_MTCB"(CMTCBX) JMP Z1010 ; ; Z1300: ; X.UNKNOWN_MESSAGE_TYPE. ; ----------------------------- MOVC ECUNKNOWN R2 ; ERRCODE=UNKNOWN MOV CMTCBX R0 ; RETRIEVE MTCB INDEX JMP S5 INTERCEPT ; "INTERCEPT_MSG"(R0=MTCBX) ; END CASE_OF_TYPE JMP Z1010 ; ENDUNTIL ;--------------------------------- ; Z1500: ; B. QUEUE 'N M'. ; -------------------------------- MOV CPMOPM R1 ; READ CPM-OPMODE SBN R1 FOACTIV ; IF OPMODE=OUTPUT_ACTIVE THEN JMP Z1700 ; Z1510: ; UNTIL QUEUE "NM" EMPTY DO ; BEGIN 'DEQUEUE NEXT ELEMENT' MOVC QDNM R4 ; QUEUE=NM MON MIO,MDEQQE ; "DEQUEUE_ELEMENT"(R4=QD) JMPI & S4 URE001 ;E X0:ERRROR,REPORT ERROR JMP & Z1700 ; X1:NONE,GOTO INSPECT NC: MOV R0 CMTCBX ; X2:R0=MTCB INDEX,STORE IT MOVC MPNM R4 ; GET MTCB PARM.BLOCK MON MIO,MGETMTCB ; "GET_MTCB"(R0=MTCBX,R4=MPCB) JMPI & S4 URE001 ;E X0:ERROR,REPORT ERROR ; X1:MTCB LOADED TO MPCB ; END DEQUEUE_NEXT_ELEMENT MOV MPMBE0.X4 R1 ; READ MTCB-TYPE SEQ R1 MMTYPREAL ; IF REAL MTCB THEN JMP Z1550 ; JMP S5 INNMSG ; "IN_NARR.MSG"(R0=MTCBX) MOV CCHNO R0 ; READ CURRENT CHN0. SLO R0 CH3 ; IF (CHNO < CH3 ) OR SLO R0 CH6+1 ; (CHNO > CH6 ) THEN JMPI S4 URE102 ;E REPORT ERROR ; ELSE JMP S5 INMACCNT ; "INB_NARR.MSG_ACCT" JMP S5 NMTRANS ; "TRANSMIT_MSG" JMP Z1510 ; ENDIF Z1550: ; ELSE (PSEUDO MCTB) MOV MPPWD5.X4 R0 ; READ CATEGORY XTR R0 8 ; SEQ R0 CATPNM ; IF (CAT. <> CATPNM) THEN JMPI S4 URE102 ;E REPORT ERROR ; ELSE JMP S5 IPMACCNT ; "INB_PSEUDO.MSG_ACCT" JMP S5 RELMTCB ; "RELEASE_MTCB" ; ENDIF ; ENDIF JMP Z1510 ; ENDUNTIL ; ENDIF ;--------------------------------- ; Z1700: ; C. QUEUE 'N C'. ; -------------------------------- Z1710: ; UNTIL QUEUE "NC" EMPTY DO ; BEGIN 'DEQUEUE NEXT ELEMENT' MOVC QDNC R4 ; QUEUE=NC MON MIO,MDEQQE ; "DEQUEUE_ELEMENT"(R4=QD) JMPI & S4 URE001 ;E X0:ERRROR,REPORT ERROR JMP & Z0100 ; X1:NONE,GOTO WAITEVENT: MOV R0 CMTCBX ; X2:R0=MTCB INDEX,STORE IT MOVC MPNC R4 ; GET MTCB PARM.BLOCK MON MIO,MGETMTCB ; "GET_MTCB"(R0=MTCBX,R4=MPCB) JMPI & S4 URE001 ;E X0:ERROR,REPORT ERROR ; X1:MTCB LOADED TO MPCB ; END DEQUEUE_NEXT_ELEMENT MOV MPMBE0.X4 R1 ; READ MTCB TYPE SEQ R1 MMTYPREAL ; IF REAL MTCB THEN JMP Z1750 ; 'FROM NSC TO FIKS' MOV CPMOPM R1 ; READ CPM OPMODE IBZ R1 FOACTIV ; IF OUTPUT NOT ACTIV THEN JMP Z1790 ; GOTO RELEASE-MTCB: ; ELSE JMP S5 CMTRANS ; "TRANSMIT_MSG" JMP Z1710 ; ENDIF Z1750: ; ELSE MOV MPPWD5.X4 R0 ; READ CATEGORY XTR R0 8 ; CASE OF CATEGORY SEQ R0 CATACK ; --------------------------- JMP Z1760 ; 1.MSS-ACK. JMP S5 OMACKP ; "MSS_ACK_PROCESSING" JMP Z1790 ; GOTO RELEASE_MTCB: Z1760: SEQP R0 CATMSSC ; SEQP R0 CATMSSR ; JMP Z1770 ; 2.MSS CONTROL MODC OPMSSC-OPMSSR ; MOVC OPMSSR R0 ; GET OPCODE(COMD) MOV MPPWD2.X4 R1 ; READ PARAMETER MOV R1 CMSSPARM ; AND STORE IT JMP S5 CPMMC ; "CPMMC"(OPCODE) JMP Z1790 ; GOTO RELEASE_MTCB: Z1770: SEQP R0 CATNTSC ; SEQP R0 CATNTSR ; JMP Z1780 ; 3.NTS CONTROL: MODC OPNTSC-OPNTSR ; MOVC OPNTSR R0 ; GET OPCODE(COMD) MOV MPPWD2.X4 R1 ; READ PARAMETER MOV R1 CNTSPARM ; AND STORE IT JMP S5 CPMMC ; "CPMMC"(OPCODE) JMP Z1790 ; GOTO RELEASE-MTCB: ; Z1780: ; X.UNKNOWN CATEGORY JMPI S4 URE102 ;E REPORT ERROR ; Z1790: ; RELEASE MCTB: JMP S5 RELMTCB ; "RELEASE_MTCB"(CMTCBX) ; ENDIF JMP Z1710 ; ENDUNTIL ;----------------------------------------------------------------------- Z2000: SEQ R0 BNMSG ; JMP Z3000 ; II . A M O S _ M E S S A G E. ;-------------------------------- Z2010: SEQ X1 CCIPOPM ; CASE_OF_COMMAND(1,X) JMP Z2100 ; 1. CWD_COMMAND ; ----------------------------- ADDC MSPARM R1 ; MOV X1 R0 ; READ OPCODE SEQP R0 SS ; IF (OPCODE<>STANDBY) AND SEQP R0 AA ; (OPCODE<>ACTIV) THEN JMPI S4 URE100 ;E REPORT ERROR MODC OPSTANDBY-OPACTIV ; ELSE MOVC OPACTIV R0 ; TRANSLATE OPCODE JMP S5 CPMMC ; "CPMM&C"(R0=OPCODE) MOVC CANSWER R1 ; GET REF TO ANSWER MOVC CCOK X1 ; CC=OK MOV AMOSEVENT R2 ; RETRIEVE EVENT MON SENDANSWER ; "SENDANSWER" JMP Z0100 ; GOTO WAITEVENT: ; ENDIF ; Z2100: ; X. UNKNOWN MESSAGE. JMPI S4 URE101 ;E REPORT ERROR ; END CASE_OF_COMMAND ;----------------------------------------------------------------------- Z3000: SEQ R0 BNANS ; JMP Z4000 ; III . A M O S _ A N S W E R. ;-------------------------------- MOVC AMOSEVENT R5 ; CASE_OF_ANSWER(1,2,3,X) SEQ R2 EVTRTC.X5 ; JMP Z3010 ; 1.RTC_EVENT (TIMER) MOVC RTCMESBUF R1 ; MOVC RTCNAME R0 ; RESERVE RTC ACTION,I.E. MON SENDMESSAGE ; "SENDMESSAGE" MOV R2 EVTRTC.X5 ; SAVE RTC EVENT JMP S5 CPMTIM ; "CPMTIMER" JMP Z3090 ; END CASE1 Z3010: ; IEQP R2 EVTSKAM.X5 ; 2.SIP_KAM MESSAGE RELEASE CLR EVTSKAM.X5 ; RESOLVE BUSY CONDITION JMP Z3090 ; END CASE2 ; ; X.UNKNOWN ANSWER JMPI S4 URE103 ;E REPORT ERROR Z3090: ; JMP Z0100 ; GOTO WAIT EVENT ; END CASE_OF_ANSWER ;----------------------------------------------------------------------- ; Z4000: ; X. U N K N O W N _ E V E N T ; ------------------------------- JMPI S4 URE104 ;E REPORT ERROR ; END CASE_OF_EVENTTYPE ;----------------------------------------------------------------------- ; ; UNRECOVERABLE_ERRORS: ; ------------------------------- ERR105: MODC 1 ; INVALID MESSAGES TYPE (CPMED) ERR104: MODC 1 ; UNKNOWN EVENT (CPMED) ERR103: MODC 1 ; UNKNOWN ANSWER (CPMED) ERR102: MODC 1 ; UNKNOWN MESSAGE EVENT (CPMED) ERR101: MODC 1 ; UNEXPECTED AMOS MESSAGE (CPMED) ERR100: MODC 100-40 ; INVALID COMMAND (CPMED) ERR040: MODC 40-30 ; INVALID OPCODE (CPMMC) ERR030: MODC 30-20 ; INVALID CHANNEL.NO (NMACKP) ERR020: MODC 20 ; INVALID CHANNEL.NO (NMACCNT) MODN R7 ; ERR004: ; REGION MONITOR ERROR ERR003: ; AMOS I/O MONITOR ERROR ERR002: ; MTCB MONITOR ERROR ERR001: MOD R7 ; MIO MONITOR ERROR MOVC 0 R0 ; GET ERRORCODE MOV R4 R1 ; GET ERRORLOCATION MON TERMINATE ; "TERMINATE" ;-----------------------------------------------------------------------