{ SEAN PALMER >Okay, I've got this small problem porting one of my assembler routines >into pascal. It's a simple coppering routine (multiple setting of the >same palette register for trippy effects :), and i can't seem to use it >in my code.. I'll post the code here now (it's fairly short), and if >someone could help me out here, i'd be most grateful - since my >assembler/pascal stuff isn't too great.. I imported it, but couldn't get it to work (several problems in the source) and in the process of getting it to work (for one thing I didn't know what it was supposed to accomplish in the first place) I added a few things to it and this probably isn't what you wanted it to look like but it wouldn't be hard to do now that it's in TP-acceptable form. I also added one other small palette flipper that's kind of neat. } {$G+} uses crt; procedure copperBars(var colors; lines : word; regNum, count : byte); assembler; var c2 : byte; asm { okay, Colors is a pointer to the variable array of colours to use (6bit rgb values to pump to the dac) Lines is the number of scanlines on the screen (for syncing) RegNum is the colour register (DAC) to use. valid values are 0-255. that should explain that one. Count is the number of cycles updates to do before it exits. } push ds mov ah, [RegNum] mov dx, $3DA {vga status port} mov bl, $C8 {reg for DAC} cli cld @V1: in al, dx test al, 8 jz @V1 {vertical retrace} @V2: in al, dx test al, 8 jnz @V2 mov c2, 1 mov di, [lines] @UPDATER: mov bh, c2 inc c2 lds si, [colors] {now,just do it.} @NIKE: mov cx, 3 mov dl, $DA @H1: in al, dx and al, 1 jz @H1 {horizontal retrace} mov al, ah {color} mov dl, bl out dx, al inc dx rep outsb {186 instruction...} mov dl, $DA @H2: in al, dx and al, 1 jnz @H2; dec di jz @X dec bh jnz @NIKE jmp @UPDATER @X: dec count jnz @V1 sti {enable interrupts} End; procedure freakout0(lines : word; count : byte); assembler; asm mov dx, $3DA {vga status port} cli cld @V1: (* in al, dx test al, 8 jz @V1 {vertical retrace} @V2: in al, dx test al, 8 jnz @V2 *) mov di,[lines] @L: mov dl, $C8 mov al, 0 {color} out dx, al inc dx mov al, bh out dx, al add al, 20 out dx, al out dx, al add bh, 17 mov dl, $DA in al, dx test al, 1 jz @L; {until horizontal retrace} dec di jnz @L mov dl, $DA dec count jnz @V1 sti {enable interrupts} End; const pal : array [0..3 * 28 - 1] of byte = (2,4,4, 4,8,8, 6,12,12, 8,16,16, 10,20,20, 12,24,24, 14,28,28, 16,32,32, 18,36,36, 20,40,40, 22,44,44, 24,48,48, 26,52,52, 26,52,52, 28,56,56, 28,56,56, 30,60,60, 30,60,60, 30,60,60, 33,63,63, 33,63,63, 33,63,63, 33,63,63, 33,63,63, 30,60,60, 28,56,56, 26,52,52, 24,48,48); var i : integer; begin asm mov ax, $13 int $10 end; for i := 50 to 149 do fillchar(mem[$A000 : i * 320 + 50], 220, 1); repeat copperBars(pal, 398, 0, 8); {398 because of scan doubling} until keypressed; readkey; repeat freakout0(398, 8); {398 because of scan doubling} until keypressed; readkey; asm mov ax, 3 int $10 end; end.