112 lines
1.3 KiB
ArmAsm
112 lines
1.3 KiB
ArmAsm
;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*-
|
|
|
|
CLKMASK = %00000010
|
|
CTRL2 = $DC00
|
|
|
|
coldstart:
|
|
lda #$0
|
|
sta $400
|
|
waitstart:
|
|
lda $dc01
|
|
and #$01
|
|
bne waitstart
|
|
lda #$00
|
|
sta $d020
|
|
teststart:
|
|
jsr check_for_load_start
|
|
jmp $c000
|
|
beq teststart
|
|
bcs @error
|
|
jmp $c000
|
|
@error:
|
|
lda #0
|
|
sta $0400
|
|
rts
|
|
|
|
check_for_load_start:
|
|
lda #CLKMASK
|
|
bit CTRL2
|
|
bne start
|
|
lda #$00
|
|
rts
|
|
start:
|
|
sei
|
|
ldx #$02
|
|
stx $d020
|
|
ldy #$00
|
|
jmp new_byte
|
|
|
|
wait_for_bit_start:
|
|
lda #CLKMASK
|
|
@loop:
|
|
bit CTRL2
|
|
beq @loop
|
|
|
|
lda #CLKMASK
|
|
bit CTRL2
|
|
beq error
|
|
lda CTRL2
|
|
|
|
lsr
|
|
ror BYTE
|
|
bcc wait_for_bit_end
|
|
txa ; get the zero flag from X
|
|
beq @normal
|
|
dex
|
|
lda BYTE
|
|
sta LEN,x
|
|
txa
|
|
bne @notdone
|
|
;; Computing stop address
|
|
clc
|
|
lda LEN
|
|
adc z:progdest
|
|
sta stop
|
|
lda LEN+1
|
|
adc z:progdest+1
|
|
sta stop+1
|
|
jmp @notdone
|
|
@normal:
|
|
;; Byte finished, storing
|
|
lda BYTE
|
|
sta (progdest), y
|
|
inc z:progdest
|
|
bne @noinchi
|
|
inc z:progdest+1
|
|
@noinchi:
|
|
;; Comparing progdest against stop address
|
|
lda z:progdest
|
|
cmp stop
|
|
bne @notdone
|
|
lda z:progdest+1
|
|
cmp stop+1
|
|
bne @notdone
|
|
jmp done
|
|
@notdone:
|
|
new_byte:
|
|
lda #%10000000
|
|
sta BYTE
|
|
wait_for_bit_end:
|
|
lda #CLKMASK
|
|
@loop:
|
|
bit CTRL2
|
|
bne @loop
|
|
jmp wait_for_bit_start
|
|
|
|
done:
|
|
lda #$01
|
|
cli
|
|
clc
|
|
rts
|
|
|
|
error:
|
|
;; TODO
|
|
cli
|
|
sec
|
|
rts
|
|
|
|
BYTE = $400
|
|
LEN = $402
|
|
progdest = $fe
|
|
stop: .word $0000
|
|
loaded: .byte 0
|