; 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
