 		     
	       ASSEMBLER CODE FOR GRAPHICS, MOUSE AND EMS ROUTINES USED IN          
		              'THE CARNAGE BENEATH'  BY ALLEN BOSAK                      


************************
GRAPHICS
************************

SIRIUSCLS

STACK LAYOUT
A  CLS SEGMENT
8  CLS OFFSET
6  CLS COLOR
4  BASIC SEGMENT
2  BASIC OFFSET
0  BP

PUSH BP
MOV BP,SP
MOV AL,[BP+6]
MOV AH,AL
MOV BX,[BP+A]
MOV ES,BX
MOV DI,[BP+8]
MOV CX,7D00	
REP STOSW
POP BP
RETF 6

************************

SIRIUSPSET

STACK LAYOUT
E PIX SEGMENT
C PIX OFFSET
A XC
8 YC
6 COL
4 BASIC SEGMENT
2 BASIC OFFSET
0 BP

PUSH BP
MOV BP,SP
MOV DX,[BP+A]
CMP DX,0
JL 13B  ;END
MOV CX,13F
CMP DX,CX
JG 13B ;END
MOV AX,[BP+8]
CMP AX,0
JL 13B ;END
MOV CX,C7
CMP AX,CX
JG 13B   ;END
MOV BX,[BP+E]
MOV ES,BX
MOV DI,AX
MOV CL,6
SHL AX,CL
MOV CL,8
SHL DI,CL
ADD AX,DX
ADD AX,[BP+C]
ADD DI,AX
MOV AL,[BP+6]
STOSB
;END
POP BP
RETF A

************************

SIRIUSCOPY

STACK LAYOUT
E FROM SEGMENT
C FROM OFFSET
A TO SEGMENT
8 TO OFFSET
6 BASIC SEGMENT
4 BASIC OFFSET
2 DS
0 BP

PUSH BP
PUSH DS
MOV BP,SP
MOV AX,[BP+E]
MOV DS,AX
MOV SI,[BP+C]
MOV AX,[BP+A]
MOV ES,AX
MOV DI,[BP+8]
MOV CX,7D00
REP MOVSW 
POP DS
POP BP
RETF 8

************************

SIRIUSPOINT

STACK LAYOUT

10 PIX SEGMENT
E  PIX OFFSET
C  XC
A  YC
8  VARI OFFSET
6  BASIC SEGMENT
4  BASIC OFFSET
2  DS
0  BP

PUSH DS
PUSH BP
MOV BP,SP
MOV AX,[BP+10]
MOV DS,AX
MOV AX,[BP+A]
MOV SI,AX
MOV CL,6
SHL AX,CL
MOV CL,8
SHL SI,CL
ADD AX,[BP+C]
ADD AX,[BP+E]
ADD SI,AX
MOV BX,[BP+2]
MOV ES,BX
MOV DI,[BP+8]
MOVSB
POP BP
POP DS
RETF A

************************

SIRIUSPUT

STACK LAYOUT
14 FROMSEGMENT
12 FROMOFFSET
10 BUFFERSEGMENT
E  BUFFEROFFSET
C  X
A  Y
8  COL
6  BASIC SEGMENT
4  BASIC OFFSET
2  BP
0  DS

