Slide 1

Slide 1 text

“Raster Shaders” on

Slide 2

Slide 2 text

I keep old computers alive mehowte  Michał Taszycki on

Slide 3

Slide 3 text

I’m making a weekly video course about programming Commodore 64 h/p:/ /64bites.com/

Slide 4

Slide 4 text

Commodore 64 belongs to the past…

Slide 5

Slide 5 text

Today

Slide 6

Slide 6 text

Back then

Slide 7

Slide 7 text

Today

Slide 8

Slide 8 text

Back then

Slide 9

Slide 9 text

Back then

Slide 10

Slide 10 text

Back then?

Slide 11

Slide 11 text

Today!

Slide 12

Slide 12 text

Pixel Shader varying vec3 N; varying vec3 v; void main(void) { vec3 L = normalize(gl_LightSource[0].position.xyz - v); vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0); Idiff = clamp(Idiff, 0.0, 1.0); gl_FragColor = Idiff; }

Slide 13

Slide 13 text

“Raster Shader” irq: lda #$ff sta $d019 ldx #$05 d: dex bne d ldx #$00 c: ldy #$08 a: lda colors,x sta $d020 sta $d021 inx dey beq c txa ldx #$07 b: dex bne b tax cpx #$8c bcc a

Slide 14

Slide 14 text

Enough talking!

Slide 15

Slide 15 text

Let’s code!

Slide 16

Slide 16 text

A minimal program :BasicUpstart2(main) main: rts

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

LDA adress LDA #value RAM ➞ A register STA address A register ➞ RAM Most important instructions

Slide 19

Slide 19 text

rts main: lda # sta background_color lda # sta border_color GRAY DARK_GRAY Border & Backgound Colors .label border_color = $d020 .label background_color = $d021 :BasicUpstart2(main)

Slide 20

Slide 20 text

Macros rts main: lda # sta background_color lda # sta border_color GRAY DARK_GRAY

Slide 21

Slide 21 text

rts main: lda # sta background_color lda # sta border_color GRAY DARK_GRAY .macro background(color) { } Macros

Slide 22

Slide 22 text

lda # sta background_color rts main: :background( ) color lda # sta border_color GRAY DARK_GRAY .macro background(color) { } Macros

Slide 23

Slide 23 text

lda # sta background_color rts main: :background( ) color lda # sta border_color GRAY DARK_GRAY .macro background(color) { } Macros

Slide 24

Slide 24 text

lda # sta background_color rts main: .macro border(color) { } :background( ) color lda # sta border_color GRAY DARK_GRAY .macro background(color) { } Macros

Slide 25

Slide 25 text

:border( ) .macro background(color) { } lda # sta background_color rts main: .macro border(color) { } :background( ) color lda # sta border_color GRAY DARK_GRAY color Macros

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Raster Bar // long delay :background(BLACK) :background(DARK_GRAY)

Slide 28

Slide 28 text

Delay :background(BLACK) :background(DARK_GRAY) nop

Slide 29

Slide 29 text

:background(BLACK) :background(DARK_GRAY) nop nop Delay

Slide 30

Slide 30 text

:background(BLACK) :background(DARK_GRAY) nop nop nop Delay

Slide 31

Slide 31 text

:background(BLACK) :background(DARK_GRAY) nop // ... many more nops nop nop Delay

Slide 32

Slide 32 text

:background(BLACK) :background(DARK_GRAY) .for (var i = 0; i < ; i++) { nop } 230 Delay

Slide 33

Slide 33 text

.macro nops( ) { } .for (var i = 0; i < ; i++) { nop } :background(BLACK) :background(DARK_GRAY) 230 count Delay

Slide 34

Slide 34 text

:nops( ) .macro nops( ) { } .for (var i = 0; i < ; i++) { nop } :background(BLACK) :background(DARK_GRAY) 230 count count Delay

Slide 35

Slide 35 text

