mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
4.8 KiB
173 lines
4.8 KiB
TITLE CDADM3 - CRT DRIVER FOR LEAR-SIEGLER ADM-3A
|
|
;**********************************************************************
|
|
;*** ***
|
|
;*** COPYRIGHT (C) 1980, MICROSOFT ***
|
|
;*** ***
|
|
;**********************************************************************
|
|
|
|
ENTRY $CRLEN,$CRWID,$SETCR,$CURON,$CUROF
|
|
ENTRY $CURBK,$ERASE,$ALARM
|
|
ENTRY $EOL,$HILIT,$LOLIT
|
|
ENTRY $CLIST,$TLIST,$FLIST
|
|
ENTRY $INCRT,$OUCRT
|
|
|
|
EXT $OUTCH,$INKEY
|
|
EXT $CMPL,$CMPR,$MULDE,$ROWCL
|
|
|
|
|
|
;****************************************************
|
|
; KEYBOARD CODE DEFINITIONS
|
|
;****************************************************
|
|
;
|
|
|
|
$CLIST: ;EDITING KEY DEFINITIONS
|
|
DB X'15' ;LINE DELETE (CTL-U)
|
|
DB X'7F' ;CHAR DELETE (DEL)
|
|
DB X'0C' ;FORWARD SPACE (CTL-L)
|
|
DB X'08' ;BACK SPACE (CTL-H)
|
|
DB X'2B' ;PLUS SIGN
|
|
DB X'2D' ;MINUS SIGN
|
|
DB 0 ;END OF LIST
|
|
|
|
$TLIST: ;TERMINATOR KEY DEFINITIONS
|
|
DB X'02' ;BACKTAB (CTL-B)
|
|
DB X'1B' ;ESCAPE KEY (ESC)
|
|
DB X'09' ;FORWARD TAB (CTL-I)
|
|
DB X'0D' ;CARRIAGE RETURN
|
|
DB X'0A' ;LINE FEED
|
|
DB 0 ;END OF LIST
|
|
|
|
$FLIST: ;FUNCTION KEY DEFINITIONS
|
|
DB X'01' ;CTL-A
|
|
DB X'03' ;CTL-C
|
|
DB X'18' ;CTL-X
|
|
DB 0 ;END OF LIST
|
|
|
|
|
|
;****************************************************
|
|
; TERMINAL SCREEN DIMENSIONS
|
|
;****************************************************
|
|
;
|
|
$CRLEN: DB 24D ;24 LINES
|
|
$CRWID: DB 80D ;80 COLUMNS
|
|
|
|
;****************************************************
|
|
; TERMINAL OUTPUT CODES
|
|
;****************************************************
|
|
;
|
|
ESCAPE EQU X'1B'
|
|
BSPACE EQU X'08'
|
|
BELL EQU X'07'
|
|
CLEAR EQU X'1A'
|
|
|
|
;****************************************************
|
|
; O U T P U T F U N C T I O N S
|
|
;****************************************************
|
|
; SET CURSOR POSITION
|
|
; [H] = ROW NUMBER
|
|
; [L] = COLUMN NUMBER
|
|
;****************************************************
|
|
;
|
|
$SETCR:
|
|
MVI A,ESCAPE
|
|
CALL $OUTCH ;SEND ESC
|
|
MVI A,"="
|
|
CALL $OUTCH ;SEND =
|
|
MOV A,H
|
|
ADI X'1F' ;ADJUST ROW NUMBER
|
|
CALL $OUTCH ;SEND ROW
|
|
MOV A,L
|
|
ADI X'1F' ;ADJUST COLUMN NUMBER
|
|
JMP $OUTCH ;SEND COLUMN
|
|
|
|
;****************************************************
|
|
; CURSOR ON/OFF - NOT AVAILABLE ON ADM-3A
|
|
; HIGHLIGHT VIDEO - NOT AVAILABLE ON ADM-3A
|
|
;****************************************************
|
|
;
|
|
$CURON:
|
|
$CUROF:
|
|
$HILIT:
|
|
$LOLIT:
|
|
RET ;NOT AVAILABLE ON ADM-3A
|
|
|
|
;****************************************************
|
|
; BACKSPACE CURSOR
|
|
;****************************************************
|
|
;
|
|
$CURBK: MVI A,BSPACE
|
|
JMP $OUTCH
|
|
|
|
;****************************************************
|
|
; ERASE TO END OF SCREEN
|
|
; [HL] = SEQUENTIAL CURSOR POSITION
|
|
;****************************************************
|
|
;
|
|
$ERASE: LXI D,1 ;SEQUENTIAL POSITION 1 (HOME)
|
|
CALL $CMPR ; VS CURRENT POSITION
|
|
JZ CLSCR ;IF HOME POSITION, USE CLEAR SCREEN CODE
|
|
PUSH H ;CURRENT CURSOR POSITION
|
|
CALL $CMPL ;NEGATE IT
|
|
PUSH H ; AND SAVE ON STACK
|
|
LDA $CRLEN ;SCREEN LENGTH
|
|
MOV D,A ; TO D
|
|
LDA $CRWID ;SCREEN WIDTH
|
|
MOV E,A ; TO E
|
|
CALL $MULDE ;PRODUCT IS SEQ POS OF END OF SCREEN
|
|
POP D ;- CURRENT POS
|
|
DAD D ;DIFFERENCE
|
|
INX H ; PLUS ONE IS NUMBER OF SPACES TO SEND
|
|
ERASLP: MVI A,' ' ;ASCII SPACE
|
|
CALL $OUTCH ;SEND THE SPACE
|
|
DCX H ;DECR COUNTER
|
|
MOV A,H ;IF SPACE COUNTER
|
|
ORA L ; IS NOT ZERO
|
|
JNZ ERASLP ; MORE SPACES TO SEND
|
|
POP H ;ORIGINAL CURSOR POSITION
|
|
CALL $ROWCL ;CONVERT TO ROW AND COLUMN FORMAT
|
|
JMP $SETCR ;PUT CURSOR BACK TO ORIGINAL POSITION
|
|
CLSCR: MVI A,CLEAR ;CLEAR SCREEN CODE
|
|
JMP $OUTCH ;SEND IT AND RETURN
|
|
|
|
;****************************************************
|
|
; ERASE TO END OF LINE
|
|
; [H] = CURRENT ROW NUMBER
|
|
; [L] = CURRENT COLUMN NUMBER
|
|
;****************************************************
|
|
;
|
|
$EOL: PUSH H ;CURRENT CURSOR POSITION
|
|
LDA $CRWID ;SCREEN WIDTH
|
|
MOV E,A ; TO E
|
|
EOLOOP: MVI A,' ' ;ASCII SPACE
|
|
CALL $OUTCH ;SEND IT
|
|
INR L ;BUMP CURRENT COLUMN
|
|
MOV A,E ;SCREEN WIDTH
|
|
CMP L ; VS CURRENT COLUMN
|
|
JNC EOLOOP ;LOOP IF COLUMN <= WIDTH
|
|
POP H ;ORIGINAL CURSOR POSITION
|
|
JMP $SETCR ;SET CURSOR AND RETURN
|
|
|
|
;****************************************************
|
|
; SOUND AUDIBLE TONE
|
|
;****************************************************
|
|
;
|
|
$ALARM: MVI A,BELL
|
|
JMP $OUTCH ;SEND BELL CODE AND RETURN
|
|
|
|
|
|
|
|
|
|
;****************************************************
|
|
; INPUT CHARACTER FROM TERMINAL
|
|
;****************************************************
|
|
;
|
|
$INCRT: JMP $INKEY ;GET KEY AND RETURN
|
|
|
|
;****************************************************
|
|
; OUTPUT CHARACTER TO TERMINAL
|
|
;****************************************************
|
|
;
|
|
$OUCRT: JMP $OUTCH ;PUT CHARACTER AND RETURN
|
|
|
|
END
|
|
|