Small operating system made in assembly language
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.
|
|
.model tiny |
|
|
.486 |
|
|
smart |
|
|
.code |
|
|
org 0100h |
|
|
start: |
|
|
jmp tsr |
|
|
drv db 'LPT ',0 |
|
|
Tsr: |
|
|
cli |
|
|
cmp ax,1234h |
|
|
jne nomore |
|
|
mov ax,4321h |
|
|
jmp itsok |
|
|
nomore: |
|
|
push bx ax |
|
|
mov ah,4 |
|
|
mov bh,1 |
|
|
int 50h |
|
|
mov bl,al |
|
|
pop ax |
|
|
cmp byte ptr cs:isact,1 |
|
|
je nottest |
|
|
mov cs:isact,1 |
|
|
cmp bl,80h |
|
|
jae react |
|
|
mov bl,ah |
|
|
xor bh,bh |
|
|
shl bx,1 |
|
|
mov bx,cs:[bx].tables |
|
|
mov cs:current,bx |
|
|
pop bx |
|
|
call cs:current |
|
|
itsok: |
|
|
jnc noerror |
|
|
push bp |
|
|
mov bp,sp |
|
|
or byte ptr [bp+6],1b |
|
|
pop bp |
|
|
mov ax,cs |
|
|
shl eax,16 |
|
|
mov ax,cs:current |
|
|
jmp endofint |
|
|
noerror: |
|
|
push bp |
|
|
mov bp,sp |
|
|
and byte ptr [bp+6],0FEh |
|
|
pop bp |
|
|
endofint: |
|
|
mov cs:isact,0 |
|
|
sti |
|
|
iret |
|
|
nottest: |
|
|
pop bx |
|
|
jmp endofint |
|
|
current dw 0 |
|
|
tables dw getlptin |
|
|
dw getlptout |
|
|
dw getlptinout |
|
|
dw setlptin |
|
|
dw setlptout |
|
|
dw setlptinout |
|
|
dw getlpt |
|
|
dw getfirstlpt |
|
|
dw setemettor |
|
|
dw setreceptor |
|
|
dw settimeout |
|
|
dw gettimeout |
|
|
dw receivelpt |
|
|
dw sendlpt |
|
|
dw receivelptblock |
|
|
dw sendlptblock |
|
|
dw receivecommand |
|
|
dw sendcommand |
|
|
|
|
|
react: |
|
|
push ds es |
|
|
mov cs:isact,1 |
|
|
pushad |
|
|
push cs |
|
|
pop ds |
|
|
push cs |
|
|
pop es |
|
|
cmp byte ptr never,1 |
|
|
je oknever |
|
|
mov bl,[drv+3] |
|
|
sub bl,'0' |
|
|
xor bh,bh |
|
|
call getlpt |
|
|
dec bl |
|
|
shl bl,1 |
|
|
mov al,7 |
|
|
sub al,bl |
|
|
mov ah,40 |
|
|
mov di,offset video |
|
|
int 47h |
|
|
push ax |
|
|
mov ah,01h |
|
|
int 50h |
|
|
mov ah,21 |
|
|
mov cl,4 |
|
|
int 47h |
|
|
sti |
|
|
mov al,0111b |
|
|
call setlptout |
|
|
call setreceptor |
|
|
call initlpt |
|
|
jc errorie |
|
|
mov cx,0 |
|
|
mov ah,20 |
|
|
mov bx,1012h |
|
|
mov si,offset initok |
|
|
int 47h |
|
|
cmp byte ptr always,1 |
|
|
je yes |
|
|
mov ah,20 |
|
|
mov bx,1010h |
|
|
mov si,offset mdd |
|
|
int 47h |
|
|
mov ah,13 |
|
|
mov si,offset drv |
|
|
int 47h |
|
|
mov ah,6 |
|
|
int 47h |
|
|
mov ah,20 |
|
|
mov bx,1011h |
|
|
mov si,offset msg |
|
|
int 47h |
|
|
waitkey: |
|
|
mov ax,0 |
|
|
int 16h |
|
|
cmp al,'n' |
|
|
je no |
|
|
cmp al,'N' |
|
|
je no |
|
|
cmp al,'Y' |
|
|
je yes |
|
|
cmp al,'y' |
|
|
je yes |
|
|
cmp al,'e' |
|
|
je nev |
|
|
cmp al,'E' |
|
|
je nev |
|
|
cmp al,'a' |
|
|
je alw |
|
|
cmp al,'A' |
|
|
je alw |
|
|
jmp waitkey |
|
|
yes: |
|
|
call receivecommand |
|
|
jc errortimeout |
|
|
no: |
|
|
mov al,0111b |
|
|
call setlptout |
|
|
cli |
|
|
mov ah,41 |
|
|
mov si,offset video |
|
|
int 47h |
|
|
pop ax |
|
|
mov ah,00h |
|
|
int 50h |
|
|
mov ah,09h |
|
|
int 50h |
|
|
oknever: |
|
|
popad |
|
|
pop es ds |
|
|
mov cs:isact,0 |
|
|
pop bx |
|
|
jmp endofint |
|
|
errorie: |
|
|
mov si,offset inits |
|
|
jmp show |
|
|
errortimeout: |
|
|
mov si,offset timeouts |
|
|
show: |
|
|
mov ah,20 |
|
|
mov bx,1012h |
|
|
int 47h |
|
|
mov ax,0 |
|
|
int 16h |
|
|
jmp no |
|
|
nev: |
|
|
mov byte ptr never,1 |
|
|
jmp no |
|
|
alw: |
|
|
mov byte ptr always,1 |
|
|
jmp yes |
|
|
initok db 'Initialisation is realised !',0 |
|
|
inits db 'Error on initialisation',0 |
|
|
timeouts db 'Connection lost or timeout complete !!',0 |
|
|
mdd db 'Connection demand on ',0 |
|
|
msg db 'Accept connection ? (Y)es (N)o n(E)ver (A)lways',0 |
|
|
isact db 0 |
|
|
always db 0 |
|
|
never db 0 |
|
|
|
|
|
;envois une commande al |
|
|
sendcommand: |
|
|
push ax bx cx di |
|
|
mov bl,al |
|
|
xor bh,bh |
|
|
shl bx,1 |
|
|
add bx,offset cmde |
|
|
call cs:[bx] |
|
|
pop di cx bx ax |
|
|
ret |
|
|
cmde dw nothing |
|
|
dw getram |
|
|
|
|
|
;recup<EFBFBD>re la ram en ds:si de cx distant caract<EFBFBD>res en es:di local |
|
|
getram: |
|
|
push ax bx cx ds |
|
|
mov bx,offset command |
|
|
mov cs:[bx+2],ds |
|
|
mov cs:[bx],si |
|
|
mov cs:[bx+4],cx |
|
|
push cs |
|
|
pop ds |
|
|
mov si,bx |
|
|
mov cx,6 |
|
|
call sendlptblock |
|
|
jc endofget |
|
|
call receivelptblock |
|
|
endofget: |
|
|
pop ds cx bx ax |
|
|
ret |
|
|
|
|
|
;Re<EFBFBD>ois une commande et l'execute |
|
|
Receivecommand: |
|
|
push ax bx cx di ds es |
|
|
push cs |
|
|
pop es |
|
|
push cs |
|
|
pop ds |
|
|
mov di,offset command |
|
|
call receivelptblock |
|
|
jc endofno |
|
|
mov bl,al |
|
|
xor bh,bh |
|
|
shl bx,1 |
|
|
add bx,offset cmd |
|
|
call cs:[bx] |
|
|
clc |
|
|
endofno: |
|
|
pop es ds di cx bx ax |
|
|
ret |
|
|
|
|
|
command db 25 dup (0) |
|
|
cmd dw nothings |
|
|
dw sendram |
|
|
dw receiveram |
|
|
dw sendreg |
|
|
dw receivereg |
|
|
dw sendport |
|
|
dw receiveport |
|
|
dw letexecute |
|
|
nothings: |
|
|
ret |
|
|
|
|
|
letexecute: |
|
|
push ds es fs gs |
|
|
pushad |
|
|
push cs |
|
|
push offset suite |
|
|
mov ax,es:[di+2] |
|
|
mov ds,ax |
|
|
mov es,ax |
|
|
mov fs,ax |
|
|
mov gs,ax |
|
|
push ax |
|
|
mov ax,es:[di] |
|
|
push ax |
|
|
DB 0CBh |
|
|
suite: |
|
|
popad |
|
|
pop gs fs es ds |
|
|
ret |
|
|
|
|
|
Sendram: |
|
|
push ax cx si ds |
|
|
mov si,es:[di] |
|
|
mov ax,es:[di+2] |
|
|
mov ds,ax |
|
|
mov cx,es:[di+4] |
|
|
call sendlptblock |
|
|
pop ds si cx ax |
|
|
ret |
|
|
|
|
|
receiveram: |
|
|
sendreg: |
|
|
receivereg: |
|
|
|
|
|
sendport: |
|
|
push ax cx dx si |
|
|
mov dx,es:[di] |
|
|
in ax,dx |
|
|
mov cx,2 |
|
|
mov si,offset tempblock |
|
|
mov ds:[si],ax |
|
|
call sendlptblock |
|
|
pop si dx cx ax |
|
|
ret |
|
|
|
|
|
receiveport: |
|
|
push ax dx |
|
|
mov dx,es:[di] |
|
|
mov ax,es:[di+2] |
|
|
out dx,ax |
|
|
pop dx ax |
|
|
ret |
|
|
|
|
|
tempblock db 25 dup (0) |
|
|
|
|
|
;---------Segment Adress----------- |
|
|
Bios equ 040h |
|
|
;---------Offset Adress------------ |
|
|
Lptadr equ 008h |
|
|
Timer equ 06Ch |
|
|
;---------Constant----------------- |
|
|
onesec equ 18 |
|
|
tensec equ 182 |
|
|
Ack equ 00 |
|
|
Nack equ 0FFh |
|
|
maxtry equ 10 |
|
|
|
|
|
Initlpt: |
|
|
push ax ecx |
|
|
call StartTimer |
|
|
cmp cs:emettor,0 |
|
|
je receptinit |
|
|
mov al,10000b |
|
|
call SetLptOut |
|
|
waitinit1: |
|
|
call EndTimer |
|
|
cmp cx,cs:timeout |
|
|
ja errorinit |
|
|
call getlptIn |
|
|
cmp al,00000b |
|
|
jnz waitinit1 |
|
|
jmp endinit |
|
|
receptinit: |
|
|
call EndTimer |
|
|
cmp cx,cs:timeout |
|
|
ja errorinit |
|
|
call getlptIn |
|
|
cmp al,00000b |
|
|
jnz receptinit |
|
|
mov al,10000b |
|
|
call SetLptOut |
|
|
endinit: |
|
|
clc |
|
|
pop ecx ax |
|
|
ret |
|
|
errorinit: |
|
|
stc |
|
|
pop ecx ax |
|
|
ret |
|
|
|
|
|
|
|
|
;-Envoie DL (dh) JNE si probl<EFBFBD>me JNC error timeout |
|
|
Sendlpt: |
|
|
push ax bx ecx |
|
|
call StartTimer |
|
|
mov dh,dl |
|
|
mov al,dl |
|
|
and al,0Fh |
|
|
call SetLptOut |
|
|
waitSend: |
|
|
call EndTimer |
|
|
cmp cx,cs:timeout |
|
|
ja errorsend |
|
|
call getlptIn |
|
|
bt ax,4 |
|
|
jnc waitsend |
|
|
and al,0Fh |
|
|
mov bl,al |
|
|
call StartTimer ;///// |
|
|
mov al,dh |
|
|
shr al,4 |
|
|
or al,10000b |
|
|
call SetLptOut |
|
|
waitSend2: |
|
|
call EndTimer |
|
|
cmp cx,cs:timeout |
|
|
ja errorsend |
|
|
call getlptIn |
|
|
bt ax,4 |
|
|
jc waitsend2 |
|
|
and al,0Fh |
|
|
shl al,4 |
|
|
add bl,al |
|
|
cmp dl,bl |
|
|
pop ecx bx ax |
|
|
clc |
|
|
ret |
|
|
errorsend: |
|
|
pop ecx bx ax |
|
|
stc |
|
|
ret |
|
|
|
|
|
|
|
|
;-Re<EFBFBD>ois DL (dh) |
|
|
Receivelpt: |
|
|
push ax bx ecx |
|
|
call StartTimer |
|
|
waitreceive: |
|
|
call EndTimer |
|
|
cmp cx,cs:timeout |
|
|
ja errorreceive |
|
|
call getlptIn |
|
|
bt ax,4 |
|
|
jnc waitreceive |
|
|
and al,0Fh |
|
|
mov dl,al |
|
|
call SetLptOut |
|
|
call StartTimer ;///// |
|
|
waitreceive2: |
|
|
call EndTimer |
|
|
cmp cx,cs:timeout |
|
|
ja errorreceive |
|
|
call getlptIn |
|
|
bt ax,4 |
|
|
jc waitreceive2 |
|
|
and al,0Fh |
|
|
mov dh,al |
|
|
shl dh,4 |
|
|
add dl,dh |
|
|
or al,10000b |
|
|
call SetlptOut |
|
|
clc |
|
|
pop ecx bx ax |
|
|
ret |
|
|
errorreceive: |
|
|
stc |
|
|
pop ecx bx ax |
|
|
ret |
|
|
|
|
|
;-AX |
|
|
SetTimeout: |
|
|
mov cs:Timeout,dx |
|
|
ret |
|
|
|
|
|
timeout dw tensec |
|
|
|
|
|
getTimeout: |
|
|
mov dx,cs:Timeout |
|
|
ret |
|
|
|
|
|
SetEmettor: |
|
|
mov cs:Emettor,1 |
|
|
ret |
|
|
|
|
|
Emettor db 0 |
|
|
|
|
|
SetReceptor: |
|
|
mov cs:Emettor,0 |
|
|
ret |
|
|
|
|
|
;->bx N<EFBFBD>port->Adresse dx |
|
|
GetLpt: |
|
|
push ax bx ds |
|
|
mov ax,bios |
|
|
mov ds,ax |
|
|
dec bx |
|
|
shl bx,1 |
|
|
mov dx,ds:[Lptadr+bx] |
|
|
mov cs:lpt,dx |
|
|
pop ds bx ax |
|
|
ret |
|
|
lpt dw 0 |
|
|
|
|
|
;->bx N<EFBFBD>port->Adresse dx |
|
|
GetFirstLpt: |
|
|
push ax ds |
|
|
mov ax,bios |
|
|
mov ds,ax |
|
|
xor bx,bx |
|
|
findlpt: |
|
|
mov dx,ds:[Lptadr+bx] |
|
|
cmp dx,0 |
|
|
jne oklpt |
|
|
add bx,2 |
|
|
cmp bx,4 |
|
|
jbe findlpt |
|
|
oklpt: |
|
|
mov cs:lpt,dx |
|
|
pop ds ax |
|
|
ret |
|
|
|
|
|
;-> |
|
|
StartTimer: |
|
|
push ax ecx ds |
|
|
mov ax,Bios |
|
|
mov ds,ax |
|
|
mov ecx,ds:[timer] |
|
|
mov cs:times,ecx |
|
|
pop ds ecx ax |
|
|
ret |
|
|
times dd 0 |
|
|
|
|
|
;->Ecx time elapsed |
|
|
EndTimer: |
|
|
push ax ds |
|
|
mov ax,Bios |
|
|
mov ds,ax |
|
|
mov ecx,ds:[timer] |
|
|
sub ecx,cs:times |
|
|
pop ds ax |
|
|
ret |
|
|
|
|
|
;-> |
|
|
GetLptOut: |
|
|
push dx |
|
|
mov dx,cs:lpt |
|
|
in al,dx |
|
|
pop dx |
|
|
ret |
|
|
|
|
|
GetLptIn: |
|
|
push dx |
|
|
mov dx,cs:lpt |
|
|
inc dx |
|
|
in al,dx |
|
|
shr al,3 |
|
|
pop dx |
|
|
ret |
|
|
|
|
|
GetLptInOut: |
|
|
push dx |
|
|
mov dx,cs:lpt |
|
|
add dx,2 |
|
|
in al,dx |
|
|
and al,11111b |
|
|
pop dx |
|
|
ret |
|
|
|
|
|
SetLptOut: |
|
|
push dx |
|
|
mov dx,cs:lpt |
|
|
out dx,al |
|
|
pop dx |
|
|
ret |
|
|
|
|
|
SetLptIn: |
|
|
push dx |
|
|
mov dx,cs:lpt |
|
|
inc dx |
|
|
out dx,al |
|
|
pop dx |
|
|
ret |
|
|
|
|
|
SetLptInOut: |
|
|
push dx |
|
|
mov dx,cs:lpt |
|
|
add dx,2 |
|
|
out dx,al |
|
|
pop dx |
|
|
ret |
|
|
|
|
|
;R<EFBFBD>alise un checksum 8 bits sur donn<EFBFBD>es DS:SI, nb CX r<EFBFBD>sultat dans dl |
|
|
Checksum8: |
|
|
push cx si |
|
|
check: |
|
|
add dl,[si] |
|
|
inc si |
|
|
dec cx |
|
|
jnz check |
|
|
pop si cx |
|
|
ret |
|
|
|
|
|
;DS:SI pointeur sur donn<EFBFBD>es, CX nombres de donn<EFBFBD>es, AL token |
|
|
SendLptBlock: |
|
|
push ax bx cx edx si edi bp |
|
|
mov dx,cx |
|
|
shl edx,16 |
|
|
mov dh,al |
|
|
call checksum8 |
|
|
mov edi,edx |
|
|
xor dh,dh |
|
|
mov bp,dx |
|
|
mov ah,maxtry |
|
|
retry: |
|
|
mov bl,4 |
|
|
xor al,al |
|
|
header: |
|
|
mov dx,di |
|
|
call sendlpt |
|
|
setne al |
|
|
jc outt |
|
|
rol edi,8 |
|
|
dec bl |
|
|
jnz header |
|
|
cmp al,0 |
|
|
jne notgood |
|
|
mov dl,ACK |
|
|
jmp allsend |
|
|
notgood: |
|
|
mov dl,NACK |
|
|
allsend: |
|
|
call sendlpt |
|
|
setne al |
|
|
jc outt |
|
|
cmp al,0 |
|
|
je okheader |
|
|
dec ah |
|
|
jnz retry |
|
|
jmp outt |
|
|
okheader: |
|
|
cmp cx,0 |
|
|
je endoftrans |
|
|
mov di,maxtry |
|
|
retry2: |
|
|
mov bx,cx |
|
|
xor ax,ax |
|
|
body: |
|
|
mov dl,[si+bx-1] |
|
|
add ah,dl |
|
|
call sendlpt |
|
|
setne al |
|
|
jc outt |
|
|
dec bx |
|
|
jnz body |
|
|
cmp al,0 |
|
|
jne notgood2 |
|
|
mov dl,ACK |
|
|
jmp allisend |
|
|
notgood2: |
|
|
mov dl,NACK |
|
|
allisend: |
|
|
call sendlpt |
|
|
setne al |
|
|
jc outt |
|
|
cmp al,0 |
|
|
je endoftrans |
|
|
dec di |
|
|
jnz retry2 |
|
|
outt: |
|
|
stc |
|
|
endoftrans: |
|
|
mov al,ah |
|
|
xor ah,ah |
|
|
cmp bp,ax |
|
|
pop bp edi si edx cx bx ax |
|
|
ret |
|
|
|
|
|
;Receptionne en es:di les donn<EFBFBD>es au nombres de CX token AL (AH) (ECX) |
|
|
receiveLptBlock: |
|
|
push bx dx si bp |
|
|
mov ah,maxtry |
|
|
retrye: |
|
|
mov bl,4 |
|
|
headere: |
|
|
call receivelpt |
|
|
jc outte |
|
|
mov cl,dl |
|
|
rol ecx,8 |
|
|
dec bl |
|
|
jnz headere |
|
|
call receivelpt |
|
|
jc outte |
|
|
cmp dl,ACK |
|
|
je okheadere |
|
|
dec ah |
|
|
jnz retrye |
|
|
jmp outte |
|
|
okheadere: |
|
|
mov al,ch |
|
|
xor ch,ch |
|
|
mov bp,cx |
|
|
rol ecx,16 |
|
|
cmp cx,0 |
|
|
je endoftranse |
|
|
mov si,maxtry |
|
|
retrye2: |
|
|
mov bx,cx |
|
|
xor ah,ah |
|
|
bodye: |
|
|
call receivelpt |
|
|
jc outte |
|
|
mov es:[di+bx-1],dl |
|
|
add ah,dl |
|
|
dec bx |
|
|
jnz bodye |
|
|
call receivelpt |
|
|
jc outte |
|
|
cmp dl,ACK |
|
|
je endoftranse |
|
|
dec si |
|
|
jnz retrye2 |
|
|
outte: |
|
|
stc |
|
|
endoftranse: |
|
|
mov bl,ah |
|
|
xor bh,bh |
|
|
cmp bp,bx |
|
|
pop bp si dx bx |
|
|
ret |
|
|
video db 0 |
|
|
end start
|
|
|
|