title 'Terminal Emulation (ADM-31 with K-Pro support) 21 May 86' maclib z80 maclib cxequ lines equ 24 public ?out40,?out80,ADM31 ; ; ADM3A ; ; ; ESC = row col cursor position ; ESC ESC ESC color set color ; added for C128 CP/M ; ^H cursor left ; ^L cursor right ; ^J cursor down ; ^K cursor up ; ^Z home and clear screen ; ^M carrage return ; ^G bell ; ; ADM31 ; ; ; ESC = row col cursor position ; ESC ESC ESC color set color ; added for C128 CP/M ; ESC T clear to end of line ; ESC t clear to end of line ; ESC Y clear to end of screen ; ESC y clear to end of screen ; ESC : home & clear screen ; ESC * home & clear screen ; ESC ) Half intensity on ; ESC ( Half intensity off ; ESC G 4 Reverse video on ; ESC G 2 Blinking on ; ESC G 0 Rev. video and blinking off ; ESC E Insert line ; ESC Q Insert Character ; ESC R Delete Line ; ESC W Delete Character ; ^H cursor left ; ^L cursor right ; ^J cursor down ; ^K cursor up ; ^Z home and clear screen ; ^M carriage return ; ^G bell ; page ; ; KPRO II Terminal control sequences ; ; ; Cursor Control ; ; ^H cursor left (bs) ; ^L cursor right ; ^J cursor down ; ^K cursor up ; ^^ home cursor ; ^Z home cursor & clear screen ; ^M carriage return ; ; Cursor Positioning ; ; ESC = R C (R & C =' '+position) ; ; Line Insert/Delete ; ; ESC E Line Insert ; ESC R Line Delete ; ; Clear to End of Screen/Line ; ; ^X Clear to End of Line ; ^W Clear to End of Screen ; ; Set Greek or ASCII (not supported) ; ; ESC A Set ASCII ; ESC G Set Greek (lower case letters print as Greek Alphabet) ; ; KAYPRO 84 (???) screen commands ; ; ESC B turn attrubute on ; ESC C turn attrubute off ; ; where is defined as: ; 0=reverse video ; 1= ; 2= ; 3= ; ; ; ; The following two sequences are ; use but I do not know what function ; they perform. (added 21 May 86) ; ; ESC D ; ESC L ; page dseg ; ; ; ?out40: mvi a,FR$40 lxi h,parm$area$40 jr out$cont ; ; ; ?out$80: xra a ; 80 column offset is 0 lxi h,parm$area$80 out$cont: sta fun$offset mvi a,7fh ana c mov c,a shld parm$base lhld emulation$adr pchl page ; ; ADM-31 terminal emulation ; ADM31: lhld parm$base ; 1st parm is exec adr (2 bytes) mov a,m inx h mov h,m mov l,a ora h ; L is in A already, test HL=0 mov a,c ; C is char to output jrz start$checking pchl ; ; ; start$checking: lxi h,control$table lxi b,cnt$tbl$lng ccir lxi h,control$exec$adr jrz find$exec$adr cpi 20h rc do$direct: mov d,a TJMP FR$wr$char page ; ; ; char$esc: ; ESC call cont$later ; ; ESC char look for char in the ESC table ; call remove$exec$adr lxi h,esc$table lxi b,esc$tbl$lng ccir rnz ; bad esc sequence lxi h,esc$exec$adr find$exec$adr: dad b dad b mov a,m inx h mov h,m mov l,a pchl page ; ; ; cont$later: pop h ; get address to cont at in H jr save$exec$adr ; save it ; ; ; remove$exec$adr: lxi h,0 save$exec$adr: xchg lhld parm$base mov m,e inx h mov m,d ret ; ; ; esc$esc: call cont$later ; ; check for ESC ESC ESC ; cpi esc ; check if 3rd char is an ESC jrnz remove$exec$adr call cont$later ; ; set current character as the attr ; mov b,a TCALL FR$color jr remove$exec$adr page ; ; ; esc$equ: call cont$later ; ; ESC = R ; lhld parm$base inx h inx h sui ' ' ; remove ascii bias mov m,a cpi '8'-' ' ; test for line 25 (A=24?) jrnz not$status$line ; no, jmp inr a ; yes, A=25 sta paint$size ; set 40 column repaint to 25 lines not$status$line: call cont$later ; ; ESC = R C (go do it) ; sui ' ' mov e,a ; column # to E lhld parm$base inx h inx h mov d,m ; row # to D TCALL FR$cursor$pos jr remove$exec$adr page ; ; ; char$cnt$z: ; ^Z home and clear screen lxi d,lines*256+0 ; B=24(row) C=0(col) TCALL FR$cursor$pos call esc$t ; clear the status line lxi d,0 TCALL FR$cursor$pos esc$y: TJMP FR$CES ; clear to end of screen home$cursor: lxi d,0 TJMP FR$cursor$pos esc$t: TJMP FR$CEL ; clear to end of line ; ; ; do$cr: TJMP FR$do$cr ; ; ; cursor$rt: TJMP FR$cursor$rt ; ; ; cursor$up: TJMP FR$cursor$up ; ; ; cursor$down: TJMP FR$cursor$down ; ; ; cursor$left: TJMP FR$cursor$left page ; ; placed in common so that link and gencpm will not ; cause this code to show up at address 0D000h to 0DFFFh ; char$cnt$g: ; ^G bell RJMP FR$bell ; ; delete character ; esc$W: TJMP FR$char$del ; ; delete line ; esc$R: TJMP FR$line$del ; ; insert character ; esc$Q: TJMP FR$char$ins ; ; insert line ; esc$E: TJMP FR$line$ins page ; ; ESC C atribute off ; esc$C: call cont$later lxi b,4*256+4 ; max+1 num, offset jr esc$num$cont ; ; ESC B atribute on ; esc$B: call cont$later lxi b,4*256+0 ; max+1 num, offset jr esc$num$cont ; ; Set Attribute sequence ; esc$G: call cont$later lxi b,5*256+8 ; max+1 num, table offset esc$num$cont: call remove$exec$adr sui '0' ; remove ascii bias cmp b ; number of functions rnc add c ; get offset mov c,a mvi b,0 lxi h,esc$num$tbl jmp find$exec$adr page ; ; ; esc$D: esc$L: call cont$later ; wait for num1 call cont$later ; wait for num2 call cont$later ; wait for num3 call cont$later ; wait for num4 jmp remove$exec$adr page ; ; Half Intensity Off ; esc$lfp: mvi b,00000001b ; turn intensity up jr set$atr$on ; ; Half Intensity On ; esc$rtp: mvi b,00000001b ; turn intensity down jr set$atr$off ; ; Rev. Video, blink, atl char set, and underline off ; esc$G$0: mvi c,10000000b ; turn attributes off mvi b,11110000b ; attribute bit to change jr set$FR$attr ; ; Select alt character set ; esc$G$1: mvi b,10000000b ; select alt character set jr set$atr$off ; ; Blinking On ; esc$B$2: ; turn flash ON ??? esc$G$2: mvi b,00010000b ; turn on blink attr jr set$atr$on ; ; ; esc$C$2: ; turn flash OFF ??? mvi b,00010000b jr set$atr$off ; ; Under line ; esc$B$3: ; turn underline ON ??? esc$G$3: mvi b,00100000b ; turn on underline bit jr set$atr$on ; ; ; esc$C$3: ; turn under line OFF ??? mvi b,00100000b jr set$atr$off ; ; Reverse Video On ; esc$B$0: esc$G$4: mvi b,01000000b ; turn attributes on set$atr$on: mov c,b ; reverse attr set$FR$attr: TJMP FR$attr ; ; ; esc$C$1: ; turn half bright OFF ??? mvi b,00000001b jr set$atr$on ; ; ; esc$B$1: ; set half bright ON ??? mvi b,00000001b jr set$atr$off ; ; turn reverse video off ; esc$C$0: mvi b,01000000b ; attribute to turn off set$atr$off: mov a,b cma ana b mov c,a TJMP FR$attr page ; ; table scanned top to bottom ; control$table: db 07h ; ^G bell db bs ; ^H cursor left db lf ; ^J cursor down db 0Bh ; ^K cursor up db 0Ch ; ^L cursor right db cr ; ^M carrage return db 1Ah ; ^Z home and clear screen db esc ; ESC db 18h ; ^X Clear to End of Line (K-Pro) db 17h ; ^W Clear to End of Screen (K-Pro) db 1Eh ; ^^ home cursor (K-Pro) cnt$tbl$lng equ $-control$table ; ; table scanned bottom to top ; control$exec$adr: dw home$cursor ; ^^ home cursor (K-Pro) dw esc$y ; ^W CES (K-Pro) dw esc$t ; ^X CEL (K-Pro) dw char$esc ; ESC dw char$cnt$z ; ^Z home and clear screen dw do$cr ; ^M carriage return dw cursor$rt ; ^L cursor right dw cursor$up ; ^K cursor up dw cursor$down ; ^J cursor down dw cursor$left ; ^H cursor left dw char$cnt$g ; ^G bell page ; ; table scanned top to bottom ; esc$table: db '=' ; ESC = R C db 'T' ; ESC T clear to end of line db 't' ; ESC t clear to end of line db 'Y' ; ESC Y clear to end of screen db 'y' ; ESC y clear to end of screen db ':' ; ESC : home & clear screen db '*' ; ESC * home & clear screen db 'E' ; ESC E Insert line db 'Q' ; ESC Q Insert Character db 'R' ; ESC R Delete Line db 'W' ; ESC W Delete Character db ')' ; ESC ) Half intensity on db '(' ; ESC ( Half intensity off db 'G' ; ESC G 4 Reverse video on ; ESC G 2 Blinking on ; ESC G 0 Rev. video and blinking off db 'B' ; ESC B atribute on db 'C' ; ESC C atribute off db esc ; ESC ESC db 'D' ; ESC D ??? db 'L' ; ESC L ??? esc$tbl$lng equ $-esc$table ; ; table scanned bottom to top ; esc$exec$adr: dw esc$L ; ESC L A kaypro function ??? dw esc$D ; ESC D A kaypro function ??? dw esc$esc ; ESC ESC ESC color dw esc$C ; ESC C atribute off dw esc$B ; ESC B atribute on dw esc$G ; ESC G 4 Reverse video on ; ESC G 2 Blinking on ; ESC G 0 Rev. video and blinking off dw esc$lfp ; ESC ( Half intensity off dw esc$rtp ; ESC ) Half intensity on dw esc$W ; ESC W Delete Character dw esc$R ; ESC R Delete Line dw esc$Q ; ESC Q Insert Character dw esc$E ; ESC E Insert line dw char$cnt$z ; ESC * home & clear screen dw char$cnt$z ; ESC : home & clear screen dw esc$y ; ESC y clear to end of screen dw esc$y ; ESC Y clear to end of screen dw esc$t ; ESC t clear to end of line dw esc$t ; ESC T clear to end of line dw esc$equ ; ESC = RC ; ; ; esc$num$tbl: dw esc$b$0 ; ESC B0 reverse video ON dw esc$b$1 ; ESC B1 ??? half bright ON dw esc$b$2 ; ESC B2 ??? blink ON dw esc$b$3 ; ESC B3 ??? under line ON dw esc$c$0 ; ESC C0 reverse video OFF dw esc$c$1 ; ESC C1 ??? half bright OFF dw esc$c$2 ; ESC C2 ??? blink OFF dw esc$c$3 ; ESC C3 ??? under line OFF dw esc$g$0 ; ESC G0 clear attributes (all G functions) dw esc$g$1 ; ESC G1 alt char set dw esc$g$2 ; ESC G2 blink attr on dw esc$g$3 ; ESC G3 underline attr on dw esc$g$4 ; ESC G4 reverse video on