; **************************************************** ; Demonstrace limitního časování procesů pomocí obvodu ; UART 8251. Určeno pro PMD-85 všech typů. ; **************************************************** uartdat .equ 01eh ; datový registr obvodu 8251 uartcwr .equ 01fh ; řídicí registr obvodu 8251 ctc_1ch .equ 05dh ; data kanálu T1 obvodu 8253 ctc_cwr .equ 05fh ; řídicí registr obvodu 8253 .org 0 ; adresa začátku programu ; ********************************** ; inicializace registrů a proměnných ; ********************************** mvi a,76h ; nastavení čítače T1 obvodu 8253 out ctc_cwr ; na generování standardních mvi a,0abh ; 1200Hz pro UART 8251 out ctc_1ch ; (dělicí poměr 06abh) mvi a,6 ; u PMD85-1 toto není nutné, out ctc_1ch ; 1200Hz je generováno hardwarově mvi a,80h ; synchronizace sekvenceru 8251 out uartcwr out uartcwr rrc ; povel RESET (40h) out uartcwr mvi a,82h ; ASYNC 16x (START+5DATA+1,5STOP) out uartcwr ; celkem 16x7,5/1200Hz = 100ms mvi a,23h ; povolit vysílání znaku out uartcwr mvi a,10 ; výchozí stav děličky 100ms => 1s sta divide ; ************************************************* ; hlavní smyčka programu tiskne každou sekundu údaj ; o počtu načítaných sekund ; ************************************************* prntim: call prttxt ; tisk následujícího řetězce casval: .db 0dh,"CAS: 000",0 timsec: in uartcwr ; uběhlo už nastavených 100ms? ani 04h ; dokud vysílací registr znaku jz timsec ; UARTu není vyprázdněn, tak ne.. out uartdat ; 100ms uběhlo, vyšlu nový znak ; a běží tak nových 100ms lxi h,divide ; snížit stav děličky deseti dcr m ; o jedničku jnz timsec ; není-li 10x 100ms, čekej mvi m,10 ; jinak inicializace děličky a.. lxi h,casval+8 ; jednotky počitadla ČAS timovr: mov a,m ; načtu inr a ; a zvětším o jedničku cpi '9'+1 ; překročil jsem devítku? mov m,a ; (ještě zapsat zpět) jc prntim ; při stavech 0..9 tisknu čas mvi m,'0' ; jinak na dané pozici času ; zapíšu nulu dcx h ; posunu se na vyšší řád času jmp timovr ; a přičítám jedničku tam.. ; ******************************************************* ; procedura pro tisk řetězce za volací instrukcí CALL adr ; ******************************************************* prttxt: xthl ; tisknout se bude text za CALL adr call prtstg ; volat tisk od adresy HL xthl ; přeskočit ASCII bajty za CALL adr ret ; a vrátit se až za ně ; ********************************************************** ; procedura pro tisk řetězce na adrese dané hodnotou reg. HL ; ********************************************************** prtstg: mov a,m ; načtu ASCII znak na adrese HL inx h ; posunu HL na další znak ana a ; test hodnoty načteného znaku rz ; 00h => ukončit proceduru tisku call 8500h ; ostatní znaky vytisknout jmp prtstg ; a jdu na další znak ; ********************************************************** divide: .db 0 ; proměnná - dělička 100ms => 1sec ; ********************************************************** .end ; konec programu