Процедура перевода цвета из отдельных значений red, green, blue в 16-битный цвет Союз-Неона:
Можно оптимизировать эту процедуру по скорости или по размеру, но так наглядней - понятен принцип кодирования цвета.Код:; input: R1 = pointer to red,green,blue bytes (0..63) ; output: R2 = 16-bit combined colour ConvertColour: PUSH R1 PUSH R3 PUSH R4 CLR R2 ; combined colour CLR R3 ; index in the bits table MOV #6,R4 ; process 6 bits 1: RORB (R1)+ ; get a red bit BCC 2 BIS BitsRed(R3),R2 2: RORB (R1)+ ; get a green bit BCC 3 BIS BitsGreen(R3),R2 3: RORB (R1) ; get a blue bit BCC 4 BIS BitsBlue(R3),R2 4: SUB #2,R1 ; set pointer back to red TST (R3)+ ; next bit in the table SOB R4,1 POP R4 POP R3 POP R1 RET ; strange RGB bit mapping BitsRed: .WORD 0, 10, 20, 2000, 4000, 10000 BitsGreen: .WORD 40,100,200,20000,40000,100000 BitsBlue: .WORD 0, 1, 2, 4, 400, 1000
Использование процедуры показано ниже. Допустим, у нас 256-цветный режим (1 байт на точку), в R0 лежит номер цвета в палитре. Тогда, получив с помощью процедуры ConvertColour закодированный цвет в R2, мы должны положить его старший байт в одно место в палитре, а младший байт - в другое, на 256 байт дальше. Такое неудобное (для программиста) устройство палитр в Союз-Неоне.
Код:MOV #RGB,R1 ; pointer to RGB values CALL ConvertColour MOVB R2,Palette+256.(R0) ; save low byte SWAB R2 MOVB R2,Palette(R0) ; save high byte RGB: .BYTE 37.,29.,11.




Ответить с цитированием