PUSH DS
PUSH BP
MOV BP,SP
MOV AX,[BP+14]  
MOV DS,AX            
MOV SI,[BP+12]
LODSW
MOV CL,3
SHR AX,CL		
MOV BX,[BP+C]     
MOV CX,13F
CMP BX,CX    
JG 181     ;X>0
XOR DX,DX
XOR CX,CX
CMP BX,DX     
JGE 128         		
SUB DX,BX	
MOV [BP+C],CX  
;X>0:
ADD AX,BX    
XOR BX,BX
CMP AX,BX 
JLE 181        ;END:	
MOV CX,140 
CMP AX,CX   
JLE 13F   ;LO<320:    
MOV BX,AX
SUB BX,CX    
MOV DX,BX
SUB AX,BX
;LO<320:
PUSH DX
SUB AX,[BP+C]        
PUSH AX
MOV CX,[SI]   
SUB SI,BX
MOV BX,[BP+A]   ;Y
MOV DX,C7
CMP BX,DX
JG 17F   ;STACKPOP: 	
XOR DX,DX
CMP BX,DX
JG 169   ;Y>0:
MOV [BP+A],DX
SUB DX,BX	
XOR AX,AX
ADD AX,[BP-2]
ADD AX,[BP-4]
MUL DX
ADD SI,AX
;Y>0:
ADD CX,BX
XOR DX,DX
CMP CX,DX
JLE 17F      ;STACKPOPEND:			
MOV DX,C9
CMP CX,DX   
JL 17A      ;Y<200
MOV CL,C7	   
;Y<200
SUB CL,[BP+A]
JMP 183 ;END
;GOTOEND
JMP 1D8
JMP 1DA ;END
MOV CH,CL
ADD SI,2
MOV DX,[BP+10]
MOV ES,DX
MOV DI,[BP+A]    
MOV DX,DI
MOV CL,6
SHL DI,CL
MOV CL,8
SHL DX,CL
ADD DI,DX
ADD DI,[BP+E]
ADD DI,[BP+C]
INC CH
MOV AH,[BP+8]	
MOV BX,140                
SUB BX,[BP-4]
SUB DI,BX
;NEXTY:
DEC CH
JZ 1CC   ;END:
ADD SI,[BP-2]   
ADD DI,BX
MOV DX,[BP-4]    
;NEXTX:
LODSB
CMP AL,AH
JZ 1C6   ;NEXTX1   
STOSB
DEC DX
JNZ 1BB  ; NEXTX:
JMP 1AF  ;NEXTY
;NEXTX1:
INC DI
DEC DX
JNZ 1BB   ;NEXTX
JMP 1AF  ;NEXTY	
MOV BX,[BP+18] 
MOV ES,BX
MOV DI,[BP+16]
MOV AX,[BP-4]
STOSW
;END 
POP AX
POP AX
;STACKPOPEND
POP BP
POP DS
RETF C

************************

SIRIUSGET

STACK LAYOUT

16 FROMSEGMENT
14 FROMOFFSET
12 BUFFERSEGMENT
10 BUFFEROFFSET
E  X1
C  Y1
A  X2
8  Y2
6  BASIC SEGMENT
4  BASIC OFFSET
2  BP
0  DS

PUSH DS
PUSH BP
MOV BP,SP
MOV AX,[BP+12]
MOV ES,AX
MOV DI,[BP+10]
MOV AX,[BP+16]
MOV DS,AX
MOV SI,[BP+C]
MOV AX,SI
MOV CL,8
SHL AX,CL
MOV CL,6
SHL SI,CL
ADD SI,AX
ADD SI,[BP+14]
ADD SI,[BP+E]
MOV AX,[BP+A]
SUB AX,[BP+E]
ADD AX,1
MOV DX,AX
MOV CL,3
SHL AX,CL
STOSW
XOR AH,AH
MOV AL,[BP+8]
SUB AL,[BP+C]
ADD AL,1
STOSW
ADD AL,1
MOV BX,140
SUB BX,DX
SUB SI,BX
;NEXTY
DEC AL
JZ 156 ;END
ADD SI,BX
MOV CX,DX
;NEXTX
REP MOVSB
JMP 14A   ;NEXTY
;END
POP BP
POP DS
RETF 10

************************

SIRIUSSCROLL

STACK LAYOUT
12 FROMSEGMENT
10 FROMOFFSET
E  TOSEGMENT
C  TOOFFSET
A  X
8  Y

