Код:
zp00 = $00
zp02 = $02
zp04 = $04
zp10 = $10
Tick = $80
Pos = $90
Screen = $4000
SizeOfScreen = $4000
NMI_On = $C040
NMI_Off = $C020
.ba $F800
.cpu 65816
Reset
sei
cld
ldx #$FF
txs
sta $C100
sta $C111
sta $C122
sta $C133
sta $C144
sta $C058
sta $C05A
Main
bit NMI_Off
ldx #0
lda #" "
- sta $800,x
sta $900,x
sta $A00,x
sta $B00,x
sta $C00,x
sta $D00,x
sta $E00,x
sta $F00,x
inx
bne -
sta $C786
stz zp10
lda #$A
sta zp10+1
ldx #0
stx Pos
- lda Mes1,x
beq +
jsr Send
inx
bra -
+
stz zp10
lda #$C
sta zp10+1
ldx #0
stx Pos
- lda Mes2,x
beq +
jsr Send
inx
bra -
+
jsr Delay5s
; 65816 MVN
sta $C720
clc
xce
rep #$30
.al
.rl
lda #$FFFE
sta Tick
-
lda Tick
bne -
lda #64
sta zp04
-
lda zp04
and #3
tax
lda ColorTable,x
sta Screen
ldx #Screen
ldy #Screen+1
lda #SizeOfScreen-2
;----------------------
;main cycle, 7 ticks/byte
mvn 0,0 ;7
;----------------------
dec zp04
bne -
bit NMI_Off
sec
xce
.as
.rs
sta $C786
lda Tick+1
jsr PrintTwoDigits
lda Tick
jsr PrintTwoDigits
stz zp10
lda #$D
sta zp10+1
ldx #0
stx Pos
- lda Mes3,x
beq +
jsr Send
inx
bra -
+
jsr Delay5s
; 6502 MoveMemory
sta $C720
lda #$FF
sta Tick+1
lda #$FE
sta Tick
-
lda Tick
bne -
lda #64
sta zp04
MM01
lda zp04
and #3
tax
lda ColorTable,x
sta Screen
lda #1
sta zp02
ldy #0
sty zp00
lda #>Screen
sta zp00+1
sta zp02+1
lda #>SizeOfScreen
sta zp04+1
;----------------------
;main cycle, 16 ticks/byte
-
lda (zp00),y ;5
sta (zp02),y ;6
iny ;2
bne - ;3
;----------------------
inc zp00+1 ;5
inc zp02+1 ;5
dec zp04+1 ;5
bne - ;3
dec zp04
bne MM01
bit NMI_Off
sta $C786
lda Tick+1
jsr PrintTwoDigits
lda Tick
jsr PrintTwoDigits
stz zp10
lda #$E
sta zp10+1
ldx #0
stx Pos
- lda Mes4,x
beq +
jsr Send
inx
bra -
+
jsr Delay5s
; 6502 FillMemory
sta $C720
lda #$FF
sta Tick+1
lda #$FE
sta Tick
-
lda Tick
bne -
lda #64
sta zp04
FM01
ldy #0
sty zp00
lda #>Screen
sta zp00+1
lda #>SizeOfScreen
sta zp04+1
lda zp04
and #3
tax
lda ColorTable,x
;----------------------
;main cycle, 11 ticks/byte
-
sta (zp00),y ;6
iny ;2
bne - ;3
;----------------------
inc zp00+1 ;5
dec zp04+1 ;5
bne - ;3
dec zp04
bne FM01
bit NMI_Off
sta $C786
lda Tick+1
jsr PrintTwoDigits
lda Tick
jsr PrintTwoDigits
jsr Delay5s
jsr Delay5s
jmp Main
ColorTable .by 0, $55, $AA, $FF
Delay2s
bit NMI_Off
stz Tick
stz Tick+1
bit NMI_On
-
lda Tick
cmp #100
bne -
rts
Delay5s
bit NMI_Off
stz Tick
stz Tick+1
bit NMI_On
-
lda Tick
cmp #250
bne -
rts
PrintTwoDigits
pha
lsr
lsr
lsr
lsr
jsr PrintDigit
pla
and #15
jsr PrintDigit
rts
PrintDigit
tax
lda HexDigit,x
jsr Send
rts
Send
ldy Pos
sta (zp10),y
inc Pos
rts
; .PETSCII
HexDigit
; .tx "0123456789ABCDEF"
.db $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7
.db $B8, $B9, $C1, $C2, $C3, $C4, $C5, $C6
Mes1
; .tx "Filling 64 screens 256x256x4colors (1MB) in NMI ticks:"
.db $C6, $49, $4C, $4C, $49, $4E, $47, $A0
.db $B6, $B4, $A0, $53, $43, $52, $45, $45
.db $4E, $53, $A0, $B2, $B5, $B6, $58, $B2
.db $B5, $B6, $58, $B4, $43, $4F, $4C, $4F
.db $52, $53, $A0, $A8, $B1, $CD, $C2, $A9
.db $A0, $49, $4E, $A0, $CE, $CD, $C9, $A0
.db $54, $49, $43, $4B, $53, $BA
.db 0
Mes2
; .tx "65816 MVN instruction (7 clocks/byte) - $"
.db $B6, $B5, $B8, $B1, $B6, $A0, $CD, $D6
.db $CE, $A0, $49, $4E, $53, $54, $52, $55
.db $43, $54, $49, $4F, $4E, $A0, $A8, $B7
.db $A0, $43, $4C, $4F, $43, $4B, $53, $AF
.db $42, $59, $54, $45, $A9, $A0, $AD, $A0
.db $A4
.db 0
Mes3
; .tx "6502 MoveMemory Sub (16 clocks/byte) - $"
.db $B6, $B5, $B0, $B2, $A0, $CD, $4F, $56
.db $45, $CD, $45, $4D, $4F, $52, $59, $A0
.db $D3, $55, $42, $A0, $A0, $A8, $B1, $B6
.db $A0, $43, $4C, $4F, $43, $4B, $53, $AF
.db $42, $59, $54, $45, $A9, $A0, $AD, $A0
.db $A4
.db 0
Mes4
; .tx "6502 FillMemory Sub (11 clocks/byte) - $"
.db $B6, $B5, $B0, $B2, $A0, $C6, $49, $4C
.db $4C, $CD, $45, $4D, $4F, $52, $59, $A0
.db $D3, $55, $42, $A0, $A0, $A8, $B1, $B1
.db $A0, $43, $4C, $4F, $43, $4B, $53, $AF
.db $42, $59, $54, $45, $A9, $A0, $AD, $A0
.db $A4
.db 0
NMI_Native
inc Tick
rti
NMI
inc Tick
bne +
inc Tick+1
+
rti
IRQ
rti
.ba $FFEA
.wo NMI_Native
.wo 0
.wo IRQ
.ba $FFFA
.wo NMI
.wo Reset
.wo IRQ