system/ruc-terminal/unknown/src/SCCPARAM.ELA

Raw file
Back to index

(* Uebertragungsparameter fuer Kanal 2 und 3 (SCC) setzen *) 
(* Vers. 1.2 : 'setup'-Prozedur / 03.02.86, M.Staubermann *) 
 
PACKET scc DEFINES baudrate, 
                   setup ,
 
                   channel a, 
                   channel b, 
                   no parity, 
                   even parity, 
                   odd parity, 
 
                   read port, 
                   write port, 
                   register, 
                   quartz :
 
BOOL CONSTchannel a   :: TRUE , 
          channel b   :: FALSE ; 
INT CONST no parity   :: 0, 
          even parity :: 3, 
          odd parity  :: 1; 
 
REAL VAR clk frequency := 12288000.0 ; (* Oszillatorfrequenz *) 
LET offset        = 0 ; 
 
PROC quartz (REAL CONST wert) : 
 clk frequency := wert 
ENDPROC quartz ; 
 
REAL PROC quartz : 
 clk frequency 
ENDPROC quartz ; 
 
PROC setup (BOOL CONST channel, INT CONST parity, 
            REAL CONST stopbits, INT CONST bits, 
            BOOL CONST dtr, rts, auto dtr, auto cts) :
 
(* Parameter müssen zusammen gesetzt werden, da die Register keine 
   Read-Register sind. Alte Werte müssen ausserhalb des SCC's gespeichert 
   werden. *) 
 
 INT VAR value := 64 ; 
 value INCR parity value ; 
 value INCR stopbit value ; 
 
 register (channel, 3, 0) ; 
 register (channel, 5, 32 * bits value) ;
 register (channel,14, 2) ; 
 
 register (channel, 4, value) ; 
 register (channel, 5, 8 + dtr value + rts value + 32 * bits value) ;
 register (channel,14, 3 + auto dtr value) ;
 register (channel, 3, 1 + 64 * bits value + auto cts value) .
 
bits value : 
 IF bits <= 5 THEN 0 
 ELIF bits >= 8 THEN 3 
 ELIF bits = 6 THEN 2 
 ELSE 1
 FI .
 
parity value : 
 IF parity >= 0 AND parity <= 3 THEN parity ELSE 0 FI . 
 
stopbit value : 
 IF stopbits = 1.0 THEN 4 
 ELIF stopbits = 1.5 THEN 8 
 ELIF stopbits = 2.0 THEN 12 
 ELSE 4 
 FI . 
 
dtr value : 
 IF dtr THEN 128 ELSE 0 FI . 
 
rts value : 
 IF rts THEN 2 ELSE 0 FI . 
 
auto cts value :
 IF auto cts THEN 32 ELSE 0 FI . 
 
auto dtr value : 
 IF auto dtr THEN 4 ELSE 0 FI . 
 
ENDPROC setup ;
 
PROC baudrate (BOOL CONST channel, REAL CONST rate) :
 INT CONST time constant :: int (clk frequency / (64.0 * rate) + 0.5) - 2 ;
 register (channel, 13, time constant DIV 256) ; 
 register (channel, 12, time constant AND 255)
ENDPROC baudrate ; 
 
REAL PROC baudrate (BOOL CONST channel) : 
 INT CONST time constant :: 
     register (channel, 12) + 256 * register (channel, 13) ;
 round (clk frequency / (real (time constant + 2) * 64.0), 1)
ENDPROC baudrate ; 
 
 
(*********************************************************************) 
(********* S C C    -     Z u g r i f f s p r o z e d u r e n ********)
(*********************************************************************) 
 
 
INT PROC read port (INT CONST port) : 
 INT VAR value ; 
 control (-1, offset + port, -1, value) ; 
 IF value = -1 THEN errorstop ("SCC - Read failed") ; 0 
 ELSE value 
FI . 
 
ENDPROC read port ;
 
PROC write port (INT CONST port, value) : 
 INT VAR rcode, my channel := channel ; 
 continue (32) ; 
 control (-1, offset + port, value, r code) ; 
 continue (my channel) ; 
 IF r code = -1 THEN errorstop ("SCC - Write failed") FI 
ENDPROC write port ; 
 
INT PROC register (BOOL CONST is channel a, INT CONST register x) : 
 INT VAR value ; 
 IF is channel a 
    THEN write port (1, registerx) ; 
         read port (1) 
    ELSE write port (0, registerx) ; 
         read port (0) 
 FI 
ENDPROC register ; 
 
 
PROC register (BOOL CONST is channel a, INT CONST register x, wert): 
 IF is channel a 
    THEN write port (1, register x) ;
         write port (1, wert) 
    ELSE write port (0, register x) ;
         write port (0, wert)
 FI 
ENDPROC register ; 
 
ENDPACKET scc ;