|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 171392 (0x29d80) Types: TextFile Names: »D161«
└─⟦ae2411776⟧ Bits:30008864 Diskette med tekster der formodes at være 31-D-152…161 └─⟦this⟧ »D161«
\f EX- NAME TER- CALL RETURN DELAY _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _N_A_L_ _ _ _W_0_ _ _ _ _ _ _ _W_1_ _ _ _ _ _ _W_2_ _ _ _ _ _ _W_3_ _ _ _ _ _ _W_0_ _ _ _ _ _ _ _W_1_ _ _ _ _ _ _W_2_ _ _ _ _ _W_3_ _ _ _ _P_A_G_E_2_ _ _ _ _ _ OPEN 4 SEM RETURN UNCH. UNCH Ø PAGE1 UNCH N OPEN CHAINED 6 OP SEM RETURN Ø Ø Ø PAGE1 0 M LOCK 3 SEM RETURN Ø Ø Ø PAGE1 UNCH M L_O_C_K_ _C_H_A_I_N_E_D_ _ _ _ _ _ _ _ _ _5_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _S_E_M_ _ _ _ _ _R_E_T_U_R_N_ _ _Ø_ _ _ _ _ _ _ _ _ _O_P_ _ _ _ _ _Ø_ _ _ _ _ _ _P_A_G_E_1_ _O_P_._P_A_G_E_ _M_ _ GET PAGES 7 RETURN Ø Ø Ø PAGE1 UNCH M PAGE JUMP 8 PAGE0 REL Ø Ø Ø PAGE1 UNCH M (W1-) CALL 25 RETURN PAGE0 REL Ø Ø Ø PAGE1 UNCH M W_0_ _-_ _C_A_L_L_ _ _ _ _ _ _ _ _ _ _ _3_4_ _ _ _ _S_T_O_R_E_ _ _ _ _R_E_T_U_R_N_ _ _P_A_G_E_0_ _ _ _R_E_L_ _ _ _ _ _Ø_ _ _ _ _ _ _ _ _Ø_ _ _ _ _ _ _ _Ø_ _ _ _ _ _ _P_A_G_E_1_ _U_N_C_H_ _ _ _ _M_ _ WAIT ANSWER 35 MESSBUF RETURN STATUS ANSW Ø PAGE1 0 Y SEND AND WAIT 1 MESS NAME RETURN STATUS ANSW Ø PAGE1 0 Y SEND AND WAIT FAST 2 MESS NAME RETURN STATUS ANSW Ø PAGE1 BUFPAGE Y SEND AND WAIT SLOW 9 MESS NAME RETURN STATUS ANSW Ø PAGE1 BUFPAGE Y STOP AND WAIT 30 NAME RETURN STATUS ANSW Ø PAGE1 0 Y C_L_E_A_R_ _C_O_R_E_ _ _ _ _ _ _ _ _ _ _1_1_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _R_E_T_U_R_N_ _ _Ø_ _ _ _ _ _ _ _ _Ø_ _ _ _ _ _ _ _Ø_ _ _ _ _ _ _P_A_G_E_1_ _U_N_C_H_ _ _ _ _Y_ _ PREPARE ACCESS 32 LOW.BASE UP.BASE NAME RETURN LOW.AREA UP.AREA ACCESS PAGE1 UNCH N T_E_R_M_I_N_A_T_E_ _A_C_C_E_S_S_ _ _ _ _3_3_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _N_A_M_E_ _ _ _ _R_E_T_U_R_N_ _ _L_O_W_._A_R_E_A_ _U_P_._A_R_E_A_ _A_C_C_E_S_S_ _P_A_G_E_1_ _U_N_C_H_ _ _ _ _N_ _ PRIV-OUT 21 HEAD1 TAIL RETURN Ø Ø Ø PAGE1 UNCH N JD-1 - W0 W1 W2 W3 UNCH UNCH UNCH UNCH UNCH N J_D_-_X_X_X_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _-_ _ _ _ _L_E_N_G_T_H_ _ _ _T_A_I_L_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _U_N_C_H_ _ _ _ _ _U_N_C_H_ _ _ _ _U_N_C_H_ _ _ _U_N_C_H_ _ _U_N_C_H_ _ _ _ _N_ _ L_E_G_E_N_D_ _T_O_ _S_U_R_V_E_Y_ _O_F_ _C_._L_._ _P_R_O_C_E_D_U_R_E_S_ SEM - Abs address of semaphore (in semaphore table) RETURN - Abs address of return-jump. Must be inside current page0. PAGE1 - Abs address of first word of page1 OP - Abs address of operation MESS - Abs address of 8 words to send as message NAME - Abs address of 5 words: name of receiver + NTA of receiver ANSW - Abs address of 8 words containing the answer MESSBUF - Abs address of message buffer sent STORE - Abs address of word where virtual return is stored. UNCH - Unchanged Ø - Undefined STATUS - Logical status of answer: if result = 1 then (2+answ(1)) else 1 shift result BUFPAGE - Address of the page used as buffer (virt/abs) OP.PAGE - Address of the page containing the operation (virt/abs) PAGE2 - Page 2 address: in coroutine descr (virt) and on page0 (abs) PAGE0 - VIRT address of the wanted new page0 REL - Relative adddress to exit to on the wanted new page0 LOW.BASE - Lower limit of catalog base to lookup the area UP.BASE - Upper limit of catalog base to lookup the area LOW.AREA - Lower limit of the found area UP.AREA - Upper limit of the found area ACCESS - Total no of accesses to the area (accesscount) HEAD1 - First word of head: length < 6+kind TAIL - Abs address of the words to move to tail of record EXTERNAL - No of the external variable holding address of the procedure DELAY - Tells if the C.L. delays the coroutine. Y=yes, N=no, M=maybe XXX - An integer 201 <= XXX <= 263. Testoutputkind will be XXX-200 \f i F_O_R_E_W_O_R_D_ First edition: RCSL No 31-D673. The current version of BOSS was first developed in 1971-72. Dur- ing the past years, several extensions and modifications have been implemented. For the maintenance staff, a great need arised for an updated de- scription of the basic parts of the internal structure. The man- ual is written to fulfil this purpose. Part of the manual is collected from old internal descriptions. Part of this manual replaces some chapters in RCSL No 31-D628 (BOSS2 Installation and Maintenance) in order to be able to sep- arate installation from maintenance in the future. The manual has no educational purpose. Still, the advanced user may find it interesting. The descriptions correspond to Release 18.0 (of the software package SW8101/1). C.H. Dreyer A/S REGNECENTRALEN af 1979, June 1982 \f ii \f iii T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 1. INTRODUCTION ........................................... 1 2. COMMON DATA STRUCTURES ................................. 2 2.1 Common Resident Tables ............................ 2 2.1.1 Core Table ................................. 2 2.1.2 Segment Table .............................. 3 2.1.3 Semaphore Table ............................ 4 2.1.4 Terminal Buffers ........................... 5 2.1.5 Sender Table ............................... 5 2.1.6 Coroutine Table ............................ 7 2.1.7 File Access Table .......................... 9 2.1.8 Run Test Buffers ........................... 10 2.2 Internal Queues in Central Logic .................. 10 2.3 Datastructures in Virtual Core .................... 11 2.3.1 Code Pages ................................. 12 2.3.2 Variable Pages ............................. 12 2.3.3 Operations ................................. 13 2.3.4 Job File Pages ............................. 14 2.3.5 Job Description Pages ...................... 18 2.4 Time Representations .............................. 24 3. CENTRAL LOGIC PROCEDURES ............................... 26 3.1 Survey of Central Logic Procedures ................ 27 3.2 Procedure Descriptions ............................ 28 3.2.1 Open ....................................... 28 3.2.2 Open Chained ............................... 28 3.2.3 Lock, Lockchained .......................... 29 3.2.4 Get Pages .................................. 31 3.2.5 Page Jump .................................. 31 3.2.6 W1-Call .................................... 31 3.2.7 W0-Call .................................... 32 3.2.8 Wait Answer ................................ 32 3.2.9 Send and Wait .............................. 32 3.2.10 Send and Wait Fast, Send and Wait Slow ..... 33 3.2.11 Stop and Wait .............................. 33 3.2.12 Clear Core ................................. 34 3.2.13 Prepare Access ............................. 34 \f iv T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _(_c_o_n_t_i_n_u_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 3.2.14 Terminate Access ........................... 35 3.2.15 Priv-Out ................................... 35 3.2.16 JD-1 ....................................... 35 3.2.17 JD-XXX ..................................... 36 4. LOADER ................................................. 37 4.1 Core Layouts ...................................... 38 4.2 Init and Load, Step by Step ....................... 38 4.3 Loader Procedures ................................. 40 4.3.1 Algorithm for Linking a Module ............. 40 4.3.2 Set Externals .............................. 43 4.3.3 Reserve Virtual ............................ 44 4.3.4 Move to Virtual ............................ 45 4.3.5 Put in Active Queue ........................ 45 4.3.6 Simulate Lock .............................. 46 4.4 Format of a Module File ........................... 47 5. PAGER, VIRTUAL CORE .................................... 49 5.1 A Virtual Address ................................. 49 5.2 A Page ............................................ 50 5.3 A Section ......................................... 51 5.4 Use of BOSS Core .................................. 51 5.5 Working Cycle of the Pager ........................ 53 5.6 Relations to Core Table and Segment Table ......... 54 6. TESTOUTPUT FORMATS ..................................... 55 6.1 Codepage Identifications .......................... 68 6.2 Coroutine Identifications ......................... 69 \f F_ 1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_ 1. This book is a maintenance manual, and so it is a working docu- ment for the people maintaining BOSS: It is a collection of de- scriptions that are needed over and over again when programming for BOSS, and so a general understanding of the structure of the system is more or less presupposed. The program text for the online system is contained in 10 files, compiled separately (but using the same option file). These files are referred to as MODULES. The first MODULE, named 'bos' (or central) contains the basic elements: - Central Logic procedures (or C.L.) - Pager coroutine - Initialization and loader/linker. Besides this, the commonly used data structures are described. These descriptions are closely related to the method of referenc- ing the structure in slang (suppose the absolute address of first word is contained in register W1): +0: _ _ _ _ _ _ _ _ _ _ _ _ first word, referred as "X1". +2: _ _ _ _ _ _ _ _ _ _ _ _ second word, as "X1+2". +4: _ _ _ _ _ _ _ _ _ _ _ _ third word, as "X1+4". +6: _ _ _ _ _ _ _ _+_7_:_ _ hw No 7, as "X1+6". hw No 8, as "X1+7". \f F_ 2_._ _ _ _ _ _ _ _ _C_O_M_M_O_N_ _D_A_T_A_ _S_T_R_U_C_T_U_R_E_S_ 2. 2_._1_ _ _ _ _ _ _ _C_o_m_m_o_n_ _R_e_s_i_d_e_n_t_ _T_a_b_l_e_s_ 2.1 The common data structures resident in BOSS core are placed in tables in the high-address end of BOSS core at run time. In this survey, they are mentioned from the low address end: M_m_m_ - core table Allocated after first loader pass. P_p_p_ - segment table - semaphore table Allocated during first loader pass. - terminal buffers - sender table - coroutine table Allocated at init (before first loader pass). - file access table - run test buffers (- top address of BOSS) 2_._1_._1_ _ _ _ _ _C_o_r_e_ _T_a_b_l_e_ 2.1.1 Core table holds one entry for every segment place in page core (see chapter 5). Coretable is indexed with core index: segment places counted from 0. Segment number (in + 3) is relative to first drum segment (cf. 5.6). _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ _C_O_R_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Core index: 0 1 2 3 4 5 - - - - _ _ _ _ _ _ _ _ _ _ _ _ _ _ _C_O_R_E_ _T_A_B_L_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ Entries: 0 1 2 3 4 5 - - - - Format of a core table entry (size = 4 hw): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +0: _c_o_r_e_ _i_n_d_e_x_ _f_o_r_ _f_i_r_s_t_ _s_e_g_m_e_n_t_ _o_f_ _s_e_c_t_i_o_n_ _ _ +1: _p_r_i_o_r_i_t_y_ _(_=_ _0_ _f_o_r_ _l_a_t_e_r_ _s_e_g_m_e_n_t_s_)_ _ _ _ _ _ _ _ _ +2: _l_e_n_g_t_h_ _o_f_ _s_e_c_t_i_o_n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +3: _s_e_g_m_ _n_u_m_b_e_r_ _o_f_ _f_i_r_s_t_ _s_e_g_m_e_n_t_ _o_f_ _s_e_c_t_i_o_n_ _ _ \f Priority (12 bits): M_S_B_ _ _ _ _ _ _ _ _ _ _ _ _(_7_ _b_i_t_s_)_ _ _ _ _ _ _ _ _ _ _L_S_B_ _ _ _ 1 = write page _ _ _ _ _ _ _ _ _ _ _ _ _ priority (2-254) _ _ 1 = fast buffer (send and wait fast) _ _ _ _ _ 1 = slow buffer (send and wait slow) _ _ _ _ _ _ _ _ 1 = requested and in core already _ _ _ _ _ _ _ _ _ _ _ 1 = job place Length: 4 * number of segments for first segment in section, 0 for later segments, 4 for free segments and later segment places for a job. Core table is terminated with a dummy top entry with the format: first index = 0 priority = 4095 length = core table length - 4 segment No = 4095 2_._1_._2_ _ _ _ _ _S_e_g_m_e_n_t_ _T_a_b_l_e_ 2.1.2 Segment table holds one entry for every segment in virtual core (drumcore/disccore - see chapter 5). Segment table is indexed with segment No: first entry is segm No = (last addr of BOSS) //512+1, so only segment places of virtual core are contained in segment table. \f Format of a segment table entry: Length = 1 hw, 12 bits: M_S_B_ _ _ _ _ _ _ _ _ _ _ _ _(_1_0_ _b_i_t_s_)_ _ _ _ _ _ _ _ _ _L_S_B_ _ _ _ 0 = first segm in section Core index for this 1 = later segm in section segment, if section _ _ _ _ _ _ 0 = section in core is in core (0-1023). 1 = section not in core 2_._1_._3_ _ _ _ _ _S_e_m_a_p_h_o_r_e_ _T_a_b_l_e_ 2.1.3 The semaphore table is allocated (and defined in size) during first loader pass, by reservations in external 19. The semaphore table contains semaphore descriptions and also a diversity of private datastructures, not described here. Format of a semaphore description: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ SEMAPHORE ->+0: SEM. VALUE length = 6 hw ADDR +2: FIRST IN QUEUE (option e13) _+_4_:_ _L_A_S_T_ _I_N_ _Q_U_E_U_E_ _ _ _ _ Examples of contents of semaphore descriptions: CORUNO is addresses of a coroutine description VIRT.OP is virtual address of an operation. - SIMPLE SEMAPHORE: (OPEN USED) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -2 -1 0 1 2 FIRST CORUNO CORUNO 0 0 0 _L_A_S_T_ _C_O_R_U_N_O_ _ _ _ _C_O_R_U_N_O_ _ _0_ _ _0_ _ _0_ _ \f - CHAINED SEMAPHORE: (OPEN CHAINED USED) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -2 -1 0 1 2 FIRST CORUNO CORUNO 0 VIRT.OP FIRST VIRT.OP _L_A_S_T_ _C_O_R_U_N_O_ _ _ _ _C_O_R_U_N_O_ _ _0_ _ _V_I_R_T_._O_P_ _ _L_A_S_T_ _V_I_R_T_._O_P_ _ 2_._1_._4_ _ _ _ _ _T_e_r_m_i_n_a_l_ _B_u_f_f_e_r_s_ 2.1.4 Used for terminal input/output. Allocated at init. A buffer for each possible terminal supported. Number of buffers = option i4+1. Buffer length = option i3 hws. 2_._1_._5_ _ _ _ _ _S_e_n_d_e_r_ _T_a_b_l_e_ 2.1.5 Each entry holds a description of a (maybe unknown) process send- ing messages to BOSS, and a semaphore to open when it occurs. Al- located at init. Number of entries = option e15. When C.L. detects a message arrived from another process, this event is signalled to a waiting coroutine by making open chained of an operation to a specific semaphore. The possible senders and related semaphores are found in sender table. F_o_r_m_a_t_ _o_f_ _s_e_n_d_e_r_ _t_a_b_l_e_: ONE TABLE ENTRY: (length = 10 hws) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _+_0_:_ _P_r_o_c_e_s_s_ _d_e_s_c_r_._ _a_d_d_r_ _o_f_ _a_ _k_n_o_w_n_ _s_e_n_d_e_r_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _+_2_:_ _A_d_d_r_e_s_s_ _o_f_ _s_e_m_a_p_h_o_r_e_ _t_o_ _s_i_g_n_a_l_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _+_4_:_ OPER: +_0_:_ _C_H_A_I_N_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _+_6_:_ +_2_:_ _f_r_e_e_,_ _o_p_._k_i_n_d_ _(_=_0_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +8: +4: Mess. buf. addr of received mess. or = 1: mess in queue, but no coroutine waiting _ _ _ _ _ _ _ _o_r_ _=_ _0_:_ _n_o_ _m_e_s_s_a_g_e_ _i_n_ _q_u_e_u_e_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \f Total number of sender table entries: e15: = commandios + unknown sender (2) + pseudojobs + operator display (1); C_._L_._ _p_e_r_f_o_r_m_s_, when message is received: 1. find sender in sendertable (last entry = unknown sender) 2. if oper already describes a mess ready for coroutine or corou- tine not waiting (sem. value > -1) then skip the message (in the event queue) else: insert mess buf addr in oper. simulate open chained (oper) page 2 (activated coroutine): = abs addr of oper. get event (mess. buf addr); T_h_e_ _c_o_r_o_u_t_i_n_e_ _p_e_r_f_o_r_m_s_: 1. lock chained (SEM). On SEM, many different operations may arrive, also an oper- ation describing an arrived message (as address of SEM is in- serted in a sender table entry). "Message-operations" are distinguished by having fouth hw (OPER+3) = 0 (op.kind = 0), by convention. Having received such an operation, proceed with: 2. Copy message (maybe). 3. Take actions on message. 4. Send answer and set OPER(+4):= 0 OPER(+2):= 0 (= free), maybe. (hw). 5. Proceed with other tasks, maybe. Now, a new message may be handled by C.L., but only one. 6. Return to 1. \f 2_._1_._6_ _ _ _ _ _C_o_r_o_u_t_i_n_e_ _T_a_b_l_e_ 2.1.6 The coroutine table contains coroutine descriptions. Allocated at init. Number of entries = option e14 (= number of coroutines). In the code of C.L., the variable named f1 (called coruno) holds the abs address of current coroutine description (the abs address of f1 is in ext (26)). And the variable named f2 (called coruno code) holds the abs address of current coroutine code page. Format of an entry in coroutine table, (see details below, length = 16 hws, option e12): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +0 _C_H_A_I_N_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +2 _S_T_A_T_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +4 _C_O_R_O_U_T_._I_D_E_N_T_,_ _T_E_S_T_,_ _R_E_L_._R_E_T_U_R_N_ _ +6 _P_A_G_E_0_ _ _ _ _ _ _ _ _ _ +8 _P_A_G_E_1_ _ _ _ _ _ _ _ _ _ Virtual +10 _P_A_G_E_2_ _ _ _ _ _ _ _ _ _ address +12 _P_A_G_E_3_ _ _ _ _ _ _ _ _ _ +14 _P_A_G_E_4_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The virtual addresses of pages should be interpreted: if it is > max core addr of BOSS, it is a virtual address. Otherwise it is some core address (e.g. CL will sometimes use page 2 for a core address). On exit to a corutine, CL promises that all pages having a real virtual address are in core. \f Detailed format of a coroutine description: length = 16 hws (option e12) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CORUNO-> +0 CHAIN: M_m_m_ (f1) - TO NEXT IN QUEUE IF IN SOME QUEUE P_p_p_ - OR = 0 IF LAST IN QUEUE _ _ _ _ _ _ _ _-_ _O_R_ _U_N_D_E_F_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +2 STATE: = 0 when running, and other cases = 1 after lock/lock chained, when SEM.VAL <= 0. (for testoutput of operation at exit). < FIRST of BOSS: waiting for answer (= message buffer addr). < LAST of BOSS: after lock/lock chained, when SEM VAL > 0 during check-pages. (= SEM ADDR) >=LAST of BOSS: during openchained, waiting for virtual operation to be moved _ _ _ _ _ _ _ _ _ _ _ _t_o_ _c_o_r_e_ _(_t_o_ _u_p_d_a_t_e_ _t_h_e_ _c_h_a_i_n_s_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ +4 COROUTINE IDENT <15 (No, 1-999) + TEST PATTERN <12 (3 BITS, TESTOUTPUT) + REL. RETURN (The relative addr to return to in page 0, when _ _ _ _ _ _ _ _e_x_i_t_ _i_s_ _d_o_n_e_ _t_o_ _c_o_u_r_u_t_i_n_e_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +6 PAGE0: (VIRTUAL ADDR) _ _ _ _ _ _ _C_O_D_E_ _P_A_G_E_ _c_u_r_r_e_n_t_l_y_ _u_s_e_d_ _b_y_ _t_h_e_ _c_o_r_o_u_t_i_n_e_ _ _ _ _ _ _ _ +8 PAGE1: (VIRTUAL ADDR) _ _ _ _ _ _ _V_A_R_I_A_B_L_E_ _P_A_G_E_,_ _v_a_r_i_a_b_l_e_s_ _u_s_e_d_ _b_y_ _t_h_e_ _c_o_r_o_u_t_i_n_e_ _ _ +10 PAGE2: (VIRTUAL ADDR) SET BY CENTRAL LOGIC: = OPERATION after lockchained INTERNAL USE IN CENTRAL LOGIC: = VIRT: of last operation in queue during opench = 0 after send and wait/stop and wait = CORETABLE REF. OF BUFFER after send and wait _ _ _ _ _ _ _ _ _f_a_s_t_-_s_l_o_w_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +12 PAGE3: (VIRTUAL ADDR) _ _ _ _ _ _ _S_E_T_ _B_Y_ _C_O_R_O_U_T_I_N_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +14 PAGE4: (VIRTUAL ADDR) _ _ _ _ _ _ _S_E_T_ _B_Y_ _C_O_R_O_U_T_I_N_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \f 2_._1_._7_ _ _ _ _ _F_i_l_e_ _A_c_c_e_s_s_ _T_a_b_l_e_ 2.1.7 The file access table is used to control the access from corou- tines to bs files. It is closely coupled to the name table of the monitor. Each entry in file accesstable is 1 hw, and corresponds to one area process description in the monitor (= number of entries). Allocated during init. B_O_S_S_: R_C_8_0_0_0_ _M_O_N_I_T_O_R_: FILE ACCESS AREA PROCESS TABLE: NAME TABLE: DESCRIPTIONS: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +0: count first area +0 first area first +1: count second area +2 area +2: +4 _ _ _ _ _ _ _ _ +3: second . area . . _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ last +N: _c_o_u_n_t_ _ last area +2xN: _ _ _ _ _ _ last area area _ _ _ _ _ _ _ _ The file access table is indexed via the name table address (NTA), which is the absolute address of the word in name table pointing to the process description in question. NTA is set by C.L. procedure prepare access, which creates an area process. "count" is counting number of simultaneous "openings" to the file described by the area process. An "opening" is understood as the time between call of prepare access and terminate access. \f A negative count will lead to bossfault 2. If count > 1, more than one coroutine (e.g. terminals) have opened to this specific file, and it must not be destroyed or overwritten. 2_._1_._8_ _ _ _ _ _R_u_n_ _T_e_s_t_ _B_u_f_f_e_r_s_ 2.1.8 Allocated during init. 2 buffers, maybe only one (if option e7 = -1). Each buffer is 512 hws (+ one dummy word). Used by C.L. pro- cedures for testoutput. When a buffer is full (no room for next testoutput record), it is sent to the device. The device may be a bs file name "bosstest" or a magtape station named "bosstest". In the latter case, option e6 = +1 is required. The selection of magtape/bs file is done on basis of "reserve process". If this succeeds, it must be a peripheral process al- ready existing (magtape assumed). Otherwise an area process is created. 2_._2_ _ _ _ _ _ _ _I_n_t_e_r_n_a_l_ _Q_u_e_u_e_s_ _i_n_ _C_e_n_t_r_a_l_ _L_o_g_i_c_ 2.2 C.L. works on 3 queues, used in administration of the coroutines. The queues are operated like semaphores and so the format is similar. CORUNO denotes a coroutine description address. - A_c_t_i_v_e_ _q_u_e_u_e_. Chains of coroutines ready to activate (internal name: f4). f4 -> (-2 : no value of the queue) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +0: FIRST CORUNO IN QUEUE (or = 0) _+_2_:_ _L_A_S_T_ _C_O_R_U_N_O_ _I_N_ _Q_U_E_U_E_ _(_o_r_ _=_ _0_)_ _ _ \f - A_n_s_w_e_r_ _q_u_e_u_e_. Chain of coroutines waiting for an answer to a message (internal name: f3). f3 -> (-2: no value of the queue) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +0: FIRST CORUNO IN QUEUE (or = 0) _+_2_:_ _L_A_S_T_ _C_O_R_U_N_O_ _I_N_ _Q_U_E_U_E_ _(_o_r_ _=_ _0_)_ _ _ - P_a_g_e_r_ _q_u_e_u_e_. Chain of coroutines, whose pages are not in core, and whose pages must be moved to core in order to proceed with some operation (internal name: f5). _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ f5 -> +0: VALUE +2: FIRST CORUNO IN QUEUE (or = 0) _+_4_:_ _L_A_S_T_ _C_O_R_U_N_O_ _I_N_ _Q_U_E_U_E_ _(_o_r_ _=_ _0_)_ _ _ 2_._3_ _ _ _ _ _ _ _D_a_t_a_s_t_r_u_c_t_u_r_e_s_ _i_n_ _V_i_r_t_u_a_l_ _C_o_r_e_ 2.3 The datastructures n_o_t_ _r_e_s_i_d_e_n_t_ in BOSS core are placed in p_a_g_e_s_ in the virtual core (drumcore/disccore), and moved to (and maybe from) the core by the pager coroutine (see chapter 5). The datastructures placed on pages, are: - Code pages. Used as page0 in coroutines. - Variable pages. Used as page1 in coroutines. - Operations. Chained to a semaphore, or in no chain (if deliver- ed to a coroutine). - Job file pages. - Job description pages. - Work pages, no general formats. Pages are created by the initialization code in each module file (coroutine file), when activated by the loader. \f 2_._3_._1_ _ _ _ _ _C_o_d_e_ _P_a_g_e_s_ 2.3.1 Code pages contain code. F_o_r_m_a_t_ _o_f_ _a_ _c_o_d_e_ _p_a_g_e_ (values are set at EXIT to coroutine): ABS. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ PAGE0 -> +0: ABS. PAGE0 ADDR. (=ITSELF) ADDR +2: ABS. PAGE1 ADDR. (VARIABLES) (f2.) +4: ABS. PAGE2 ADDR. (USED BY C.L.) +6: ABS. PAGE3 ADDR +8: ABS. PAGE4 ADDR +10: CODEPAGE IDENT (hw) +11: REL. RETURN at exit from CL (hw) i.e.: rel.addr of the instruction to which C.L. jumped at exit. _ _ _ _ _ _ _ _ _ _ _ _ _ _(_t_h_e_ _r_e_s_t_ _c_o_n_t_a_i_n_s_ _c_o_d_e_)_ _ _ _ _ _ _ Before exit to a coroutine, C.L. assigns all the fields mention- ed, except CODEPAGE IDENT. All code pages are created as "real" pages. Except for the pager, which is resident in core. But the head of the pager code has the same format. 2_._3_._2_ _ _ _ _ _V_a_r_i_a_b_l_e_ _P_a_g_e_s_ 2.3.2 Contain variables, mostly dedicated to a specific coroutine. Used as page1. There exist no conventions about format. Note that C.L. procedure w1-call stores virtual return address on page1: P_a_g_e_1_:_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +0 Virtual page0 addr +2 Relative return in page0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \f 2_._3_._3_ _ _ _ _ _O_p_e_r_a_t_i_o_n_s_ 2.3.3 Common conventions for format: +0 _c_h_a_i_n_ _(_i_f_ _c_h_a_i_n_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +2 "Free"-mark/banker op.code HW defines use and +3 _O_p_._k_i_n_d_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _H_W_ _ _ _ contents of operation +4 _A_n_s_w_e_r_ _S_e_m_a_f_o_r_ _a_d_d_r_ _(_a_b_s_)_ _(_i_f_ _s_e_nding coroutine expects an answer) (defined by 2nd word) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ In an operation, C.L. only uses 1st word, and only when the oper- ation is chained to a semaphore. The chain is a virtual address of the next in chain. Note that the length of the operation is not part of the data- structure. It is defined at creation and not signalled later on. E_x_a_m_p_l_e_s_ _o_f_ _s_e_m_a_f_o_r_ _s_t_a_t_e_s_: - Semaphore with value 3 and chain (operations queued): SEM.DESCR. (VIRTUAL) CORE: _ _ _ _ _ _ _ +0 3 _ _ _ _ _ _ _ _ _ _ _ +2 FIRST CHAIN +4 _ _L_A_S_T_ _ _ _1_s_t_ _O_P_E_R_ _ _ _ _ _ _ _ _ _ _ _ _ _ CHAIN _2_n_d_ _O_P_E_R_ _ _ _ _ _ _ _ _ _ _ _ _ _ CHAIN=0 _L_A_S_T_ _O_P_E_R_ _ \f - Semaphore with value 3 and n_o_ chain: SEM.DESCR: _ _ _ _ _ _ _ _ _ 3 0 _ _ _ _0_ _ _ _ _ - Semaphore with value 0: SEM.DESCR: _ _ _ _ _ _ _ _ _ 0 0 _ _ _ _0_ _ _ _ _ - Semaphore with value -2 (2 coroutines chained): SEM.DESCR: CORUT.DESCR: _ _ _ _ _ _ _ _ _ -2 _ _ _ _ _ _ _ _ _ _ _ FIRST CHAIN _L_A_S_T_ _ _ _ _ 1st CORUT. _I_N_ _C_H_A_I_N_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CHAIN=0 LAST CORUT. _I_N_ _C_H_A_I_N_ _ _ _ 2_._3_._4_ _ _ _ _ _J_o_b_ _F_i_l_e_ _P_a_g_e_s_ 2.3.4 This page is not a C.L. datastructure. It is created and used in the module term1. One page for each commandio coroutine. \f F_ Layout of JOB FILE PAGE: \f F_ Layout of JOB FILE PAGE (continued): \f F_ Layout of JOB FILE PAGE (continued): \f F_ 2_._3_._5_ _ _ _ _ _J_o_b_ _D_e_s_c_r_i_p_t_i_o_n_ _P_a_g_e_s_ 2.3.5 This page is not a C.L. datastructure. It is described in a sep- arate module text, and used in the modules: job, jobstart and procs. It is created (as a page) in the module JOBSTART One page for each pseudo-job. \f F_ Layout of JOB DESCRIPTION PAGE: \f F_ Layout of JOB DESCRIPTION PAGE (continued): \f F_ Layout of JOB DESCRIPTION PAGE (continued): \f F_ Layout of JOB DESCRIPTION PAGE (continued): \f F_ Layout of JOB DESCRIPTION PAGE (continued): \f F_ 2_._4_ _ _ _ _ _ _ _T_i_m_e_ _R_e_p_r_e_s_e_n_t_a_t_i_o_n_s_ 2.4 Time representations are always based on the monitor clock in ad- dress 110 (and 108). It is loaded like this: dl W1 110 The registers now will contain: _ _ _ _ _W_0_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _W_1_ _ _ _ _ _ _ _ 24 bits 24 bits 48 bits real time clock in units of 0.1 msec. T_i_m_e_ _i_n_ _t_e_s_t_o_u_t_p_u_t_ _h_e_a_d_e_r_ Algorithm in pseudo-algol second header-word: = time:= ((montime - bossstarttime) extract 29) //100; After subtract of boss start time: _ _ _ _ _W_0_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _W_1_ _ _ _ _ _ _ _ 19 bits 5 bits not used 29 bits, used time is in units of 0.01 sec. Max. value is 5368709, stored in 24 bits. U_n_i_t_s_ _o_f_ _0_._8_1_9_2_ _s_e_c_o_n_d_s_ Algorithm in pseudo-algol: time:= (montime shift (-13)) extract 24; _ _ _ _ _W_0_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _W_1_ _ _ _ _ _ _ _ _ _ _ 11 bits 13 bits 11 bits 13 bits 24 bits, used 1 shift 13 = 8192. time unit is: 8192 x 0.0001 = 0.8192 sec. \f S_h_o_r_t_c_l_o_c_k_ _i_n_ _c_a_t_a_l_o_g_ _e_n_t_r_y_ Algorithm in pseudo-algol: time: = (montime shift(-19)) extract 24; _ _ _ _ _ _ _ _W_0_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _W_1_ _ _ _ _ _ _ _ _ _ _ 5 bits 19 bits 5 bits 19 bits 24 bits, used 1 shift 19 = 524288. time unit is: 524288 x 0.0001 = 52.4288 sec. \f F_ 3_._ _ _ _ _ _ _ _ _C_E_N_T_R_A_L_ _L_O_G_I_C_ _P_R_O_C_E_D_U_R_E_S_ 3. The functions of C.L. procedures are described below. The return from the C.L. procedure to the coroutine is in most cases done as an "exit to coroutine". Thereby it is checked that all pages stated in the page list of the coroutine description are present in core (page core). So, before call, the coroutine may change its page list, and in the same call get some other pages (note that this is not working in procedures marked with no delay). At "exit to coroutine", C.L. promises that all pages, mentioned in the coroutine description, are in core. And on page0 itself, the corresponding abs. addresses of the pages is placed (see sub- section 2.3.1). Note that if an operation is delivered as page2, this may be a page (comming from virtual core), but it could also point to e.g. sender table (if it signals that a message has arrived). \f F_ 3_._1_ _ _ _ _ _ _ _S_u_r_v_e_y_ _o_f_ _C_e_n_t_r_a_l_ _L_o_g_i_c_ _P_r_o_c_e_d_u_r_e_s_ 3.1 \f F_ 3_._2_ _ _ _ _ _ _ _P_r_o_c_e_d_u_r_e_ _D_e_s_c_r_i_p_t_i_o_n_s_ 3.2 3_._2_._1_ _ _ _ _ _O_p_e_n_ 3.2.1 Release a semaphore w_i_t_h_o_u_t_ chain (operation): sem:= sem+1; if sem <= 0 then activate another coroutine, waiting for the semaphore. (it is chained to active queue). Returns immediately (no delay). 3_._2_._2_ _ _ _ _ _O_p_e_n_ _C_h_a_i_n_e_d_ 3.2.2 Releases a semaphore with a chained queue of operations, i.e. the operation pointed out is turned over to (chained to) the sema- phore, whose value is now increased by one. The operation is chained as the last of the operations queued at the semaphore. The operation must be in core (pointed out by an abs addr), and must be part of a virtual page. In the operation itself, - first word (addr+0) is used by C.L. for chain. (Virtual addr of next in chain) - fourth hw (addr+3) should be <> 0 (as 0 means a message). Calling coroutine may be delayed. At least the chain from a pre- ceding operation in the queue must be altered, and this requires the corresponding page in core. F_u_n_c_t_i_o_n_: The semaphore address is temporarily saved in the chain of the operation. The address of the operation is transformed from abso- lute to virtual, a writing bit is added and this virtual address\f is saved in the state of the coroutine. Page2 of the coroutine is set to the last operation (or coroutine) chained to the sema- phore. Now the pages are checked and afterwards the page pointed to by the state, the operation, is checked. If any coroutine is waiting for the semaphore (value < 0) the first coroutine is taken out of the chain, the operation is inserted as page2 of this coroutine description and this coroutine is put in the active queue. The semaphore value is incremented by one and the state and page2 of the delivery coroutine are cleared. If no coroutine is waiting it is checked that no other coroutine has succeeded in sending an operation to the same semaphore dur- ing a paging, if any, ordered by check pages. In this case the last-pointer of the semaphore differs from page2 of the corou- tine, the page2 is set to the new last-pointer and the algorithm is repeated from the point of page-checking. If no other coroutine has interfered, then the operation is in- serted into the chain of the semaphore, the value of which is in- creased by one and the state of the coroutine is cleared. 3_._2_._3_ _ _ _ _ _L_o_c_k_,_ _L_o_c_k_c_h_a_i_n_e_d_ 3.2.3 These procedures are identical, as the same entry in C.L. is used for both. P_u_r_p_o_s_e_: - lock: wait for a semaphore w_i_t_h_o_u_t_ chain (operation): sem: = sem -1; if sem < 0 then wait for activation - lock chained: wait for an operation chained to the semaphore: sem: = sem -1; if sem < 0 then wait for activation else deliver first operation on semaphore. \f D_e_s_c_r_i_p_t_i_o_n_: if sem <= 0 then wait for activation else (sem is >= 1) sem:= sem -1; if any operations are chained to the semaphore then deliver first operation in queue; (even in this case the calling coroutine maybe delayed). Note that the type of the semaphore is determined by the open operations performed on the semaphore: - open makes the semaphore unchained (simple) - open chained makes the semaphore chained. In an operation delivered, - first word (addr+0) contains the new semaphore value. - second word (addr+2) contains by convention free, op.kind op.kind = 0 if the operation signals a message arrived. F_u_n_c_t_i_o_n_: If the semaphore is not available (value <= 0) the state of the coroutine is cleared, the semaphore value is decreased and the coroutine is put into the semaphore chain. If the semaphore is available (value >= 1) then the first oper- ation of the semaphore chain (empty if not chained) is placed as page2 of the coroutine and the semaphore address as state. Then the pages are checked and after this possibly time consuming operation the semaphore is checked again; if it is not available any longer or if the first operation in the chain now differs from the one which was found before the pages were checked, then some other coroutine has locked the semaphore and snatched away the operation during the paging which must have taken place and the algorithm is repeated from the beginning. \f When the pages are ok and no other coroutine has interfered, the semaphore value is decreased and the operation is taken out of the semaphore chain (only if chained). 3_._2_._4_ _ _ _ _ _G_e_t_ _P_a_g_e_s_ 3.2.4 The pages (page0-page4) described in coroutine description (co- routine table), are moved to core (if not already present), i.e.: check that all the pages of the coroutine are in core. The corou- tine continues when this is the case. 3_._2_._5_ _ _ _ _ _P_a_g_e_ _J_u_m_p_ 3.2.5 The calling coroutine wants to jump to another code page (page0), as indicated in W2-W3. Note that no return address in the old code page is saved. The page0 addr is renewed, and the coroutine continues when its pages are ready (in core). 3_._2_._6_ _ _ _ _ _W_1_-_C_a_l_l_ (or just Call) 3.2.6 The calling coroutine wants to jump to another code page (page0), as indicated in W2-W3. The return address (in W1) is stored in the first two words of (current) page1, thus: page 1 addr+0: virt (current) page0 page 1 addr+2: rel return in page0 (W1 - abs addr of page0) Now page0 addr is renewed, and the coroutine continues when its pages are ready. \f 3_._2_._7_ _ _ _ _ _W_0_-_C_a_l_l_ 3.2.7 The calling coroutine wants to jump to another code page (page0), as indicated in W2-W3. The return address (in W1) is stored in the abs address pointed out by W0: addr(W0) -2: virt (current) page0 addr(W0) +0: rel return in page0 (W1 - abs addr of page0) Now page0 addr is renewed, and the coroutine continues when its pages are ready. 3_._2_._8_ _ _ _ _ _W_a_i_t_ _A_n_s_w_e_r_ 3.2.8 The coroutine asks to wait until answer arrives to a message al- ready sent by the coroutine in the message buffer pointed out by W2 (MESSBUF). Note that the message sent m_u_s_t_ _n_o_t_ - if it is an I/O message - point out a data buffer in some of the pages (virtual core). If I/O, the data buffer must be in permanent core. Used by transmit. The coroutine is queued to wait for the answer. 3_._2_._9_ _ _ _ _ _S_e_n_d_ _a_n_d_ _W_a_i_t_ 3.2.9 The coroutine wants to send a message and wait for the answer. The message to send is in addr (W1). - if the message is an I/O mess, it m_u_s_t_ _n_o_t_ point out a data buffer in some of the pages (virtual core). - If I/O, the data buffer must be in permanent core. - page2:= 0; \f - send message; - the coroutine is queued to wait for the answer; 3_._2_._1_0_ _ _ _ _S_e_n_d_ _a_n_d_ _W_a_i_t_ _F_a_s_t_,_ _S_e_n_d_ _a_n_d_ _W_a_i_t_ _S_l_o_w_ 3.2.10 The coroutine wants to send a message and wait for the answer. Data are on a virtual page. The message to send is in addr (W1). - The message will normally be an I/O mess, and it contains abs. addresses pointing out a data buffer in some of the pages (virtual core). - The page in question must be in core at call time, and now this page is marked (must stay in core until answer arrives). - page2:= virtual addr of page containing data buffer. - send message; - the coroutine is queued to wait for the answer; F_u_n_c_t_i_o_n_: The procedures are used in connection with input/output to or from a virtual buffer. The corresponding bufferbit is set in the core table entry for the buffer, otherwise it works as send and wait (note input/output to or from a core store buffer is accom- plished by means of the normal send and wait). The difference be- tween fast and slow is solely reflected in the order in which the pager selects its victims (i.e. core places to be cancelled). 3_._2_._1_1_ _ _ _ _S_t_o_p_ _a_n_d_ _W_a_i_t_ 3.2.11 The coroutine wants to perform stop process (a job process). - page2:= 0 - stop process (monitor 60) - the coroutine is queued to wait for the answer. \f 3_._2_._1_2_ _ _ _ _C_l_e_a_r_ _C_o_r_e_ 3.2.12 The purpose is to reserve a part of core store before swop-in of a job process. Works as get pages but the coroutine has in advance replaced its page4-addr in coroutine description, thus: page4: +0: - first segm place (hw) +1: + top segm place (hw) Used by banker. The pager is activated (put in active queue). The calling coroutine is put in the pager queue, and the pager will clear the pages occupying the core places pointed out. 3_._2_._1_3_ _ _ _ _P_r_e_p_a_r_e_ _A_c_c_e_s_s_ 3.2.13 The calling coroutine wants to access (read) a bs file. W0, W1 contains the "lookup-base" from where to find the file and create area process. Calling coroutine is not delayed. 2 return jumps exist: 1) return to W3 (from call): No entry visible, the registers are: W0:= result of create area process W1, W2:= undefined W3:= page1 addr page2:= unchanged. In name area (addr(W2)), result of create area process is stored instead of name table address. 2) return to W3+2: Entry found, area process created. Registers set as described in the survey. In name area (addr(W2)), name table address is set (in addr(W2)+8). \f The catalog base (of BOSS) is set to the base of the area process. Access count is increased by 1 (in access table). (if new value is < 0, bossfault 2 occurs). 3_._2_._1_4_ _ _ _ _T_e_r_m_i_n_a_t_e_ _A_c_c_e_s_s_ 3.2.14 The calling coroutine wants to terminate (a previously prepared) access to a bs file. Access count is decreased by 1 (in access table). (if new value is < 0, bossfault 2 occurs). The catalog base (of BOSS) is set to the base of the area pro- cess. If the (new) access count = 0, remove process is called. The coroutine is not delayed. 3_._2_._1_5_ _ _ _ _P_r_i_v_-_O_u_t_ 3.2.15 Private testoutput from the coroutine. The C.L. procedure coruno output is called. The coroutine is not delayed. The testoutput record has the format: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +0 length<6+kind length: length of tail in hw. +2 time (max 502 hw) +4 _c_o_r_o_u_t_i_n_e_ _i_d_e_n_t_ _ +6 tail: 'length' hw, copied from addr(W1) and on. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 3_._2_._1_6_ _ _ _ _J_D_-_1_ 3.2.16 The coroutine wants testoutput of registers. \f The coroutine executes the (illegal) instruction jd -1, which provokes a 'break0'. The interrupt routine checks, that this was the case, generates at testoutput record containing registers and instruction count- er, and continues with re-established registers in the instruc- tion following the jd-1. The coroutine is not delayed. 3_._2_._1_7_ _ _ _ _J_D_-_X_X_X_ 3.2.17 The coroutine wants to generate private testoutput (as PRIV-OUT). This facility is just a simpler way of implementing it. The registers (W0, W1) are assigned in advance, with W0 = tail length, W1 = first (tail). XXX must be an integer, 201 <= XXX <= 263. Testoutput kind will be XXX-200. The coroutine executes the (illegal) instruction jd-XXX, which provokes a 'break0'. The interrupt routine checks that this was the case, sets W0 = length < 6 + kind, W1 = first (tail), calls C.L. procedure coruno output and continues with re-established registers in the in- struction following the jd-200. The coroutine is not delayed. \f F_ 4_._ _ _ _ _ _ _ _ _L_O_A_D_E_R_ 4. The loader in BOSS is a 2-pass loader/linker. All the module files are loaded twice and executed. This execu- tion is the initialization of the module, and it transforms the module into one or several code pages, variable pages, creates coroutines, semaphores, operations etc. Information used in several modules is passed from module to mod- ule via the external table. It contains abs addresses (e.g. of C.L. procedures) virtual addresses etc. All values are initially zero and only a few are defined before first loader pass. The majority of the externals are defined by the modules. They are in turn used by other modules that may have been loaded al- ready. This is the basis reason for the 2 passes. \f 4_._1_ _ _ _ _ _ _ _C_o_r_e_ _L_a_y_o_u_t_s_ 4.1 The figure shows the core utilization during the two loader passes and during run. p_a_s_s_1_: p_a_s_s_2_: r_u_n_: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ central logic B central logic central logic pager O pager pager init S init external table external table for jobs drumcoretable drumcoretable and pages diskcoretable diskcoretable (see pager) move virt buf move virt buf module module coretable coretable segmenttable segmenttable semaphoretable semaphoretable semaphortable terminal buffers terminal buffers terminal buffers sender table sender table sender table coroutine table coroutine table coroutine table file access table file access table file access table run test buf run test buf run test buf _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 4_._2_ _ _ _ _ _ _ _I_n_i_t_ _a_n_d_ _L_o_a_d_,_ _S_t_e_p_ _b_y_ _S_t_e_p_ 4.2 The following description covers all the initialization performed in the module bos, including the two loader passes. step 1. If FP is present in the BOSS core, all the code is moved, so the FP code is overwritten. \f step 2. Already existing internal processes with BOSS as parent are left unchanged i.e. the last address of BOSS core is set below the smallest of these core processes. step 3. Allocate run test buffer(s). step 4. Get name of main console. step 5. Remove all area processes. step 6. Connect testoutput medium: bosstest (bs file or magtape). step 7. Zero-fill all BOSS core after the bos module. step 8. Overwrite bosstest to zero-fill all segments (if bs file). step 9. Allocate core used during loader: - external table - drumcore table - disccore table - buffer for move to virtual. step 10. Allocate (some of) common resident tables: - file access table - coroutine table - sender table - terminal buffers - top of semaphoretable. step 11. Assign externals (external 13, 14, 24 dummy) step 12. First testoutput: - installation name record - bos load record. step 13. "Next pass": Assign externals (to initial values) 18 = post record of coroutine table 19 = post record of semaphor table 20 = post record of sender table. step 14. Load 9 module files, one by one: step 14.1 load next module file step 14.2 testoutput of load record step 14.3 link the module (see subsection 4.3.1) step 14.4 Jump to initialization code of module file (loader procedures called from module: see section 4.3). \f step 15. Assign externals, that will be active in pass2: 13 = move to virtual 14 = simulate lock 24 = put in active queue. step 16. Adjust all virtual disc addresses in external table (all externals < 0), and virtual addresses in coroutine table. step 17. Allocate and initialize - segment table - core table. step 18. Create and overwrite drumcore and disccore. step 19. Proceed with pass2: Step 13 and 14. step 20. Output external table to testoutput. step 21. In file access table, access count is set = 1 for the files: - bosstest - drumcore - disccore - usercat - catalog. step 22. If BOSS is started in monitor mode and monitor mode is not wanted (option e16) and the machine is RC4000 (op- tion e80) then the protection key is changed. step 23. On RC8000: Ensure, that BOSS has only write access to its own core (mode0 removed). step 24. Jump to C.L. entry, where first coroutine in active queue is activated. 4_._3_ _ _ _ _ _ _ _L_o_a_d_e_r_ _P_r_o_c_e_d_u_r_e_s_ 4.3 The initialization code in a module calls some procedures to handle the common datastructures. 4_._3_._1_ _ _ _ _ _A_l_g_o_r_i_t_h_m_ _f_o_r_ _L_i_n_k_i_n_g_ _a_ _M_o_d_u_l_e_ 4.3.1 Before exit to a module file, the link algorithm transfers the current value of externals to places in the module itself. \f The linking is also used for reserving core in semaphore-, corou- tine- and sendertable. The module contains a_n_ _e_x_t_e_r_n_a_l_ _l_i_s_t_. This is a list of relative addresses (REF) meaning: "in the address relative to this is found an external number". The list starts in module start +8 (see section 4.4) MODULE: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +0 +2 +4 +6 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +8 first external REF second external REF external list _-_ _r_e_l_ _a_d_d_r_._ _t_o_ _c_o_r_o_u_t_i_n_e_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ external REF external list (cont.) _0_ _=_ _e_n_d_ _o_f_ _e_x_t_e_r_n_a_l_ _l_i_s_t_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ A negative value means: continue in rel.addr - ref. A zero means: end of external list. Now, the list is scanned, and each positive ref. is interpreted, thus: - REF is odd: In the hw addressed (will always be the right half of a word), the external number is found. Current value of this external is inserted in the hw. \f _h_w_ _ _ _h_w_ _ _ _ _h_w_ _ _ _ _h_w_ _ _ _ _ if found: _ _ _ _ _ _3_0_5_ _ it becomes _ _ _ _ _e_x_t_(_3_0_5_)_ _ - REF is even, and the word addressed contains the value 10: Reserve in semaphoretable (usually more than 4095 hws). In the word preceding the addressed word is found the number of hws to reserve. Ext(19) is decreased by number of hws and stored in the word addressed. (meaning: first address of just reserved core). Ext(10) is increased by number of hws. _ _ _ _ _ _ _ _ _ _ if found: -2 _ _ _ _ _ _ _5_0_ _ , 50 hws are reserved: +0 _ _ _ _ _ _ _1_0_ _ ext(10): = ext(10) +50; ext(19): = ext(19) -50; it becomes: _ _ _ _ _ _ _ _ _ -2 _ _ _ _ _ _ _5_0_ _ +0 _ _ _e_x_t_(_1_9_)_ - REF is even: In the word addressed, the external number is found. Current value of this external is inserted in the word. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ if found _ _ _ _ _ _ _3_0_5_ _ it becomes _ _ _e_x_t_(_3_0_5_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ if found _ _ _ _ _ _ _-_1_0_ _ it becomes _ _ _e_x_t_(_-_1_0_)_ _ - Special use of external 18, 19, 20: The left hw of the word addressed is used as "number of hws to reserve", and the external (number in right hw) is decreased before stored in the word addressed. So this value means: first address of just reserved core. \f _ _h_w_ _ _ _h_w_ _ _ if found: _3_0_0_ _ _ _1_8_ _ _ 300 hws are reserved: ext(18): = ext(18) - 300, and it becomes: _ _ _ _ _ _ _ _ _ _ _ _ _ _e_x_t_(_1_8_)_ _ _ _ ext(18) reserves in coroutine table ext(19) reserves in semaphore table ext(20) reserves in sender table. 4_._3_._2_ _ _ _ _ _S_e_t_ _E_x_t_e_r_n_a_l_s_ 4.3.2 The abs addr of entry to the procedure is in ext(40). The procedure is used to assign new values to externals. Called from the initialization code of the module. Call: Return: W0 = irr W0: = unchanged W1 = irr W1: = unchanged W2 = irr W2: = unchanged W3 = -2 + abs.addr. of W3: = undefined start of list Return jump is made to the address just after the list. The list consists of a number of entries. Each entry is 2 words, the first is the new value, the second is external number. The last entry must be 0, -1000. \f E_x_a_m_p_l_e_ _o_f_ _c_a_l_l_: external list: g13., g14., ... jl. w3 (2) ; set externals: g13: 40 ; here abs addr of entry is placed. 100 , 304 ; means set ext(304): = 100 e2 , -7 ; means set ext(-7): = option e2 g14: 26<12+19 ; here is placed abs addr of first word of ; the 26 hws which are reserved in the ; semaphore table. 335 ; and then set external will assign this ; value to ext(335) 0 -1000 ; end of set external list (code) ; set externals returns to this addr. 4_._3_._3_ _ _ _ _ _R_e_s_e_r_v_e_ _V_i_r_t_u_a_l_ 4.3.3 The procedure is used to reserve (find room) in the virtual store for a number of hws, and returns the virtual address of the first word reserved. The abs addr of entry to the procedure is in ext(12). The reservation must be specified to either drumcore or disccore. Call: Return: W0 = drum or disc W0: = unchanged (W0 extract 1 = 0 means drum) W1 = length of reservation, in hws W1: = unchanged W2 = irr. W2: = virtual address W3 = return addr W3: = undefined. - Successive calls of reserve virtual with same value of W0 ex- tract 1 and W1 >= 512, will make reservations on consecutive segments. \f - if W1 >= 512, the reserved room will start at a segment start, and an unused part, if any, of last segment will n_o_t_ be used in later reservations. - if W1 < 512, the procedure will find the smallest suitable "hole" (if any), left over from previous calls with W1 < 512 4_._3_._4_ _ _ _ _ _M_o_v_e_ _t_o_ _V_i_r_t_u_a_l_ 4.3.4 The procedure is used to move a just initialized page to virtual core. Note that it is dummy in pass1. The abs addr of entry to the procedure is in ext(13). Call: Return: W0 = first addr to move W0: = unchanged W1 = length in hws W1: = unchanged W2 = virtual address to W2: = unchanged move to (W2 extract 1 = writing) W3 = return addr. W3: = unchanged 4_._3_._5_ _ _ _ _ _P_u_t_ _i_n_ _A_c_t_i_v_e_ _Q_u_e_u_e_ 4.3.5 The procedure is used to chain a coroutine to the active queue, so it will be activated when the load is completed. The abs addr of entry to the procedure is in ext(24). Note that the procedure is dummy in pass1. Call: Return: W0 = irr. W0: = undefined W1 = coroutine description addr W1: = unchanged (in coroutine table) W2 = irr. W2: = abs addr of active queue. W3 = return addr. W3: = unchanged \f 4_._3_._6_ _ _ _ _ _S_i_m_u_l_a_t_e_ _L_o_c_k_ 4.3.6 The procedure is used to chain a coroutine to a semaphore, so it will be waiting for this semaphore to be opened when the load is completed. The abs addr of entry to the procedure is in ext(14). Note that the procedure is dummy in pass1. Call: Return: W0 = irr W0: = undefined W1 = coroutine descr. addr W1: = unchanged (in coroutine table) W2 = semaphore descr. addr W2: = unchanged (in semaphore table) W3 = return addr. W3: = undefined. \f 4_._4_ _ _ _ _ _ _ _F_o_r_m_a_t_ _o_f_ _a_ _M_o_d_u_l_e_ _F_i_l_e_ 4.4 Output from slang compiler must have the following format: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +0 _f_r_o_m_ _s_l_a_n_g_:_ _s_u_m_ _o_f_ _c_h_a_r_s_ _(_S_0_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +2 _f_r_o_m_ _s_l_a_n_g_:_ _d_o_u_b_l_e_ _s_u_m_ _o_f_ _c_h_a_r_s_ _(_S_1_)_ _ _ _ _ _ _ _ +4 _d_a_t_e_ _o_f_ _v_e_r_s_i_o_n_ _(_e_._g_._:_ _8_2_0_2_2_0_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ +6 _i_d_e_n_t_ _o_f_ _v_e_r_s_i_o_n_ _(_e_._g_:_ _7_5_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +8 first external REF External list: +10 second external REF (module code) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (maybe continued external list) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _l_a_s_t_ _e_x_t_e_r_n_a_l_ _r_e_f_ _ _ _ _ _ _ _0_ _(_e_n_d_ _e_x_t_e_r_n_a_l_ _l_i_s_t_)_ _ _ M_m_m_ ENTRY -> First instruction of initialization code P_p_p_ POINT _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ (module code) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \f The module files are named: bos loaded by FP or s. Contains Central Logic, pager and loader. bterm2 bterm1 bjobstart bjob Loaded by the loader, bmount in the order mentioned. bread bprinter bprocs bbanker \f F_ 5_._ _ _ _ _ _ _ _ _P_A_G_E_R_,_ _V_I_R_T_U_A_L_ _C_O_R_E_ 5. The virtual core is defined as follows: M_ first of BOSS core. last of BOSS core. Central _p_a_g_e_r_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _T_a_b_l_e_s_ _ First free addr. _P_A_G_E_ _C_O_R_E_ _ _ _ _ _ _ _ _ _ _V_I_R_T_U_A_L_ _C_O_R_E_ _ _ _ _ _ _ _ _ _D_R_U_M_C_O_R_E_ _ _ _ _ _ _ _ _D_I_S_C_C_O_R_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _A_D_D_R_E_S_S_ _S_P_A_C_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ P_ The addressing is based on core addresses. The process descrip- tion of BOSS gives the addresses for first and last of BOSS core. The virtual core is addressed as a continuous extension of the BOSS core. The address space has the limits: - first addr = 0 (= register W0). - last addr = last addr of disccore. The address space is split into segments, so an address may be decoded, thus: _ _ _ _A_D_D_R_E_S_S_ _ _ _ _ _ _ _ _ _ _1_5_ _b_i_t_s_ _ _ _9_ _b_i_t_s_ _ Segm number Relative in segm (0-32767) (0-511) 5_._1_ _ _ _ _ _ _ _A_ _V_i_r_t_u_a_l_ _A_d_d_r_e_s_s_ 5.1 An address pointing in the virtual core, i.e. a "core" address > last of BOSS core. But the term may also be used for an address which may be both in BOSS core and virtual core, e.g. the page addresses in the coroutine description. \f 5_._2_ _ _ _ _ _ _ _A_ _P_a_g_e_ 5.2 Initially a page is a number of consecutive hws, residing some- where in the virtual core and moved to and from page core by the pager. The hws of a page will always remain together, regardless of where it is placed in page core. A page is created during initialization by call of "reserve vir- tual" (and output to virtual core by "move to virtual"). The length of a page is not maintained after reservation, but is implicit known to the code. The page is identified by the virtual address of first word. This is often stored in an external, to pass the address to other mod- ules. In this way is created - codepages - variable pages - some of the internal operations (e.g. convert operations) - work pages After the creation of a page, it might be used and addressed freely. For example, a variable page is created during initialization. Somewhere on this page, an operation may be set up. It is signal- led to a semaphore by the open chained procedure (the abs address of the operation is set at call, and this is converted to a vir- tual address by C.L.). When another coroutine receives this operation, the address is placed as page2 of the coroutine (so now only the operation is handled as a page). The receiving coroutine may have no knowledge or interest in the start address of the original page. \f 5_._3_ _ _ _ _ _ _ _A_ _S_e_c_t_i_o_n_ 5.3 A section is a number of consecutive segments in virtual core. Sections are what the pager is actually paging (and sometimes the term page is also used for a section). A section contains an integral number of segments in virtual core. The segments of a section remain consecutive when moved to page core. A section contains one or several pages as defined to "reserve virtual"). A "big" page (size >= 512 hws), will occupy one sec- tion alone, but otherwise it will probably be placed on a section together with other "small" pages. Example: VIRTUAL CORE _ _ _ _ _ _s_e_g_m_ _ _ _ _ _ _s_e_g_m_ _ _ _ _ _ _s_e_g_m_ _ _ _ _ _ _s_e_g_m_ _ _ _ _ _ _ _s_e_g_m_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ big page un- 2 small big page big page used pages (1 segm) (1 segm) _ _ _ _s_e_c_t_i_o_n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _s_e_c_t_i_o_n_ _ _ _ _ _s_e_c_t_i_o_n_ _ _ _ _s_e_c_t_i_o_n_ _ _ _ 5_._4_ _ _ _ _ _ _ _U_s_e_ _o_f_ _B_O_S_S_ _C_o_r_e_ 5.4 The core store of BOSS is divided into the following parts: 1) A part containing the code for the central logic and the pager coroutine. This part is of fixed size and resident in core. 2) A part containing buffers, coroutine descriptions, semaphores and tables of various kinds. This part is resident in core but the size of it varies with the installation. \f 3) A part containing the processes created by BOSS and the cur- rently and most recently used pages from the virtual core of BOSS. The size of this part is determined by the size of the process in which BOSS is operating. The contents of this part of the core will change dynamically. This gives the following layout of the core store of BOSS (cf. section 4.1): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1) Central Logic and Pager Coroutine _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 3) Job Processes and Pages from the _ _ _V_i_r_t_u_a_l_ _S_t_o_r_e_ _ _ _ _ _ _ _ _ _ _ 2) Coroutine Descriptions Semaphores Buffers _ _ _T_a_b_l_e_s_ _e_t_c_._ _ _ _ _ _ _ _ _ _ _ _ _ The jobs running under BOSS are divided into two groups: a-jobs and b-jobs. The jobs may have different size and the core place is determined by the fact that a-jobs always start at the lower end and b-jobs always end at the higher end of the exchangeable part of BOSS (3). This exchangeable part may at different times have the following contents: - no jobs in it - one a-job only - one b-job only - one a-job and one b-job. In any case the remaining core place will be used for pages from the virtual core of BOSS. \f This leads to four different layouts: no jobs in core two jobs in core _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a-job _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages _ _ _ _p_a_g_e_s_ _ _ _ _ _ _ _ _ _ b-job _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ one a-job only one b-job only _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a-job _ _ _ _p_a_g_e_s_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages b-job _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 5_._5_ _ _ _ _ _ _ _W_o_r_k_i_n_g_ _C_y_c_l_e_ _o_f_ _t_h_e_ _P_a_g_e_r_ 5.5 The pager receives operations in the pager queue. An operation to the pager consists of a coroutine description for a coroutine which wants to be put in the active queue but needs one or more pages from the virtual core. Coroutines are put into the pager queue by the central logic which checks the presence of all specified pages of a coroutine each time it requests to operate on them (e.g. before exit to a coroutine, at lock, lock chained and open chained operations). The pager builds up a page information list and two chains of pages, i.e. pages _in _core and pages _not _in _core. \f 5_._6_ _ _ _ _ _ _ _R_e_l_a_t_i_o_n_s_ _t_o_ _C_o_r_e_ _T_a_b_l_e_ _a_n_d_ _S_e_g_m_e_n_t_ _T_a_b_l_e_ 5.6 The relations can be illustrated by this example: _B_O_S_S_ _C_O_R_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _D_R_U_M_ _C_O_R_E_ _ _ _ _ _ _ _ _ _ _ _D_I_S_C_ _C_O_R_E_ _ _ _ _ _ _ _ _ _ _P_A_G_E_ _C_O_R_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _V_I_R_T_U_A_L_ _C_O_R_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ one segment one section in core (2 segments) _ _C_O_R_E_ _T_A_B_L_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _S_E_G_M_E_N_T_ _T_A_B_L_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The 2 core table entries describe the section and hold reference to the segment table (i.e. where the section came from). See descriptions of coretable and segment table in subsections 2.1.1 and 2.1.2. \f F_ 6_._ _ _ _ _ _ _ _ _T_E_S_T_O_U_T_P_U_T_ _F_O_R_M_A_T_S_ 6. The following pages give a quick survey of record types, format and contents. In most modules, the term "kind" is used for what is called "re- cord type" here. m_m_ S_U_R_V_E_Y_ _O_F_ _T_E_S_T_O_U_T_P_U_T_ _R_E_C_O_R_D_ _T_Y_P_E_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ TEST T_Y_P_E_ _ _ _ _B_I_T_ _ _ _ _S_O_U_R_C_E_:_ _C_O_N_T_E_N_T_S_,_ _D_E_S_C_R_I_P_T_I_O_N_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1 SEND 1 CL: MESS, at send and wait etc. 2 LOCK 1 CL: SEM, at lock (simple or chained). 3 OPCH 1 CL: SEM+OP, at open chained. 4 OPEN 1 CL: SEM, at open simple. 5 EXIT 1 CL: PAGE-ADDR+REL.EXIT, at exit to code page. After: all except open. 6 MESS 1 CL: MESSAGE, after: message ready for coroutine. 7 ANSW 1 CL: ANSWER, after: answer arrived to coroutine. 8 JD-1 2 CL: W0, W1, W2, W3, at jd-1 call. 9 STOP (-) CL: W0-W3, IC, BF etc, at BOSSFAULT + CLOSE. 10 OPER 1 CL: SEM+OP, after: lock chained (just before exit). 11 4 BANKER: PSJOB+FREE RESS, REC1: psjob a+b, REC2-REC5: free ress. 12 JOBSTART: jobfile page, jobdescr page PSJOB FINIS: timer values. 13 LOAD (-) START UP: REC1:install.name, REC2: startup params, REC3-REC20: from loader. 14 EXTN (-) START UP: External table, after second loaderpass. 15 LINE 2 COMMAND/JOBSTART: line, from terminal or jobfile. 16 2 BS ADJUST: BS CLAIMS. 17 JOB TERM/LOGOUT: CAT.ENTRY, when it is removed. 18 MOUNTER: STATION TABLE, at each activation of mounter. 19 MOUNTER: TAPE TABLE, at each activation of mounter. 20 PREP./TERM. ACCESS: ENTRY, ACCESS COUNT, output at call. 21 : AREA PROCESS. 22 DUMP CL: CODE DUMP. Primary storage of code leading to interrupt. At BOSSFAULT+CLOSE. 23 REQU REQ.DISPL: REQUEST OPERATION, output when received. 24 START UP: LOAD RESULT. End of loader, end of fixed part of testoutput. 25 PSJ1 BANKER: PSJOB descr. part 1. 26 PSJ2 BANKER: PSJOB descr. part 2. 27 PSJ3 BANKER: PSJOB descr. part 3. 28 PSJ4 BANKER: PSJOB descr. part 4. p_p_\f m_m_ S_U_R_V_E_Y_ _O_F_ _T_E_S_T_O_U_T_P_U_T_ _R_E_C_O_R_D_ _T_Y_P_E_S_ _(_c_o_n_t_i_n_u_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ TEST T_Y_P_E_ _ _ _ _B_I_T_ _ _ _ _S_O_U_R_C_E_:_ _C_O_N_T_E_N_T_S_,_ _D_E_S_C_R_I_P_T_I_O_N_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 29 LOOKUP HOST: call params. 30 LOOKUP HOST: return params. 31 LOOKUP DEVICE, LINK-UP REMOTE: call params. 32 LOOKUP DEVICE, LINK-UP REMOTE: message to host. 33 LOOKUP DEVICE, LINK-UP REMOTE: data to host. 34 ALL HOST PROCEDURES: answer from host. 35 ALL HOST PROCEDURES: data from host. 36 LOOKUP DEVICE, LINK-UP REMOTE: return params. p_p_\f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ T_y_p_e_s_:_ _1_-_2_-_3_-_4_-_5_-_6_-_7_-_8_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _9_-_1_0_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _1_1_-_1_2_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _1_3_-_1_4_-_1_5_-_1_6_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _1_7_-_1_8_-_1_9_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _2_0_-_2_1_-_2_2_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _2_3_-_2_4_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _2_5_-_2_6_-_2_7_-_2_8_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _2_9_-_3_0_-_3_1_-_3_2_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _3_3_-_3_4_ \f F_ F_o_r_m_a_t_ _o_f_ _t_e_s_t_o_u_t_p_u_t_ _r_e_c_o_r_d_s_ _(_c_o_n_t_i_n_u_e_d_)_ T_y_p_e_s_:_ _3_5_-_3_6_ \f 6_._1_ _ _ _ _ _ _ _C_o_d_e_p_a_g_e_ _I_d_e_n_t_i_f_i_c_a_t_i_o_n_s_ 6.1 Codepage identification is found in the EXIT-record: M_ c_e_n_t_r_a_l_ 9: pager t_j_o_b_s_t_a_r_t_ 11: codepage 1 (job birth, online convert) 12: codepage 2 (load commands, set claim) 13: codepage 3 (command reading) 14: codepage 4 (create job, request alarm) 15: codepage 5 (load, rb-comm) t_t_e_r_m_ _1_ t_p_r_i_n_t_e_r_ 20: command input 70: paper description 21: commandio bulk file 71: central page 22: command print 72: triangle page 23: snapshot, autoline 73: main loop t_j_o_b_ t_p_r_o_c_s_ 40: psjob I/O 80: account 41: psjob aux 81: bsadjust 42: psjob break 82: init from usercat 43: clean catalog 83: unknown sender 44: psjob finis 84: various procedures for remote devices t_m_o_u_n_t_ t_b_a_n_k_e_r_ 50: psmount 90: main banker 52: remoter 91: core allocation 54: rewinder 92: resource allocation 56: watchdog 58: comandio, name, label t_t_e_r_m_ _2_ 100: kill t_r_e_a_d_ 101: go, run, job, newjob 60: tape reader 102: rename, clear, scope 61: card reader 103: login, get, save 62: start card 104: transmit 63: pstape 105: display 64: pscard 106: kit changer 65: psload 107: term out P_ 108: request display \f 6_._2_ _ _ _ _ _ _ _C_o_r_o_u_t_i_n_e_ _I_d_e_n_t_i_f_i_c_a_t_i_o_n_s_ 6.2 The coroutine identification is found in 3rd word in most test- output records. i_d_e_n_t_ _ _ _n_a_m_e_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _(_i_n_i_t_-_c_o_d_e_ _i_n_ _._._._)_ 0 output during start-up (central) 1 timer (banker) 2 banker (banker) 3 unknown sender (procs) 7 watchdog (mount) 8 request display (term2) 9 pager (central) 10 operator display (term2) 20* kit changers (term2) 40* printers (printer) 60* rewinders (mount) 80* remoters (mount) 100* commandios (term1) (198 downer) (banker) 199 convert (banker) 200 account job (jobstart) 200* psjobs (jobstart) 300* termouts (term2) 400* card readers (reader) 450* readers (reader) \f Relation between coroutine numbers of psjobs and commandios: P_S_J_O_B_S_: C_O_M_M_A_N_D_I_O_S_: 200 account 201 20 psjobs for newjobs etc. = option 209 i45 210 <- maybe -> 100 main console 211 <- -> 101 9 terminals = option 219 <- -> 109 i4 MATCH in run/go-jobs i.e.: run from term-coroutine 108 uses psjob-coroutine 218 \f i T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 1. INTRODUCTION ........................................... 1 2. OPERATING PROCEDURES ................................... 2 2.1 LOGON ............................................. 2 2.2 IBM Console Commands .............................. 2 2.3 Local Commands .................................... 3 2.3.1 General .................................... 3 2.3.2 Start ...................................... 3 2.3.3 Stop ....................................... 4 2.3.4 Restart .................................... 4 2.3.5 Stat ....................................... 5 2.4 Termination ....................................... 5 2.4.1 LOGOFF ..................................... 5 2.4.2 SIGNOFF .................................... 6 2.5 Local Reading ..................................... 6 2.5.1 General .................................... 6 2.5.2 Reading Punched Cards ...................... 7 2.5.2.1 Selection of Punched Card Input ... 7 2.5.2.2 Messages and Restart Action ....... 7 2.5.3 Reading Paper Tapes ........................ 9 2.5.3.1 Selection of Paper Tape Input ..... 9 2.5.3.2 Messages and Restart Action ....... 9 2.5.4 Reading Diskettes .......................... 10 2.5.4.1 Selection of Diskette Input ....... 10 2.5.4.2 Messages and Restart Action ....... 12 2.5.5 Reading Magnetic Tapes ..................... 14 2.5.5.1 Selection of Magnetic Tape Input .. 14 2.5.5.2 Messages and Restart Action ....... 15 2.5.6 Reading Cassette Tapes ..................... 17 2.5.6.1 Selection of Cassette Tape Input .. 17 2.5.6.2 Messages and Restart Action ....... 19 2.5.7 Other Messages ............................. 20 2.5.8 Stat Command ............................... 21 2.5.9 Stop Command ............................... 22 2.6 Local Printing .................................... 22 2.6.1 General .................................... 22 2.6.2 Messages and Restart Action ................ 22 \f ii T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _(_c_o_n_t_i_n_u_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 2.6.3 Other Messages ............................. 24 2.6.4 Stat Command ............................... 24 2.6.5 Stop Command ............................... 25 2.7 Local Punching .................................... 25 2.7.1 General .................................... 25 2.7.2 Punching on Magnetic Tape .................. 25 2.7.2.1 Messages and Restart Action ....... 26 2.7.2.2 Other Messages .................... 28 2.7.2.3 Stat Command ...................... 28 2.7.2.4 Stop Command ...................... 29 2.7.3 Punching on Diskettes (3740 Format) ........ 29 3. ERROR MESSAGES ......................................... 30 3.1 Error Messages from the CON Module ................ 30 3.2 Error Messages from the SNAP Module ............... 30 A_P_P_E_N_D_I_X_: A. GENERATION OF THE IBM .................................. 33 \f 1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_ 1. The RC3600 SNA/SDCC TERMINAL is a remote job entry (RJE) terminal using Synchronous Data Link Control (SDLC) and the multiple logi- cal unit (MLU) protocol of Systems Network Architecture (SNA). Following functions are implemented: 1) Input a) Read card images from different devices (card, magnetic tape, diskette (3740), paper tape and cassette tape) b) Recognize operator requests and read from console c) Compress card images for transmission to central site d) Recognize control records and switch between alternative physical devices. 2) Output a) Identify the physical device required for output b) Decompress output records, queuing the images for printing, punching or typing c) Perform the required output operation d) Set status flags, indicating error condition on the output devices The terminal program can process input and output streams con- currently, e.g. perform interleaved printing, reading and punch- ing, depending on the options selected by the installation and the capabilities of the remote terminal's unit record devices. Since blocking and character compression are used to minimize line transmission time, the operating speed of the unit record devices will depend on the data being transmitted and the number of concurrent functions being performed. \f F_ 2_._ _ _ _ _ _ _ _ _O_P_E_R_A_T_I_N_G_ _P_R_O_C_E_D_U_R_E_S_ 2. 2_._1_ _ _ _ _ _ _ _L_O_G_O_N_ 2.1 When the program has been loaded, the message RC3600 SNA/SDLC TERMINAL TYPE LOGON COMMAND will appear on the console. Type in your LOGON command and send it by pressing the return key. If there is a default LOGON record in the system it is only necessary to press escape key to send the LOGON record. When the terminal is ready to send and receive data the text ** COMMUNICATION ESTABLISHED will appear on the console and the readers, printers and punches will be started, so the transmission of jobs and receiving of print and punch can start. If the LOGON command is wrong, you will get an answer from the IBM, which says what is not accepted. Then you can give a DISC command and the message TYPE LOGON COMMAND will appear on the console and you can type in the correct LOGON command. 2_._2_ _ _ _ _ _ _ _I_B_M_ _C_o_n_s_o_l_e_ _C_o_m_m_a_n_d_s_ 2.2 All commands given to CON starting with S or with space will be sent to IBM as a console command. \f 2_._3_ _ _ _ _ _ _ _L_o_c_a_l_ _C_o_m_m_a_n_d_s_ 2.3 2_._3_._1_ _ _ _ _ _G_e_n_e_r_a_l_ 2.3.1 All commands given to CON, not included in 2.2 and 2.4 are treated as local commands. The local commands are used to operate the data streams. Commands exist for starting, stopping, restarting after error and getting statistics about the data streams. The format for a local command to a data stream is <command> <data stream name> <parameters> E_x_a_m_p_l_e_: START RD1 TAPE FILE=1 2_._3_._2_ _ _ _ _ _S_t_a_r_t_ 2.3.2 The START command starts a data stream after it has been stopped by the operator. The START command can have some parameters: START <data stream name> <parameters> E_x_a_m_p_l_e_: START RD1 TAPE FILE=1 (starts reading from magnetic tape file 1). The parameters for each data stream are described in the section for each datastream (2.5, 2.6, 2.7). \f 2_._3_._3_ _ _ _ _ _S_t_o_p_ 2.3.3 The STOP command stops a data stream (normally used after serious errors only). The STOP command has no parameters: STOP <data stream name> E_x_a_m_p_l_e_: STOP PR1 (stops printing) When stopping a stream sending data to IBM, the sending is ter- minated. This has to be done before the job can be cancelled on IBM. When stopping a stream receiving data from IBM, data are lost, because the whole print/punchout must be received in order not to hang up IBM. This means before using the STOP command, commands to IBM, saving the print/punchout must be given. 2_._3_._4_ _ _ _ _ _R_e_s_t_a_r_t_ 2.3.4 The RESTART command is used to restart a data stream after errors that require operator intervention. The RESTART command can have some parameters saying what action to be taken on the error: RESTART <data stream name> <parameters> E_x_a_m_p_l_e_: RESTART RD1 SKIP (skip the erroneous data and continue reading) \f The legal parameters and the action upon them are described in the section for each data stream (2.5, 2.6, 2.7). 2_._3_._5_ _ _ _ _ _S_t_a_t_ 2.3.5 The STAT command is used to get statistics about the data streams such as active/not active, number of cards read or number of lines printed etc. The STAT command has no parameters. STAT <data stream name> E_x_a_m_p_l_e_: STAT PR1 (displays statistics about printer 1) The statistics displayed are described in the section for each data stream (2.5, 2.6, 2.7). 2_._4_ _ _ _ _ _ _ _T_e_r_m_i_n_a_t_i_o_n_ 2.4 2_._4_._1_ _ _ _ _ _L_O_G_O_F_F_ 2.4.1 The LOGOFF command is used to send a LOGOFF to the IBM. It is sent on all active LU's. The LOGOFF command has the following parameters: LOGOFF APPLID(name) TYPE(COND/UNCOND) HOLD(YES/NO) where name in APPLID is the name of the application id. The parameter TYPE is used to make a conditional LOGOFF or an unconditional LOGOFF. A conditional LOGOFF means that jobs are finished before the session is terminated. An unconditional LOGOFF will terminate the session without finishing any jobs. \f The parameter HOLD is used whether you want to deactivate or not deactivate the physical unit and the logical units. HOLD(NO) means that the physical unit and the logical units are deactivated, HOLD(YES) means that they are still active. All parameters are optional. 2_._4_._2_ _ _ _ _ _S_I_G_N_O_F_F_ 2.4.2 A SIGNOFF command will send SIGNOFF to the IBM on all active LU's. Can only be used when SIGNOFF is defined in the IBM. 2_._5_ _ _ _ _ _ _ _L_o_c_a_l_ _R_e_a_d_i_n_g_ 2.5 2_._5_._1_ _ _ _ _ _G_e_n_e_r_a_l_ 2.5.1 Local reading is performed by the reader stream: RD1, which is able to read punched cards, paper tapes, diskettes, magnetic tapes and cassette tapes. RD1 is automatically started after signon. RD1 is default reading from card reader. Selection of other devices is done by either controlcards or local commands. After having read from another device RD1 automatically switches back to card reader. A controlcard starts with /* in the first column on the card. A job is terminated when the controlcard 1 5 /* END OF FILE is read or the local command STOP RD1 is given. \f In case of errors etc. the job must be terminated before it can be cancelled on IBM. 2_._5_._2_ _ _ _ _ _R_e_a_d_i_n_g_ _P_u_n_c_h_e_d_ _C_a_r_d_s_ 2.5.2 Punched cards are 80 columns cards in EBCDIC code. 2_._5_._2_._1_ _ _ _S_e_l_e_c_t_i_o_n_ _o_f_ _P_u_n_c_h_e_d_ _C_a_r_d_ _I_n_p_u_t_ 2.5.2.1 At system upstart punched cards are automatically started as input. After end of file or end medium on any other input device, switch back to punched cards is automatically performed. After the local command STOP RD1 has been used to stop the reader stream, it can be started reading punched cards by the local command START RD1 2_._5_._2_._2_ _ _ _M_e_s_s_a_g_e_s_ _a_n_d_ _R_e_s_t_a_r_t_ _A_c_t_i_o_n_ 2.5.2.2 Following parameters to the local command RESTART RD1 can be given when reading punched cards: no parameter The read operation is repeated, erroneous data are skipped. ACCEPT The error is accepted, erroneous data are used. Note that the RESTART command shall be given only when an error\f message is followed by the text: ** OPERATOR INTERVENTION REQUIRED All other errors are automatically repeated, thus reading will continue after the error has been corrected. The messages are started with: ** RD1 STATUS: CDR List of messages: DISCONNECTED power off, disconnected. NOT READY stacker jam, stacker full, feed error. NOT AVAILABLE * illegal, driver reserved by other process. BLOCK LENGTH ERROR * card reader transfers more than 80 columns from one card. DATA LATE * data late (hardware). PARITY ERROR * a card contains too many holes in row 1 to 7. END MEDIUM hopper empty. DRIVER MISSING the driver is not loaded. The system is not loaded properly. TIMEOUT * timeout (hardware) Messages marked with * should not appear. Hardware or software malfunction. \f 2_._5_._3_ _ _ _ _ _R_e_a_d_i_n_g_ _P_a_p_e_r_ _T_a_p_e_s_ 2.5.3 Paper tapes are 5 or 8 channel paper tapes, all hole combinations are legal. 2_._5_._3_._1_ _ _ _S_e_l_e_c_t_i_o_n_ _o_f_ _P_a_p_e_r_ _T_a_p_e_ _I_n_p_u_t_ 2.5.3.1 Selection of paper tape input is done by the following control- card /* READ PAPER After the local command STOP RD1 has been used to stop the reader stream, it can be started reading paper tapes by the local com- mand START RD1 PAPER After a paper tape has been read, switch back to reading punched cards is automatically performed. 2_._5_._3_._2_ _ _ _M_e_s_s_a_g_e_s_ _a_n_d_ _R_e_s_t_a_r_t_ _A_c_t_i_o_n_ 2.5.3.2 Following parameters to the local command RESTART RD1 can be given when reading paper tapes: no parameter The read operation is repeated, erroneous data are skipped. ACCEPT The error is accepted, erroneous data are used. IGNORE Ignore the device, and continue reading punched cards. \f Note that the RESTART command shall be given only when an error message is followed by the text: ** OPERATOR INTERVENTION REQUIRED All other errors are automatically repeated, thus reading will continue after the error has been corrected. The messages are started with: ** RD1 STATUS: PTR List of messages: NOT AVAILABLE * illegal, driver reserved by other process. END MEDIUM no paper tape was mounted when selection of paper tape as input was done. Mount the paper tape. DRIVER MISSING the driver is not loaded. The system is not loaded properly. Messages marked with * should not appear. Hardware or software malfunction. 2_._5_._4_ _ _ _ _ _R_e_a_d_i_n_g_ _D_i_s_k_e_t_t_e_s_ 2.5.4 Diskettes are single sided, 128 bytes sector length with standard IBM3740 datasets. 2_._5_._4_._1_ _ _ _S_e_l_e_c_t_i_o_n_ _o_f_ _D_i_s_k_e_t_t_e_ _I_n_p_u_t_ 2.5.4.1 Selection of diskette input is done by the following controlcard /* READ 3740 <parameters> \f After the local command STOP RD1 has been used to stop the reader stream, it can be started reading diskettes by the local command. START RD1 3740 <parameters> Following parameters exist for diskettes: M_m_m_ UNIT = device unit number, <unit number> P_p_p_ U = default unit 0. VOLID = <volname> volume label on the diskette. Max. 6 characters. Need not to be spe- cified. If specified it is checked that it is the correct diskette which is mounted. DSN = <dataset name(s)> dataset name on the diskette. Max. 8 characters. It is possible to give up to 4 dataset names in a parenthesis separated by commas. The datasets will be transmitted in the sequence given in the parent- hesis. It is not allowed with spaces in dataset names or in a parenthesis. Giving the dataset name ALL will transmit all datasets on the diskette until a DDR1 is met. E_x_a_m_p_l_e_: /* READ 3740 DSN=ALL will read all datasets from diskette unit 0 with no check of volume label. /* READ 3740 DSN = (JOB1, JOB2, JOB3, JOB4) will read the 4 datasets with the names JOB1, JOB2, JOB3 and JOB4 in this sequence from diskette unit 0 with no check of volume label. \f After having read from 1-4 or all datasets from a diskette (de- pending on the controlcard or START command) the message: RD1: END OF DISKETTE will be written on the console. If there is a cardreader in the system, switch back to reading punched cards is automatically performed. 2_._5_._4_._2_ _ _ _M_e_s_s_a_g_e_s_ _a_n_d_ _R_e_s_t_a_r_t_ _A_c_t_i_o_n_ 2.5.4.2 Following parameters to the local command RESTART RD1 can be given when reading diskettes: no parameter The read operation is repeated. This means trying to read the same record again. SKIP The erroneous record is skipped, reading is continued with next record. ACCEPT The erroneous record is accepted and transmitted, reading is con- tinued with next record. IGNORE Ignore the device, and continue reading punched cards. NOTE that the RESTART command shall be given only when an error message is followed by the text: ** OPERATOR INTERVENTION REQUIRED \f All other errors are automatically repeated, thus reading will continue after the error has been corrected. All messages are coming from RD1 via the CON module. The messages from RD1 except the first are started with ** RD1 STATUS: 3740 or with ** RD1 STATUS: FDO List of messages RD1: MOUNT DISKETTE mount the diskette. This message comes for each controlcard or START command selecting diskette. Door to diskette must be opened once for each controlcard or START command selecting diskette. Status from 3740. FORMAT ERROR the format on the diskette is not 3740 format. DATASET NOT FOUND dataset with the specified name does not exist. ILLEGAL OPERATION * driver reserved by other process. BLOCK LENGTH ERROR * input buffer less than record. END OF VOLUME, MOUNT NEXT DISKETTE, ENTER RESTART RD1 end of volume. Dateset continues on another diskette. Mount next disk- ette and enter RESTART RD1. \f SEQUENCE ERROR occurs if a diskette is a multivol- ume dataset and is out of sequence. If it is desired to transfer the dataset in spite of the sequence error enter RESTART RD1 ACCEPT, otherwise mount another diskette and enter RESTART RD1. POSITION ERROR it is not possible to read the diskette. Status from FDO DRIVER MISSING The driver is not loaded. The system is not loaded properly. NOT AVAILABLE illegal, driver reserved by other process. PARITY ERROR The diskette is impossible to read. POSITION ERROR TIMEOUT Messages marked with * should not appear. Hardware or software malfunction. 2_._5_._5_ _ _ _ _ _R_e_a_d_i_n_g_ _M_a_g_n_e_t_i_c_ _T_a_p_e_s_ 2.5.5 Magnetic tapes are 9 track with maximum block length of 1080 bytes. 2_._5_._5_._1_ _ _ _S_e_l_e_c_t_i_o_n_ _o_f_ _M_a_g_n_e_t_i_c_ _T_a_p_e_ _I_n_p_u_t_ 2.5.5.1 Selection of magnetic tape input is done by the following con- trolcard /* READ TAPE <parameters> \f After the local command STOP RD1 has been used to stop the reader stream, it can be started reading magnetic tapes by the local command START RD1 TAPE <parameters> Following parameters exist for magnetic tapes: M_m_m_ UNIT = device unit number, <UNIT NUMBER> P_p_p_ U = default unit 0. M_m_m_ FILE = file number on the magnetic tape. <FILE NUMBER(S)> P_p_p_ F = it is possible to give as many file numbers as can be on the card in parenthesis, separated by commas. The files will be transmitted in the sequence given in the parent- hesis. E_x_a_m_p_l_e_: /* READ TAPE FILE=2 U=1 will read file number 2 from magnetic tape unit 1. START RD1 TAPE F=(1,3,9,4,2,7,8) will read the 7 files in the given sequence from magnetic tape unit 0. After having read the specified files from magnetic tape, switch back to reading punched cards is automatically performed. 2_._5_._5_._2_ _ _ _M_e_s_s_a_g_e_s_ _a_n_d_ _R_e_s_t_a_r_t_ _A_c_t_i_o_n_ 2.5.5.2 Following parameters to the local command RESTART RD1 can be given when reading magnetic tapes: no parameter \f The read operation is repeated. This means trying to read the same block again. SKIP The erroneous block is skipped, reading is continued with next block. ACCEPT The erroneous block is accepted and transmitted, reading is con- tinued with next block. IGNORE Ignore the device, and continue reading punched cards. Note that the RESTART command shall be given only when an error message is followed by the text: ** OPERATOR INTERVENTION REQUIRED All other errors are automatically repeated, thus reading will continue after the error has been corrected. The messages are started with: ** RD1 STATUS: MT <UNIT NUMBER> List of messages: NOT READY the magnetic tape unit is offline. NOT AVAILABLE * illegal, driver reserved by other process. BLOCK LENGTH ERROR the magnetic tape contains blocks greater than 1080 bytes. \f DATA LATE * data late (hardware). PARITY ERROR a block contains a parity error. END MEDIUM EOT (end of tape) mark is reached. POSITION ERROR positioning at non-existing block (should not appear). DRIVER MISSING the driver is not loaded. The system is not loaded properly. TIMEOUT wrong density, positioning at non- existing file or timeout (hard- ware). Messages marked with * should not appear. Hardware or software malfunction. 2_._5_._6_ _ _ _ _ _R_e_a_d_i_n_g_ _C_a_s_s_e_t_t_e_ _T_a_p_e_s_ 2.5.6 Cassette tapes are ECMA 34 vers. 1, ECMA 34 vers. 2, or M10. The 2 first types with maximum block length of 256 bytes, M10 with maximum block length 1024 bytes. 2_._5_._6_._1_ _ _ _S_e_l_e_c_t_i_o_n_ _o_f_ _C_a_s_s_e_t_t_e_ _T_a_p_e_ _I_n_p_u_t_ 2.5.6.1 Selection of cassette tape input is done by the following con- trolcard: /* READ CASSETTE <parameters> After the local command STOP RD1 has been used to stop the reader stream, it can be started reading cassette tapes by the local command START RD1 CASSETTE <parameters> \f Following parameters exist for cassette tapes: M_m_m_ UNIT= device unit number, <UNIT NUMBER> P_p_p_ U = default unit Ø. M_m_m_ FILE= file number on the casette tape. It <FILE NUMBER(S)> P_p_p_ F = is possible to give as many file numbers as can be on the card in parenthesis separated by commas. The files will be transmitted in the sequence given in the parent- hesis. FILL=<fillchar> decimal value of fillchar, default = 64 (EBCDIC SPACES). Records less than 80 bytes are filled with characters of this value. cassette tape format, default = E2 E1 E1 = ECMA 34 VERS.1 M_m_m_ E2 E2 = ECMA 34 VERS.2 FORMAT = P_p_p_ M10 M10 = M10 CASSETTES FREE FREE = no check is performed E_x_a_m_p_l_e_: START RD1 CASSETTE F=1 will read file 1 from cassette tape unit 0 with format E2, fill- ing records less than 80 bytes with 64 (EBCDIC SPACE) /* READ CASSETTE U=1 F=(1,2,3) FORMAT=E1 will read file 1, 2 and 3 from cassette tape unit 1 with format E1, filling records less than 80 bytes with 64 (EBCDIC SPACE) /* READ CASSETTE FORMAT=M10 FILL=0 F=1 will read file 1 from cassette tape unit 0 with format M10, filling records less than 80 bytes with 0 (zero). \f After having read the specified files from cassette tape, switch back to reading punched cards is automatically performed. 2_._5_._6_._2_ _ _ _M_e_s_s_a_g_e_s_ _a_n_d_ _R_e_s_t_a_r_t_ _A_c_t_i_o_n_ 2.5.6.2 Following parameters to the local command RESTART RD1 can be given when reading cassette tapes: no parameter The read operation is repeated, this means trying to read the same block again. SKIP The erroneous block is skipped, reading is continued with next block. ACCEPT The erroneous block is accepted and transmitted, reading is con- tinued with next block. IGNORE Ignore the device, and continue reading punched cards. Note that the RESTART command shall be given only when an error message is followed by the text: ** OPERATOR INTERVENTION REQUIRED All other errors are automatically repeated, thus reading will continue after the error has been corrected. The messages are started with: ** RD1 STATUS: CT <UNIT NUMBER> \f List of messages: NOT READY the cassette tape unit is offline. NOT AVAILABLE * illegal, driver reserved by other process. BLOCK LENGTH ERROR the cassette tape contains blocks greater than 256 bytes. DATA LATE * data late (hardware). PARITY ERROR a block contains a parity error. END MEDIUM EOT (end of tape) mark is reached. POSITION ERROR positioning at non-existing block (should not appear). DRIVER MISSING the driver is not loaded. The sys- tem is not loaded properly. TIMEOUT rewinding or timeout (hardware). Messages marked with * should not appear. Hardware or software malfunction. 2_._5_._7_ _ _ _ _ _O_t_h_e_r_ _M_e_s_s_a_g_e_s_ 2.5.7 One more message exists from the reader stream: ** RD1 SYNTAX ERROR IN COMMAND <erroneous command> ** OPERATOR INTERVENTION REQUIRED This means that syntax error has been detected in a controlcard or a START command. \f The error can be corrected with the command: RESTART RD1 <correct command> or the controlcard can be skipped with the command: RESTART RD1 IGNORE E_x_a_m_p_l_e_: ** RD1 SYNTAX ERROR IN COMMAND CASSETTE FILE = ABC ** OPERATOR INTERVENTION REQUIRED the file number is illegal, to correct the error: RESTART RD1 CASETTE FILE = 1 to skip this command and continue reading punched cards: RESTART RD1 IGNORE 2_._5_._8_ _ _ _ _ _S_t_a_t_ _C_o_m_m_a_n_d_ 2.5.8 When giving the STAT RD1 command one of the following texts will be displayed: ** RD1 IS STOPPED the reader stream has been stopped by the local command STOP RD1. ** RD1 STATUS <device name> OK ** NUMBER OF RECORDS = nnnnn the reader stream is active reading from the device given in devicename, nnnnn = number of punched cards read in this job. \f ** RD1 STATUS <device name> <device message> the reader stream is active reading from the device given in device name, the device is in state given in device message (see the paragraph list of messages in the section for each device). 2_._5_._9_ _ _ _ _ _S_t_o_p_ _C_o_m_m_a_n_d_ 2.5.9 When giving the STOP RD1 command the active job (if any) is ter- minated as if the /* END OF FILE has been read, so the execution of the job can start in the IBM. If this is not wanted because the RD1 has been stopped due to an error, remember to cancel the job with a console command to the IBM. 2_._6_ _ _ _ _ _ _ _L_o_c_a_l_ _P_r_i_n_t_i_n_g_ 2.6 2_._6_._1_ _ _ _ _ _G_e_n_e_r_a_l_ 2.6.1 Local printing is performed by the printer stream: PR1, which is able to print on line printer. PR1 is automatically started after signon. After having printed one job the printer stream is auto- matically started again so it is ready for the next job. After the local command STOP PR1 has been used to stop the printer stream, it can be started printing (waiting for next job) by the local command: START PR1 2_._6_._2_ _ _ _ _ _M_e_s_s_a_g_e_s_ _a_n_d_ _R_e_s_t_a_r_t_ _A_c_t_i_o_n_ 2.6.2 Following parameters to the local command RESTART PR1 can be given: no parameter \f The write operation is repeated, trying to print the line again, no data is lost. ACCEPT The write operation is not repeated, data (1 line) may be lost depending on the error. IGNORE The whole block received from IBM is ignored, several lines may be lost. Note that the RESTART command shall be given only when an error message is followed by the text: ** OPERATOR INTERVENTION REQUIRED All other errors are automatically repeated, thus printing will continue after the error has been corrected. The messages are started with: ** LPT STATUS: List of messages: DISCONNECTED power off, disconnected. NOT READY the printer is offline. ILLEGAL * illegal, driver reserved by other process. PAPER ERROR paper run away, paper torn. DATA LATE * data late (hardware). CCW ERROR * illegal carriage control word (ccw). \f END OF PAPER end of paper. DRIVER MISSING the driver is not loaded. The system is not loaded properly. PAPER RUN AWAY timeout, paper run away. Messages marked with * should not appear. Hardware or software malfunction. 2_._6_._3_ _ _ _ _ _O_t_h_e_r_ _M_e_s_s_a_g_e_s_ 2.6.3 One other message exists from the printer stream: ** LPT STATUS: DATA LOST If the printer stream was active when the local command STOP PR1 was given, the active job must be received in order not to hang up JES2 (see 2.6.5). 2_._6_._4_ _ _ _ _ _S_t_a_t_ _C_o_m_m_a_n_d_ 2.6.4 When giving the STAT PR1 command one of the following texts will be displayed: ** PR1 IS STOPPED The printer stream has been stopped by the local command STOP PR1 ** LPT STATUS: NOT ACTIVE The printer stream is waiting for the next printfile from IBM ** LPT STATUS: OK ** NUMBER OF LINES PRINTED = nnnnn \f The printer stream is active printing, nnnnn = number of lines printed in current printfile. ** LPT STATUS: <device message> The printer stream is active printing, but the printer is in the state given in device message (see 2.6.2). 2_._6_._5_ _ _ _ _ _S_t_o_p_ _C_o_m_m_a_n_d_ 2.6.5 When giving the STOP PR1 command the active job (if any) must be received in order not to hang up JES2, in this case the data are lost. Therefore before giving the STOP PR1 command, console com- mands saving the printout should be given to IBM (purge and re- start printer: SPPR1 and SEPR1). 2_._7_ _ _ _ _ _ _ _L_o_c_a_l_ _P_u_n_c_h_i_n_g_ 2.7 2_._7_._1_ _ _ _ _ _G_e_n_e_r_a_l_ 2.7.1 Local punching is performed by the punch stream: PU1, which is able to write punchout on either magnetic tape unit 0 or 3740 formatted diskettes. Each block is 80 bytes and contains one punch record. If a punch record is less than 80 bytes it is fill- ed with zeroes. PU1 is automatically started after signon. 2_._7_._2_ _ _ _ _ _P_u_n_c_h_i_n_g_ _o_n_ _M_a_g_n_e_t_i_c_ _T_a_p_e_ PU1 is initiated to write in file 1. After having punched one job the punch stream is automatically started again so it is ready for the next job (still in file 1, but the tape is rewound and set offline after each job). After the local command STOP PU1 has been used to stop the punch stream, it can be started punching (waiting for next job) by the local command START PU1 <parameters> \f Following parameters exist for PU1 M_m_m_ FILE = file number on magnetic tape in <file number> P_p_p_ F = which the punchout should be written. Default file 1. E_x_a_m_p_l_e_: START PU1 FILE=3 will write the next punchout in file 3 on magnetic tape. 2_._7_._2_._1_ _ _ _M_e_s_s_a_g_e_s_ _a_n_d_ _R_e_s_t_a_r_t_ _A_c_t_i_o_n_ 2.7.2.1 Following parameters to the local command RESTART PU1 can be given: no parameter The write operation is repeated, no data are lost. ACCEPT The write operation is not repeated, 1 record is lost or is er- roneous written on the magnetic tape. IGNORE The whole block received from IBM is ignored, several records may be lost. Note that the RESTART command shall be given only when an error message is followed by the text: ** OPERATOR INTERVENTION REQUIRED All other errors are automatically repeated, thus punching will continue after the error has been corrected. \f The messages are started with: ** MT STATUS: List of messages: OFFLINE the magnetic tape unit is offline. WRITE LOCK no write ring is mounted on the tape. ILLEGAL * illegal, driver reserved by other process. BLOCK LENGTH ERROR * trying to write block greater than 80 bytes (software). DATA LATE * data late (hardware). PARITY ERROR writing a block results in perma- nent parity error. END OF TAPE EOT (end of tape) mark is reached. POSITION ERROR positioning at non-existing block (should not appear). DRIVER MISSING the driver is not loaded. The sys- tem is not loaded properly. TIMEOUT wrong density, positioning at non- existing file or timeout (hard- ware). Messages marked with * should not appear. Hardware or software malfunction. \f 2_._7_._2_._2_ _ _ _O_t_h_e_r_ _M_e_s_s_a_g_e_s_ 2.7.2.2 Two other messages exist from the punch stream: ** MT STATUS: DATA LOST If the punch stream was active when the local command STOP PU1 was given, the active job must be received in order not to hang up JES2 (see 2.7.2.4). ** PU1 SYNTAX ERROR IN COMMAND This means that a syntax error has been detected in a START COM- MAND. The error can be corrected with the commands: STOP PU1 START PU1 <correct command> E_x_a_m_p_l_e_: START PU1 FILE=ABC ** PU1 SYNTAX ERROR IN COMMAND the file number is illegal, to correct the error: STOP PU1 START PU1 FILE=2 2_._7_._2_._3_ _ _ _S_t_a_t_ _C_o_m_m_a_n_d_ 2.7.2.3 When giving the STAT PU1 command one of the following texts will be displayed: ** PU1 IS STOPPED The punch stream has been stopped by the local command STOP PU1. ** MT STATUS: NOT ACTIVE The punch stream is waiting for the next punchfile from IBM. \f ** MT STATUS: OK ** NUMBER OF RECORDS = nnnnn The punch stream is active punching, nnnnn number of records have been written to magnetic tape in the current punchfile. ** MT STATUS: <device message> The punch stream is active punching, but the magnetic tape unit is in the state given in device message (see 2.7.2.1). 2_._7_._2_._4_ _ _ _S_t_o_p_ _C_o_m_m_a_n_d_ 2.7.2.4 When giving the STOP PU1 command the active job (if any) must be received in order not to hang up JES2, in this case the data are lost. Therefore before giving the STOP PU1 command, console com- mands saving the punchout should be given to IBM (purge and re- start punch: SPPU1 and SEPU1). 2_._7_._3_ _ _ _ _ _P_u_n_c_h_i_n_g_ _o_n_ _D_i_s_k_e_t_t_e_s_ _(_3_7_4_0_ _F_o_r_m_a_t_)_ 2.7.3 Will appear later. \f F_ 3_._ _ _ _ _ _ _ _ _E_R_R_O_R_ _M_E_S_S_A_G_E_S_ 3. 3_._1_ _ _ _ _ _ _ _E_r_r_o_r_ _M_e_s_s_a_g_e_s_ _f_r_o_m_ _t_h_e_ _C_O_N_ _M_o_d_u_l_e_ 3.1 ** INVALID COMMAND An invalid command has been given. The command is skipped. ** NOT ALLOWED A command that is not allowed at this moment has been given. It could be starting an already started data stream or stop- ping an already stopped data stream. The command is skipped. ** WAIT A command has been given to a data stream that is not able to handle the command right now. The command is skipped. 3_._2_ _ _ _ _ _ _ _E_r_r_o_r_ _M_e_s_s_a_g_e_s_ _f_r_o_m_ _t_h_e_ _S_N_A_P_ _M_o_d_u_l_e_ 3.2 A message will come from the SNAP module when the SNAP module re- ceives a status message from the SDLC driver, when the SNAP mod- ule receives a negative response from the IBM or when the SNAP module will give an error message. The last message should not appear. The status messages from the SDLC driver has the following for- mat: > SNAP SDLC I: 8'xxxxxx or > SNAP SDLC 0: 8'xxxxxx where the first message is from input messages and the other is from output messages. xxxxxx is the status word. \f Following status bits may appear: 1B0: The channel is logical disconnected. 1B0 + 1B9: An SNRM frame (Set Normal Response Mode) is received from the IBM while the channel was connected. 1B0 + 1B11: A DISC or DM frame has been received. 1B0 + 1B12: An FRMR has been transmitted. When the SNAP module receives a negative response from the IBM the following message will be displayed on the console: > SNAP NEG. RESP. REC. ERRORCODE X'nnnnnnnn where nnnnnnnn is the sense code received in the negative re- sponse. The last error message should not appear under normal conditions. The format is: > SNAP ERROR: nn where nn is a number. L_i_s_t_ _o_f_ _e_r_r_o_r_ _n_u_m_b_e_r_s_ 01 A negative response is transmitted to the IBM. 02 An SCB indicating compaction is received. 03 Internal error message. Contact RC. 04 Internal error message. Contact RC. 05 Wrong sequence number in data from IBM. 06 Internal error message. Contact RC. 07 A Set Virtual Format is received. 08 A Set Line Density is received. 09 An ACTLU with an LU number greater than the number of LU's generated in the terminal is received. 10 A Crypto Verification is received. 11 An illegal Session Control Command is received. \f F_ \f F_ A_._ _ _ _ _ _ _ _ _G_E_N_E_R_A_T_I_O_N_ _O_F_ _T_H_E_ _I_B_M_ A. The RC3650 SNA/SDLC Terminal is generated to a certain number of Logical Units (LU's). The IBM must be generated with the same number of active LU's. It is not possible to activate further LU's without making a new generation of the RC3600 software. The number of readers, printers or punches generated at the IBM must not exceed the number generated in the RC3600 SNA/SDLC Ter- minal. Following parameters must be generated in JES2: RMTnnn BUFSIZE = 256, COMP, CONSOLE, NOCMPCT, DISCINTV = 0, SETUPMSG, SETUPINF, WAITTIME = 1 Rnnn.PRm OPERATOR, CCTL, NOCMPCT, COMP, COMPACT = 0, NOFCBLOAD, LRECL = yyy, PRWIDTH = yyy, SELECT = PRINTn (yyy in LRECL and PRWIDTH maximum 132) Rnnn.PUn OPERATOR, CCTL, NOCMPCT, COMP, COMPACT = 0, LRECL = zzz, SELECT = PUNCHn (zzz in LRECL maximum 80) \f F_ \f SW1720 PASCAL/MT+ * til RC700 . OVERMÆNGDE AF ISO STANDARD PASCAL . DIREKTE OVERSÆTTELSE TIL EFFEKTIV MASKINKODE . EN RÆKKE HJÆLPEPROGRAMMER INKLUDERET . SEGMENTERING OG SAMMENKÆDNING AF PROGRAMMER . BÅDE HØJNIVEAU OG BASAL I/O-BEHANDLING DIREKTE FRA PASCAL . RUTINER TIL MANIPULATION AF DATA . KØRER UNDER OPERATIVSYSTEMET CP/M* GENERELT Pascal/MT+ programmelpakken består af en integreret serie af pro- grammer, der muliggør udvikling af kvalitetsprogrammel i Pascal på RC700 mikrodatamaten. Programmellet kører under CP/M og pro- grammer skrevet i Pascal/MT+ åbner mulighed for et bredere sigte mod andre CP/M-baserede systemer, både 8-bit og 16-bit. Pascal/MT+ er et yderst velstruktureret sprog med avancerede muligheder inden for fejlretning; det er designet til fuldt ud at * Varemærker fra Digital Research. \f udnytte modulær kompilation bl.a. med henblik på reducering af oversætterressourcer under programudvikling. Foruden at implementere alle faciliteter i henhold til ISO Stan- dard Nr. 7185, byder Pascal/MT+ på mange yderligere faciliteter. Udvidelserne inkluderer for eksempel dynamiske strenge og en ræk- ke nyttige, indbyggede funktioner og procedurer. Ved udvikling af store programmelsystemer kan segmentering/sam- menkædning af programmer med fordel benyttes. Segmentering af programmer bevirker, at hele programmet ikke ligger i arbejdsla- geret på samme tid, men at for eksempel en række sjældent benyt- tede procedurer kun hentes ind fra baggrundslageret, når de be- nyttes. Sammenkædning af programmer betyder, at man kan kalde nye programmer fra et kørende program, desuden er det muligt at over- føre globale data til det kaldte program. Især til administrativ brug tilbydes BCD (Binary Coded Decimal) aritmetik, hvor tal består af 18 cifre, heraf de 4 som decimaler. Håndteringen af input/output er kendetegnet ved, at den giver mu- lighed for indlæsning og udskrivning på både record- og byte-ni- veau. Desuden er der mulighed for at få tilgang til de enkelte I/O-porte direkte fra Pascal/MT+. Pascal/MT+ inkluderer også rutiner til flytning og manipulation på bit- og byte-niveau, ligesom den indeholder rutiner til at flytte data rundt i arbejdslageret, samt til at få fat i indhold- et af bestemte lagerpositioner. \f Pascal/MT+ SPROGELEMENTER S_æ_t_n_i_n_g_s_s_t_r_u_k_t_u_r_e_r_ S_t_a_n_d_a_r_d_ _p_r_o_c_e_d_u_r_e_r_ BEGIN...END CLRBIT CASE...END DELETE FOR...TO DISPOSE FUNCTION EXIT GOTO FILLCHAR IF...THEN...ELSE INSERT MODULE MOVELEFT PROCEDURE MOVERIGHT PROGRAM NEW REPEAT...UNTIL SETBIT WHILE...DO TSTBIT WAIT S_t_a_n_d_a_r_d_ _f_u_n_k_t_i_o_n_e_r_ I_/_O_ _p_r_o_c_e_d_u_r_e_r_ _o_g_ _f_u_n_k_t_i_o_n_e_r_ ABS ASSIGN ADDR BLOCKREAD ARCTAN BLOCKWRITE CHR CHAIN COS CLOSE EOF CLOSEDEL EOLN GET EXP GNB LENGTH IORESULT LN OPEN MAXAVAIL PAGE MEMAVAIL PUT ODD PURGE ORD READ POS READLN PRED RESET ROUND REWRITE SIN SEEKREAD SIZEOF SEEKWRITE SQR WNB SQRT WRITE SUCC WRITELN TRUNC WRD \f D_a_t_a_k_o_n_v_e_r_t_e_r_i_n_g_s_p_r_o_c_e_d_u_r_e_r_ D_y_n_a_m_i_s_k_e_c_ _a_l_l_o_k_e_r_i_n_g_s_ _p_r_o_c_e_d_u_r_e_r_ PACK(A,I,Z) DIPOSE UNPACK(Z,A,I) NEW FORUDSÆTNINGER Pascal/MT+ programmelpakken forudsætter en RC700 mikrodatamat med CP/M og enten en 8" eller to 5 1/4" diskettestationer. RCSL Nr. 42-i2145 \f «eof»