PUSH BP
PUSH DS
MOV BP,SP
MOV DX,[BP+8]
CMP DX,0
JGE 10E   Y>0;
NEG DX
;Y>0
MOV AX,DX
MOV CL,6
SHL DX,CL
MOV CL,8
SHL AX,CL 
ADD DX,AX
MOV AX,[BP+10]
MOV BX,[BP+C]
MOV CX,[BP+8]
CMP CX,0
JL 12C ;Y<0
ADD AX,DX
JMP 130 ;DONEY:
;Y<0
NEG CX
ADD BX,DX
;DONEY
MOV CX,FA00
SUB CX,DX
MOV DX,[BP+A]
CMP DX,0
JL 141    ;X<0
ADD AX,DX
JMP 145   ;DONEX
;X<0
NEG DX
ADD BX,DX
;DONEX
SUB CX,DX
MOV DX,[BP+12]
MOV DS,DX
MOV SI,AX
MOV DX,[BP+E]
MOV ES,DX
MOV DI,BX
REP MOVSB  
MOV ES,DX
XOR AL,AL
MOV BX,[BP+A]
MOV DI,[BP+C]
CMP BX,0
JE 190 ;DOY
CMP BX,0
JG 179  ;319
NEG BX
MOV DH,C8
MOV CX,140
SUB CX,BX
MOV [BP+A],CX
JMP 185  ;WIPEX
;319
MOV DH,C8
MOV CX,140
SUB CX,BX
MOV DI,CX
MOV [BP+A],CX
;WIPEX
MOV CX,BX
REP STOSB
ADD DI,[BP+A]
DEC DH
JNZ 185 ;WIPEX
;DOY
MOV DL,[BP+8]
MOV DI,[BP+C]
CMP DL,0
JE 1BF  ;END
CMP DL,0
JG 1A4 ;199
NEG DL
JMP 1B6  ;WIPEY
;199
XOR DH,DH
MOV BL,C8
SUB BL,DL
MOV DI,BX
MOV CL,6
SHL DI,CL
MOV CL,8
SHL BX,CL
ADD DI,BX
;WIPEY
MOV CX,140
REP STOSB
DEC DL
JNZ 1B6  ;WIPEY
;END
POP DS
POP BP
RETF C

************************

SIRIUSBOX

STACK LAYOUT
12 BUFFERSEGMENT
10 BUFFEROFFSET
E  X1
C  Y1
A  X2
8  Y2
6  COL
4  BASIC SEGMENT
2  BASIC OFFSET
0  BP

PUSH BP
MOV BP,SP
MOV AX,[BP+12]
MOV ES,AX
MOV DI,[BP+C]
MOV AX,DI
MOV CL,8
SHL AX,CL
MOV CL,6
SHL DI,CL
ADD DI,AX
ADD DI,[BP+E]
ADD DI,[BP+10]
MOV DX,[BP+A]
SUB DX,[BP+E]
ADD DX,1
MOV AH,[BP+8]
SUB AH,[BP+C]
ADD AH,2
MOV BX,140
SUB BX,DX
SUB DI,BX
MOV AL,[BP+6]
;NEXTY
DEC AH
JZ 145  ;END
ADD DI,BX
MOV CX,DX
;NEXTX
REP STOSB
JMP 139   ;NEXTY
;END
POP BP
RETF E

************************

SIRIUSPRINT

STACK LAYOUT
28 TOSEGMENT
26 TOOFFSET
24 LEN
22 SADD
20 X
1E Y
1C COL
1A ACROSSORDOWN
18 BASICSEGMENT
16 BASICOFFSET
14 BP
12 DS
10 1
E  2
C  4
A  8
8  16
6  32
4  64
2  128

