|
|
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 - metrics - 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"
;-----------------------------------------------------------------------