diff --git a/buhbye.system.s b/buhbye.system.s index 116838e..ab569e1 100644 --- a/buhbye.system.s +++ b/buhbye.system.s @@ -73,18 +73,72 @@ ASCII_ESCAPE := $1B ;;; area is Apple's dispatcher code. ;;; ------------------------------------------------------------ -;;; Entry point +;;; Installer ;;; ------------------------------------------------------------ - ;; Loads at $2000 but executed at $1000. - .org $2000 - jmp install_and_quit - install_src := * - install_size := $300 ; must fit in $D100...$D3FF = $300 - padded_size := $400 ; but some struct members can spill past end + +.proc install + src := install_src + end := install_src + install_size + dst := $D100 ; Install location in ProDOS (bank 2) + + src_ptr := $19 + dst_ptr := $1B + + sta ALTZPOFF + lda ROMIN ; write bank 2 + lda ROMIN + + lda #src + sta src_ptr+1 + + lda #dst + sta dst_ptr+1 + +loop: lda (src_ptr) ; *src_ptr = *dst_ptr + sta (dst_ptr) + + inc src_ptr ; src_ptr++ + bne :+ + inc src_ptr+1 + +: inc dst_ptr ; dst_ptr++ + bne :+ + inc dst_ptr+1 + +: lda src_ptr+1 ; src_ptr == end ? + cmp #>end + bne loop + lda src_ptr + cmp #src - sta src_ptr+1 - lda #dst - sta dst_ptr+1 - lda #end - bne loop - lda src_ptr - cmp #