summaryrefslogtreecommitdiff
path: root/system/shard-x86-at/7/src/PCSCREEN.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'system/shard-x86-at/7/src/PCSCREEN.ASM')
-rw-r--r--system/shard-x86-at/7/src/PCSCREEN.ASM438
1 files changed, 438 insertions, 0 deletions
diff --git a/system/shard-x86-at/7/src/PCSCREEN.ASM b/system/shard-x86-at/7/src/PCSCREEN.ASM
new file mode 100644
index 0000000..9fe7d9e
--- /dev/null
+++ b/system/shard-x86-at/7/src/PCSCREEN.ASM
@@ -0,0 +1,438 @@
+;***************************************************************************
+;*======= 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
+;
+ \ No newline at end of file