VZEditor/PATCHED/swap.asm
2025-04-02 08:44:47 +09:00

514 lines
7.5 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;------------------------------------------------
; swap.asm
;
; Copyright (c) 1989-93 by c.mos
;------------------------------------------------
include vz.inc
IFNDEF NOSWAP
;----- Swap slot -----
_swapslot struc
xs_handle dw 0
xs_size dw 0
_swapslot ends
;----- External symbols -----
wseg
extrn doswapf :byte
extrn invz :byte
extrn swapmode :byte
extrn usefar :byte
extrn cmdlinef :byte
extrn code_seg :word
extrn data_seg :word
extrn gtops :word
extrn loseg :word
extrn nears :word
extrn stack_seg :word
extrn cz_val :word
extrn swapss_end :word
extrn syssw :word
extrn ss_stack :word
extrn save_ds :word
extrn save_end :word
extrn tocs :dword
endws
extrn cstop :near
extrn cs_stack :near
extrn parbuf :near
extrn allocTPA :near
extrn clrstack :near
extrn xmem_alloc :near
extrn xmem_free :near
extrn xmem_read :near
extrn xmem_trunc :near
extrn xmem_write :near
extrn getsends :near
extrn ofs2seg :near
extrn seg2ofs :near
extrn realloc_cs1 :near
extrn code_end :near
wseg
;----- Local work -----
xslot_cs _swapslot <>
xslot_ss _swapslot <>
xslot_text _swapslot 16 dup (<>)
textslots dw 0
swapcsf db 0
endws
eseg
assume ds:cgroup,es:cgroup
;----- Swap out -----
public swapout
swapout proc
clr ax
mov cs:invz,al
mov swapcsf,al
test syssw,SW_CLRSTACK
_ifn z
call clrstack
_endif
mov si,gtops
tst si
jz swapo_cs
tstw textslots
jnz free_gs
tstb swapmode
jz realloc_gs
tstb doswapf
jle realloc_gs
call getsends
mov di,ax
push si
call swapout_text
pop si
_if c
realloc_gs:
mov es,si
mov bx,si
call getsends
xchg ax,bx
sub bx,ax
msdos F_REALLOC
_else
free_gs: mov es,si
msdos F_FREE
swapo_cs:
mov al,swapmode
tstb doswapf
js swapo8
_if z
dec ax
_endif
cmp al,1
jle swapo8
call swapout_cs
_ifn c
call realloc_cs1
_endif
_endif
swapo8:
call xmem_trunc
call stack_cs
call allocTPA
mov ax,loseg
mov dx,cs
cmp ax,dx
_ifn e
mov es,ax
mov cs:save_ds,ax
mov si,0120h
mov di,si
mov cx,offset cgroup:cstop
sub cx,si
call memcopy
_endif
VZ_RET
swapout endp
;----- Swap out CS & SS -----
;<--
; CY :error
; BX :end of loader seg.
public swapout_cs
swapout_cs proc
tstb usefar
_ifn z
stc
VZ_RET
_endif
push es
mov ax,offset cgroup:cstop
call ofs2seg
mov bx,cs
add bx,ax
push bx
mov bx,offset cgroup:xslot_cs
tstw [bx]
_if z
movseg es,cs
mov di,offset cgroup:cstop
mov ax,offset cgroup:code_end
call swapout_blk
_ifn c
mov bx,offset cgroup:xslot_ss
movseg es,ss
clr di
mov ax,swapss_end
call swapout_blk
_endif
_else
mov bx,offset cgroup:xslot_ss
movseg es,ss
clr di
mov cx,save_end
mov ax,[bx].xs_handle
call xmem_write
_endif
_ifn c
mov swapcsf,TRUE
mov ax,cs
cmp ax,loseg
_ifn e
pop bx
push ax
mov tocs.@seg,0 ;;
_endif
clc
_endif
pop bx
pop es
VZ_RET
swapout_cs endp
;----- Swap out Text -----
;-->
; SI :top of seg.
; DI :end of seg.
;<--
; CY :error
swapout_text proc
mov bx,offset cgroup:xslot_text
clr cx
_repeat
mov ax,di
sub ax,si
cmp ax,0800h
_if a
mov ax,0800h
_endif
pushm <ax,cx,si,di>
call seg2ofs
mov es,si
clr di
call swapout_blk
popm <di,si,cx,ax>
inc cx
add bx,type _swapslot
add si,ax
cmp si,di
_while b
mov textslots,cx
VZ_RET
swapout_text endp
;----- Swap out block -----
;-->
; BX :swap slot ptr
; ES:DI :start ptr
; AX :end ptr
;<--
; CY :error
swapout_blk proc
sub ax,di
mov [bx].xs_size,ax
mov cx,ax
call xmem_alloc
_ifn c
mov [bx].xs_handle,ax
call xmem_write
_endif
VZ_RET
swapout_blk endp
endes
bseg
;----- Swap in block -----
;-->
; BX :swap slot ptr
; ES:DI :start ptr
; AX :end ptr
;<--
; CY :error
swapin_blk proc
sub ax,di
mov cx,ax
mov ax,[bx].xs_handle
call xmem_read
VZ_RET
swapin_blk endp
;----- Swap in CS & SS -----
;<-- CY :Can't load CS
public swapin_es
swapin_es proc
tstb swapcsf
jz swapin8
mov bx,nears
mov ax,cs
mov es,ax
sub bx,ax
push bx
msdos F_REALLOC
pop bx
_if c
msdos F_MALLOC
jc swapin9
mov es,ax
_endif
mov bx,offset cgroup:xslot_cs
mov di,offset cgroup:cstop
mov ax,offset cgroup:code_end
call swapin_blk
jc swapin9
mov cx,stack_seg
sub cx,code_seg
mov ax,es
mov code_seg,ax
mov tocs.@seg,ax
mov dx,ax
dec dx
mov es,dx
mov es:[mcb_psp],ax
add ax,cx
mov data_seg,ax
mov stack_seg,ax
mov cz_val,ax
mov bx,offset cgroup:xslot_ss
mov es,ax
clr di
mov ax,swapss_end
call swapin_blk
jc swapin9
mov swapcsf,FALSE
swapin8:
mov ax,code_seg
mov dx,cs
cmp ax,dx
_ifn e
mov es,ax
clr si
clr di
mov cx,offset cgroup:cstop
call memcopy
_endif
clc
swapin9: VZ_RET
swapin_es endp
endbs
eseg
;----- Close Swap file -----
public swapin_cs
swapin_cs proc
mov bx,offset cgroup:xslot_cs
call swapclose
mov bx,offset cgroup:xslot_ss
call swapclose
VZ_RET
swapin_cs endp
;----- Swap in text -----
public swapin_text
swapin_text proc
tstw xslot_cs.xs_handle
_ifn z
call swapin_cs
_endif
mov bx,offset cgroup:xslot_text
clr cx
xchg cx,textslots
mov es,gtops
_repeat
_break cxz
tstw [bx].xs_handle
_break z
push cx
push es
clr di
mov ax,[bx].xs_size
push ax
call swapin_blk
call swapclose
pop ax
pop dx
call ofs2seg
add ax,dx
mov es,ax
pop cx
add bx,type _swapslot
_loop
VZ_RET
swapin_text endp
;--- Close Swap buffer ---
swapclose proc
clr ax
xchg ax,[bx].xs_handle
call xmem_free
VZ_RET
swapclose endp
;--- Change Stack ---
public stack_cs, stack_ss
stack_cs proc
movseg es,cs
call move_wseg
mov si,sp
mov cx,ss_stack
sub cx,si
mov di,offset cgroup:cs_stack
sub di,cx
push di
call memcopy
pop di
mov ax,cs
jmps set_ss
stack_cs endp
stack_ss proc
movseg ds,cs
mov es,stack_seg
tstb invz
_if z
call move_wseg
_endif
mov invz,TRUE
mov si,sp
mov cx,offset cgroup:cs_stack
sub cx,si
mov di,ss_stack
sub di,cx
push di
movseg ds,ss
call memcopy
pop di
mov ax,es
set_ss: mov ss,ax
mov sp,di
movseg ds,ss
mov cs:save_ds,ds
mov es,cs:loseg
mov es:save_ds,ds
VZ_RET
stack_ss endp
move_wseg proc
mov si,0100h
mov di,si
mov cx,offset cgroup:parbuf
sub cx,si
call memcopy
VZ_RET
move_wseg endp
endes
ELSE
eseg
;--- External symbols ---
extrn invz :byte
extrn syssw :word
extrn gtops :word
extrn allocTPA :near
extrn clrstack :near
extrn getsends :near
assume ds:cgroup
;--- Swap out ---
public swapout
swapout proc
clr ax
mov cs:invz,al
push es
test syssw,SW_CLRSTACK
_ifn z
call clrstack
_endif
mov ax,gtops
tst ax
jz swapo8
mov es,ax
mov bx,ax
call getsends
xchg ax,bx
sub bx,ax
msdos F_REALLOC
swapo8: call allocTPA
pop es
VZ_RET
swapout endp
endes
ENDIF
bseg
;--- Memory copy ---
public memcopy
memcopy proc
shr cx,1
cld
rep movsw
_if c
movsb
_endif
VZ_RET
memcopy endp
endbs
end
;****************************
; End of 'swap.asm'
; Copyright (C) 1989 by c.mos
;****************************