diff --git a/wip-duuqnd/loader.s b/wip-duuqnd/loader.s new file mode 100644 index 0000000..2bdaa17 --- /dev/null +++ b/wip-duuqnd/loader.s @@ -0,0 +1,112 @@ +;;; -*- 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