;---------------------------------------- ;Seiriaki Epikoinwnia - Apeftheias UART ;Askisi 3b ;################# ####### ;---------------------------------------- TITLE serial_bios DOSSEG .MODEL SMALL .STACK 100h .DATA ;Minimata interface i_msg1 db 10,13,"Sellect Serial 1 or 2: $" r_msg1 db 10,13,"overrun error, skipping",10,13,"$" r_msg2 db 10,13,"parity error, skipping",10,13,"$" r_msg3 db 10,13,"framing error, skipping",10,13,"$" endl db 10,13,"$" ;Endline ;Term Flag escf db 00h .CODE start: mov ax,@DATA ;Arxikopoiisi mov ds,ax ;tou DS mov ax,0040h ;Arxikopoiisi tou mov es,ax ;ES gia evresi thirwn sub ax,ax ; call INPUT ;Input cmp al,"1" ; jne com2 ; mov al,00h ; jmp cont com2: mov al,02h cont: mov ah,00h ; mov si,al ;Saving mov cx,es:[si] ;Serial Port Address save lea dx,endl ; mov ah,09h ;alazoume int 21h ;grammi call INIT ;Arxikopoiisi thyras prlp: call SEND ;Sending proc cmp escf,01h ;Check if ESC je term ; call RECIEVE ;Recieve proc cmp escf,01h ;Check if ESC je term ; jmp prlp ;Loop term: mov ax,4C00h ;Termatismos int 21h ; ;-------------------------------- ;Input Routine ;-------------------------------- INPUT proc near push dx ;------------------------ i_ask: lea dx,i_msg1 ;Printing mov ah,09h ;message int 21h ; mov ah,01h ;Reading int 21h ; cmp al,"1" ;Check jb i_ask ;Below 1 ask again cmp al,"2" ; ja i_ask ;Above 2 ask again ;------------------------ pop dx retn INPUT endp ;-------------------------------- ;Initialise com ;-------------------------------- INIT proc near push dx push ax ;------------------------ mov dx,cx ;Diefthinsi thiras add dx,3h ;base+3 == kataxoristis elegxou gramis mov al,10001111b out dx,al ;1=DLAB (gia to baud rate) ;0=Apenergopoiisi gramis metadosis (oxi) ;0=bit isotimias 0 ;0=periti isotimia ;1=energopoiisi isotimias ;1=2 stop bits ;1=} ;1=}8 bytes char mov dx,cx ;Diefthinsi thiras ==diefthinsi LSB mov al,18h ;exoume DLAB = 1 apo prin out dx,al ;4800 BaudRATE inc dx ;+1 diefthinsi MSB mov al,0h ; out dx,al ;MSB = 0 gia 4800 mov dx,cx ;Diefthinsi thiras add dx,3h ;base+3 == kataxoristis elegxou gramis mov al,00001111b ;To idio me DLAB 0 gia apostoli/lipsi out dx,al ; ;------------------------ pop ax pop dx retn INIT endp ;-------------------------------- ;SEND Routine ;-------------------------------- SEND proc near push dx push cx push ax ;------------------------ mov ah,01h ;Check if int 16h ;key on buffer jz s_skip ;if not, quit mov ah,00h ;Read key int 16h ;from buffer mov escf,01h ; cmp al,1bh ;ESC pressed je s_exit ;An exoume ESC parakamptei mov escf,00h ;to "midenismo" tis simeas s_exit: push ax ; s_wait: mov dx,cx ;Diefthinsi thiras add dx,5h ;base+5 = kataxoritis katastasis gramis in al,dx ;Anagnosi katastasis test al,00100000b ;Koitame katastasi jz s_wait ;perimenoume na einai 0 (clear to send) pop ax ;Epanaferoume ax ;======================== mov dx,cx ;Diefthinsi thiras out dx,al ;al exei ton xaraktira apo prin ;------------------------ s_skip: pop ax pop cx pop dx retn SEND endp ;-------------------------------- ;RECIEVE Routine ;-------------------------------- RECIEVE proc near push dx push cx push ax ;------------------------ mov dx,cx ;Diefthinsi thiras add dx,5h ;base+5 = kataxoritis katastasis gramis in al,dx ;Anagnosi katastasis mov ah,al test ah,00000001b ;Koitame katastasi an irthe tpt jz r_skip ;an oxi vgenoume ;Elegxxoume gia lathi ;-------------------- test ah,00000010b ;overrun jz r_parc ;proxorame se parity check lea dx,r_msg1 ;Tupoma minimatos mov ah,09h ;kai int 21h ;eksodos apo jmp r_skip ;routina r_parc: test ah,00000100b ;overrun jz r_frac ;framing check lea dx,r_msg2 ;Tupoma minimatos mov ah,09h ;kai int 21h ;eksodos apo jmp r_skip ;routina r_frac: test ah,00001000b ;overrun jz r_reci ;Recieve lea dx,r_msg3 ;Tupoma minimatos mov ah,09h ;kai int 21h ;eksodos apo jmp r_skip ;routina r_reci: mov dx,cx ;Diefthinsi thiras in al,dx ;al exei ton xaraktira apo prin cmp al,1bh ;Escape - exiting je r_exit ; mov dl,al ;Typoma mov ah,02h ;Xaraktira int 21h ; jmp r_skip ;Apofigi tou r_exit r_exit: mov escf,01h ;------------------------ r_skip: pop ax pop cx pop dx retn RECIEVE endp END start