home *** CD-ROM | disk | FTP | other *** search
- title 'Terminal Emulation (ADM-31 with K-Pro support) 26 April 87'
-
-
- maclib z80
-
- maclib cxequ
-
- lines equ 24
-
- public ?out80,ADM31
-
- ; Changes to this module were to remove all 40 column code. Original
- ; Copyright is still maintained by Commodore
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ; 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 (not supported yet)
- ;
- ;
- ; 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)
- ;
- page
-
- dseg
- ;
- ;
- ;
- ;
- ;
- ;
- ?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
- ;
- ; Half Intensity Off
- ;
- esc$lfp:
- mvi c,00000001b ; turn intensity up
- jr set$FR$atr$c
- ;
- ; Half Intensity On
- ;
- esc$rtp:
- mvi c,00000000b ; turn intensity down
- parn$cont:
- mvi b,00000001b ; attribute bit to change
- jr set$FR$attr
-
- ;
- ; Set Attribute sequence
- ;
- esc$G:
- call cont$later
- ;
- ; ESC G char
- ;
- call remove$exec$adr
- sui '4' ; '4' reverse video on
- jrz esc$G$4
- inr a ; '3' underline attr on
- jrz esc$G$3
- inr a ; '2' blink attr on
- jrz esc$G$2
- inr a ; '1' alt char set
- jrz esc$G$1
- inr a ; '0' clear attributes
- rnz
- ;
- ; 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 c,00000000b ; select alt character set
- mvi b,10000000b
- jr set$FR$attr
-
- ;
- ; Blinking On
- ;
- esc$G$2:
- mvi c,00010000b ; turn on blink attr
- jr set$FR$atr$c
-
- ;
- ; Under line
- ;
- esc$G$3:
- mvi c,00100000b ; turn on underline bit
- jr set$FR$atr$c
-
- ;
- ; Reverse Video On
- ;
- esc$G$4:
- mvi c,01000000b ; turn attributes on
-
- set$FR$atr$c:
- mov b,c ; reverse attr
- set$FR$attr:
- 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 esc ; ESC ESC
-
- esc$tbl$lng equ $-esc$table
-
-
- ;
- ; table scanned bottom to top
- ;
- esc$exec$adr:
- dw esc$esc ; ESC ESC ESC color
-
- 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
-
- of screen
- dw esc$t ; ESC t clear