150875
numer indeksu
Grzegorz Graczyk
imie i nazwisko
151021
numer indeksu
Paweł Tarasiuk
imie i nazwisko
Data 2010-03-03
Kierunek Informatyka Rok akademicki 2009/10
Semestr 4
Grupa dziekańska 2
Laboratorium telekomunikacji
Zadanie 1
Wykorzystane narzędzia
Urządzenie ADAM-4500 działa w oparciu system zgodny z 16-bitowym systemem DOS.
Naszym założeniem było napisanie programu w języku C, optymalnie - zgodnym ze standar- dem ANSI C. Niewiele dostępnych obecnie narzędzi pozwala na tworzenie właściwych dla tego systemu binariów. Przystosowane do tego narzędzia dawnych wersji Turbo C++ nie są już w sprzedaży. Projekt DJGPP udostępnia jedynie łatę na bardzo przestarzałą wersję gcc, którą trudno jest w ogóle zbudować, ze względu na trudność w zdobyciu zgodnych z nią wersji bi- bliotek i wykonania odpowiedniej cross-kompilacji. Jednakże kompilator WATCOM dostępny obecnie jako Open Watcom na warunkach open-source jest doskonale przystosowany do budo- wania 16-bitowych binariów systemu DOS za pomocą nowoczesnych systemów operacyjnych.
Ponadto, jest to kompilator nowoczesny, kompilujący kod napisany w sposób podobny jak dla nowych wersji kompilatora GNU bądź kompilatora Intela. Użyty został zatem zestaw narzędzi Open Watcom 1.8.
Kod źródłowy programu
#i n c l u d e < s t d l i b . h>
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t r i n g . h>
#i n c l u d e <t i m e . h>
#i n c l u d e <c o n i o . h>
#i n c l u d e <d o s . h>
/∗ d e f i n i c j e k o l o r o w ∗/
#d e f i n e RED 0 x08
#d e f i n e YELLOW 0 x04
#d e f i n e GREEN 0 x02
#d e f i n e NONE 0 x00
/∗ s t a n d a r d C n i e z a w i e r a t y p u l o g i c z n e g o − d l a e s t e t y k i k o d u , o k r e s l a m y g o ∗/
#d e f i n e b o o l i n t
#d e f i n e t r u e −1
#d e f i n e f a l s e 0
/∗ s t a n d a r d o w e a d r e s y b a z o w e p o r t o w COM ∗/
#d e f i n e COM1 0 x3F8
#d e f i n e COM2 0 x2F8
/∗ w s p o l n y b u f o r do t y m c z a s o w y c h o p e r a c j i na c i a g a c h z n a k o w ∗/
char b u f [ 6 4 ] ;
/∗ k o n w e r s j a z a p i s u k o l o r o w d l a u r z a d z e n i a Adam po d r u g i e j s t r o n i e s a l i ∗/
i n t c o n v e r t c o l o r ( i n t c o l o r ) {
return ( ( c o l o r & RED) >> 3 ) + ( ( c o l o r & YELLOW) >> 1 ) + ( ( c o l o r & GREEN) << 1 ) ; }
/∗ s p r a w d z s t a n p o r t u s z e r e g o w e g o ∗/
b o o l c h e c k p o r t ( i n t p o r t ) { return i n p ( p o r t + 5 ) & 1 ; }
/∗ w y s l i j c i a g z n a k o w ∗/
void o u t p s ( i n t p o r t , char ∗ c ) { while ( ∗ c ) {
o u t p ( p o r t , ∗ c ++);
} }
/∗ z a i n i c j u j k o m u n i k a c j e i u s t a l j e j p a r a m e t r y ∗/
void i n i t ( i n t p o r t ) {
o u t p ( p o r t + 2 , 0 x c 9 ) ; /∗ w l a c z e n i e FIFO ∗/
o u t p ( p o r t + 3 , 0 x80 ) ; /∗ DLAB : 1 ∗/
o u t p ( p o r t , 0 x 0 c ) ;
o u t p ( p o r t + 1 , 0 x00 ) ; /∗ s z y b k o s c : 9 6 0 0 ∗/
o u t p ( p o r t + 3 , 0 x03 ) ; /∗ 8 b i t o w d a n y c h , 1 b i t s t o p u , p a r z y s t o s c : w y l a c z o n a ∗/
o u t p ( p o r t + 1 , 0 x00 ) ; /∗ w y l a c z e n i e p r z e r w a n ∗/
}
/∗ w y s l i j p o l e c e n i e u s t a w i e n i a s t a n u d i o d ∗/
void s e n d ( i n t p o r t , i n t c o l o r ) { s p r i n t f ( b u f , ” #0100%.2X\ r ” , c o l o r ) ; o u t p s ( p o r t , b u f ) ;
}
/∗ z a k o n c z k o m u n i k a c j e ∗/
void f i n i s h ( i n t p o r t ) { s e n d ( p o r t , NONE ) ; }
/∗ o d b i e r z i n f o r m a c j e z w r o t n a i p o d a j j e j p o p r a w n o s c ∗/
PSK: Grzegorz Graczyk i Paweł Tarasiuk 2 / 3
b o o l r e c v ( i n t p o r t , i n t s e c ) { i n t i ;
c l o c k t w a i t = c l o c k ( ) + CLK TCK∗ s e c , now ; f o r ( i = 0 ; w a i t > c l o c k ( ) ; i = ( i + 1 ) % 6 4 ) {
p r i n t f ( ”%l d %l d \n ” , w a i t , c l o c k ( ) ) ; s l e e p ( 1 ) ;
i f ( c h e c k p o r t ( p o r t ) ) { b u f [ i ] = i n p ( p o r t ) ; i f ( b u f [ i ] == 1 3 )
break ; }
}
i f ( w a i t > c l o c k ( ) ) {
s l e e p ( ( w a i t − c l o c k ( ) ) / (CLK TCK ) ) ; }
b u f [ i ] = 0 ;
i f ( s t r c m p ( b u f , ”>” ) == 0 ) { return t r u e ;
}
return f a l s e ; }
/∗ o p i s ” a n i m a c j i ” m i g a n i a d i o d a m i ∗/
const i n t num [ 3 ] = { 5 , 4 , 2 } ;
const i n t v a l u e s [ 3 ] [ 5 ] = { { RED+GREEN, YELLOW + GREEN, RED+YELLOW, RED+YELLOW+GREEN, NONE} , { RED, RED+YELLOW, GREEN, YELLOW} , { NONE, YELLOW } } ;
const i n t t i m e s [ 3 ] [ 5 ] = { { 2 , 2 , 2 , 2 , 2 } , { 5 , 2 , 5 , 2 } , { 2 , 2 } } ;
#d e f i n e MAX LOOP 4
i n t main ( i n t a r g c , char ∗ a r g v [ ] ) { i n t i = 0 ;
enum {DEMO = 0 , TRAFFIC = 1 , ERROR = 2} mode = DEMO;
i n t l o o p = −4;
b o o l d o l o o p = t r u e ; i n t p o r t = COM2;
b o o l c o n v e r t = f a l s e ;
i f ( a r g c > 1 && s t r c m p ( a r g v [ 1 ] , ” 1 ” ) == 0 ) { p o r t = COM1;
}
i f ( a r g c > 2 && s t r c m p ( a r g v [ 2 ] , ” 2 ” ) == 0 ) { c o n v e r t = t r u e ;
}
i n i t ( p o r t ) ;
while ( d o l o o p ) {
/∗ m o z l i w o s c z a k o n c z e n i a p r a c y p r o g r a m u p o p r z e z w c i s n i e c i e k l a w i s z a ESC ∗/
while ( k b h i t ( ) ) { i f ( g e t c h ( ) == 2 7 ) {
d o l o o p = f a l s e ; }
}
/∗ u s t a w o d p o w i e d n i k o l o r ∗/
s e n d ( p o r t , c o n v e r t ? c o n v e r t c o l o r ( v a l u e s [ mode ] [ i ] ) : v a l u e s [ mode ] [ i ] ) ;
/∗ o d c z y t a j o d p o w i e d z ∗/
i f ( ! r e c v ( p o r t , t i m e s [ mode ] [ i ] ) ) {
p u t s ( ” \” S e r v e r \” d i d n ’ t r e s p o n s e w i t h \”>\\n \ ” . E x i t i n g . . . ” ) ; f i n i s h ( p o r t ) ;
return EXIT FAILURE ; }
i = ( i + 1 ) % num [ mode ] ;
/∗ z m i a n a t r y b u p r a c y ∗/
i f ( i == 0 ) {
i f ( mode == DEMO) { mode = TRAFFIC ; }
i f ( mode == TRAFFIC) {
/∗ z a p r o g r a m o w a l i s m y b a r d z o r e a l i s t y c z n a s y g n a l i z a c j e s w i e t l n a , t a k a j a k a j e s t na p o l s k i c h d r o g a c h ; −) ∗/
i f ( r a n d ( ) % MAX LOOP < l o o p ) { mode = ERROR;
} } l o o p ++;
} }
f i n i s h ( p o r t ) ; return EXIT SUCCESS ; }
PSK: Grzegorz Graczyk i Paweł Tarasiuk 3 / 3