; Copper bars by Patch (hamell@rigel.cs.pdx.edu) ; Uses "color each line differently and cycle colors" 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 xor al,al out dx,al inc dx mov cx,256 spoo: out dx,al out dx,al out dx,al loop spoo mov bx,200 mov ax,0101h push 0a000h pop es xor di,di cld spank: mov cx,160 rep stosw inc al inc ah dec bx jnz spank push ds pop es cld 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 ; set to proper spot in bar palette 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 jmp nextpriority nodrawline: add si,3 ; increment palette pointer add di,3 ; 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 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,200 mov dx,03dah ; Input Status 1 reg VRetrace: in al,dx test al,00001000b ; test bit 3, vert retrace jnz VRetrace ; if active, go back VNoRetrace: in al,dx test al,00001000b ; test bit 3, vert retrace jz VNoRetrace ; if active, go back mov al,01h ; start at color 1 mov dx,03c8h out dx,al inc dx paldump: 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 ; mov dx,03c9h 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,300 xor ax,ax rep stosw sub bx,[barcount] ; reset bar line address sub bx,[barcount] ; twice for word size sti mov ah,01h int 16h jz 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 barpriority db 200 dup(0) barheight dw 17 barcount dw 8 bardelay dw 10 barpal db 200*3 dup(0) irqsave db ? nmisave db ? end start