fuzix: coco3: booter improvement
authorBrett Gordon <beretta42@gmail.com>
Wed, 12 Aug 2015 14:05:46 +0000 (10:05 -0400)
committerAlan Cox <alan@linux.intel.com>
Fri, 21 Aug 2015 18:46:11 +0000 (19:46 +0100)
--001a11c1d8d614b481051d1db7c7
Content-Type: text/plain; charset=UTF-8

Added kernel loading thermometer.

--
Brett M. Gordon,
beretta42@gmail.com

<div dir="ltr"><div>Added kernel loading thermometer.</div><div><br></div>-- <br><div class="gmail_signature">Brett M. Gordon,<br><a href="mailto:beretta42@gmail.com" target="_blank">beretta42@gmail.com</a></div>
</div>

Kernel/platform-coco3/boot/boot.s

index 3ea7bb2..4a074e8 100644 (file)
 frame  .dw     0               ; on entry frame pointer
 npage  .db     0               ; next page no.
 pos    .dw     0               ; buffer pos in memory
+tickp  .dw     $400+(32*15)    ; ticker next position
+tickb  .db     0               ;
+size   .dw     0               ; no of grans
+secs   .dw     0               ; init value of of sectors for each screen block
+scount .dw     0               ; sector counter 
 nampre fcn     /"FUZIX.BIN/    ; " image to load
 
        ;; And the Kick-off
@@ -23,6 +28,20 @@ start
        lbcs    abort
        lda     #'U             ; print "U"
        jsr     $a282
+       ;; calculate sectors for each screen block
+       ldd     size
+       lsra
+       rorb
+       lsra
+       rorb
+       lsra
+       rorb
+       lsra
+       rorb
+       lsra
+       rorb
+       std     secs
+       std     scount
        ;; Move to task one
        ldx     #$ffa0
        ldu     #$ffa8
@@ -51,6 +70,7 @@ c@    jsr     $a176           ; get a byte in A
        jsr     getw            ; D = load address
        jsr     setload         ; set load address
 d@     jsr     $a176           ; A = byte
+       jsr     tick
        jsr     putb            ; put into kernel memory
        leay    -1,y            ; decrement U
        bne     d@              ; loop
@@ -117,6 +137,8 @@ getw
        tfr     a,b             ; B = high byte
        jsr     $a176           ; A = low byte
        exg     a,b             ; flip D = next word
+       jsr     tick
+       jsr     tick
        rts
 
 
@@ -183,8 +205,21 @@ f@ jsr     $c68c           ; search directory, U=ram directory image
        beq     err@            ; yes then error!
        ldd     #$00ff          ; basic/ascii
        bra     h@
+       ;; get size of file in granuals
+g@     pshs    d,x,u
+       ldb     2,u             ; B = first granuals of file
+       jsr     $cd1e           ; get no of granuals
+       andb    #0xf            ; B = sectors used in last granual
+       pshs    b               ; save on stack ( last )
+       clr     ,-s             ; as 16 bit value
+       deca                    ; A = whole granuals
+       ldb     #9
+       mul                     ; D = sectors
+       addd    ,s++            ; D = sectors in file
+       std     size            ; save
+       puls    d,x,u
        ;; copy directory stuff
-g@     ldd     ,u              ; D = type/ascii
+       ldd     ,u              ; D = type/ascii
        ldb     #$ff            ; force ascii
 h@     std     $957
        ldd     #$100           ; record length
@@ -208,5 +243,23 @@ close
        rts
 
 
+;;; Tick the ticker
+tick
+       pshs    d,x
+       inc     tickb           ; inc byte counter
+       bne     out@            ; return if not 256 bytes
+       ;; decrement block counter
+       ldd     scount
+       subd    #1
+       std     scount
+       bne     out@            ; leave if sector/block counter is not done
+       ;; else put new screen block
+       ldd     secs
+       std     scount
+       ldb     #$af            ; a blue block
+       ldx     tickp           ; get position
+       stb     ,x+             ; print it to screen buffer
+       stx     tickp           ; and save position
+out@   puls    d,x,pc
 
        end     start