464 lines
6.6 KiB
NASM
464 lines
6.6 KiB
NASM
;Driver video per NXOS
|
|
|
|
MaxProcess equ 7
|
|
|
|
org 0h
|
|
|
|
InstallDriver:
|
|
;Questa procedura installa l'interrupt 24h che sar… usato dal driver video
|
|
|
|
cli
|
|
xor ax,ax
|
|
mov es,ax
|
|
mov ax,offset Int24h
|
|
mov es:[24h*4],ax
|
|
mov ax,cs
|
|
mov es:[24h*4+2],ax
|
|
|
|
mov ah,02h ;termina il processo
|
|
mov bl,1 ;non libera la memoria (perchŠ le procedure devono
|
|
;essere sempre presenti in memoria)
|
|
int 20h
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
Int24h:
|
|
cmp ah,00h
|
|
je Int24h_00h
|
|
cmp ah,01h
|
|
je Int24h_01h
|
|
cmp ah,02h
|
|
je Int24h_02h
|
|
cmp ah,03h
|
|
je Int24h_03h
|
|
cmp ah,04h
|
|
je Int24h_04h
|
|
cmp ah,05h
|
|
je Int24h_05h
|
|
cmp ah,06h
|
|
je Int24h_06h
|
|
cmp ah,07h
|
|
je Int24h_07h
|
|
iret
|
|
|
|
Int24h_00h:
|
|
call WriteChar
|
|
iret
|
|
Int24h_01h:
|
|
call WriteString
|
|
iret
|
|
Int24h_02h:
|
|
call SetVisibleProcess
|
|
iret
|
|
Int24h_03h:
|
|
call WriteNumber
|
|
iret
|
|
Int24h_04h:
|
|
call ClearScreen
|
|
iret
|
|
Int24h_05h:
|
|
call GetCursorPos
|
|
iret
|
|
Int24h_06h:
|
|
call SetCursorPos
|
|
iret
|
|
Int24h_07h:
|
|
call GetChar
|
|
iret
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
WriteChar:
|
|
;input AL=carattere da scrivere
|
|
; BL=attributi
|
|
|
|
;Da aggiungere: supporto per lo "scrolling" verticale
|
|
|
|
;Finalmente sostituita la procedura del bios con una mia procedura!
|
|
|
|
push ax
|
|
push bx
|
|
push cx
|
|
push dx
|
|
push si
|
|
|
|
mov ah,03h
|
|
int 20h
|
|
|
|
; mov dx,si
|
|
; mov bh,dl
|
|
|
|
cmp al,13
|
|
je WriteChar_13
|
|
cmp al,10
|
|
je WriteChar_10
|
|
test al,al
|
|
jz WriteChar_End
|
|
cmp al,9
|
|
je WriteChar_09
|
|
|
|
push ax
|
|
push di
|
|
push es
|
|
|
|
call GetCursorPos
|
|
|
|
mov di,dx
|
|
shr di,8
|
|
push ax
|
|
mov ax,80
|
|
push dx
|
|
mul di
|
|
pop dx
|
|
xor dh,dh
|
|
mov di,ax
|
|
add di,dx
|
|
add di,di
|
|
|
|
mov ax,0b000h
|
|
mov es,ax
|
|
add di,8000h
|
|
mov ax,si
|
|
shl ax,12
|
|
add di,ax
|
|
pop ax
|
|
mov ah,bl
|
|
stosw
|
|
|
|
pop es
|
|
pop di
|
|
pop ax
|
|
|
|
|
|
jmp WriteChar_AggiornaCursore
|
|
|
|
WriteChar_13:
|
|
call GetCursorPos
|
|
|
|
mov dl,0
|
|
; mov ah,02h
|
|
; int 10h
|
|
call SetCursorPos
|
|
jmp WriteChar_End
|
|
|
|
WriteChar_10:
|
|
call GetCursorPos
|
|
|
|
cmp dh,24
|
|
je WriteChar_ScrollUp
|
|
|
|
inc dh
|
|
; mov ah,02h
|
|
; int 10h
|
|
call SetCursorPos
|
|
jmp WriteChar_End
|
|
|
|
WriteChar_09:
|
|
call GetCursorPos
|
|
add dl,9
|
|
cmp dl,80
|
|
jbe WriteChar_09_Ok
|
|
|
|
sub dl,80
|
|
inc dh
|
|
|
|
WriteChar_09_OK:
|
|
call SetCursorPos
|
|
jmp WriteChar_End
|
|
|
|
WriteChar_AggiornaCursore:
|
|
call GetCursorPos
|
|
|
|
cmp dl,79
|
|
je WriteChar_NextLine
|
|
inc dl
|
|
; mov ah,02h
|
|
; int 10h
|
|
call SetCursorPos
|
|
|
|
WriteChar_End:
|
|
pop si
|
|
pop dx
|
|
pop cx
|
|
pop bx
|
|
pop ax
|
|
|
|
ret
|
|
|
|
WriteChar_NextLine:
|
|
cmp dh,24
|
|
je WriteChar_ScrollUp
|
|
mov dl,0
|
|
inc dh
|
|
; mov ah,02h
|
|
; int 10h
|
|
call SetCursorPos
|
|
jmp WriteChar_End
|
|
|
|
WriteChar_ScrollUp:
|
|
;int 10h funzione 06h:scroll up window
|
|
;Da sostituire con una mia funzione: questa funziona solo con le pagine attive
|
|
xor cx,cx ;in CX c'Š il punto in alto a sinistra della finestra
|
|
mov ah,06h
|
|
mov al,1 ;in AL c'Š il numero di righe da aggiungere
|
|
mov bh,07h ;in BH ci sono gli attributi per la nuova riga
|
|
mov dh,24
|
|
mov dl,79
|
|
int 10h
|
|
jmp WriteChar_End
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
GetChar:
|
|
;input DL=X, DH=Y
|
|
;output AH=attributi del carattere, AL=carattere letto
|
|
|
|
push dx
|
|
call GetCursorPos
|
|
mov bx,dx
|
|
pop dx
|
|
call SetCursorPos
|
|
|
|
push bx
|
|
|
|
mov ah,03h
|
|
int 20h
|
|
mov bx,si
|
|
mov bh,bl
|
|
mov ah,08h
|
|
int 10h
|
|
|
|
pop dx
|
|
call SetCursorPos
|
|
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
WriteString:
|
|
;input DS:[SI] --> indirizzo della stringa
|
|
; BL --> attributi dei caratteri
|
|
;Nota: la stringa finisce con uno 0 o con un '$'
|
|
push ax
|
|
push si
|
|
|
|
WriteString_Ini:
|
|
mov al,[si]
|
|
test al,al
|
|
jz WriteString_EndString
|
|
cmp al,'$'
|
|
je WriteString_EndString
|
|
|
|
call WriteChar
|
|
inc si
|
|
jmp WriteString_Ini
|
|
|
|
WriteString_EndString:
|
|
pop si
|
|
pop ax
|
|
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
SetVisibleProcess:
|
|
;input SI --> numero del processo da rendere visibile
|
|
|
|
cmp si,(MaxProcess)
|
|
jae SetVisibleProcess_End
|
|
|
|
cli
|
|
|
|
push ax
|
|
mov ax,si
|
|
|
|
mov ah,05h
|
|
int 10h
|
|
|
|
mov ah,04h
|
|
int 20h
|
|
|
|
pop ax
|
|
|
|
SetVisibleProcess_End:
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
WriteNumber:
|
|
;Scrive un numero decimale
|
|
;input DX=numero
|
|
push ax
|
|
push cx
|
|
push dx
|
|
|
|
push dx
|
|
pop ax
|
|
|
|
mov cx,0ffffh
|
|
push cx
|
|
mov cx,10
|
|
a1_shownum:
|
|
xor dx,dx
|
|
div cx
|
|
or dl,30h
|
|
push dx
|
|
cmp ax,0
|
|
jne a1_shownum
|
|
pop ax
|
|
a2_shownum:
|
|
mov bl,7
|
|
call WriteChar
|
|
pop ax
|
|
cmp ax,0ffffh
|
|
jne a2_shownum
|
|
|
|
pop dx
|
|
pop cx
|
|
pop ax
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
ClearScreen:
|
|
;Il nome dice tutto...
|
|
;Input SI=numero del processo il cui schermo verr… cancellato
|
|
|
|
push ax
|
|
push bx
|
|
push cx
|
|
push dx
|
|
push es
|
|
push di
|
|
|
|
mov ah,03h
|
|
int 20h
|
|
|
|
mov ax,0b000h
|
|
mov es,ax
|
|
mov di,8000h
|
|
|
|
mov ax,si
|
|
shl ax,12
|
|
add di,ax
|
|
|
|
mov cx,2000
|
|
mov ax,0720h
|
|
rep stosw
|
|
|
|
mov ax,si
|
|
mov bh,al
|
|
mov ah,02h
|
|
xor dx,dx
|
|
int 10h
|
|
|
|
pop di
|
|
pop es
|
|
pop dx
|
|
pop cx
|
|
pop bx
|
|
pop ax
|
|
|
|
ret
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
;==============================================================================
|
|
|
|
SetCursorPos2:
|
|
;Setta la posizione del cursore
|
|
;input: BL=X, BH=Y
|
|
;output: no output
|
|
push ax
|
|
push cx
|
|
push dx
|
|
mov al,bh
|
|
cbw
|
|
; mov cx,word ptr [Video_MaxX]
|
|
mov cx,80
|
|
mul cx ;AX=Y*80, BL=X,BH=Y
|
|
xchg ax,bx ;AL=X,AH=Y, BX=Y*80
|
|
cbw ;AX=X
|
|
add bx,ax ;BX=X+(Y*80)
|
|
; mov word ptr [Video_CursorPos],bx
|
|
mov al,0eh
|
|
mov ah,bh
|
|
mov dx,3d4h
|
|
out dx,ax
|
|
mov al,0fh
|
|
mov ah,bl
|
|
out dx,ax
|
|
pop dx
|
|
pop cx
|
|
pop ax
|
|
ret
|
|
|
|
;==============================================================================
|
|
|
|
SetCursorPos:
|
|
;input DL=X, DH=Y
|
|
;Setta la posizione del cursore del processo chiamante
|
|
|
|
push ax
|
|
push bx
|
|
push cx
|
|
push si
|
|
|
|
mov ah,03h
|
|
int 20h
|
|
mov bx,si
|
|
mov bh,bl
|
|
|
|
mov bl,0
|
|
|
|
mov ah,02h
|
|
int 10h
|
|
|
|
pop si
|
|
pop cx
|
|
pop bx
|
|
pop ax
|
|
|
|
ret
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
|
|
GetCursorPos:
|
|
;output DL=X position, DH=Y position
|
|
;Restituisce la posizione del cursore del processo chiamante
|
|
|
|
push ax
|
|
push bx
|
|
push es
|
|
|
|
push cx
|
|
push si
|
|
|
|
mov ah,03h
|
|
int 20h
|
|
mov bx,si
|
|
add bx,bx
|
|
; add si,si
|
|
|
|
mov ax,40h
|
|
mov es,ax
|
|
|
|
mov dx,word ptr es:[50h+bx]
|
|
|
|
pop si
|
|
pop cx
|
|
|
|
pop es
|
|
pop bx
|
|
pop ax
|
|
|
|
ret
|
|
|
|
|
|
;==============================================================================
|
|
|
|
|
|
ProcessPage db 16 dup (0)
|
|
;ProcessCursor dw 16 dup (0)
|
|
Resolution dw (80*50)
|