SecondReality/PAM/ASMYT.ASM
2017-09-24 01:45:36 +02:00

322 lines
No EOL
3.8 KiB
NASM

IDEAL
MODEL large
P386
CODESEG
aseg dw 0
;ntaulu db 1000b,1100b,1110b,1111b
;taulu db 1111b,0111b,0011b,0001b
ntaulu db 0001b,0011b,0111b,1111b
taulu db 1111b,1110b,1100b,1000b
ptaulu db 1,2,4,8
PUBLIC C init_uframe, C ulosta_frame
PROC C init_uframe
ARG fseg:word
mov ax, [fseg]
mov [cs:aseg], ax
ret
ENDP
PROC C ulosta_frame
ARG scseg:word
push ds di si
xor di, di
xor si, si
mov ax, [scseg]
mov es, ax
mov ds, [cs:aseg]
mov dx, 03c4h ; map mask... 03c4h, 02..
@@looppi:
lodsb
cmp al, 0d
jg @@outtaa
je @@over
@@skip:
cbw
sub di, ax
lodsb
cmp al, 0d
jl @@skip
je @@over
@@outtaa:
dec al
jz @@single
cbw
mov bx, di
and bx, 3d
add bx, ax
shr bx, 2d
or bx, bx
jz @@samebyte
cmp bx, 1d
je @@twobytes
mov cx, ax
mov bx, di
and bx, 3d
mov ah, [cs:taulu+bx]
mov al, 2d
out dx, ax
mov al, [ds:si]
mov bx, di
shr bx, 2d
mov [es:bx], al
push di cx
mov ax, di
add cx, ax
shr cx, 2d
sub cx, bx
dec cx
shr di, 2d
inc di
mov ax, 0f02h
out dx, ax
mov al, [ds:si]
mov ah, al
shr cx, 1d
jnc @@l1
stosb
@@l1: jcxz @@l2
rep stosw
@@l2: pop cx di
add di, cx
mov bx, di
and bx, 3d
mov ah, [cs:ntaulu+bx]
mov al, 2d
out dx, ax
lodsb
mov bx, di
shr bx, 2d
mov [es:bx], al
inc di
lodsb
cmp al, 0d
jl @@skip
jg @@outtaa
je @@over
@@twobytes:
mov bx, di
and bx, 3d
mov cl, [cs:taulu+bx]
add di, ax
mov bx, di
and bx, 3d
mov ch, [cs:ntaulu+bx]
mov ah, cl
mov al, 2d
out dx, ax
mov cl, [ds:si]
mov bx, di
shr bx, 2d
mov [es:bx-1], cl
mov ah, ch
out dx, ax
mov [es:bx], cl
inc di
inc si
lodsb
cmp al, 0d
jl @@skip
jg @@outtaa
je @@over
@@samebyte:
mov bx, di
and bx, 3d
mov cl, [cs:taulu+bx]
add di, ax
mov bx, di
and bx, 3d
and cl, [cs:ntaulu+bx]
mov ah, cl
mov al, 02h
out dx, ax
lodsb
mov bx, di
shr bx, 2d
mov [es:bx], al
inc di
lodsb
cmp al, 0d
jl @@skip
jg @@outtaa
je @@over
@@single:
mov bx, di
and bx, 3d
mov ah, [cs:ptaulu+bx]
mov al, 2d
out dx, ax
lodsb
mov bx, di
shr bx, 2d
mov [es:bx], al
inc di
;-------------
lodsb
cmp al, 0d
jl @@skip
jg @@outtaa
je @@over
@@over:
mov di, si
shr si, 4d
mov ax, ds
add ax, si
and di, 15d
jz @@exit
inc ax
@@exit:
mov [cs:aseg], ax
pop si di ds
ret
ENDP
PROC ruudulle
dec al
jz @@single
cbw
mov bx, di
and bx, 3d
add bx, ax
shr bx, 2d
or bx, bx
jz @@samebyte
cmp bx, 1d
je @@twobytes
mov cx, ax
mov bx, di
and bx, 3d
mov ah, [cs:taulu+bx]
mov al, 2d
out dx, ax
mov al, [ds:si]
mov bx, di
shr bx, 2d
mov [es:bx], al
push di cx
mov ax, di
add cx, ax
shr cx, 2d
sub cx, bx
dec cx
shr di, 2d
inc di
mov ax, 0f02h
out dx, ax
mov al, [ds:si]
mov ah, al
shr cx, 1d
jnc @@l1
stosb
@@l1: jcxz @@l2
rep stosw
@@l2: pop cx di
add di, cx
mov bx, di
and bx, 3d
mov ah, [cs:ntaulu+bx]
mov al, 2d
out dx, ax
lodsb
mov bx, di
shr bx, 2d
mov [es:bx], al
inc di
ret
@@twobytes:
mov bx, di
and bx, 3d
mov cl, [cs:taulu+bx]
add di, ax
mov bx, di
and bx, 3d
mov ch, [cs:ntaulu+bx]
mov ah, cl
mov al, 2d
out dx, ax
mov cl, [ds:si]
mov bx, di
shr bx, 2d
mov [es:bx-1], cl
mov ah, ch
out dx, ax
mov [es:bx], cl
inc di
inc si
ret
@@samebyte:
mov bx, di
and bx, 3d
mov cl, [cs:taulu+bx]
add di, ax
mov bx, di
and bx, 3d
and cl, [cs:ntaulu+bx]
mov ah, cl
mov al, 02h
out dx, ax
lodsb
mov bx, di
shr bx, 2d
mov [es:bx], al
inc di
ret
@@single:
mov bx, di
and bx, 3d
mov ah, [cs:ptaulu+bx]
mov al, 2d
out dx, ax
lodsb
mov bx, di
shr bx, 2d
mov [es:bx], al
inc di
ret
ENDP
END