home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Party 1994: Try This At Home
/
disk_image.bin
/
source
/
bars
/
bar.asm
next >
Wrap
Assembly Source File
|
1993-04-10
|
14KB
|
340 lines
; Copper bars by Patch (hamell@rigel.cs.pdx.edu)
; Uses raster method
; 4-9-93
; Call Dead Man's Hand at 503.288.9264 - USR 16.8k DS
; Programming source only
.model tiny
.286
JUMPS
.code
org 100h
start: mov ax,0013h
int 10h
in al,21h ; get IRQ mask
mov [irqsave],al ; save it
mov al,11111101b ; all but kbd off
out 21h,al ; set new IRQ mask
in al,0a1h ; get NMI mask
mov [nmisave],al ; save it
mov al,11111111b ; ?
out 0a1h,al ; set new NMI mask
mov dx,03c8h
mov al,01h
out dx,al
xor al,al
inc dx
out dx,al
out dx,al
out dx,al
push 0a000h
pop es
xor di,di
mov ax,0101h
mov cx,32000
cld
rep stosw
push ds
pop es
mov bx,offset barline
startbar: cli ; don't poll keyboard
mov si,offset palette ; set up pointer
mov bp,01h ; bar num = 1
palsetup:
push bp
mov di,[bx]
mov al,sintable[di] ; top bar line
mov di,offset barpal
dec al ; dec for 0th index element
xor ah,ah ; clear high byte
mov cx,ax
shl ax,1
add ax,cx
add di,ax
add di,ax
mov bp,offset barpriority ;
add bp,cx ; set to proper spot in priority check
mov cx,[barheight]
checkline:
cmp byte ptr [bp],00h ; is the line empty?
jne nodrawline ; if not, jump
mov byte ptr [bp],01h ; it's full now
movsw
movsb
sub si,3
movsw
movsb
jmp nextpriority
nodrawline: add si,3 ; increment palette pointer
; add si,6
add di,6 ; increment bar palette
nextpriority: inc bp ; next priority line
loop checkline
barspot: add word ptr [bx],03h ; increment table index
cmp word ptr [bx],359 ; end of table?
jle nextbar
resetbarspot: mov word ptr [bx],00h ; reset table index
nextbar:
pop bp ; restore bar num
inc bx ; next bar line address
inc bx ; word size = + 2
inc bp ; increment bar counter
cmp bp,[barcount] ; bar count at max?
jle palsetup ; if <= , go back
mov si,offset barpal
mov cx,400
mov dx,03dah ; set up Input Status 1 reg
VRetrace: in al,dx
test al,00001000b ; test bit 3, vertical retrace
jnz VRetrace ; if active, go back
VNoRetrace: in al,dx
test al,00001000b ; test bit 3, vertical retrace
jz VNoRetrace ; if active, go back
paldump:
mov al,01h
mov dx,03c8h
out dx,al
inc dx
outsb ; dump it out
outsb
mov dx,03dah
puck1:
in al,dx
test al,00000001b
jz puck1
mov dx,03c9h
outsb
mov dx,03dah ; set up Input Status 1 reg
HRetrace: in al,dx
test al,00000001b ; test bit 1, horiz retrace
jnz HRetrace ; if not active, go back
; HNoRetrace: in al,dx
; test al,00000001b ; test bit 1, horiz retrace
; jz HNoRetrace ; if active, go back
; mov dx,03dah
loop paldump
mov di,offset barpriority
mov cx,100 ; 100 of them WORD sized
xor ax,ax ; AH = 0, AL = 0
rep stosw ; zero them all out
mov di,offset barpal
mov cx,600
xor ax,ax
rep stosw
sub bx,[barcount] ; reset bar line address
sub bx,[barcount] ; twice for word size
sti ; ok, poll keyboard
mov ah,01h
int 16h
jnz exit
jmp startbar
exit:
mov al,[irqsave] ; get old IRQ mask
out 021h,al ; restore IRQ mask
mov al,[nmisave] ; get old NMI mask
out 0a1h,al ; restore NMI mask
mov ax,0003h
int 10h
mov ax,4c00h
int 21h
sintable db 1,1,1,1,1,1,1,1,1,2,2,2
db 3,3,3,4,4,5,5,6,6,7,7,8
db 8,9,10,11,11,12,13,14,14,15,16,17
db 18,19,20,21,22,23,24,25,26,27,29,30
db 31,32,33,35,36,37,38,40,41,42,44,45
db 46,48,49,51,52,54,55,57,58,60,61,63
db 64,66,67,69,70,72,73,75,77,78,80,81
db 83,84,86,88,89,91,93,94,96,97,99,101
db 102,104,105,107,108,110,112,113,115,116,118,119
db 121,122,124,125,127,128,130,131,133,134,136,137
db 138,140,141,143,144,145,147,148,149,150,152,153
db 154,155,156,158,159,160,161,162,163,164,165,166
db 167,168,169,170,171,171,172,173,174,174,175,176
db 177,177,178,178,179,179,180,180,181,181,182,182
db 182,183,183,183,184,184,184,184,184,184,184,184 ; top to bottom palette values
db 184,184,184,184,184,184,184,184,184,183,183,183
db 182,182,182,181,181,180,180,179,179,178,178,177
db 177,176,175,174,174,173,172,171,171,170,169,168
db 167,166,165,164,163,162,161,160,159,158,156,155
db 154,153,152,150,149,148,147,145,144,143,141,140
db 139,137,136,134,133,131,130,128,127,125,124,122
db 121,119,118,116,115,113,112,110,108,107,105,104
db 102,101,99,97,96,94,93,91,89,88,86,84
db 83,81,80,78,77,75,73,72,70,69,67,66
db 64,63,61,60,58,57,55,54,52,51,49,48
db 47,45,44,42,41,40,38,37,36,35,33,32
db 31,30,29,27,26,25,24,23,22,21,20,19
db 18,17,16,15,14,14,13,12,11,11,10,9
db 8,8,7,7,6,6,5,5,4,4,3,3
db 3,2,2,2,1,1,1,1,1,1,1,1 ; bottom to top palette values
palette db 7, 7, 7 ; gray bar start
db 10,10,10
db 13,13,13
db 16,16,16
db 19,19,19
db 22,22,22
db 25,25,25
db 28,28,28
db 31,31,31 ; middle
db 28,28,28
db 25,25,25
db 22,22,22
db 19,19,19
db 16,16,16
db 13,13,13
db 10,10,10
db 7, 7, 7 ; gray bar end
db 7, 0, 0 ; red bar start
db 10, 0, 0
db 13, 0, 0
db 16, 0, 0
db 19, 0, 0
db 22, 0, 0
db 25, 0, 0
db 28, 0, 0
db 31, 0, 0 ; middle
db 28, 0, 0
db 25, 0, 0
db 22, 0, 0
db 19, 0, 0
db 16, 0, 0
db 13, 0, 0
db 10, 0, 0
db 7, 0, 0 ; red bar end
db 0, 7, 0 ; green bar start
db 0,10, 0
db 0,13, 0
db 0,16, 0
db 0,19, 0
db 0,22, 0
db 0,25, 0
db 0,28, 0
db 0,31, 0 ; middle
db 0,28, 0
db 0,25, 0
db 0,22, 0
db 0,19, 0
db 0,16, 0
db 0,13, 0
db 0,10, 0
db 0, 7, 0 ; green bar end
db 0, 0, 7 ; blue bar start
db 0, 0,10
db 0, 0,13
db 0, 0,16
db 0, 0,19
db 0, 0,22
db 0, 0,25
db 0, 0,28
db 0, 0,31 ; middle
db 0, 0,28
db 0, 0,25
db 0, 0,22
db 0, 0,19
db 0, 0,16
db 0, 0,13
db 0, 0,10
db 0, 0, 7 ; blue bar end
db 7, 7, 0 ; yellow bar start
db 10,10, 0
db 13,13, 0
db 16,16, 0
db 19,19, 0
db 22,22, 0
db 25,25, 0
db 28,28, 0
db 31,31, 0 ; middle
db 28,28, 0
db 25,25, 0
db 22,22, 0
db 19,19, 0
db 16,16, 0
db 13,13, 0
db 10,10, 0
db 7, 7, 0 ; yellow bar end
db 7, 0, 7 ; purple bar start
db 10, 0,10
db 13, 0,13
db 16, 0,16
db 19, 0,19
db 22, 0,22
db 25, 0,25
db 28, 0,28
db 31, 0,31 ; middle
db 28, 0,28
db 25, 0,25
db 22, 0,22
db 19, 0,19
db 16, 0,16
db 13, 0,13
db 10, 0,10
db 7, 0, 7 ; purple bar end
db 0, 7, 7 ; cyan bar start
db 0,10,10
db 0,13,13
db 0,16,16
db 0,19,19
db 0,22,22
db 0,25,25
db 0,28,28
db 0,31,31 ; middle
db 0,28,28
db 0,25,25
db 0,22,22
db 0,19,19
db 0,16,16
db 0,13,13
db 0,10,10
db 0, 7, 7 ; cyan bar end
db 18, 8, 1 ; copper bar start
db 23,13, 5
db 28,18, 9
db 33,23,13
db 38,28,17
db 43,33,21
db 48,38,25
db 53,43,29
db 58,48,33 ; middle
db 53,43,29
db 48,38,25
db 43,33,21
db 38,28,17
db 33,23,13
db 28,18, 9
db 23,13, 5
db 18, 8, 1 ; copper bar end
barline dw 175,150,125,100,75,50,25,0
;barline dw 175,170,165,160,155,150,145,140
barpriority db 200 dup(0)
barheight dw 17
barcount dw 8
barpal db 400*3 dup(0)
irqsave db ?
nmisave db ?
end start