cos2000v1/editor.asm

451 lines
7.7 KiB
NASM
Raw Normal View History

.model tiny
.386c
.code
org 0100h
start:
mov ax,0305h
mov bx,0008h
int 16h
mov ax,0002
int 47H
mov ah,26
int 47H
mov ah,2
int 47h
xor ebp,ebp
xor ax,ax
mov fs,ax
Adres:
mov di,offset infos
mov ah,34
int 47h
dec infos
mov bx,0
mov ah,25
int 47h
mov bh,infos
mov edi,ebp
mov ah,21
mov cl,7
int 47h
lines:
mov edx,edi
shr edx,4*4
shl edx,4*3
mov cx,16
mov ah,10
int 47h
mov si,offset dep
mov ah,13
int 47h
mov dx,di
mov ah,10
int 47h
mov ah,13
mov si,offset spaces
int 47h
mov al,16
mov cl,7
mov ah,21
int 47h
mov esi,edi
doaline:
mov edx,edi
shr edx,4*4
shl edx,4*3
mov fs,dx
mov dl,fs:[di]
mov ah,10
mov cl,8
int 47h
mov ah,5
int 47h
inc edi
dec al
jnz doaline
mov edi,esi
mov si,offset spaces
mov ah,13
int 47h
mov al,16
mov ah,21
mov cl,7
int 47h
doaline2:
mov edx,edi
shr edx,4*4
shl edx,4*3
mov fs,dx
mov dl,fs:[di]
mov ah,7
int 47h
inc edi
dec al
jnz doaline2
mov ah,6
int 47h
dec bh
jnz lines
mov ah,21
mov cl,112
int 47h
mov si,offset menu
mov ah,13
int 47h
waitkey:
mov ax,0
int 16h
cmp ax,3B00h
jne suit
inc ebp
jmp adres
suit:
cmp ax,3C00h
jne suit2
dec ebp
jmp adres
suit2:
cmp ax,3D00h
jne suit3
add ebp,24*16
jmp adres
suit3:
cmp ax,3E00h
jne suit4
sub ebp,24*16
jmp adres
suit4:
cmp ax,3F00h
jne suit5
add ebp,010000h
jmp adres
suit5:
cmp ax,4000h
jne suit6
sub ebp,010000h
jmp adres
suit6:
cmp ax,4100h
jne suit7
mov dword ptr [pope],'TIDE'
mov bl,infos
xor bh,bh
mov ah,25
int 47h
mov ah,21
mov cl,116
int 47h
mov si,offset menu
mov ah,13
int 47h
mov ah,21
mov cl,7
int 47h
mov ax,0B800h
mov es,ax
mov xxyy2,3
mov xxyy,3
call calc1
call calc2
waitst:
mov ax,0
int 16h
cmp ah,41h
jne tre
mov dword ptr [pope],' EUV'
push cs
pop es
jmp adres
tre:
cmp al,0
jne write
cmp ah,48h
jne tre1
cmp yy,0
je waitst
dec yy
jmp cursor
tre1:
cmp ah,50h
jne tre2
mov al,infos
dec al
xor ah,ah
cmp yy,ax
je waitst
inc yy
jmp cursor
tre2:
cmp ah,4Dh
jne tre4
cmp xx,15
je waitst
inc xx
jmp cursor
tre4:
cmp ah,4Bh
jne waitst
cmp xx,0
je waitst
dec xx
jmp cursor
write:
call AsciiHex2dec
cmp cl,15
ja waitst
call calc1
call calc2
mov edi,es:[bx-1]
mov dx,es:[si-1]
mov byte ptr es:[bx],0112
mov es:[bx-1],al
writs:
mov ax,0
int 16H
mov ch,cl
call AsciiHex2dec
cmp cl,15
ja writs
shl ch,4
add ch,cl
mov es:[bx+1],al
mov es:[si-1],ch
mov ax,bx
call calc3
mov gs:[bx],ch
pusha
popa
mov cl,gs:[bx]
cmp ch,cl
je no
push si ax
mov ah,25
mov bl,infos
xor bh,bh
int 47h
mov ah,21
mov cl,117
int 47h
mov si,offset msg
mov ah,13
int 47h
mov ax,0
int 16h
mov bl,infos
xor bh,bh
mov ah,25
int 47h
mov ah,21
mov cl,116
int 47h
mov ah,13
mov si,offset menu
int 47h
pop bx si
mov es:[bx-1],edi
mov es:[si-1],dx
no:
inc xx
cmp xx,16
jne pasde
inc yy
mov xx,0h
pasde:
call calc1
call calc2
jmp waitst
cursor:
call calc1
call calc2
jmp waitst
suit7:
cmp ax,4200h
jne waitkey
mov ah,27
int 47h
db 0CBH ; +++++++
ret
calc1:
push ax dx si
mov ax,xx
mov dx,xx
shl ax,2
shl dx,1
add ax,dx
add ax,25
mov bx,YY
mov dx,yy
shl bx,5
shl dx,7
add bx,dx
add bx,ax
mov byte ptr es:[bx],112
mov byte ptr es:[bx+2],112
mov si,xxyy
mov byte ptr es:[si],07
mov byte ptr es:[si+2],07
mov xxyy,bx
pop si dx ax
ret
calc2:
push ax bx dx
mov si,YY
mov dx,yy
shl si,5
shl dx,7
add si,dx
mov dx,xx
shl dx,1
add si,dx
add si,127
mov byte ptr es:[si],112
mov bx,xxyy2
mov byte ptr es:[bx],07
mov xxyy2,si
pop dx bx ax
ret
calc3:
push dx
xor ebx,ebx
mov bx,xx
mov dx,yy
shl dx,4
add bx,dx
add ebx,ebp
mov edx,ebx
shr edx,4*4
shl edx,4*3
mov gs,dx
pop dx
ret
asciihex2dec:
cmp al,'a'
jb nomin
cmp al,'f'
ja nomin
sub al,'a'-'A'
jmp ismaj
nomin:
cmp al,'A'
jb nomaj
cmp al,'F'
ja nomaj
ismaj:
mov cl,al
sub cl,'A'-10
jmp endt
nomaj:
mov cl,al
sub cl,'0'
endt:
ret
dep db ':',0
sect dw 0
xx dw 0
yy dw 0
xxyy dw 3
xxyy2 dw 3
msg db 'Error : Unchangeable area (ROM) press a key to continu ',0
menu db 'Top F1, Bottom F2, Offset F3&F4, Segment F5&F6, Mode F7, Quit F8 MODE '
pope db 'VUE ',0
spaces db ' <20> ',0
showbuffer db 35 dup (0FFh)
Lastread dw 0FFFFh
ReadSector:
push ax cx dx si
cmp cx,cs:lastread
je done
mov cs:LastRead,cx
mov AX, CX
xor DX, DX
div cs:DiskSectorsPerTrack
mov CL, DL ;{ Set the sector }
and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder }
xor DX, DX
div cs:DiskTracksPerHead
mov CH, DL ;{ Set the track bits 0-7 }
mov AL, DH
ror AL, 1
ror AL, 1
and AL, 11000000b
or CL, AL ;{ Set bits 8&9 of track }
xor dX, DX
div cs:DiskHeads
mov DH, DL ;{ Set the head }
inc CL
mov SI, 4
TryAgain:
mov AL, 1
mov DL, 0
mov AH, 2
int 13h
jnc Done
dec SI
jnz TryAgain
mov word ptr cs:lastread,0ffffh
Done:
pop si dx cx ax
ret
WriteSector:
push ax cx dx si
cmp cs:Lastread,cx
jne nodestruct
mov cs:Lastread,0ffffh
nodestruct:
mov AX, CX
xor DX, DX
div cs:DiskSectorsPerTrack
mov CL, DL ;{ Set the sector }
and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder }
xor DX, DX
div cs:DiskTracksPerHead
mov CH, DL ;{ Set the track bits 0-7 }
mov AL, DH
ror AL, 1
ror AL, 1
and AL, 11000000b
or CL, AL ;{ Set bits 8&9 of track }
xor DX, DX
div cs:DiskHeads
mov DH, DL ;{ Set the head }
inc CL
mov SI, 4
TryAgain2:
mov AL, 1
mov DL, 0
mov AH, 3
int 13h
jnc Done2
dec SI
jnz TryAgain2
Done2:
pop si dx cx ax
ret
DiskSectorsPerTrack dw 18
DiskTracksPerHead dw 80
DiskHeads dw 2
infos db 10 dup (0)
end start