; 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