рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреБрдЫ рддрд░рдХреАрдмреЗрдВ рдмрддрд╛рдИ рдЧрдИ рд╣реИрдВ рдЬреЛ рдореЗрд░реА рдЫреЛрдЯреА
рдХрдореЛрдбреЛрд░ 64 рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдиреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рд╣реИрдВред рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рдирд┐рдпрдо рд╕рд░рд▓ рдереЗ: рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ C64 (PRG) рдмрдирд╛рдПрдВ, рдЬреЛ рдиреАрдЪреЗ рджреА рдЧрдИ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИред рдЬрд┐рд╕рдХреА рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ рдореЗрдВ рдЫреЛрдЯреА рд╣реИ рд╡рд╣ рдЬреАрддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдЦреБрд▓реЗ рдЯреНрд╡реАрдЯреНрд╕ рдФрд░ рдирд┐рдЬреА рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ PRG рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдФрд░ MD5 рд╣реИрд╢ рд╢рд╛рдорд┐рд▓ рдереЗред
рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд▓рд┐рдВрдХ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА:
(рдпрджрд┐ рдореИрдВ рдХрд┐рд╕реА рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ, рдореИрдВ рд╕реВрдЪреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реВрдВрдЧрд╛)ред
рд▓реЗрдЦ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдХреБрдЫ рдХреЛрдбрд╛рдВрддрд░рдХ рдЯреНрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗред
рдореВрд▓ рдмрд╛рддреЗрдВ
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ C64 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 40x25 рд╡рд░реНрдг рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред RAM рдореЗрдВ рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рдХреЛ рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
$0400
(рд╕реНрдХреНрд░реАрди рд░реИрдо, 40x25 рдмрд╛рдЗрдЯреНрд╕)
$d800
(рд░рдВрдЧреАрди рд░реИрдо, 40x25 рдмрд╛рдЗрдЯреНрд╕)
рдПрдХ рдЪрд░рд┐рддреНрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╛рдЗрдЯ рдХреЛ рдСрди-рд╕реНрдХреНрд░реАрди рд░реИрдо,
$0400
(рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
$0400+y*40+x
) рдкрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рд░рдВрдЧ рд░реИрдо рдХреЛ рд╣рд▓реНрдХреЗ рдиреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд░рдВрдЧ 14): рдпрд╣ рд╡рд╣ рд░рдВрдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд░рдВрдЧ рд░реИрдо рдХреЛ рд╕реНрдкрд░реНрд╢ рдХреЗ рдмрд┐рдирд╛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк
$d020
(рд╕реАрдорд╛) рдФрд░
$d021
(рдкреГрд╖реНрдарднреВрдорд┐) рдореЗрдВ рдореЗрдореЛрд░реА I / O рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдорд╛ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рд╕реАрдзреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░реЗрдЦрд╛ рдХреЗ рдврд▓рд╛рди рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ рджреЛ рд▓рд╛рдЗрдиреЗрдВ рдЦреАрдВрдЪрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрд╣рд╛рдБ рдПрдХ C рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реАрди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ stdout рдореЗрдВ
malloc()
рдПрдХ рдкреАрд╕реА рдкрд░ рдХреЛрдб рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (
malloc()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):
#include <stdint.h> #include <stdio.h> #include <stdlib.h> void dump(const uint8_t* screen) { const uint8_t* s = screen; for (int y = 0; y < 25; y++) { for (int x = 0; x < 40; x++, s++) { printf("%c", *s == 0xa0 ? '#' : '.'); } printf("\n"); } } void setreg(uintptr_t dst, uint8_t v) { // *((uint8_t *)dst) = v; } int main() { // uint8_t* screenRAM = (uint_8*)0x0400; uint8_t* screenRAM = (uint8_t *)calloc(40*25, 0x20); setreg(0xd020, 0); // Set border color setreg(0xd021, 0); // Set background color int yslope = (25<<8)/40; int yf = yslope/2; for (int x = 0; x < 40; x++) { int yi = yf >> 8; // First line screenRAM[x + yi*40] = 0xa0; // Second line (X-mirrored) screenRAM[(39-x) + yi*40] = 0xa0; yf += yslope; } dump(screenRAM); }
рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрди рдХреЛрдб
$20
(рд░рд┐рдХреНрдд) рдФрд░
$a0
(рднрд░реЗ рд╣реБрдП 8 ├Ч 8 рдмреНрд▓реЙрдХ) рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЪрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рджреЛ рд▓рд╛рдЗрдиреЛрдВ рд╡рд╛рд▓рд╛ ASCII рдЪрд┐рддреНрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
## тАжтАжтАжтАжтАжтАжтАжтАжтАжтАжтАжтАжтАж ##
редред # .................................. # редред
... ## .............................. # # ...
..... # ............................ # .....
...... ## ........................ ## ......
........ ## .................... ## ........
.......... # .................. # ..........
........... ## .............. ## ..........ред
............. # ............ # ............ред
.............. ## ........ ## ..............
................ ## .... ## ................
.................. # .. # ..................
................... ## ...................
.................. # .. # ..................
................ ## .... ## ................
.............. ## ........ ## ..............
............. # ............ # ............ред
........... ## .............. ## ..........ред
.......... # .................. # ..........
........ ## .................... ## ........
...... ## ........................ ## ......
..... # ............................ # .....
... ## .............................. # # ...
редред # .................................. # редред
## тАжтАжтАжтАжтАжтАжтАжтАжтАжтАжтАжтАжтАж ##
рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
!include "c64.asm" +c64::basic_start(entry) entry: { lda #0 ; black color sta $d020 ; set border to 0 sta $d021 ; set background to 0 ; clear the screen ldx #0 lda #$20 clrscr: !for i in [0, $100, $200, $300] { sta $0400 + i, x } inx bne clrscr ; line drawing, completely unrolled ; with assembly pseudos lda #$a0 !for i in range(40) { !let y0 = Math.floor(25/40*(i+0.5)) sta $0400 + y0*40 + i sta $0400 + (24-y0)*40 + i } inf: jmp inf ; halt }
рдпрд╣ рдкреАрдЖрд░рдЬреА рдХреЛ 286 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЬрдЧрд╣ рдореЗрдВ рд░реЙрдо рд░реВрдЯ рдХреЗ рд╕рд╛рде C64 рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЯрди рдХреЗ рд░реВрдЯреАрди рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
JSR $E544
рд╕рд╛рде рд╕реНрдХреНрд░реАрди рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ред
рджреВрд╕рд░реА рдмрд╛рдд, 6502 рдЬреИрд╕реЗ 8-рдмрд┐рдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдкрддрд╛ рдЧрдгрдирд╛ рдмреЛрдЭрд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрд╛рдЗрдЯ рдЦрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдПрдХ рдЧреБрдгрдХ рднреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП
y*40+i
рдЬреИрд╕реА рдЧрдгрдирд╛ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдпрд╛ рддреЛ рддрд╛рд░реНрдХрд┐рдХ рдкрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдпрд╛ рдПрдХ рд▓реБрдХрдЕрдк рддрд╛рд▓рд┐рдХрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ рдЬреЛ рдмрд╛рдЗрдЯреНрд╕ рднреА рдЦрд╛рддреА рд╣реИред 40 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░реАрди рдХрд░реНрд╕рд░ рдХреЛ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ:
int yslope = (25<<8)/40; int yf = yslope/2; uint8_t* dst = screenRAM; for (int x = 0; x < 40; x++) { dst[x] = 0xa0; dst[(39-x)] = 0xa0; yf += yslope; if (yf & 256) { // Carry set? dst += 40; yf &= 255; } }
рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рдЙрдВрдЯрд░
yf
рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдХреА рдврд▓рд╛рди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм 8-рдмрд┐рдЯ рдЬреЛрдбрд╝ рдХреИрд░реА рдлреНрд▓реИрдЧ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо 40 рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдПрдХ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдЕрд╕реЗрдВрдмрд▓рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ:
!include "c64.asm" +c64::basic_start(entry) !let screenptr = $20 !let x0 = $40 !let x1 = $41 !let yf = $60 entry: { lda #0 sta x0 sta $d020 sta $d021 ; kernal clear screen jsr $e544 ; set screenptr = $0400 lda #<$0400 sta screenptr+0 lda #>$0400 sta screenptr+1 lda #80 sta yf lda #39 sta x1 xloop: lda #$a0 ldy x0 ; screenRAM[x] = 0xA0 sta (screenptr), y ldy x1 ; screenRAM[39-x] = 0xA0 sta (screenptr), y clc lda #160 ; line slope adc yf sta yf bcc no_add ; advance screen ptr by 40 clc lda screenptr adc #40 sta screenptr lda screenptr+1 adc #0 sta screenptr+1 no_add: inc x0 dec x1 bpl xloop inf: jmp inf }
82 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рднрд╛рд░реА рд╣реИред рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ 16-рдмрд┐рдЯ рдкрддрд╛ рдЧрдгрдирд╛ рд╣реИред рдЕрдкреНрд░рддреНрдпрдХреНрд╖
screenptr
рд▓рд┐рдП
screenptr
рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВ:
; set screenptr = $0400 lda #<$0400 sta screenptr+0 lda #>$0400 sta screenptr+1
рд╣рдо 40 рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ
screenptr
рдХрд╛ рдЕрдиреБрд╡рд╛рдж
screenptr
:
; advance screen ptr by 40 clc lda screenptr adc #40 sta screenptr lda screenptr+1 adc #0 sta screenptr+1
рдмреЗрд╢рдХ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк 16-рдмрд┐рдЯ рдкрддреЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ? рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
рдЯреНрд░рд┐рдХ 1. рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ!
рдСрди-рд╕реНрдХреНрд░реАрди рд░реИрдо рдореЗрдВ рдПрдХ рд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░реАрди рд▓рд╛рдЗрди Y = 24 рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░
JSR $E8EA
рдлрд╝рдВрдХреНрд╢рди рдХреЛ
JSR $E8EA
рд╕рд╛рде рдХреЙрд▓ рдХрд░рддреЗ рд╣реБрдП рдкреВрд░реА рд╕реНрдХреНрд░реАрди рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВ!
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ xloop рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
lda #0 sta x0 lda #39 sta x1 xloop: lda #$a0 ldx x0 ; hardcoded absolute address to last screen line sta $0400 + 24*40, x ldx x1 sta $0400 + 24*40, x adc yf sta yf bcc no_scroll ; scroll screen up! jsr $e8ea no_scroll: inc x0 dec x1 bpl xloop
рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рдпрд╣ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдореЗрд░реА рдкрд╕рдВрджреАрджрд╛ рдЪрд╛рд▓ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд▓рдЧрднрдЧ рд╕рднреА рдкреНрд░рддрд┐рдпреЛрдЧрд┐рдпреЛрдВ рдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рджрдо рдкрд░ рдкрд╛рдпрд╛ред
рдЯреНрд░рд┐рдХ 2. рд╕реЗрд▓реНрдл-рдореЙрдбрд┐рдлрд╛рдИ рдХреЛрдб
рдкрд┐рдХреНрд╕реЗрд▓ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:
ldx x1 ; hardcoded absolute address to last screen line sta $0400 + 24*40, x ldx x0 sta $0400 + 24*40, x inc x0 dec x1
рдпрд╣ 14 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ:
0803: A6 22 LDX $22 0805: 9D C0 07 STA $07C0,X 0808: A6 20 LDX $20 080A: 9D C0 07 STA $07C0,X 080D: E6 22 INC $22 080F: C6 20 DEC $20
рд╕реНрд╡-рд╕рдВрд╢реЛрдзрд┐рдд рдХреЛрдб (рдПрд╕рдПрдорд╕реА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЗрд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
ldx x1 sta $0400 + 24*40, x addr0: sta $0400 + 24*40 ; advance the second x-coord with SMC inc addr0+1 dec x1
... рдЬреЛ 13 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ:
0803: A6 22 LDX $22 0805: 9D C0 07 STA $07C0,X 0808: 8D C0 07 STA $07C0 080B: EE 09 08 INC $0809 080E: C6 22 DEC $22
рдЯреНрд░рд┐рдХ 3. рдСрдкрд░реЗрд╢рди рд╕реНрдЯреЗрдЯ 'рдкрд╛рд╡рд░ рдСрди'
рдХрд╛рдо рдХреЗ рдорд╛рд╣реМрд▓ рдХреЛ рд▓реЗрдХрд░ рдЬрдВрдЧрд▓реА рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреЗ рдХреА рд╣реЛрдбрд╝ рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рдЗрди рдбреНрд░рд╛рдЗрдВрдЧ рдкрд╣рд▓реА рдЪреАрдЬ рд╣реИ рдЬреЛ C64 рдкрд╛рд╡рд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдмреЗрд╕рд┐рдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рд╕рд╛рдл рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреАрдЖрд░рдЬреА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдорд┐рд▓рддрд╛ рд╣реИ рд╡рд╣ рдЖрдкрдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░:
- рд░рдЬрд┐рд╕реНрдЯрд░ рдП, рдПрдХреНрд╕, рд╡рд╛рдИ рдХреЛ рд╢реВрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рд╕рднреА рд╕реАрдкреАрдпреВ рдЭрдВрдбреЗ рд╕рд╛рдл рдХрд░ рджрд┐рдП
- Zeropage рд╕рд╛рдордЧреНрд░реА (рдкрддреЗ
$00
- $ff
)
рдЙрд╕реА рддрд░рд╣, рдХреБрдЫ KERNAL ROM рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдХрд┐рд╕реА рднреА рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХрд╛ рдкреВрд░рд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ: рд╕реАрдкреАрдпреВ рдЭрдВрдбреЗ, рдЕрд╕реНрдерд╛рдпреА рдЬрд╝реАрд░реЛрдкреЗрдЬ рдорд╛рди, рдЖрджрд┐ред
рдкрд╣рд▓реА рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рдж, рдЖрдЗрдП рдорд╢реАрди рдореЗрдореЛрд░реА рдореЗрдВ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рджреЗрдЦреЗрдВ:
Zeropage рдореЗрдВ рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
$d5
: 39 / $ 27 == рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ - 1
$22
: 64 / $ 40 == рд▓рд╛рдЗрди рдврд▓рд╛рди рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп
рдпрд╣ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рдмрдЪрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
!let x0 = $20 lda #39 ; 0801: A9 27 LDA #$27 sta x0 ; 0803: 85 20 STA $20 xloop: dec x0 ; 0805: C6 20 DEC $20 bpl xloop ; 0807: 10 FC BPL $0805
рдЪреВрдБрдХрд┐
$d5
рдореЗрдВ рдореВрд▓реНрдп 39 рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ
x0
/ STA рдЬреЛрдбрд╝реА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдЙрдВрдЯрд░
x0
рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
!let x0 = $d5 ; nothing here! xloop: dec x0 ; 0801: C6 D5 DEC $D5 bpl xloop ; 0803: 10 FC BPL $0801
рдлрд┐рд▓рд┐рдк, рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХрд╛ рд╡рд┐рдЬреЗрддрд╛, рдЗрд╕реЗ рдЪрд░рдо рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдВрддрд┐рдо рдЪрд░рд┐рддреНрд░ рдХреЗ рдкрддреЗ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ
$07C0
(
$07C0
(==
$0400+24*40
)ред рдпрд╣ рдорд╛рди рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╢реВрдиреНрдп рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, ROM рд╕реЗ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд░реВрдЯреАрди рдЕрд╕реНрдерд╛рдпреА рдЬрд╝рд╛рд░реЛрдкреЗрдЬ рдорд╛рдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ
$07C0
$D1-$D2
рдХреЗ рдкрддреЗ рдореЗрдВ
$D1-$D2
07C0 рдХрд╛ рдорд╛рди рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
STA $07C0,x
рдмрдЬрд╛рдп
STA $07C0,x
рдЖрдк рдПрдХ рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП
STA ($D1),y
рдХреЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖-рдЗрдВрдбреЗрдХреНрд╕-рдЗрдВрдбреЗрдХреНрд╕ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЯреНрд░рд┐рдХ 4. рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ C64 PRG рдмрд╛рдЗрдирд░реА рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдкрд╣рд▓реЗ 2 рдмрд╛рдЗрдЯреНрд╕: рдбрд╛рдЙрдирд▓реЛрдб рдкрддрд╛ (рдЖрдорддреМрд░ рдкрд░
$0801
)
- рдмреБрдирд┐рдпрд╛рджреА рдмреВрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЗ 12 рдмрд╛рдЗрдЯреНрд╕
рдореБрдЦреНрдп рдмреВрдЯ рдЕрдиреБрдХреНрд░рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдкрддреЗ
$801-$80C
):
0801: 0B 08 0A 00 9E 32 30 36 31 00 00 00 080D: 8D 20 D0 STA $D020
рдмреЗрд╕рд┐рдХ рдЯреЛрдХрди рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдХреНрд░рдо рдХрдореЛрдмреЗрд╢ '10 SYS 2061 'рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдкрддрд╛
2061
(
$080D
) рд╡рд╣ рдЬрдЧрд╣ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╢реАрди рдХреЛрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдм рдЪрд▓рддрд╛ рд╣реИ рдЬрдм BASIC рджреБрднрд╛рд╖рд┐рдпрд╛ SYS рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 14 рдмрд╛рдЗрдЯреНрд╕ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рд╣реИрдВред рдлрд┐рд▓рд┐рдк, рдорд╛рдЯрд▓реЗрд╡ рдФрд░ рдЧреАрдпрд░ рдиреЗ рдореБрдЦреНрдп рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рдЪрд╛рд▓реЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреАрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП PRAD рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
LOAD"*",8,1
,
LOAD"*",8
рдмрд╛рдж рд╕реЗ
LOAD"*",8
PRG рд▓реЛрдб рдПрдбреНрд░реЗрд╕ (рдкрд╣рд▓реЗ рджреЛ рдмрд╛рдЗрдЯреНрд╕) рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛
$0801
рдкрд░ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рджреЛ рддрд░реАрдХреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
- рдвреЗрд░ рдХреА рдЪрд╛рд▓
- рдмреЗрд╕рд┐рдХ рдЧрд░реНрдо рд░реАрд╕реЗрдЯ рдЪрд╛рд▓
рдвреЗрд░ рдХреА рдЪрд╛рд▓
рдЪрд╛рд▓
$01F8
рдореВрд▓реНрдп рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрдЯреИрдХ рдореЗрдВ
$01F8
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ PRG рдмрдирд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ 16-рдмрд┐рдЯ рдкреЙрдЗрдВрдЯрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ PRG рдХреЛ
$01F8
рдкрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ:
* = $01F8 !word scroll - 1 ; overwrite stack scroll: jsr $E8EA
рдЬреИрд╕реЗ рд╣реА BASIC рд▓реЛрдбрд░ (
disassembly рдХреЗ рдмрд╛рдж рдХреЛрдб рджреЗрдЦреЗрдВ) рдиреЗ рд▓реЛрдб рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░
RTS
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓рд░ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдпрд╣ рд╕реАрдзреЗ рд╣рдорд╛рд░реЗ PRG рдкрд░ рд▓реМрдЯрддрд╛ рд╣реИред
рдмреЗрд╕рд┐рдХ рдЧрд░реНрдо рд░реАрд╕реЗрдЯ рдЪрд╛рд▓
рдпрд╣ рдХреЗрд╡рд▓ рдЕрд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкреАрдЖрд░рдЬреА рдХреЛ рджреЗрдЦрдХрд░ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИред
02E6: 20 EA E8 JSR $E8EA 02E9: A4 D5 LDY $D5 02EB: A9 A0 LDA #$A0 02ED: 99 20 D0 STA $D020,Y 02F0: 91 D1 STA ($D1),Y 02F2: 9D B5 07 STA $07B5,X 02F5: E6 D6 INC $D6 02F7: 65 90 ADC $90 02F9: 85 90 STA $90 02FB: C6 D5 DEC $D5 02FD: 30 FE BMI $02FD 02FF: 90 E7 BCC $02E8 0301: 4C E6 02 JMP $02E6
рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ (
JMP $02E6
) рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдЬреЗрдПрдордкреА рдирд┐рд░реНрджреЗрд╢
$0301
рд╕реЗ
$0302-$0303
рдХреВрдж рдкрддреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдЬрдм рдпрд╣ рдХреЛрдб рдкрддрд╛
$02E6
рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ
$02E6
рдорд╛рди
$0302-$0303
рдкрддреЗ рдкрд░ рд▓рд┐рдЦрд╛
$02E6
рд╣реИред рдЦреИрд░, рдЗрд╕ рд╕реНрдерд╛рди рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рд╣реИ: рдЗрд╕рдореЗрдВ "BASIC рдкреНрд░рддреАрдХреНрд╖рд╛ рдЪрдХреНрд░" рдХрд╛ рд╕реВрдЪрдХ рд╣реЛрддрд╛ рд╣реИ (рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП
C64 рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рджреЗрдЦреЗрдВ)ред PRG рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛
$02E6
рд╕рд╛рде рдЗрд╕реЗ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЬрдм рдПрдХ рдЧрд░реНрдо рд░реАрд╕реЗрдЯ рдХреЗ рдмрд╛рдж BASIC рджреБрднрд╛рд╖рд┐рдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рд▓реВрдк рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рд▓реВрдк рдореЗрдВ рдХрднреА рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ!
рдмреЗрд╕рд┐рдХ рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдЯреНрд░рд┐рдХреНрд╕
рдкреЗрдЯреНрд░реА рдиреЗ
рдЕрднреА рддрдХ рдПрдХ рдФрд░ рдмреЗрд╕рд┐рдХ рд▓реЙрдиреНрдЪ рдЯреНрд░рд┐рдХ рдХреА рдЦреЛрдЬ рдХреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЬрд╝реАрд░реЛрдкреЗрдЬ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЯреЛрдХрди рдмреЗрд╕рд┐рдХреНрд╕ рдкреНрд░рд╛рд░рдВрдн рдХреНрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд▓рд╛рдЗрди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдПрдирдХреЛрдб рдХрд░рддреЗ рд╣реИрдВред рдЗрдирдкреБрдЯ рдкрд░, BASIC рд▓рд╛рдЗрди рдирдВрдмрд░, ahem, рдЕрд░реНрдерд╛рдд, рдЖрдкрдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдкрддреЛрдВ рдореЗрдВ
$39-$3A
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмрд╣реБрдд рд╣реЛрд╢рд┐рдпрд╛рд░!
рдЯреНрд░рд┐рдХ 5. рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣
рдпрд╣рд╛рдВ рдПрдХреНрд╕-рд▓реВрдк рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ:
lda #39 sta x1 xloop: lda #$a0 ldx x1 sta $0400 + 24*40, x adc yf sta yf bcc no_scroll ; scroll screen up! jsr $e8ea no_scroll: dec x1 bpl xloop ; intentionally halt at the end inf: jmp inf
рд▓реЗрдХрд┐рди рдПрдХ рдЧрд▓рддреА рд╣реИред рдЬрдм рд╣рдордиреЗ рдЕрдВрддрд┐рдо рдкрд┐рдХреНрд╕реЗрд▓ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛, рддреЛ рд╣рдо рд╕реНрдХреНрд░реАрди рдХреЛ рдЕрдм рдФрд░ рдирд╣реАрдВ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдВрддрд┐рдо рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд╛рдЦрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
lda #39 sta x1 xloop: lda #$a0 ldx x1 sta $0400 + 24*40, x dec x1 ; skip scrolling if last pixel bmi done adc yf sta yf bcc no_scroll ; scroll screen up! jsr $e8ea no_scroll: jmp xloop done: ; intentionally halt at the end inf: jmp inf
рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ рдХрд┐ рд╕реА рд╕рдВрдХрд▓рдХ рдПрдХ рд╕рдВрд░рдЪрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдХреНрдпрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░реЙрд▓ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдб рдПрдХ рдирдпрд╛
JMP abs
рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 3 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рд╕рд╢рд░реНрдд рдХреВрджрддрд╛ рд▓рдВрдмрд╛рдИ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕реАрдзреЗ рд╕рдВрдмреЛрдзрди рдХреЗ рд╕рд╛рде рдПрдХ рд░рд┐рд╢реНрддреЗрджрд╛рд░ 8-рдмрд┐рдЯ рдСрдкрд░реЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрдореНрдк рдПрдбреНрд░реЗрд╕ рдХреЛ рдПрдирдХреЛрдб рдХрд░рддреЗ рд╣реИрдВред
JMP "рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░реЙрд▓ рдХреЛ рдЫреЛрдбрд╝реЗрдВ" рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХреЙрд▓ рдХреЛ рд▓реВрдк рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рдХрд░ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдХрд░ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдлрд┐рд▓рд┐рдк рдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛:
lda #39 sta x1 scroll: jsr $e8ea xloop: lda #$a0 ldx x1 sta $0400 + 24*40, x adc yf sta yf dec x1 ; doesn't set carry! inf: bmi inf ; hang here if last pixel! bcc xloop ; next pixel if no scroll bcs scroll ; scroll up and continue
рдпрд╣ рдПрдХ рддреАрди-рдмрд╛рдЗрдЯ JMP рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп JMP рдХреЛ рджреЛ-рдмрд╛рдЗрдЯ рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреБрд▓ 4 рдмрд╛рдЗрдЯ рдмрдЪрддреА рд╣реИрдВред
рдЯреНрд░рд┐рдХ 6. рдмрд┐рдЯ рдХрдореНрдкреНрд░реЗрд╢рди рд╡рд╛рд▓реА рд▓рд╛рдЗрдиреЗрдВ
рдХреБрдЫ рддрддреНрд╡ рд▓рд╛рдЗрди рдврд▓рд╛рди рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдмрд┐рдЯреНрд╕ рдХреЛ 8-рдмрд┐рдЯ рдирд┐рд░рдВрддрд░ рдореЗрдВ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдкреИрдХреЗрдЬрд┐рдВрдЧ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдПрдХ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ 8-рдкрд┐рдХреНрд╕реЗрд▓ рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ:
int mask = 0xB6; // 10110110 uint8_t* dst = screenRAM; for (int x = 0; x < 40; x++) { dst[x] = 0xA0; if (mask & (1 << (x&7))) { dst += 40; // go down a row } }
рдпрд╣ рдХрд╛рдлреА рдХреЙрдореНрдкреИрдХреНрдЯ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЭреБрдХрд╛рд╡ рдХрд╛рдЙрдВрдЯрд░ рд╡рд┐рдХрд▓реНрдк рдЖрдорддреМрд░ рдкрд░ рдФрд░ рднреА рдЫреЛрдЯреЗ рд╣реЛрддреЗ рд╣реИрдВред
рд╡рд┐рдЬреЗрддрд╛
рдпрд╣рд╛рдВ рдлрд┐рд▓рд┐рдк рд╕реЗ
34-рдмрд╛рдЗрдЯ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдЬреАрддрдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рдЙрдкрд░реНрдпреБрдХреНрдд рдЪрд╛рд▓ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрд╕рдХреЗ рдХреЛрдб рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ:
ov = $22 ; == $40, initial value for the overflow counter ct = $D5 ; == $27 / 39, number of passes. Decrementing, finished at -1 lp = $D1 ; == $07C0, pointer to bottom line. Set by the kernal scroller ; Overwrite the return address of the kernal loader on the stack ; with a pointer to our own code * = $01F8 .word scroll - 1 scroll: jsr $E8EA ; Kernal scroll up, also sets lp pointer to $07C0 loop: ldy ct ; Load the decrementing counter into Y (39 > -1) lda #$A0 ; Load the PETSCII block / black col / ov step value sta $D020, y ; On the last two passes, sets the background black p1: sta $07C0 ; Draw first block (left > right line) sta (lp), y ; Draw second block (right > left line) inc p1 + 1 ; Increment pointer for the left > right line adc ov ; Add step value $A0 to ov sta ov dec ct ; Decrement the Y counter bmi * ; If it goes negative, we're finished bcc loop ; Repeat. If ov didn't overflow, don't scroll bcs scroll ; Repeat. If ov overflowed, scroll
рд▓реЗрдХрд┐рди 34 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рдХреНрдпреЛрдВ рд░рд╣рддреЗ рд╣реИрдВ?
рдЬреИрд╕реЗ рд╣реА рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рд╕рдорд╛рдкреНрдд рд╣реБрдИ, рд╕рднреА рдиреЗ рдЕрдкрдирд╛ рдХреЛрдб рдФрд░ рдиреЛрдЯреНрд╕ рд╕рд╛рдЭрд╛ рдХрд┐рдП - рдФрд░ рдЖрдЧреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рдЗрд╕ рдкрд░ рдЬреАрд╡рдВрдд рдЪрд░реНрдЪрд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реБрдИред рд╕рдордп рд╕реАрдорд╛ рдХреЗ рдмрд╛рдж, рдХрдИ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдереЗ:
рджреЗрдЦрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ - рдХрдИ рдЕрд╕рд▓реА рдореЛрддреА рд╣реИрдВред
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдФрд░ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдЯрд▓реЗрд╡, рдлрд┐рд▓, рдЧреАрд░, рдкреЗрдЯреНрд░реА, рдЬреЗрдореА, рдЗрдпрд╛рди рдФрд░ рдбреЗрд╡рд┐рдб рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж (рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрд┐рд╕реА рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ - рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд╕рднреА рдЙрд▓реНрд▓реЗрдЦреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рдерд╛!]
рдкреАрдПрд╕ рдкреЗрдЯреНрд░реА рдиреЗ рдореЗрд░реА рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЛ "рд╡рд╛рд░реНрд╖рд┐рдХ" рдХрд╣рд╛, рдЗрд╕рд▓рд┐рдП, рдЙрд╣, рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рд╕рд╛рд▓ рджреЗрдЦреЗрдВред