PUSH BP
PUSH DS
MOV CL,1
MOV AX,1
PUSH AX
MOV DH,7
SHL AX,CL
PUSH AX      
DEC DH
JNZ 10A 	;NEXTSHIFT
MOV BP,SP
SUB BP,2
MOV AL,[BP+1A]  
CMP AL,0
JL 126   ;-1
CMP AL,0
JG 12B     ;1
MOV AX,F608
JMP 12D ;DOWN
;-1
MOV AX,EC00
JMP 12D ;DOWN
;1
XOR AX,AX
;DOWN
MOV [BP+1A],AX   
MOV AX,[BP+28]   
MOV ES,AX
MOV DI,[BP+1E]  
MOV AX,DI
MOV CL,8
SHL AX,CL
MOV CL,6
SHL DI,CL
MOV CL,3
ADD DI,AX
ADD DI,[BP+20]   
ADD DI,[BP+26]   
MOV AL,[BP+1C]  
SUB DI,[BP+1A]  
MOV DX,139
SUB DI,DX
;NEXTCHAR
MOV CH,[BP+24]  
DEC CH
JZ 1AC ;END:
MOV [BP+24],CH  
MOV DX,[BP+12]
MOV DS,DX
MOV SI,[BP+22]  
XOR DH,DH
MOV DL,[SI]
INC SI
MOV [BP+22],SI  
SHL DX,CL
ADD DX,E
MOV CH,9
MOV BX,FFA6
MOV DS,BX
ADD DI,[BP+1A] 
;NEXTY:
DEC CH
JZ 157 ; NEXTCHAR
MOV BX,139
ADD DI,BX
MOV SI,DX
MOV BX,[SI]
ADD SI,1
MOV DX,SI
MOV SI,0 
MOV AH,7
;NEXTX
ADD SI,2
TEST BX,[BP+SI]
JZ 1A5     ;BIT0:
STOSB
DEC AH
JNZ 197   ;NEXTX
JMP  180   ;NEXTY:
;BIT0:
INC DI
DEC AH
JNZ 197  ;NEXTX
JMP  180  ;NEXTY
;END
POP AX
POP AX
POP AX
POP AX
POP AX
POP AX
POP AX
POP AX
POP DS
POP BP
RETF 10

************************

SIRIUSLINE

STACK LAYOUT
14 TOSEGMENT
12 TOOFFSET
10 X1
E  Y1
C  X2
A  Y2
8  COL
6  BASIC SEGEMENT
4  BASIC OFFSET
2  BP
0  DS
-2 XDIFF
-4 XSTEP
-6 YDIFF
-8 YSTEP

PUSH DS
PUSH BP
MOV BP,SP
;XDIFF
MOV BX,[BP+C]
MOV AX,[BP+10]
MOV CX,BX
SUB CX,AX
MOV DX,1
CMP AX,BX
JL 119  ;X1<
NEG CX
NEG DX
;X1<
PUSH CX  ;XDIFF
PUSH DX  ;XSTEP
;YDIFF
MOV BX,[BP+A]
MOV AX,[BP+E]
MOV CX,BX
SUB CX,AX
MOV DX,140
MOV DI,1
CMP AX,BX
JL 135  ;Y1<
NEG DX
NEG CX
NEG DI
;Y1<
MOV [BP+A],DI
PUSH CX ;YDIFF
PUSH DX ;YSTEP
MOV DX,[BP+14]
MOV DS,DX
MOV SI,[BP+E]
MOV DX,SI
MOV CL,8
SHL DX,CL
MOV CL,6
SHL SI,CL
ADD SI,DX
ADD SI,[BP+10]
ADD SI,[BP+12]
MOV AL,[BP+8]
MOV BX,[BP-2]
MOV CX,[BP-6]
CMP BX,CX
JLE 1AC   ;INITY
;INITX
MOV DX,[BP+10]
MOV DI,[BP+E]
XOR CX,CX
CMP BX,0 
JGE 170   ;DRAWLINEX
NEG BX
;DRAWLINEX
CMP DX,0
JL 18D  ;SKIPPIXELA 
MOV AX,13F
CMP DX,AX
JG 18D  ;SKIPPIXELA 
CMP DI,0
JL 18D  ;SKIPPIXELA 
MOV AX,C7
CMP DI,AX
JG 18D  ;SKIPPIXELA 
MOV AL,[BP+8]
MOV [SI],AL
;SKIPPIXELA
ADD SI,[BP-4]
ADD CX,[BP-6]
CMP CX,[BP-2]
JL  1A1  ;NEXTX
ADD SI,[BP-8]
SUB CX,[BP-2]
ADD DI,[BP+A]
;NEXTX
ADD DX,[BP-4]
DEC BX
CMP BX,0
JGE 170  ;DRAWLINEX
JMP 1F5  ;END
;INITY
MOV DX,[BP+10]
MOV DI,[BP+E]
XOR BX,BX
CMP CX,0 
JGE 1BB   ;DRAWLINEY
NEG CX
;DRAWLINEY
CMP DX,0
JL 1D8   ;SKIPPIXEL
MOV AX,13F
CMP DX,AX
JG 1D8   ;SKIPPIXEL
CMP DI,0
JL 1D8  ;SKIPPIXEL 
MOV AX,C7
CMP DI,AX 
JG 1D8   ;SKIPPIXEL
MOV AL,[BP+8]
MOV [SI],AL
;SKIPPIXEL
ADD SI,[BP-8]
ADD BX,[BP-2]
CMP BX,[BP-6]
JL  1EC  ;NEXTY
ADD SI,[BP-4]
SUB BX,[BP-6]
ADD DX,[BP-4]
;NEXTY
ADD DI,[BP+A]
DEC CX
CMP CX,0
JGE 1BB ;DRAWLINEY
POP AX
POP AX
POP AX
POP AX
POP BP
POP DS
RETF E

