;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