This is the main handler of the MMI profile container
Parameters : fb_in_offset First byte in the input container
fb_out_offset First byte in the output container
db_address Number of the database to use
con_len Length of container in bytes (min.32)
Example : The terminal is configured to be on input and output byte 64,
32 bytes allocated and database to communcate with is 51:
fb_in_offset = 64
fb_out_offset = 64
db_address = 51
con_len = 32
The function block handles one complete container in one scan. If read index,
FC111 is called.
If write index, FC112 is called.
Note that the control byte is not set until next scan, to avoid timing problems
L #fb_in_offset // Incontainer start address
T MW 496 // Remember incontainer start
T MW 500
L #fb_in_offset // Incontainer start address
SLD 3 //
LAR1
L IB [AR1,P#0.0] // Get the proper control byte from inp.container
T MB 486 // Store it
L #fb_out_offset // Outcontainer start address
T MW 498 // Store it
T MW 502
L #m_110 // Previous input control byte
T MB 479 // Store it
L 0
T MB 474 // Clear error code
A M 479.0
R M 479.0 // Clear error flag
A M 486.6 // Terminal present ?
JC WEI1 //
L 1 // Error 1 : Comm error
JU FEH //
WEI1: A M 486.5 // Does the terminal toggle the toggle bit ?
AN M 486.5
L S5T#2S // Timeout timer
SD "Terminal timeout"
AN "Terminal timeout"
JC WEI2
L 2 // Error 2 : Terminal not in RUN
JU FEH
WEI2: A M 486.7 // Test if new container
A M 479.7 // Compare old container byte with the new one
O
AN M 486.7
AN M 479.7
JC ENDE // No new container
A M 486.7 // Pulse
= M 479.7
L MW 498 // Outcontainer pointer
L 4
+I
T MW 498 // First data position : 4
L MW 496 // Incontainer pointer
L 4
+I
T MW 496 // First index position : 4
//
LOOP: NOP 0
L MW 496 // Incontainer pointer
ITD
SLD 3
T MD 504 // Make it double word
L IB [MD 504] // Get first index byte
T MB 486 // Store it
L MB 486
L 0
==I
JC DONE // Jump out if index is 0
A M 486.7 // Is it a read index ?
JC ANK1
CALL "READ INDEX OP PANEL" // Then call read index function
DataBase:=#db_address
ANK1: NOP 0
L MB 478 // Check return value from FC111
L 0
==I
JC WEI3 // Was there an error return ?
AN M 479.0
S M 479.0 // Then, set error bit
L MB 478
JU FEH // Jump to error
WEI3: AN M 486.7 // Is it a write index ?
JC WEI4
CALL "WRITE INDEX OP PANEL" // Then call write index function
DataBase:=#db_address
L MB 478 // Check return value from FC112
L 0
==I
JC WEI4 // Was there an error return ?
AN M 479.0
S M 479.0 // Then set error bit
L MB 478 //
JU FEH // Jump to error
WEI4: L MW 496 // Check if incontainer is done
L MW 500
-I
L #con_len
<I
A(
L MW 498 // .. or that outcontainer is done
L MW 502
-I
L #con_len
<I
)
JC LOOP // Continue id conatiner not completed
DONE: L #fb_in_offset // Container done !
SLD 3
LAR1
L IB [AR1,P#0.0] // Get input control byte
T MB 486 // Store it
JU ENDE
//------- ERROR HANDLING ---------
FEH: T MB 474 // Store error code
FEH1: L MW 498
ITD
SLD 3
T MD 504
L 0 // Write controlbyte to output container
T QB [MD 504]
L 1
L MW 498
+I
T MW 498
L MW 502
-I // INTERNES MERKERBYTE SICHERN
L 32
<I
JC FEH1
ENDE: NOP 0
NOP 0
AN M 486.6
S M 486.6 // Set the COM-bit
AN M 486.5
= M 486.5 // Toggle the Toggel-bit
A M 479.0
= M 486.4
//----------------------
L MB 486 // Delay answer one scan to avoid timing problems
T #out_this_cycle
L #fb_out_offset
SLD 3
LAR1
L #out_last_cycle
T QB [AR1,P#0.0]
L #out_this_cycle
T #out_last_cycle
L MB 479
T #m_110
NOP 0