; ******************************************************************************** ; Demonstrační program pro synchronizaci časovače T1 s rozkladem obrazu. ; Určeno pro mikropočítač PMD-85. ; Tlačítky U a D posouvám uskočené rozhraní svislého pruhu na obrazovce ; v rozmezí 0..319. Stiskem EOL vynuluji relativní ukazatel zvoleného mikrořádku. ; ******************************************************************************** ; Smysl: Program umí kreslit pouze souvislý svislý pruh. Přesto je na obrazovce ; někdy vidět pruh uskočený. Pokud se tak stane, znamená to, že program ; čeká na zvolený mikrořádek TV rozkladu a tam začne kreslit posunutý pruh. ; Protože ale chybí informace o fázovém posunu T1 vůči TV rozkladu, lze ; klávesou EOL nulovat tento ofset. ; Pokud předěl není vidět, je nutno chvíli držet klávesu U nebo D, aby se ; předěl dostal do viditelné části obrazovky. Viditelná část obrazovky ; totiž představuje pouze 256/320 rozkladového prostoru videoprocesoru. ; ******************************************************************************** CTC1CH .equ 05dh ; časovač #1 CTC 8253 (2MHz) CTCCWR .equ 05fh ; řídicí registr CTC 8253 KBDOUT .equ 0f4h ; volba sloupce klávesnice KBDIN .equ 0f5h ; čtení řádku klávesnice KBDLED .equ 0f6h ; BEEP, LED & BANKING KBDCWR .equ 0f7h ; řídicí port služební 8255-ky MaxScan .equ 320 ; Počet mikrořádků rozkladu TV obrazu .org 0 lxi sp,8000h ; nastavit STACK jmp Start ; a spustit program .org 8 mov a,h ; RST 1 = test klávesnice out KBDOUT ; vstup: H = sloupec klávesnice in KBDIN ; L = maska ana l ; vrací: Z=1 <=> stisknuto ret .org 10h mov a,h ; RST 2 = test HL vs DE cmp d ; vstup: Hl, DE rnz ; vrací: Z=1 když HL=DE mov a,l ; Z=0 když HL<>DE cmp e ; CY=1 když HL=DE ; ************************ ; Vlastní začátek programu ; ************************ Start: call Cls ; výmaz obrazovky ; ******************************************************* ; Nejprve nastavení CTC1 aby sohlasil číselně s rozkladem ; ******************************************************* Fix: lxi h,MaxScan*64 mvi a,74h ; nastavit T1 8253 synchronně s rozkladem obrazu out CTCCWR mov a,l ; LSB T1 out CTC1CH mov a,h ; MSB T1 out CTC1CH lxi h,0 ; vynulovat relativní ukazatel mikrořádku shld Kalibr Print: lxi h,0c501h ; vytisknout hodnotu ukazatele mikrořádku shld 0c03eh ; nejprve nastavit adresu tisku na obrazovce lda Kalibr+0 ; do HL sestavit hodnotu předělového kurzoru 0..(MaxScan-1) rlc ; tedy v praxi 0..319 rlc ani 3 mov l,a lda Kalibr+1 ral ral push psw ani 0fch ora l mov l,a pop psw mvi a,0 ral call 8125h mov a,l call 8125h Loop: call Sync ; synchronizace na kalibrační bod (předělový kurzor) call Pruh ; vykreslení svislého pruhu Setup: lxi h,0604h ; test klávesy U rst 1 lxi b,-64 ; posunout relativní ukazatel mikrořádku o -1 jz SetupX lxi h,0208h ; test klávesy D rst 1 lxi b,+64 ; posunout relativní ukazatel mikrořádku o +1 jz SetupX lxi h,0e10h ; test klávesy EOL rst 1 jnz Loop ; není stisk => zobrazuj kalibrační pruh lhld Kalibr ; při stisku EOL lxi b,(2*64) ; nejprve předsadím synchronizaci 2 mikrořádky před dad b ; hodnotu kurzoru lxi d,MaxScan*64 rst 2 cnc Over ; hodnotu HL ošetřím jen na platný rozsah 0..(MaxScan-1) call Wait ; počkám na dosažení TV rozkladu jmp Fix ; a tento bod rozkladu ztotžním s hodnotou kurzoru=0 Over: lxi d,-(MaxScan*64) dad d ; ošetření hodnoty předsazeného kurzoru na rozsah ret ; 0..(MaxScan-1) SetupX: mvi a,0 ; posun předělového kurzoru nahoru a dolů dle BC inr a ani 3 sta SetupX+1 jnz Loop ; nejprve zpomalovač posunu.. lhld Kalibr ; načíst aktuální hodnotu ukazatele mikrořádku dad b ; přičíst přírůstek lxi d,MaxScan*64 ; porovnat s max. hodnotou TV mikrořádku rozkladu rst 2 jnc Loop ; a pokud jsem mimo rozsah 0..319 tak neukládat shld Kalibr ; platný údaj uložit, jmp Print ; vytisknout a generovat testovací pruh ; ******************************* ; Synchronizace na rozklad obrazu ; ******************************* Sync: lhld Kalibr ; do HL načtu aktuální relativní ukazatel mikrořádku ; (nevím sice, jaké výškové pozici paprsku na TV obrazovce ; odpovídá, ale je s rozkladem synchronní!) Wait: mvi a,40h ; latch T1 out CTCCWR in CTC1CH ; a porovnám s požadovaným relativním číslem mikrořádku v HL ani 0c0h cmp l in CTC1CH jnz Wait cmp h jnz Wait ret Kalibr: .dw 0 ; relativní číslo mikrořádku (předělového kurzoru) ; ************************************ ; nakreslí svislý proužek na adrese HL ; ************************************ Pruh: lxi h,003fh ; vzor pro kreslení mov a,h ; při každém vykreslení se proužek stranově zrcadlí mov h,l mov l,a shld Pruh+1 xchg lxi b,64-1 ; řádkovač lxi h,0c017h ; pozice H okraje pruhu na obrazovce PruhDo: mov m,e ; kreslím L polovinu pruhu inx h mov m,d ; kreslím P polovinu pruhu dad b ; přechod na další mikrořádek směrem dolů jnc PruhDo ; odpočet mikrořádků ret ; *************** ; výmaz obrazovky ; *************** Cls: lxi h,0 mov b,h ; výplň obrazovky mov c,l dad sp ; uschovat SP shld ClsSP+1 lxi h,0c030h ; začátek mazání obrazovky lxi d,64 ; adresová rozteč mikrořádků ClsLop: sphl ; zásobník na "konec" mikrořádku push b ; a uložit 48 prázdných bajtů push b push b push b push b push b push b push b push b push b push b push b push b push b push b push b push b push b push b push b push b push b push b push b dad d ; přechod na další mikrořádek jnc ClsLop ; dokud jsem v obrazovce, mažu ClsSP: lxi sp,0 ; obnovit SP ret .end