Interrupts raster_bars_irq: jmp irq_handler :nops( ) :background(BLACK) :background(DARK_GRAY) 230

Slide 36

Slide 36 text

// Disable IRQ handling sei // inject the handler lda #raster_bars_irq sta irq_vector + 1 // Enable IRQ handling cli Interrupts

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

// inject the handler lda #raster_bars_irq sta irq_vector + 1 Let’s Disable Timer cli sei

Slide 39

Slide 39 text

cli sei Let’s Disable Timer

Slide 40

Slide 40 text

cli sei // Disable the interrupt generated by timers lda #%01111111 sta cia1_interrupt_control_register sta cia2_interrupt_control_register // Negate already scheduled interrupts lda cia1_interrupt_control_register lda cia2_interrupt_control_register Let’s Disable Timer

Slide 41

Slide 41 text

Let’s Enable Raster cli sei // Disable the interrupt generated by timers lda #%01111111 sta cia1_interrupt_control_register sta cia2_interrupt_control_register // Negate already scheduled interrupts lda cia1_interrupt_control_register lda cia2_interrupt_control_register // Enable raster interrupts lda #%00000001 sta vic2_interrupt_control_register

Slide 42

Slide 42 text

Choose Raster Line cli sei // Disable the interrupt generated by timers lda #%01111111 sta cia1_interrupt_control_register sta cia2_interrupt_control_register // Negate already scheduled interrupts lda cia1_interrupt_control_register lda cia2_interrupt_control_register // Enable raster interrupts lda #%00000001 sta vic2_interrupt_control_register :request_raster_irq(106, raster_bars_irq)

Slide 43

Slide 43 text

.macro request_raster_irq(line_number, handler) { } Choose Raster Line

Slide 44

Slide 44 text

.macro request_raster_irq(line_number, handler) { } lda #handler sta irq_vector + 1 Choose Raster Line

Slide 45

Slide 45 text

.macro request_raster_irq(line_number, handler) { } lda #handler sta irq_vector + 1 lda #line_number sta vic2_rasterline_register Choose Raster Line

Slide 46

Slide 46 text

.macro request_raster_irq(line_number, handler) { } lda #handler sta irq_vector + 1 .if (line_number > 255) { :set_bits(screen_control_register, %10000000) } else { :clear_bits(screen_control_register, %10000000) } lda #line_number sta vic2_rasterline_register Choose Raster Line

Slide 47

Slide 47 text

