241 lines
9.2 KiB
NASM
241 lines
9.2 KiB
NASM
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
;+ +
|
|
;+ This asm file contains 2 pascal procedures for +
|
|
;+ linking with TTT version 5.0. The procedures are: +
|
|
;+ +
|
|
;+ scrolllistup; +
|
|
;+ scrolllistdown; +
|
|
;+ +
|
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
|
data segment byte public
|
|
extrn snowcheck:byte
|
|
extrn usebios:byte
|
|
extrn vidseg:word
|
|
extrn windmin,windmax:word
|
|
xpos db ?
|
|
ypos db ?
|
|
data ends
|
|
|
|
|
|
code segment byte public
|
|
|
|
assume cs:code,ds:data
|
|
public fastchr
|
|
|
|
;++++++++++++++++++++++++++++++++++++
|
|
;+ C A L M E M P O I N T E R +
|
|
;++++++++++++++++++++++++++++++++++++
|
|
|
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
;+ +
|
|
;+ CALCMEMPOINTER is a local procedure that is called by +
|
|
;+ Fastwrite, PlainWrite and Attribute. It places the segment +
|
|
;+ and offset of the first attribute, in ES:DI ready for an +
|
|
;+ LDS. Vseg and Vofs point to the first attribute of the +
|
|
;+ screen, the final location is computed by adding Row*160 +
|
|
;+ (80 attribs and 80 chars per row) and then adding 2*Col. +
|
|
;+ The passed Row and Column are decremented by one to fit +
|
|
;+ with DOS's 0..79, 0..24 coordinate system. +
|
|
;+ +
|
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
calcmempointer proc near
|
|
|
|
xor ax,ax ;AX=0
|
|
mov cl,al ;CL=0
|
|
mov bh,al ;BH=0
|
|
shr cx,1 ;CX=Y*128
|
|
mov di,cx ;store in DI
|
|
shr di,1 ;DI=y*64
|
|
shr di,1 ;DI=y*32
|
|
add di,cx ;DI=y*160
|
|
shl bx,1 ;account for attribute bytes
|
|
add di,bx ;DI=(y*160)+(x*2)
|
|
mov es,vidseg ;ES:DI points to color attribute
|
|
ret
|
|
|
|
calcmempointer endp
|
|
|
|
;+++++++++++++++++++++++++++++++++++++++
|
|
;+ F A S T C H R +
|
|
;+++++++++++++++++++++++++++++++++++++++
|
|
|
|
wattr equ byte ptr [bp+6] ;write attribute
|
|
wchr equ byte ptr [bp+8] ;write character
|
|
|
|
fastchr proc far
|
|
|
|
push bp ;Save BP
|
|
mov bp,sp ;Set up stack frame
|
|
|
|
mov ax,40h
|
|
mov es,ax
|
|
mov bx,es:word ptr [0050h] ;X position [0040:0050]
|
|
mov cx,es:word ptr [0051h] ;Y position [0040:0051]
|
|
|
|
mov xpos,bl
|
|
mov ypos,cl
|
|
|
|
cmp usebios,1 ;check whether to use BIOS
|
|
je FCusebios1
|
|
|
|
FCdirectscr1:
|
|
mov ch,cl
|
|
mov cl,0
|
|
mov bh,cl
|
|
call calcmempointer
|
|
mov bh,wattr ;attribute
|
|
mov bl,wchr ;character
|
|
|
|
cmp snowcheck,1 ;check whether to check snow
|
|
jne FCdoch5
|
|
push ax
|
|
mov dx,03DAh
|
|
FCdoch1:
|
|
cli ;interrupts OFF
|
|
FCdoch2:
|
|
in al,dx ;get 6845 status
|
|
test al,8 ;check for vertical retrace
|
|
jnz FCdoch4 ;in progress? go..
|
|
rcr al,1 ;wait for end of horizontal
|
|
jc FCdoch2 ; retrace
|
|
FCdoch3:
|
|
in al,dx ;get 6845 status again
|
|
rcr al,1 ;wait for horizontal
|
|
jnc FCdoch3 ; retrace
|
|
FCdoch4:
|
|
mov ax,bx
|
|
stosw ;store video word into ES:DI
|
|
sti ;interrupts ON
|
|
jmp FCdoch6 ;ALL DONE!
|
|
FCdoch5:
|
|
mov ax,bx
|
|
stosw ;no waiting!!!!!
|
|
FCdoch6:
|
|
jmp FCmovecursor
|
|
|
|
FCusebios1:
|
|
;assumes that cursor is already positioned to the correct place on the screen
|
|
mov ah,9 ;service=write attr & chr at cursor
|
|
mov al,wchr ;write character
|
|
mov bh,0 ;page 0
|
|
mov bl,wattr ;write attribute
|
|
mov cx,1 ;write 1x
|
|
int 10h
|
|
|
|
FCmovecursor:
|
|
mov ax,windmin
|
|
mov bx,windmax
|
|
|
|
mov dl,xpos ;X pos in DL
|
|
mov dh,ypos ;Y pos in DH
|
|
|
|
inc dl ;increment X
|
|
|
|
cmp dl,bl ;is X>79 ??
|
|
jg FCmc1
|
|
jmp FCnoscroll
|
|
FCmc1:
|
|
mov dl,al ;X:=0
|
|
inc dh ;increment Y
|
|
cmp dh,bh ;is Y>25 ??
|
|
jg FCmc2
|
|
jmp FCnoscroll
|
|
FCmc2:
|
|
|
|
;scrolling stuff
|
|
|
|
cmp usebios,1 ;check whether to use BIOS
|
|
jne FCdirectscr2
|
|
jmp FCusebios2
|
|
|
|
FCdirectscr2:
|
|
push ds ;save DS ...
|
|
mov al,snowcheck ;grab before changing DS
|
|
push ax
|
|
|
|
mov dx,windmax
|
|
mov cx,windmin
|
|
sub dh,ch ;difference in DH (Y)
|
|
mov dl,0
|
|
shr dx,1 ;DX=Y*128
|
|
shr dx,1 ;DX=Y*64
|
|
mov cx,dx ;store in CX
|
|
shr cx,1 ;CX=Y*32
|
|
shr cx,1 ;CX=Y*16
|
|
add cx,dx ;CX=Y*80
|
|
push cx
|
|
|
|
mov cx,0
|
|
mov bx,windmin ;BL=X position
|
|
mov ch,bh ;CH=Y position
|
|
mov bh,0
|
|
inc ch ;2nd line of window
|
|
call calcmempointer
|
|
mov ds,vidseg
|
|
mov si,di ;DS:SI
|
|
|
|
mov dx,ds
|
|
mov es,dx ;ES:DI
|
|
sub di,0A0h
|
|
|
|
pop cx
|
|
|
|
cld ;set direction to FORWARD
|
|
pop ax
|
|
cmp al,1 ;check whether to check snow
|
|
jne FCdscr5
|
|
mov dx,03DAh
|
|
FCdscr1:
|
|
cli ;interrupts OFF
|
|
FCdscr2:
|
|
in al,dx ;get 6845 status
|
|
test al,8 ;check for vertical retrace
|
|
jnz FCdscr4 ;in progress? go..
|
|
rcr al,1 ;wait for end of horizontal
|
|
jc FCdscr2 ; retrace
|
|
FCdscr3:
|
|
in al,dx ;get 6845 status again
|
|
rcr al,1 ;wait for horizontal
|
|
jnc FCdscr3 ; retrace
|
|
FCdscr4:
|
|
movsw ;move it out...
|
|
sti ;interrupts ON
|
|
loop FCdscr1 ;get next video word
|
|
jmp FCdscr6 ;ALL DONE!
|
|
FCdscr5:
|
|
rep movsw ;no waiting!!!!!
|
|
FCdscr6:
|
|
pop ds
|
|
mov cx,windmin
|
|
mov dx,windmax
|
|
mov dl,cl
|
|
jmp FCnoscroll
|
|
|
|
FCusebios2:
|
|
mov cx,ax ;windmin
|
|
mov dx,bx ;windmax
|
|
mov ax,0601h ;func=scroll up, 1 line
|
|
mov bh,wattr
|
|
int 10h
|
|
|
|
mov dl,cl ;X=windmin's X position (1)
|
|
|
|
FCnoscroll:
|
|
mov ah,2
|
|
mov bh,0
|
|
int 10h
|
|
|
|
mov sp,bp ;Restore SP
|
|
pop bp ;Restore BP
|
|
ret ;Remove parameters and return
|
|
|
|
fastchr endp
|
|
|
|
code ends
|
|
|
|
end
|
|
|