From 98cab31fc3659e33aef260efca55bf9f1753164c Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Mon, 11 Feb 2019 11:49:19 +0100 Subject: Add source files from Michael --- system/shard-x86-at/7/src/PCSCREEN.ASM | 438 +++++++++++++++++++++++++++++++++ 1 file changed, 438 insertions(+) create mode 100644 system/shard-x86-at/7/src/PCSCREEN.ASM (limited to 'system/shard-x86-at/7/src/PCSCREEN.ASM') 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 -- cgit v1.2.3