************************
MOUSE
************************

SIRIUSMOUSEINITIALIZE

STACK LAYOUT
6 BASIC AX VARIABLE OFFSET
4 BASIC SEGMENT
2 BASIC OFFSET
0 BP

PUSH BP
MOV BP,SP
XOR AX,AX
INT 33
MOV BX,[BP+6]
MOV [BX],AX
POP BP
RETF 2

************************

SIRIUSMOUSE

STACK LAYOUT
C BASIC AX VARIABLE OFFSET
A BASIC BX VARIABLE OFFSET
8 BASIC CX VARIABLE OFFSET
6 BASIC DX VARIABLE OFFSET
4 BASIC SEGMENT
2 BASIC OFFSET
0 BP

PUSH BP
MOV BP,SP
MOV SI,[BP+C]
MOV AX,[SI]
MOV SI,[BP+A]
MOV BX,[SI]
MOV SI,[BP+8]
MOV CX,[SI]
MOV SI,[BP+6]
MOV DX,[SI]
INT 33
MOV AX,BX
MOV BX,[BP+A]
MOV [BX],AX
MOV BX,[BP+8]
MOV [BX],CX
MOV BX,[BP+6]
MOV [BX],DX
POP BP
RETF 8

************************
EMS 
************************

SIRIUSEMSSTATUS

STACK LAYOUT
6 BASIC EMSSTAT VARIABLE OFFSET
4 BASIC SEGMENT
2 BASIC OFFSET
0 BP

PUSH BP
MOV BP,SP
XOR AL,AL
MOV AH,40
INT 67
MOV BX,[BP+6]
MOV [BX],AX
POP BP
RETF 2

*************************

SIRIUSEMSGET

STACK LAYOUT
8 BASIC HANDLE VARIABLE OFFSET
6 NUMBERPAGES
4 BASIC SEGMENT
2 BASIC OFFSET
0 BP
PUSH BP
MOV BP,SP
MOV AH,43
MOV BX,[BP+6]
INT 67
MOV BX,[BP+8]
MOV [BX],DX
POP BP
RETF 4


*************************

SIRIUSRELEASEEMS

STACK LAYOUT
6 HANDLE
4 BASIC SEGMENT
2 BASIC OFFSET
0 BP

PUSH BP
MOV BP,SP
MOV AH,45
MOV DX,[BP+6]
INT 67
POP BP
RETF 2

*************************

SIRIUSPAGEFRAME

STACK LAYOUT
6 BASIC PAGEFRAME VARIABLE OFFSET
4 BASIC SEGMENT
2 BASIC OFFSET
0 BP

PUSH BP
MOV BP,SP
MOV AH,41
INT 67
MOV AX,BX
MOV BX,[BP+6]
MOV [BX],AX
POP BP
RETF 2

*************************

SIRIUSMAPEMS

STACK LAYOUT
8 HANDLE
6 PAGENUMBER
4 BASIC SEGMENT
2 BASIC OFFSET
0 BP

PUSH BP
MOV BP,SP
XOR AL,AL
MOV BX,[BP+6]
MOV DX,[BP+8]
;MAPEMS
MOV AH,44
INT 67
INC AL
INC BX
CMP AL,4
JNZ 10B ;  MAPEMS
POP BP
RETF 4