.macro set_bits(address, bit_mask) { lda address ora #bit_mask sta address } .macro clear_bits(address, bit_mask) { lda address and #255 - bit_mask sta address } Choose Raster Line

Slide 48

Slide 48 text

IRQ Acknowledged? jmp irq_handler raster_bars_irq: :background(BLACK) :nops(230) :background(DARK_GRAY)

Slide 49

Slide 49 text

Przerwanie obsłużone? raster_bars_irq: :background(BLACK) :nops(230) :background(DARK_GRAY) lda #%00000001 sta vic2_interrupt_status_register jmp irq_handler

Slide 50

Slide 50 text

Przerwanie obsłużone? raster_bars_irq: :background(BLACK) :nops(230) :background(DARK_GRAY) :exit_irq_handler() .macro exit_irq_handler() { } lda #%00000001 sta vic2_interrupt_status_register jmp irq_handler

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

Stabilization :exit_irq_handler() raster_bars_irq: :nops(14) :background(BLACK) :nops(230) :background(DARK_GRAY)

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

Raster Bars! :exit_irq_handler() raster_bars_irq:

Slide 55

Slide 55 text

:nops(14) :background(BLACK) :nops(4) :background(DARK_GRAY) :nops(29) :background(GRAY) :nops(29) :background(LIGHT_GRAY) :nops(29) :background(WHITE) Raster Bars! :exit_irq_handler() raster_bars_irq:

Slide 56

Slide 56 text

:nops(14) :background(BLACK) :nops(4) :background(DARK_GRAY) :nops(29) :background(GRAY) :nops(29) :background(LIGHT_GRAY) :nops(29) :background(WHITE) Raster Bars! :exit_irq_handler() raster_bars_irq: // ...

Slide 57

Slide 57 text

:nops(14) :background(BLACK) :nops(4) :background(DARK_GRAY) :nops(29) :background(GRAY) :nops(29) :background(LIGHT_GRAY) :nops(29) :background(WHITE) Raster Bars! :exit_irq_handler() raster_bars_irq: // ... // ...

Slide 58

Slide 58 text

:nops(14) :background(BLACK) :nops(4) :background(DARK_GRAY) :nops(29) :background(GRAY) :nops(29) :background(LIGHT_GRAY) :nops(29) :background(WHITE) Raster Bars! :exit_irq_handler() raster_bars_irq: :nops(29) :background(LIGHT_GRAY) :nops(29) :background(GRAY) :nops(29) :background(DARK_GRAY) :nops(29) :background(BLACK) :nops(4) :background(DARK_GRAY) // ... // ...

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

Hardware Sprites

Slide 61

Slide 61 text

// Enable all 8 sprites lda #%11111111 sta sprites.enable_bits Hardware Sprites

Slide 62

Slide 62 text

// Enable all 8 sprites lda #%11111111 sta sprites.enable_bits .for (var i = 0; i < 8; i++) { :set_sprite_position_x(i, 60 + 32 * i) } Hardware Sprites

Slide 63

Slide 63 text

.macro set_sprite_position_x(index, position_x) { } Hardware Sprites

Slide 64

Slide 64 text

.macro set_sprite_position_x(index, position_x) { } lda #position_x sta sprites.positions + index*2 + 0 Hardware Sprites

Slide 65

Slide 65 text

.macro set_sprite_position_x(index, position_x) { } .if (position_x > 255) { :set_bits(sprites.position_x_high_bits,1<

Slide 66

Slide 66 text

More Interrupts raster_bars_irq: :exit_irq_handler() // ... :nops(14)

Slide 67

Slide 67 text

sprite_row_irq1: :exit_irq_handler() // ... raster_bars_irq: :exit_irq_handler() // ... :nops(14) More Interrupts

Slide 68

Slide 68 text

sprite_row_irq1: :exit_irq_handler() // ... raster_bars_irq: :exit_irq_handler() // ... :request_raster_irq(60, sprite_row_irq1) :nops(14) More Interrupts

Slide 69

Slide 69 text

sprite_row_irq1: :exit_irq_handler() // ... :request_raster_irq(106, raster_bars_irq) raster_bars_irq: :exit_irq_handler() // ... :request_raster_irq(60, sprite_row_irq1) :nops(14) More Interrupts

Slide 70

Slide 70 text

sprite_row_irq1: :exit_irq_handler() // Set the y-position, bitmaps and colors :sprites_row(70, 0, 3) raster_bars_irq: :exit_irq_handler() // ... :request_raster_irq(60, sprite_row_irq1) :request_raster_irq(106, raster_bars_irq) :nops(14) More Interrupts

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

sprite_row_irq1: :exit_irq_handler() // Set the y-position, bitmaps and colors :sprites_row(70, 0, 3) Raster time raster_bars_irq: :exit_irq_handler() // ... :request_raster_irq(60, sprite_row_irq1) :request_raster_irq(106, raster_bars_irq) :nops(14)

Slide 73

Slide 73 text

sprite_row_irq1: :exit_irq_handler() // Set the y-position, bitmaps and colors :sprites_row(70, 0, 3) Raster time raster_bars_irq: :exit_irq_handler() // ... :request_raster_irq(60, sprite_row_irq1) :request_raster_irq(106, raster_bars_irq) :border(RED) :border(GRAY) :nops(14)

Slide 74

Slide 74 text

sprite_row_irq1: :exit_irq_handler() // Set the y-position, bitmaps and colors :sprites_row(70, 0, 3) Raster time raster_bars_irq: :exit_irq_handler() // ... :request_raster_irq(60, sprite_row_irq1) :request_raster_irq(106, raster_bars_irq) :nops(14) :border(RED) :border(GRAY) :border(GRAY) :border(ORANGE)

Slide 75

Slide 75 text

sprite_row_irq1: :exit_irq_handler() // Set the y-position, bitmaps and colors :sprites_row(70, 0, 3) Raster time raster_bars_irq: :exit_irq_handler() // ... :request_raster_irq(60, sprite_row_irq1) :request_raster_irq(106, raster_bars_irq) :nops(7) :border(RED) :border(GRAY) :border(GRAY) :border(ORANGE)

Slide 76

Slide 76 text

No content

Slide 77

Slide 77 text

More Sprites raster_bars_irq: :request_raster_irq( ) :exit_irq_handler() 60, sprite_row_irq1 sprite_row_irq1: // ... // ...

Slide 78

Slide 78 text

raster_bars_irq: :request_raster_irq( ) :exit_irq_handler() sprite_row_irq2: :border(CYAN) :sprites_row(160, 8, 12) :border(GRAY) :request_raster_irq( ) :exit_irq_handler() 60, sprite_row_irq1 sprite_row_irq1: // ... // ... More Sprites

Slide 79

Slide 79 text

raster_bars_irq: :request_raster_irq( ) :exit_irq_handler() sprite_row_irq2: :border(CYAN) :sprites_row(160, 8, 12) :border(GRAY) :request_raster_irq( ) :exit_irq_handler() 60, sprite_row_irq1 sprite_row_irq1: // ... // ... 150, sprite_row_irq2 More Sprites

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

Thin Green Line… :request_raster_irq(248, open_border_irq) open_border_irq: :border(GREEN) :nops(14) :border(GRAY) :request_raster_irq(60, sprite_row_irq1) :exit_irq_handler()

Slide 82

Slide 82 text

No content

Slide 83

Slide 83 text

No content

Slide 84

Slide 84 text

Opening the Border sprite_row_irq2: :request_raster_irq(248, open_border_irq) :exit_irq_handler() open_border_irq: :request_raster_irq(60, sprite_row_irq1) :exit_irq_handler()

Slide 85

Slide 85 text

sprite_row_irq2: :request_raster_irq(248, open_border_irq) :exit_irq_handler() open_border_irq: :request_raster_irq(60, sprite_row_irq1) :exit_irq_handler() // Enable 25 lines mode :set_bits(screen_control_register, %00001000) Opening the Border

Slide 86

Slide 86 text

sprite_row_irq2: :request_raster_irq(248, open_border_irq) :exit_irq_handler() open_border_irq: :request_raster_irq(60, sprite_row_irq1) :exit_irq_handler() // Enable 24 lines mode :clear_bits(screen_control_register, %00001000) // Enable 25 lines mode :set_bits(screen_control_register, %00001000) Opening the Border

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

Draw Under The Border lda #%10110101 sta border_pattern

Slide 89

Slide 89 text

No content

Slide 90

Slide 90 text

No content

Slide 91

Slide 91 text

Music

Slide 92

Slide 92 text

// Import music from a file .pc=$1000 music: .import binary "music.bin" Music

Slide 93

Slide 93 text

main: // initialize music jsr music // Import music from a file .pc=$1000 music: .import binary "music.bin" Music

Slide 94

Slide 94 text

main: // initialize music jsr music // Import music from a file .pc=$1000 music: .import binary "music.bin" play_music: :border(YELLOW) jsr $music + 3 :border(GRAY) :request_raster_irq(248, open_border_irq) :exit_irq_handler() Music

Slide 95

Slide 95 text

No content

Slide 96

Slide 96 text

Try It Youself! h/p:/ /64bites.com/raster-shaders/ Don’t Let Old Computers Die