home *** CD-ROM | disk | FTP | other *** search
- ;driver for videx card
- ;general philosophy
- ;BC register for character
- ;DE to work stuff
- ;HL for writing
- FALSE EQU 00h
- TRUE EQU NOT FALSE
- CPM56 EQU TRUE
- CPM60 EQU FALSE
- space equ 20h
- data equ 0e0b1h
- reg equ 0e0b0h
- speaker equ 0e030h
- videx equ 0e300h
- ram0 equ 0ec00h
- ram1 equ 0ed00h
- offrom equ 0efffh
- @gendd macro ?dd
- if (?dd gt 7fh) and (?dd lt 0ff80h)
- db 100h
- else
- db ?dd
- endif
- endm
- jr macro ?n
- db 18h
- @gendd ?n-$-1
- endm
- jrc macro ?n
- db 38h
- @gendd ?n-$-1
- endm
- jrnc macro ?n
- db 30h
- @gendd ?n-$-1
- endm
- jrz macro ?n
- db 28h
- @gendd ?n-$-1
- endm
- jrnz macro ?n
- db 20h
- @gendd ?n-$-1
- endm
- ldir macro ;;LDIR
- db 0edh,0b0h
- endm
- org 100h
- jmp mover
- offset equ 0f300h
- org 180h
- begin: equ $+offset
- lda offrom ;turns off roms
- lda videx ;turns on videx
- call putchar ;
- ora a ;clear carry
- lhld basel
- xchg
- lhld chorz ;store chorz offoffset
- mov a,e
- adc l ;add chorz
- mvi l,0fh ;register f
- mov h,a
- shld reg
- mov a,d ;cvertoffoffset
- aci 00h ;
- dcr l ;0eh
- mov h,a
- shld reg
- lda offrom ;turn off rom
- ret
- ;**************************
- putchar: equ $+offset
- lda escflag ;are we ready to process an escape sequence
- ora a
- jnz escxy
- notesc: equ $+offset
- mov a,c
- cpi ' '
- jc control ;handle control if less than SPACE
- lda chorz
- mov b,a
- call chrput
- jmp done
- ;*********************************
- ;ring the bell
- bell: equ $+offset
- mvi b,0c0h
- bell1: equ $+offset
- mvi c,080h
- bell2: equ $+offset
- dcr c
- jrnz bell2-offset
- lda speaker
- dcr b
- jrnz bell1-offset
- ret
- ebegin equ $+offset
- ;***************************************************
- org 2b0h
- escxy: equ $+offset
- lxi h,escflag
- inr m
- mov a,m
- cpi 02h
- jrnz xy-offset
- notxy: equ $+offset
- mov a,c
- cpi '='
- rz
- mvi m,00h
- cpi 'Y'
- jz cleareos
- cpi '*'
- jz formfeed
- cpi 'T'
- jz cleareol
- ret
- xy: equ $+offset
- mov a,c ;move the character
- sui ' '
- mov c,a
- mov a,m
- cpi 1h
- rz
- cpi 04h
- jrz bknext-offset
- inx h ;points to tempx(now used for tempy)
- mov m,c
- dcx h
- bkhome: equ $+offset
- ret
- ;***************************************************
- bknext: equ $+offset
- ;this is the second character after escape
- inx h ;points to tempx
- mov b,m ;
- dcx h ;points to escflag
- mvi m,00h ;offset escflag to zero
- jmp gotoxy
- eescxy equ $+offset
- ;****************************************************
- org 330h
- tab: equ $+offset
- lxi h,chorz
- mov a,m
- ani 0f8h
- ora a
- adi 08h
- cpi 050h ;chorz number
- jrc backtab-offset
- mvi a,04fh ;
- backtab: equ $+offset
- mov m,a
- ret
- ;****************************************************
- control: equ $+offset
- cpi 'G'-40h ;ctrl-G=BEL
- jz bell
- cpi 'I'-40h ;ctrl-I=TAB
- jz tab
- cpi '['-40h ;ctrl-[=ESC=software leadin
- jz escxy
- cpi 'H'-40h ;ctrl-H=BS
- jz bs
- cpi 'M'-40h ;ctrl-M=CR
- jz cr
- cpi '^'-40h ;ctrl-^=RS=software home cursor
- jz homecursor
- cpi 'L'-40h ;ctrl-L=FF=software cursor forward
- jz done
- cpi 'K'-40h ;ctrl-K=VT=software cursor up
- jz cursorup
- cpi 'J'-40h ;ctrl-J=LF=software cursor down
- jz lf
- ret
- etab equ $+offset
- ;************************************
- org 380h
- formfeed: equ $+offset
- call homecursor
- cleareos: equ $+offset
- call cleareol
- lxi h,cvert
- mov a,m
- push a
- clloop: equ $+offset
- lxi h,cvert
- inr m
- mov a,m
- cpi 018h ;24 columns
- jrnc clback-offset
- call vtabz
- call etb
- jmp clloop
- clback: equ $+offset
- pop a
- jmp vtab
- ;****************************************
- etb: equ $+offset
- mvi b,0h
- jr etbloop-offset
- cleareol: equ $+offset
- lda chorz
- mov b,a
- etbloop: equ $+offset
- mvi c,' '
- call chrput
- inr b
- mov a,b
- cpi 050h
- jrc etbloop-offset
- ret
- ;**************************************************
- homecursor: equ $+offset
- xra a
- mov b,a
- mov c,a
- gotoxy: equ $+offset
- ;when entered from escxy b=cvert, c=chorz
- mov h,b
- mov l,c
- shld chorz
- mov a,b
- vtab: equ $+offset
- sta cvert
- vtabz: equ $+offset
- lhld chorz
- mov a,h
- add a
- add a ;x4
- add h ;x5
- ora a ;clear carry
- mov h,a
- lda start
- adc h
- bascal1: equ $+offset
- mov l,a
- rrc
- rrc
- rrc
- rrc
- ani 0fH ;x80
- mov h,a
- mov a,l
- rlc
- rlc
- rlc
- rlc
- ani 0f0H ;x80
- mov l,a
- shld basel
- ret
- ;*************************
- cr: equ $+offset
- mvi a,0h
- sta chorz
- ret
- ;********************************************
- bs: equ $+offset
- lxi h,chorz
- mov a,m
- sui 01h
- jrnc backbs-offset
- mvi m,4fh
- jmp cursorup
- backbs: equ $+offset
- mov m,a
- ret
- eformfeed equ $+offset
- ;*******************************************
- org 400h
- done: equ $+offset
- lxi h,chorz
- inr m
- mov a,m
- cpi 050h ;width
- rc
- call cr
- jmp lf
- ret
- ;***********************************
- cursorup: equ $+offset
- lxi h,cvert
- dcr m
- jp backcu
- inr m
- backcu: equ $+offset
- jmp vtabz
- ;**********************************
- lf: equ $+offset
- lxi h,cvert
- inr m
- mov a,m
- cpi 018h ;height
- jrc backlf-offset
- dcr m
- jrnz scroll-offset
- backlf: equ $+offset
- jmp vtabz
- scroll: equ $+offset
- lda cvert
- sta tempy
- ora a
- lda start
- adi 05h
- ani 07fh
- sta start
- call bascal1
- lda basel
- mvi l,0dh
- mov h,a
- shld reg
- dcr l
- lda baseh
- mov h,a
- shld reg
- mvi a,17h
- call vtab
- call etb
- lda tempy
- jmp vtab
- psncalc: equ $+offset
- ;************
- ; calculates position in page
- ;and offsets the videx card
- ;B contains the chorz
- ;returns the result in E and the carry flag
- mov a,b
- ora a ;clear carry
- lhld basel
- xchg
- adc e
- mov e,a
- mvi a,00h
- adc d
- rrc ;determine the carry flag
- push psw
- ani 03h
- rlc ;x2
- rlc ;x4
- lxi h,reg
- ora l ;a=a+l
- mov l,a
- mov a,m ;toggle the correct page
- pop psw
- ret
- edone equ $+offset
- ;******************************
- ;CHRPUT B contains chorz, C contains the character
- ;
- ;destroys HLchrput: equ $+offset
- org 480h
- chrput: equ $+offset
- call psncalc
- jrnc lowpage-offset
- hipage: equ $+offset
- lxi h,ram1
- jr writeit-offset
- lowpage: equ $+offset
- lxi h,ram0
- writeit: equ $+offset
- mov a,e
- ora l
- mov l,a
- mov a,c
- ani 7fh
- mov m,a
- ret
- ;********************************
- temp: equ $+offset
- db 0
- chorz: equ $+offset
- db 0
- cvert: equ $+offset
- db 0
- basel: equ $+offset
- db 0
- baseh: equ $+offset
- db 0
- escflag: equ $+offset
- db 0
- tempx: equ $+offset
- db 0
- tempy: equ $+offset
- db 0
- start: equ $+offset
- db 0
- echrput equ $+offset
- org 500h
- initseq: equ $
- db 07bh,050h,062h,029h,01bh,8,018h,019h,0,8,0c0h
- db 8,0,0,0,0
- initflag: equ $
- db 0
- init: equ $
- lda initflag
- ora a
- jrnz backinit
- lda offrom ;turn off card
- lda videx ;and on again
- lxi b,1000h ;16 registers to initialize
- lxi d,initseq
- loop2: equ $
- xchg ;h contains initialization
- mov a,m ;in the accumulator
- xchg ;back agian
- mov h,a
- mov l,c
- shld reg
- inr c
- dcr b
- inx d
- jrnz loop2
- mvi a,0h
- sta escflag
- sta tempx
- sta start
- call formfeed
- lda offrom
- lda initflag
- dcr a
- sta initflag
- backinit: equ $
- ret
- mover:
- lxi d,begin
- lxi h,begin-offset
- lxi b,ebegin-begin
- ldir
- lxi d,escxy
- lxi h,escxy-offset
- lxi b,eescxy-escxy
- ldir
- lxi d,tab
- lxi h,tab-offset
- lxi b,etab-tab
- ldir
- lxi d,formfeed
- lxi h,formfeed-offset
- lxi b,eformfeed-formfeed
- ldir
- lxi d,done
- lxi h,done-offset
- lxi b,edone-done
- ldir
- lxi d,chrput
- lxi h,chrput-offset
- lxi b,echrput-chrput
- ldir
- call init
- lxi h,0f480h
- ;ONE OF THE FOLLOWING EQUATES SHOULD BE TRUE
- IF CPM56
- shld 0da0dh
- ENDIF
- IF CPM60
- shld 0fa0dh
- ENDIF
- jmp 0000 ;WARM BOOT
- end
-
-
-