SUBTTL Bios (RPBIOS.ASM) v1.0,(C)26.11.90 OLEO
TITLE REKLAMNI PANEL
.Z80 ;M80 Source - Procesor je Z80A (Z8400)
.XLIST
IF1
INCLUDE RP.ASI
INCLUDE RPFNAMES.ASI
ENDIF
.LIST
.SALL
PUBLIC RUN
PUBLIC EDIT
PUBLIC CRCOK
PUBLIC OPEN
EXTERNAL MVLEFT
EXTERNAL WRITE
EXTERNAL KEY
EXTERNAL RSTXT
EXTERNAL ISBRK
EXTERNAL POCPTR
POTIMEDLY EQU 100
CURSOR_SPEED EQU 350 ;Hitrost utripanja kurzorja pri editiranju
CSEG
;Interpreter za display jezik
;Vhod: HL=kazalec na tekst
;Konec je takrat ko interpreter naleti na ukaz END, takrat je CY=1
;ali pa ko je bila pritisnjena BREAK TIPKA -> CY=0
PNEXT: call FIND_SEMICOLON
call ISBRK
ret nc ;vrni se ~e je bila pritisnjena BREAK tipka
PHARSE:
call SKIP_FORM ;A<-(hl)
and 0DFh ;~e je ~rka mala jo pretvori v veliko
cp 'M' ;Move
jr nz, ph0
push hl
call MVLEFT
pop hl
jp PNEXT
ph0: cp 'P'
jr nz, ph1
call FIND_QUOTE ;Print text
push hl
pop de
VBIOS POSTR
db 0, NUL
call FIND_QUOTE
jr PNEXT
ph1: cp 'W'
jr nz, ph2
call FIND_QUOTE ;TeleType Print
push hl
call FIND_QUOTE
call FIND_SEMICOLON
call SKIP_FORM
pop de
ex de, hl
push de
call WRITE
pop hl
ld a,(hl)
jr PHARSE+3
ph2: cp 'F' ;Flash
jr nz, ph3
VBIOS FLASH
db 0,1,NUL
jr PNEXT
ph3: cp 'I' ;Invert
jr nz, ph4
VBIOS CPLPAGE
db 0,NUL
jr PNEXT
ph4: cp 'C' ;Clear
jr nz, ph5
VBIOS FILLPAGE
db 0,0,NUL
jr PNEXT
ph5: cp 'S' ;Shift x=(Up, Dow, Left, Right)
jr nz, ph6
call SKIP_ASC
call SKIP_FORM
cp 'U' ;Up
jr nz, ph5_1
VBIOS SHIFTUP
db 0,NUL
jr PNEXT
ph5_1: cp 'D' ;Down
jr nz, ph5_2
VBIOS SHIFTDN
db 0,NUL
jp PNEXT
ph5_2: cp 'L' ;Left
jr nz, ph5_3
VBIOS SHIFTL
db 0,NUL
jp PNEXT
ph5_3: cp 'R' ;Right
jr nz, ph5_4
VBIOS SHIFTR
db 0,NUL
jp PNEXT
ph5_4: jr $
ph6: cp 'T' ;Time
jr nz, ph7
ld a,(TIMEDLY)
ld b,a
ph6_0: VBIOS POTIME
db 0,NUL
VBIOS VDELAY
db 78,NUL
djnz ph6_0
jp PNEXT
ph7: cp 'D' ;Date
jr nz, ph8
VBIOS PODATE
db 0,NUL
jp PNEXT
ph8: cp 'B' ;Blink
jr nz, ph9
VBIOS FILLPAGE
db 1,0,NUL
ld a,(FLASHDLY)
ld b,a
xor a
VBIOS VDELAY
db NUL
VBIOS SETDPAGE
db 1,NUL
ld a,(FLASHDLY)
ld b,a
xor a
VBIOS VDELAY
db NUL
VBIOS SETDPAGE
db 0,NUL
jp PNEXT
ph9: cp 'H' ;Hold
jr nz, ph10
call SKIP_ASC
call SKIP_FORM
call ASC_BYTE
jp nc, PNEXT ;~e je neuspe{na konverzija
VBIOS VDELAY
db 0, NUL
jp PNEXT
ph10: cp 'E' ;End
call ISBRK
ret
;Poi{~e ustrezni karakter, ki je podan v A
;Izhod hl=kazalec na naslednji karakter in ne na A
FIND_SEMICOLON:
ld a, ';'
jr FIND_CHAR
FIND_SPACE:
ld a,' '
jr FIND_CHAR
FIND_QUOTE:
ld a,'"'
FIND_CHAR:
ld bc,0FFFFh
cpir
ret
;poi{~e prvi ASCII znak ki je ve~ji od SPACE
;Vhod: hl=kazalec na text
;Izhod hl=kazalec na text, A=vrednost karakterja na kazalcu
SKIP_FORM: ;poi{~e prvi znak ki je ve~ji od SPACE
ld a,(hl)
cp ' '+1
ret nc
inc hl
jr SKIP_FORM
;Delo obratno kot SKIP_FORM; poi{~e prvi znak ki je ve~ji od space
SKIP_ASC:
ld a,(hl)
cp ' '+1
ret c
inc hl
jr SKIP_ASC
;~e je v Akumulatorju ASCII {tevilka vrne ugasnjen Carry
IS_DIGIT:
cp '0'
ret c ;~e je manj kot 0 vrni CY
cp '9'+1
ccf ;~e je ve~ kot 9 vrni CY
ret
;Pretvori ASCII string v byte
;Vhod HL=kazalec na string
;Izhod A=prvi karakter, ki ni digit, B=rezultat konverzije
;CY=1 ~e je konverzija uspe{na, CY=0 ~e ni
ASC_BYTE:
ld b, 0 ;za~etna vrednost je 0
call SKIP_FORM ;presko~i za~etne BLANKe
call IS_DIGIT
jr nc, ascbyt ;~e je prva {t cifra je OK
VBIOS POERROR
dw edigit
db NUL
ccf
ret
edigit: DEFM "#1 Digit?"""
ascbyt: ld a, (hl)
call IS_DIGIT ;ali je cifra
ret c ;~e ni cifra se vrni
sub '0' ;odstej '0'
ld c,a ;za~asno shrani A v C
ld a,b ;mno`i B=B*10
sla a
sla a
add a, b
sla a
add a,c ;pri{tej {e zadnjo cifro
ld b,a ;shrani v b
inc hl ;pove~aj kazalec
jr ascbyt ;ponavljaj do zadnje cifre
;Izra~una kontrolno vsoto bloka v ramu
;Vhod: HL=za~etek bloka, BC={tevilo bytov (velikost bloka)
;Izhod: DE=kontrolna vsota bloka
CRC:
ld de, 0000h ;za~etna vsota je 0
csum: ld a,(hl)
add a,e
ld e,a
ld a,0
adc a,d
ld d,a
inc hl
dec bc
ld a,b
or c
jr nz, csum
ret
;Napravi kontrolno vsoto teksta
;Izhod: DE=CRC oz. kontrolna vsota
GET_TXT_CRC:
ld hl,(TXTEND)
ld de,TXTBEG
and a
sbc hl,de
ld b,h
ld c,l
ld hl,TXTBEG
call CRC
ret
;Napravi kontrolno vsoto teksta in ga primerja s shranjeno CRC vsoto
;Izhod: ZF=1 ~e je vsota OK
CRCOK:
call GET_TXT_CRC
ld hl,(TXTCRC)
and a
sbc hl,de
ret
UPDATE_TXT_CRC:
call GET_TXT_CRC
ld (TXTCRC),de
ret
;Kopira string iz (DE)<--(HL) dokler ni (HL)==0
CPYSTR:
ldi
ld a,(hl)
cp 0
jr nz, cpystr
ret
;Naredi prostor za eno ~rko v TEXTRAMU
;Izhod: CY=1 ~e ni mo`no alocirati spomina za ~rko
ONE_SPACE:
ld hl,TXTLAST-1 ;Ali je prostor se za eno ~rko
ld bc,(TXTEND)
and a
sbc hl,bc
ret c
ld hl,(TXTEND)
ld bc,(CPTR)
and a
sbc hl,bc
ld b,h
ld c,l ;Byte Counter je velikost bloka
inc bc
ld hl,(TXTEND)
ld d,h
ld e,l
inc de
ld (TXTEND),de ;TXTEND je ve~ji za ena
lddr ;prenesi blok
ret
;Izbri{e en prostor ni`je od trenutnega kazalca CPTR v TEXTRAMU
;Izhod: CY=1 ~e ni mo`no brisati- za~etek
BACKSP: ld hl,(CPTR)
ld bc,TXTBEG+1
and a
sbc hl,bc
ret c ;vrni pri`gan CY ~e smo na za~etku teksta
ld hl,(TXTEND)
ld bc,(CPTR)
and a
sbc hl,bc
ld b,h
ld c,l ;BC je velikost bloka
ld hl,(CPTR) ;izvor
ld d,h
ld e,l
dec de ;cilj je eno lokacijo ni`je
ld (CPTR),de ;kazalec CPTR se zmanj{a
ldir ;prenesemo blok
dec hl
ld (TXTEND),hl ;kakor tudi TXTEND
and a
ret
;Vrine ~rko v TEXTRAMU
;Vhod A=ASCII koda ~rka
;Izhod: CY=1 ~e je alokacija spomina neuspe{na
; CY=0 ~e je OK
INSA: push af
call ONE_SPACE
pop af
ret c
ld hl, (CPTR)
ld (hl),a
inc hl
ld (CPTR), hl
and a
ret
CURSOR_LEFT:
ld hl,(CPTR)
ld de, TXTBEG+1
and a
sbc hl,de
ret c
ld hl,(CPTR)
dec hl
ld (CPTR),hl
ret
CURSOR_RIGHT:
ld hl,(TXTEND)
ld de, VIDEOPORTS/2+1
and a
sbc hl,de
ld de,(CPTR)
and a
sbc hl,de
ret c
ld hl,(CPTR)
inc hl
ld (CPTR),hl
ret
CURSOR_PgDn:
ld hl,(CPTR)
ld de, TXTBEG+1+VIDEOPORTS
and a
sbc hl,de
ret c
ld hl,(CPTR)
ld de,VIDEOPORTS
and a
sbc hl,de
ld (CPTR),hl
ret
CURSOR_PgUp:
ld hl,(TXTEND)
ld de, VIDEOPORTS/2+1+VIDEOPORTS
and a
sbc hl,de
ld de,(CPTR)
and a
sbc hl,de
ret c
ld hl,(CPTR)
ld de, VIDEOPORTS
add hl,de
ld (CPTR),hl
ret
CURSOR_HOME:
ld hl,TXTBEG
ld (CPTR),hl
ret
CURSOR_END:
ld hl,(TXTEND)
ld de,VIDEOPORTS/2
and a
sbc hl,de
ld (CPTR),hl
ret
;Inicializira spremenljivke in odpre stream za tekst
;Vhod: ni~, Izhod: Ni~
OPEN: ld hl,TXTBEG
ld (CPTR),hl
ex de,hl
ld hl,open_end
call CPYSTR
ld (TXTEND),de
ld de,TXTBEG-VIDEOPORTS/2
ld hl,open_start
call CPYSTR
call UPDATE_TXT_CRC
ret
open_start:
REPT VIDEOPORTS/2
DEFB '>'
ENDM
DEFB 0
open_end:
DEFM ";End"
REPT VIDEOPORTS/2-4
DEFB ' '
ENDM
DEFB 0
RUN: ld hl,TXTBEG
call PHARSE
jr c,run
ret
EDIT:
enext: call POCPTR
call UPDATE_TXT_CRC
ecurs: ld hl,CURSOR_SPEED
eloop: dec hl
ld a,h
or l
jr nz,ekey
VBIOS CURSOR
db VIDEOPORTS/2, NUL
jr ecurs
ekey: call KEY
jr c, eloop
cp 0
jr z,espec
call INSA
jr enext
espec: ld a,c
cp 0Eh
jr nz,left
call BACKSP
jr enext
left: cp 4Bh
jr nz, right
call CURSOR_LEFT
jr enext
right: cp 4Dh
jr nz,pgdn
call CURSOR_RIGHT
jr enext
pgdn: cp 51h
jr nz,pgup
call CURSOR_PgDn
jr enext
pgup: cp 49h
jr nz,home
call CURSOR_PgUp
jr enext
home: cp 47h
jr nz,eend
call CURSOR_HOME
jr enext
eend: cp 4Fh
jr nz,erun
call CURSOR_END
jr enext
erun: cp 3Bh ;F1
jr nz,eopen
call UPDATE_TXT_CRC
VBIOS CLRPAGES
DB NUL
call RUN
jr enext
eopen: cp 3Fh ;F5
jr nz,etime
call OPEN
jr enext
etime: cp 40h ;F6
jr nz,edate
call EDIT_TIME
jp enext
edate: cp 41h ;F7
jp nz,enext
call EDIT_DATE
jp enext
EDIT_TIME:
VBIOS CLRPAGES
DB NUL
ld a,10
ld (TIMECURSOR),a ;nastavi pozicijo kurzorja na prvo mesto
VBIOS POTIME
DB 0,NUL
tcurs: ld hl,CURSOR_SPEED
tloop: dec hl
ld a,h
or l
jr nz,tkey
ld a,(TIMECURSOR)
VBIOS CURSOR
db NUL
jr tcurs
tkey: call KEY
jr c, tloop
cp 0
jr z,tloop
call IS_DIGIT
jr c,tloop
ld c,a
sub '0'
push af ;za~asno shrani na sklad {tevilko
ld a,(TIMECURSOR)
ld b,0 ;stran {t. 0
VBIOS GOTOX
db NUL
ld a,c
VBIOS PO_CHAR
db NUL
ld a,(TIMECURSOR)
tcpdec: dec a
ld (TIMECURSOR),a
cp 8 ;presko~i mesto 8
jr z,tcpdec
cp 5 ;kakor tudi 5.
jr z,tcpdec
cp 2
jr nz,tcurs ;sko~i, ~e ni konec vstavljanja podatov
IRPC register,hldeba
pop af
ld register,a
ENDM
VBIOS SETRTC
db NUL
VBIOS SETTIME
db NUL
ret
EDIT_DATE:
VBIOS CLRPAGES
DB NUL
ld a,9
ld (TIMECURSOR),a ;nastavi pozicijo kurzorja na prvo mesto
dnext: VBIOS PODATE
DB 0,NUL
dcurs: ld hl,CURSOR_SPEED
dloop: dec hl
ld a,h
or l
jr nz,dkey
ld a,(TIMECURSOR)
VBIOS CURSOR
db NUL
jr dcurs
dkey: call KEY
jr c, dloop
cp 0
jr z,dloop
call IS_DIGIT
jr c,dloop
ld c,a
sub '0'
push af ;za~asno shrani na sklad {tevilko
ld a,(TIMECURSOR)
ld b,0 ;stran {t. 0
VBIOS GOTOX
db NUL
ld a,c
VBIOS PO_CHAR
db NUL
ld a,(TIMECURSOR)
dcpdec: dec a
ld (TIMECURSOR),a
cp 8
jr nz,dcnxt
pop af ;najprej se nastavi dan v tednu
VBIOS SETDAY
db NUL
jr dnext
dcnxt: cp 6 ;presko~i 6. in
jr z,dcpdec
cp 3 ; 3. mesto
jr z,dcpdec
cp 0
jr nz,dcurs ;sko~i, ~e ni konec vstavljanja podatov
IRPC register,hldeba
pop af
ld register,a
ENDM
VBIOS SETRTC
db NUL
VBIOS SETDATE
db NUL
ret
commands:
DEFM "Print""Slavko Pirman"";Blink;S D;"
DEFM "Write""Sprejem TV sprejemnikov"";"
DEFM "Move;Hold 10;Time;T;T;T;Date;Hold 12;Shift Up;End;"
END