SUBTTL Video Bios (RPVIDEO.ASM) v1.0,(C)26.11.90 OLEO
TITLE REKLAMNI PANEL
.Z80 ;M80 Source - Procesor je Z80A (Z8400)
.XLIST
IF1
INCLUDE RP.ASI
ENDIF
.LIST
.SALL
PUBLIC VSTART
PUBLIC MVLEFT
PUBLIC WRITE
PUBLIC POCPTR
EXTRN CA9X7
CSEG
.COMMENT (video bios)
Video bios vsebuje video krmilnik za upravljanjem displaya.
Rutine se kli~ejo z RST 20h s tem, da podamo za rst z
DEFB {e {tevilko funkcije.
Parametre podajamo v ragistre, tako kot funkcija zahteva ali pa
po principu "inline code parameter passing" tako, da za
definicijo funkcije podamo {e vrednosti A,B,E,D,L,H zaporedoma.
Pri drugem na~inu klicanja se tudi ohranjo prvotni registri,
parametri pa so le kot podatek.
^e vi{jih registrov ni potrebno podajat jih ne kodiramo.
Kon~amo z definicijo byta NUL oz 0FFh, ki pove, da je konec
parametrov, in za tem bytom bo program nadaljeval delo.
Bios ohranja vse registre take kot so bili pred klicem.
primer klica:
ld a,'Q' ;vstavi ~rko Q v A register
rst 20h ;kli~i video bios
DEFB 0 ;funkcija 0;
DEFB NUL ;ali DEFB 0FFh za konec parametrov
...
...
ali:
rst 20h ;kli~i bios
DEFB 7 ;funkcja 7
DEFB 0,1 ;nastavi A=0, B=1
DEFB NUL ;konec
...
...
(video bios)
VSTCA MACRO sreg,ixofs,jmploc
inc ix
ld a,(ix+0)
cp NUL
ld a,(ix-ixofs)
jr z,jmploc
ld sreg,(ix+0)
ENDM
VSTART: rst CLRWDT ;komplementiraj ~uvaja
ex (sp),ix ;ix ka`e na {t. funkcije
push iy
PUSHALL
ld c,(ix+0) ;v c je {tevilka funkcije
VSTCA a,0,v_pa ;sko~i ~e ni podatkov
VSTCA b,1,v_ca ;sko~i ~e je podan samo A
VSTCA e,2,v_ca ;sko~i ~e je podan samo A,B
VSTCA d,3,v_ca ;sko~i ~e je podan samo A,B,E
VSTCA l,4,v_ca ; -""- A,B,E,D
VSTCA h,5,v_ca ; -""- A,B,E,D,L
VSTCA a,6,v_ca ; -""- A,B,E,D,L,H
jp vsterror ;~e pride do tu je hro{~ {e `iv
v_pa: pop af ;obnovi A register
push af ;vendar ne pacaj sklada
v_ca: inc ix
vst_p0: push hl ;shrani hl
ld hl,vstrtn ;nastavi hl na vrnitev po klicu funkcije
ex (sp),hl ;in vrednost nastavi na skladu, HL je OK
push bc ;shrani BC
ld iy,VTABLE ;IY ka`e na za~etek tabele skokov
ld b,0 ;BC vsebuje {t. funkcije
sla c ;BC mno`ino z 2
rl b
add iy,bc ;sedaj IY ka`e na kazalec za skok
ld c,(iy+0)
ld b,(iy+1) ;BC ka`e na funkcijo
push bc ;kopiramo BC
pop iy ;v IY ki ka`e na funkcijo
pop bc ;vzamemo BC nazaj
jp (iy) ;JP v funkcijo,ki ne sme pacati IY,IX
vstrtn: POPALL ;tu se bo za~elo po klicu funkcije
pop iy
ex (sp),ix ;nastavimo {e skok
rst CLRWDT ;ponovno komplementiraj `uvaja
ret ;in se vrnemo odkoder smo pri{li
VTABLE: ;tabela skokov za vidoeo rutine
DEFW PO_CHAR ;0 Izpi{e ~rko v A
DEFW SCRL ;1 premakne levo stran A
DEFW SCRR ;2 premakne desno stran A
DEFW SCRUP ;3 premik navzdol A
DEFW SCRDN ;4 premik navzgor A
DEFW FILLPAGE ;5 zapolni stran A z B registrom
DEFW CLRPAGES ;6 bri{e vse video strani
DEFW CPYB2A ;7 kopira B v A stran
DEFW CPLPAGE ;8 naredi koplement A strani
DEFW SETDPAGE ;9 izbere A aktivno stran za displaya
DEFW PO_TST ;A izpi{e Testiranje
DEFW LDROMFONT ;B nastavi video kontroler
DEFW VDELAY ;C zakasnitev cca. A * ms
DEFW POTTY ;D izpis stringa v TTY na~inu
DEFW POTIME ;E izpis ~as na stran A
DEFW PODATE ;F izpis datuma na stran A
DEFW SETRTC ;10 nastavitev RTC
DEFW SETTIME ;11 nastavitev ~asa A,B,E,D,L,H=hh:mm:ss
DEFW SETDATE ;12 nastvitev datuma A,B,E,D,L,H=dd/mm/yy
DEFW SETDAY ;13 nastavitev dneva v tednu A = w
DEFW SHIFTUP ;14 pomik strani A navzgor
DEFW SHIFTDN ;15 pomik strani A navzdol
DEFW POAHEX ;16 izpis A registra na aktivno stran v HEX
DEFW POAASC ;17 izpis kot POAHEX le v ascii obliki
DEFW SHIFTL ;18 pomik strani levo
DEFW SHIFTR ;19 pomik strani desno
DEFW POSTR ;1A izpis DE stringa na stran A
DEFW FLASH ;1B utripne stran A s pomo~jo B
DEFW POERROR ;1C izpise napako *BA na tekoco stran
DEFW MOVELEFT ;1D pomakne v levo s hitrostjo TTY
DEFW CURSOR ;1E izpis kurzorja na aktivna stran, A=pozicija
DEFW GOTOX ;1F nastavi cilj za izpis ~rke stran B, poz A
vsterror:
halt
CLRPAGES: ;bri{e vse video strani
ld d,0
ld a,VIDEOPAGES
clrp00: dec a
push af
rst CLRWDT
call FILLVIDEO
pop af
jr nz,clrp00
ret
;Brisanje in polnjenje strani z B registrim
;Vhod A = video stran
; B = byte s katerim polnimo stran
FILLPAGE:
ld d,b
FILLVIDEO: ;Zapolni A video stran z D registrom
call GETPAGEPTR
ld bc,PAGESIZE
and a ;ali je A==0
jr z,fv02
fv00: add hl,bc
dec a
jr nz,fv00
fv02: ld (hl),d
inc hl
dec bc
ld a,b
or c
jr nz, fv02
ret
;Izra~una za~etek video strani
;vhod A = video stran
;izhod HL = kazalec na za~etek strani
GETPAGEPTR:
ld hl,VIDEORAM
cp 0
ret z
ld bc,PAGESIZE
gpag: add hl,bc
dec a
jr nz, gpag
ret
;Scroll v levo za en piksel stran A
;Vhod A = video stran
SCRL:
call GETPAGEPTR
ld a, VIDEOLINES
scl00: and a
ld b, VIDEOPORTS+2
scl01: rl (hl)
inc hl
djnz scl01
dec a
jr nz,scl00
ret
;Scroll v desno za en piksel stran A
;Vhod A = video stran
SCRR:
inc a
call GETPAGEPTR
dec hl
ld a, VIDEOLINES
scr00: and a
ld b, VIDEOPORTS+2
scr01: rr (hl)
dec hl
djnz scr01
dec a
jr nz,scr00
ret
;Scroll A gor za piksel.
;Zgornja vrstica se nepovratno izgubi, spodnja pa se polni z 00.
;Vhod A = stran
SCRUP:
scsize EQU (VIDEOLINES-1)*(VIDEOPORTS+2)
call GETPAGEPTR
ld d,h
ld e,l
ld bc,VIDEOPORTS+2
add hl,bc
ld bc,scsize
ldir
ld b,VIDEOPORTS+2
xor a
scup: ld (de),a
inc de
djnz scup
ret
;Scroll A dol za piksel
;Spodnja vrstica se nepovratno izgubi, zgornja se polni z 00.
SCRDN:
inc a
call GETPAGEPTR
dec hl
ld d,h
ld e,l
ld bc,VIDEOPORTS+2
and a
sbc hl,bc
ld bc,scsize
lddr
ld b,VIDEOPORTS+2
xor a
scdn: ld (hl),a
inc hl
djnz scdn
ret
;pomakne navzgor in izbri{e teko~o stran
SHIFTUP:
ld b,VIDEOLINES
scuppg: push bc
push af
call SCRUP
ld a,(SCRUPDNDLY)
call VDELAY
pop af
pop bc
djnz scuppg
ret
;pomakne navzdol in izbri{e teko~o stran
SHIFTDN:
ld b,VIDEOLINES
scdnpg: push bc
push af
call SCRDN
ld a,(SCRUPDNDLY)
call VDELAY
pop af
pop bc
djnz scdnpg
ret
;Kopira vsebino B strani v A stran
;vhod B = {tevilka izvorne strani
; A = {tevilka ciljne strani
CPYB2A:
ld d,b ;shrani b
call GETPAGEPTR
ld a,d
ex de,hl ;de ka`e na ciljno stran
call GETPAGEPTR ;hl pa na izvor
ld bc,PAGESIZE ;koliko prena{amo je v bc
ldir ;prenesemo
ret ;in se vrnemo
;Naredi komplement A strani
;Vhod A = video stran
CPLPAGE:
call GETPAGEPTR ;hl ka`e na `eleno stran
ld bc,PAGESIZE
cpl00: ld a,(hl)
cpl ;invertiramo vse byte cilja
ld (hl),a
inc hl
dec bc
ld a,b
or c
jr nz,cpl00
ret
;Printout Character
;vhod A = ASCII karakter
;Uporablja (CHARS), kot kazalec na tabelo ~rk vi{ine 9 pikslov
;in {irine max 1 byte, ter (CHARSDE) za cilj kamor naj kopira
;zahtevano ~rko.
PO_CHAR::
ld h,0 ;mno`imo A z 9 da dobomo offset
ld l,a ;za kazalec na obliko ~rke
ld b,0
ld c,a
add hl,hl ;a=a+a=2a
add hl,hl ;a=2a+2a=4a
add hl,hl ;a=4a+4a=8a
add hl,bc ;a=9a
ld bc,(CHARS)
add hl,bc ;pri{tejemo {e za~etek tabele
ld bc,VIDEOLINES;koliko bytov kopiramo
ld de,(CHARSDE) ;beremo, kam naj kopiramo
pochl: ldi ;prenesemo en byt znaka
push af
ld a,e
add a,VIDEOPORTS+1 ;izra~unamo cilj naslednje video vrstice
ld e,a
ld a,d
adc a,00h
ld d,a
pop af
jp pe,pochl
ret
PO_TST: ;izpi{e tabelo na ni~to stran
ld de,VIDEORAM+VIDEOPORTS ;prva ~rka
ld b,VIDEOPORTS ;koliko crk imamo
ld hl,potsttbl ;kazalec na prvo ~rko
potstl:
ld (CHARSDE),de ;kam naj se izpi{e ~rka
ld a,(hl)
rst CLRWDT
PUSHALL
call PO_CHAR
POPALL
rst CLRWDT
dec de
inc hl
djnz potstl
ret
potsttbl: ;tabela s sporo~ilom
DEFM "Testiranje..."
;Izbere aktivno video stran,tako da nastavi spremenljivke
;Vhod A = display page number
SETDPAGE:
ld (CURDPAGE),A
call GETPAGEPTR
push hl
ld bc,VIDEOLINES*(VIDEOPORTS+2)-1
add hl,bc
vsync: halt
TSTBIT INT1,P1
jr nz,vsync
ld (CURPAGEPTR),hl
pop hl
ret
;Nastavi kontroler za izpis ~rk
LDROMFONT:
ld bc,CA9X7 ;Nastavi kazalec na za~etek tabele
ld (CHARS),bc ;o obliki ~rk
ld de,VIDEORAM ;nastavi kazalec za PO_CHAR na stran 0
ld (CHARSDE),de
xor a
call SETDPAGE ;aktivna je stran 0
ld a,7 ;zakasnitev pri POTTY
ld (TTYDLY),a
ld a,4 ;zakasnitev pri utripanju
ld (FLASHDLY),a
ld a,20 ;zakanitev pri izpisu casa
ld (TIMEDLY),a
ld a,100 ;zakasnitev pri pomiku gor ali dol
ld (SCRUPDNDLY),a
ret
;Zakasnitve A*DCLK, ali B*83*DCLK
;Vhod A = {t. hold ukazov ali
; A=0 in B={t. (83*hold ukazov)
VDELAY:
cp 0
jr z,vdly01 ;~e je A==0 potem je zakasnitev dalj{a
vdly: ld b,a
vdly00: rst CLRWDT
halt ;zunanja referenca 1.2ms
rst CLRWDT
djnz vdly00
ret
vdly01: ld a,b
vdly02: ld b,83
call vdly00
dec a
jr nz,vdly02
ret
CPSPDP MACRO dest,source ;Za Teletype printout
rst CLRWDT
ld a,dest
ld b,source
call CPYB2A
ld a,dest
call SCRL
rst CLRWDT
ld a,dest
call SETDPAGE
ld a,(TTYDLY)
call vdly
ENDM
;Print String In Teletype mode na straneh 0 in 1
; Vhod A = kazalec LOW, B = kazalec HI
; Kon~a takrat, ko je na koncu QUOTE '"' karakter (22h)
POTTY:
ld h,b ;HL je kazalec na string
ld l,a
WRITE: ld a,(CURDPAGE) ;kopiraj aktivno stran na stran 0
ld b,a
xor a
push hl
call CPYB2A
pot00: TSTBIT INT1,P1
jr z,pot00
pot01: TSTBIT INT1,P1
jr nz,pot01
xor a
call SETDPAGE
ld (CHARSDE),hl
pop hl
pstty:
ld a,(hl) ;poberi ~rko
cp '"' ;a je `e konc besedila
ret z
push hl ;shrani kazalec na tekst
call PO_CHAR ;tiskaj ~rko
CPSPDP 1,0
CPSPDP 0,1
CPSPDP 1,0
CPSPDP 0,1
CPSPDP 1,0
CPSPDP 0,1
CPSPDP 1,0
CPSPDP 0,1
pop hl
inc hl
jp pstty
;Makroji za Real Time Clock (RTC) sekcijo ukazov
RTCWAIT:
push af
rtcl: rst CLRWDT
in a,(RTC+0Dh) ;;pri`gi HOLD bit
or 1
out (RTC+0Dh),a
in a,(RTC+0Dh)
and 10b ;;ali je BUSY==0
jr z,rtcr ;;~e je sko~i
in a,(RTC+0Dh) ;;sicer resetiraj HOLD
and NOT 1
out (RTC+0Dh),a
jr rtcl
rtcr: pop af
ret
CLRHOLD MACRO ;Bri{e HOLD bit
push af
in a,(RTC+0Dh) ;;resetiraj HOLD
and NOT 1
out (RTC+0Dh),a
pop af
ENDM
RTCWRITE MACRO register ;Pi{e v RTC register
call RTCWAIT
out (RTC+register),a ;;pi{i register
CLRHOLD
ENDM
RTCREAD MACRO register ;Bere RTC register
call RTCWAIT
in a,(RTC+register) ;;pi{i register
CLRHOLD
and 0Fh
ENDM
PORTCR MACRO register ;Pobere register iz ure in izpi{e
ld (CHARSDE),hl
push hl
RTCREAD register
or 30h ;;Spremenimo v ASCII kodo
call PO_CHAR
pop hl
inc hl
ENDM
POSIGN MACRO sign ;Izpi{e znak
ld (CHARSDE),hl
push hl
ld a,sign
call PO_CHAR
pop hl
inc hl
ENDM
;Izpi{e ~as na stran a v obliki hh:mm:ss
; Vhod A = stran
POTIME:
call GETPAGEPTR
REPT 3
inc hl
ENDM
PORTCR 0
PORTCR 1
POSIGN ':'
PORTCR 2
PORTCR 3
POSIGN ':'
PORTCR 4
PORTCR 5
ret
;Iztiska Datum na A stran po vzorcu www dd/mm/yy
;Vhod A = stran
PODATE:
call GETPAGEPTR
inc hl
PORTCR 0Ah
PORTCR 0Bh
POSIGN '.'
PORTCR 8
PORTCR 9
POSIGN '.'
PORTCR 6
PORTCR 7
POSIGN ' '
RTCREAD 0Ch
and 111b
cp 0
jr nz,poned
POSIGN 'd'
POSIGN 'e'
POSIGN 'N'
ret
poned: cp 1
jr nz,torek
POSIGN 'n'
POSIGN 'o'
POSIGN 'P'
ret
torek: cp 2
jr nz,sreda
POSIGN 'r'
POSIGN 'o'
POSIGN 'T'
ret
sreda: cp 3
jr nz,cetrt
POSIGN 'e'
POSIGN 'r'
POSIGN 'S'
ret
cetrt: cp 4
jr nz,petek
POSIGN 't'
POSIGN 'e'
POSIGN '^'
ret
petek: cp 5
jr nz,sobota
POSIGN 't'
POSIGN 'e'
POSIGN 'P'
ret
sobota: POSIGN 'b'
POSIGN 'o'
POSIGN 'S'
ret
;Nastavi se RTC za delovanje - 24h, ...
SETRTC:
ld c,RTC+0Fh
ld a,0001b
out (c),a ; 24 urni prikaz
ld a,0101b
out (c),a ; 24 urni prikaz
ld a,0100b
out (c),a ; 24 urni prikaz
ld a,0100b
out (RTC+0Eh),a ; 1 sek STD.P
ld a,0000b
out (RTC+0Dh),a ; RUN
ret
;Nastavi ~as RTC tt:mm:ss
; Vhod A,B,D,E,H,L tako,da v zaporadju tvorijo ~as
SETTIME:
ld c,RTC
IRPC register,hldeba
call RTCWAIT
out (c),register
CLRHOLD
inc c
ENDM
ret
;Nastavi datum RTC dd/mm/yy
; Vhod A,B,D,E,H,L tako, da v zaporedju tvorijo datum
SETDATE:
ld c,RTC+6
IRPC register,badehl
call RTCWAIT
out (c),register
CLRHOLD
inc c
ENDM
ret
;Nastavi dan v tednu RTC
;Vhod A = {t. dneva v tednu ; 0=Ned, 1=Pon, 2=Tor ...
SETDAY:
and 111b
RTCWRITE 0Ch
ret
;Izpis vrednosti A registra na aktivno stran v hexadecimalni obliki
;Uporabno pri razhro{~evanju
POAHEX:
push af
ld a,(CURDPAGE)
ld b,0
call FILLPAGE
ld a,(CURDPAGE)
call GETPAGEPTR
inc hl
ld (CHARSDE),hl
pop af
push af
HEXASC
call PO_CHAR
ld hl, CHARSDE
inc (hl)
pop af
REPT 4
rrca
ENDM
HEXASC
call PO_CHAR
ret
;Izpis vrednosti A registra na aktivno stran v ASCII obliki
;Uporabno pri razhro{~evanju
POAASC:
push af
ld a,(CURDPAGE)
ld b,0
call FILLPAGE
ld a,(CURDPAGE)
call GETPAGEPTR
inc hl
ld (CHARSDE),hl
pop af
call PO_CHAR
ret
;Pomik v levo strani A
SHIFTL:
ld b,VIDEOPORTS*8
shl: push af
push bc
call SCRL
ld a,(TTYDLY)
call VDELAY
pop bc
pop af
djnz shl
ret
;Pomik v desno strani A
SHIFTR:
ld b,VIDEOPORTS*8
shr: push af
push bc
call SCRR
ld a,(TTYDLY)
call VDELAY
pop bc
pop af
djnz shr
ret
;Ispis stringa na stran A
;Vhod: A=stran, DE=kazalec na string
POSTR:
push af ;bri{i stran
push de
ld b,0
call FILLPAGE
pop de
pop af
call GETPAGEPTR ;nastavi kazalec na levo
ld bc,VIDEOPORTS
add hl,bc
ld b,c ;b je {tevec ~rk
ld (CHARSDE),hl
ex de,hl
postr0: ld a,(hl) ;ponavljaj izpis do "
cp '"'
ret z
PUSHALL
call PO_CHAR
POPALL
dec de
ld (CHARSDE),de
inc hl
djnz postr0 ;ali je konec displaya
ret
;Utrip teksta na strani A, naprej caka preklopi na B stran,
; caka in preklopi nazaj na A stran
;Vhod: A=stran, B=pomozna stran za utrip
FLASH:
push af
push bc
ld c,a
ld a,b
ld b,c
call CPYB2A
pop bc
push bc
ld a,b
call CPLPAGE
ld a,(FLASHDLY)
ld b,a
xor a
call VDELAY
pop bc
ld a,b
call SETDPAGE
ld a,(FLASHDLY)
ld b,a
xor a
call VDELAY
pop af
call SETDPAGE
ret
;Izpise string (napako) BA na tekoco stran in ~aka nekaj ~asa
;Vhod A=low byte kazalca na string, B=high ""
;String se mora kon~ati z "
POERROR:
ld d,b
ld e,a
ld a,(CURDPAGE)
call POSTR
ld b,10
xor a
call VDELAY
ret
;Pomik v levo za eno stran
MOVELEFT:
MVLEFT:
ld hl, spaces
call POTTY+2
ret
spaces: REPT VIDEOPORTS
DEFB ' '
ENDM
DEFB '"'
;Prikaz kurzorja tako, da se invertira pozicija kurzorja na teko~i
;video strani
;Vhod A=polo`aj kurzorja od desne strani
CURSOR:
cp VIDEOPORTS+2
ret nc
push af
ld a, (CURDPAGE)
call GETPAGEPTR
pop af
ld b,0
ld c,a
add hl,bc
ld bc,VIDEOPORTS+2
ld e, VIDEOLINES
cursl: ld a,(hl)
cpl
ld (hl),a
add hl,bc
dec e
jr nz,cursl
ret
POCPTR: ld hl,(CPTR)
ld bc,VIDEOPORTS
srl c
and a
sbc hl,bc
ld de,VIDEORAM+VIDEOPORTS
ld (CHARSDE),de
ld b,VIDEOPORTS
pcptr0: ld a,(hl)
PUSHALL
call PO_CHAR
POPALL
dec de
ld (CHARSDE),de
inc hl
djnz pcptr0 ;ali je konec displaya
ret
;Nastavi CHARSDE kazalec za izpis teksta
;Vhod A=pozicija od desne strani, B=videostran
GOTOX:
cp VIDEOPORTS+2
jr c,gotox1
xor a
gotox1: push af
ld a,b
call GETPAGEPTR
pop af
ld b,0
ld c,a
add hl,bc
ld (CHARSDE),hl
ret
END