;***************************************************************************
;*======= Copyright (C) 1985,86 Martin Schoenbeck, Spenge =================*
;* *
;* Behandlung des PC Bildschirms und der Tastatur *
;* *
;***************************************************************************
device pc
dtcbroutines iocontrol
routine 1,devicetype
routine 2,frout_ok
routine 5,nil_size
routine 6,priv_op_question
routine 8,priv_op_question
routine 9,priv_op_question
routine -3,set_attribute
routine -4,set_palette
routine -5,switch_mode
routine -6,draw
routine -7,move
routine -8,pen
routine -9,new_pen1
routine -10,new_pen2
routine -11,mask_mode
routine -1,unknowncontrol
dtcbroutines control32
routine -2,pc_init
routine -1,no_channel_setup
dtcbroutines blockin
dtcbroutines blockout
routine -1,unknowncontrol
dtcbparams pc_output,3 ;typ = nur stream io
;***************************************************************************
pc_init:
breakaddress equ 01bh*4 ;tastatur break adresse
mov bx,0
mov es,bx ;in die interrupt vektoren zeigen
mov word ptr es:[breakaddress+2],cs
mov word ptr es:[breakaddress],offset breakint
mov dx,0 ;cursor in die obere ecke
mov bh,0
mov ah,2 ;cursor setzen
int 10h
mov ax,0600h ;clear entire window
mov cx,0 ;von oben
mov dx,25*256+80 ;bis unten
mov bh,7 ;attribut
int 10h
ret
;
breakint:
push cx
push ax
push ds
push cs
pop ds
; mov al,1
; mov ch,'i'
; call inputinterrupt
mov al,1
mov ch,2 ;sv
call inputinterrupt
pop ds
pop ax
pop cx
iret
;
;
;
REVERS EQU 01110000B ;ATTRIBUT FUER REVERS-VIDEO
NORMAL EQU 00000111B ;ATTRIBUT FUER NORMAL-VIDEO
HOME EQU 1
RECHTS EQU 2
OBEN EQU 3
CLEOP EQU 4 ;CLEAR TO END OF PAGE
CLEOL EQU 5 ;CLEAR TO END OF LINE
CPOS EQU 6 ;CURSOR-POSITIONIERUNG
; ES FOLGEN X- UND Y-KOORDINATE
BELL EQU 7
LINKS EQU 8
UNTEN EQU 10
RETURN EQU 13
BEGMARK EQU 15
ENDMARK EQU 14
MAXCOLS EQU 79
MAXLINES EQU 23
ATTRIBUT DB NORMAL
CURFLAG DB 0
YPOS DB 0
;
;***********************************************************************
;* output auf bildschirm des pc
;*
pc_output:
PUSH CX ;RETTE ORIGINALLAENGE DES STRINGS
CLD ;DIRECTION FLAG : INCREM. SI
MOV SI,BX
OUT: mov al,es:[si] ;HOLE ZEICHEN
inc si
MOV AH,CURFLAG
CMP AH,0
JNZ s0
CMP AL,HOME
JZ s1 ;CURSOR HOME VERLANGT ?
CMP AL,RECHTS
JZ s2 ;CURSOR NACH RECHTS ?
CMP AL,OBEN
JZ s3 ;CURSOR NACH OBEN ?
CMP AL,CLEOP
JZ s4 ;LOESCHEN BIS BILDSCHIRMENDE ?
CMP AL,CLEOL
JZ s5 ;LOESCHEN BIS ZEILENENDE ?
CMP AL,CPOS
JZ s6 ;CURSOR POSITIONIEREN ?
CMP AL,LINKS
JZ s7 ;CURSOR NACH LINKS?
CMP AL,UNTEN
JZ s8 ;CURSOR NACH UNTEN ?
CMP AL,RETURN
JZ s9 ;CURSOR AN DEN ANFANG DER AKT. ZEILE ?
CMP AL,BEGMARK
JZ s10 ;AB JETZT REVERS ?
CMP AL,ENDMARK
JZ s11 ;WIEDER NORMALE VIDEO-DARSTELLUNG ?
CMP AL,BELL
JZ s12 ;KLINGELN ?
;
PUSH CX
PUSH BX
PUSH SI
PUSH AX ;AKTUELLES ATTRIBUT
MOV AL,ATTRIBUT
MOV BL,AL
POP AX
MOV AH,9 ;SCHREIBEN MIT ATTRIBUT
MOV BH,0 ;PAGE #
MOV CX,1
INT 010H ;CALL BIOS
MOV AH,3 ;GET CURRENT CURSOR-POSITION
MOV BH,0 ;PAGE #
INT 010H ;CALL BIOS
INC DL ;COL = COL + 1
CMP DL,MAXCOLS+1
JNZ SAME_LINE
MOV DL,0
CMP DH,MAXLINES
JZ SCROLL_UP
INC DH
SAME_LINE: MOV AH,2
mov bh,0 ;page number
INT 010H
POP SI
POP BX
POP CX
JMP DONE
;
SCROLL_UP: CALL SCROLL
JMP SAME_LINE
;
DONE: DEC CX ;ANZAHL ZEICHEN = ANZAHL ZEICHEN - 1
JNZ OUT ;WEITER ?
POP CX ;ANZAHL UEBERNOMMENE ZEICHEN (S.O.)
RET
;
s0: JMP CUR1
s1: JMP CURHOME
s2: JMP RIGHT
s3: JMP UP
s4: JMP CLEAREOP
s5: JMP CLEAREOL
s6: JMP CURPOS
s7: JMP LEFT
s8: JMP DOWN
s9: JMP ENTER
s10: JMP MARK
s11: JMP UNMARK
s12: JMP KLINGELN
;
;
CURPOS:MOV AL,2
MOV CURFLAG,AL
JMP DONE
;
CUR1: CMP AH,1
JZ CURX
cmp al,maxlines
jc cur1ok
mov al,maxlines
cur1ok:
MOV YPOS,AL
DEC CURFLAG
JMP DONE
CURX: DEC CURFLAG
MOV DH,YPOS;Y-KOORDINATE
cmp al,maxcols
jc curxok
mov al,maxcols
curxok:
MOV DL,AL ;X-KOORDINATE
PUSH BX
PUSH CX
PUSH SI
MOV BH,0 ;PAGE #
MOV AH,2 ;SET CURSOR POSITION
INT 010H ;CALL BIOS
POP SI
POP CX
POP BX
JMP DONE
;
CURHOME: PUSH BX
PUSH CX
PUSH SI
MOV BH,0 ;PAGE #
MOV DX,0000H ;POSITION (0,0)
MOV AH,2
INT 010H ;CALL BIOS
POP SI
POP CX
POP BX
JMP DONE
;
RIGHT: PUSH BX
PUSH CX
PUSH SI
MOV AH,3 ;GET CURRENT CURSOR-POSITION
MOV BH,0 ;PAGE #
INT 010H ;CALL BIOS
CMP DL,MAXCOLS ;X-POSITION DES CURSOR ZU GROSS?
JZ RUNTER
INC DL ;COL = COL + 1
MOV AH,2
INT 010H
POP SI
POP CX
POP BX
JMP DONE
RUNTER:MOV DL,0
MOV BH,0
mov ah,2
INT 010H
JMP down1
;
LEFT: PUSH BX ;KOMMENTARE : S.O.
PUSH CX
PUSH SI
MOV AH,3
MOV BH,0
INT 010H
DEC DL
MOV AH,2
INT 010H
POP SI
POP CX
POP BX
JMP DONE
;
UP: PUSH BX
PUSH CX
PUSH SI
MOV AH,3
MOV BH,0
INT 010H
DEC DH
MOV AH,2
INT 010H
POP SI
POP CX
POP BX
JMP DONE
;
DOWN: PUSH BX
PUSH CX
PUSH SI
down1: MOV AH,3
MOV BH,0
INT 010H
CMP DH,MAXLINES
JZ SCRL
INC DH
MOV AH,2
INT 010H
POP SI
POP CX
POP BX
JMP DONE
SCRL: CALL SCROLL
POP SI
POP CX
POP BX
JMP DONE
;
;
ENTER: PUSH BX
PUSH CX
PUSH SI
MOV AH,3
MOV BH,0
INT 010H
MOV DL,0
MOV AH,2
INT 010H
POP SI
POP CX
POP BX
JMP DONE
;
;
CLEAREOP: PUSH BX
PUSH CX
PUSH SI
MOV AH,3 ;GET CURRENT CURSOR-POSITION
MOV BH,0 ;PAGE #
INT 010H ;CALL BIOS
MOV CX,DX ;CURRENT CURS.POS = UPPER LEFT CORNER
MOV DL,maxcols ;END OF LINE
MOV AX,600H;AH=6 : SCROLL AL=0 : BLANK WINDOW
MOV BH,7 ;ATTRIBUTE FOR CLS
INT 010H ;CLEAR TO END OF LINE
MOV CL,0
CMP DH,MAXLINES
JZ FERTIG
INC CH
MOV DH,MAXLINES ;NEW LOWER RIGHT CORNER
MOV DL,MAXCOLS
MOV AX,600H
MOV BH,7 ;ATTRIBUTE FOR CLS
INT 010H
FERTIG:POP SI
POP CX
POP BX
JMP DONE
;
CLEAREOL: PUSH BX
PUSH CX
PUSH SI
MOV AH,3 ;GET CURRENT CURSOR-POSITION
MOV BH,0 ;PAGE #
INT 010H ;CALL BIOS
MOV CX,DX ;CURRENT CURS.POS = UPPER LEFT CORNER
MOV DL,maxcols ;END OF LINE
MOV AX,600H;AH=6 : SCROLL AL=0 : BLANK WINDOW
MOV BH,7 ;ATTRIBUTE FOR CLS
INT 010H ;CLEAR TO END OF LINE
POP SI
POP CX
POP BX
JMP DONE
;
MARK:
MOV ATTRIBUT,revers
JMP DONE
;
UNMARK:
MOV ATTRIBUT,normal
JMP DONE
;
SCROLL:MOV AH,6
MOV AL,1 ;SCROLL WINDOW ONE LINE UP
MOV CX,0000H ;UPPER LEFT CORNER : (0,0)
MOV DH,MAXLINES
MOV DL,MAXCOLS
mov bh,7 ;attribute for scroll
INT 010H
MOV DH,MAXLINES
MOV DL,0
MOV BH,0 ;PAGE #
RET
;
;
KLINGELN: PUSH BX
PUSH CX
PUSH SI
MOV AH,14
MOV BH,0
INT 010H ;PIEEPS
POP SI
POP CX
POP BX
JMP DONE
;
set_attribute:
mov attribut,dl
ret
set_palette:
mov ah,11 ;set color palette
int 10h
ret
;
;
;
;**********************************************************************
;*
;* checkkey prueft ob ein zeichen auf der tastatur eingegeben wurde
;* und uebergibt dies ggf. dem EUMEL;
;* muss regelmaessig (z.B. aus timerinterrupt aufgerufen werden
;
checkkey:
push ax
checkagain:
MOV AH,1 ;Z-FLAG GESETZT : ZEICHEN !
cli
INT 016H ;INPUT FROM KEYBOARD
JZ NO_KEY ;NEIN,KEINE TASTE GEDRUECKT
MOV AH,0
INT 016H ;JA, ZEICHEN ABHOLEN
cmp ax,0 ;kommt von 'break'
jz no_key
cmp al,0 ;extended code
jnz normal_key
mov al,ah ;mit bit acht kennzeichnen
or al,80h
normal_key:
push cx
MOV CH,AL
MOV AL,1 ;KANAL-NUMMER
CALL inputinterrupt
pop cx
sti
jmp checkagain
NO_KEY:
sti
pop ax
ret
;