From 30c9272b73dd32104c7753db49ddfc800e805d6c Mon Sep 17 00:00:00 2001 From: Rob Greene Date: Wed, 3 Feb 2016 22:13:38 -0600 Subject: [PATCH] Adding capability to display a tally of disk bytes from buffer. --- README.md | 4 ++ afscanner.s | 99 ++++++++++++++++++++++++++++++++++++- images/BufferCountPage.png | Bin 0 -> 17779 bytes 3 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 images/BufferCountPage.png diff --git a/README.md b/README.md index d43d32f..2ef8854 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ The Graphical Disk Display is a rudimentary component to give a 'picture' of the ![Graphical Disk Display](images/GraphicalDiskDisplay.png) +The Buffer Count Page totals the number of each type of "disk byte" in the buffer for easy reference. + +![Buffer Count Page](images/BufferCountPage.png) + ## Notes * `Makefile` is very rudimentary as I am not a Makefile type person and build is so fast it doesn't matter * Pay attention to versions diff --git a/afscanner.s b/afscanner.s index e1042ac..6edf688 100755 --- a/afscanner.s +++ b/afscanner.s @@ -14,6 +14,8 @@ * + About (default page) * + Headers (updated Address Field Header information) * + Browse track buffer (hilights Address Field Header bytes) +* + Graphical disk display +* + Buffer counts * ****************************************************************************************** @@ -391,6 +393,8 @@ SetScreen da BrowseInit, BrowseDisplay, BrowseKeypress dfb "G" da HgrInit, HgrDisplay, HgrKeypress + dfb "C" + da CountInit, CountDisplay, CountKeypress dfb "T" da TestInit, TestDisplay, TestKeypress dfb 0 ; end @@ -400,7 +404,7 @@ SetScreen * * Build array of line pointers in INBUF. -AboutInit ; Returns with A:Y = max lines +AboutInit ; Returns with A:Y = max lines, C = scrolling jsr PRINT asc _INVERSE,_MT_ON,_U_ARROW,_D_ARROW,_MT_OFF,_NORMAL," Scroll / " asc _INVERSE,_MT_ON,_O_APPLE,_NORMAL,"-",_INVERSE,_U_ARROW,_D_ARROW,_MT_OFF,_NORMAL," Page" @@ -453,6 +457,7 @@ AboutInit ; Returns with A:Y = max lines asc " ",$00 asc _INVERSE,_MT_ON,_O_APPLE,_MT_OFF,_NORMAL,"A = This about page.",$00 asc _INVERSE,_MT_ON,_O_APPLE,_MT_OFF,_NORMAL,"B = Browse track buffer.",$00 + asc _INVERSE,_MT_ON,_O_APPLE,_MT_OFF,_NORMAL,"C = Display buffer counts.",$00 asc _INVERSE,_MT_ON,_O_APPLE,_MT_OFF,_NORMAL,"F = Address field display. " ; (cont) asc "(Assuming 'good' address fields on disk.)",$00 asc _INVERSE,_MT_ON,_O_APPLE,_MT_OFF,_NORMAL,"G = Graphical disk display.",$00 @@ -507,6 +512,12 @@ AboutInit ; Returns with A:Y = max lines asc "disk. Note that the length of each bar indicates how many sync bytes were in",$00 asc "that section of the disk. Each bar represents approximately 46 bytes.",$00 asc " ",$00 + asc "Display Buffer Counts",$00 + asc "=====================",$00 + asc " ",$00 + asc "Count the number of disk bytes in the buffer and display totals. This may be",$00 + asc "helpful when trying to determine address field bytes.",$00 + asc " ",$00 asc "-END-",$00 dfb 0 @@ -889,6 +900,92 @@ HgrHexFont ; Stolen from https://github.com/Michaelangel007/apple2_hgr_font_tut hex 3E02021E02023E00 ; E hex 3E02021E02020200 ; F +* +* BUFFER COUNT interface +* + +CountInit ; Returns with A:Y = max lines, C = scrolling + jsr PRINT + asc "(high bit must be set, only showing those bytes)" + dfb 0 +; Set inbuf to zero (only counting $80, so $200-$2ff sufficient) + ldy #0 + tya +:erase sta inbuf,y + iny + bne :erase +; Start counting + jsr ReadTrack + jsr SETUPDATA + ldy #0 +:loop lda (DATA),y + asl ; times 2, we don't care about highbit + tax + inc inbuf,x + bne :skip + inc inbuf+1,x +:skip iny + bne :loop + inc DATA+1 + dec TEMP + bne :loop +; Setup framework + lda #0 ; No lines + tay + sec ; No scrolling + rts + +CountDisplay ; Called with A:Y = line + jsr PRINT + dfb $8D + dfb 14 + asc " Low +0 +1 +2 +3 +4 +5 +6 +7 High",$8D + dfb 19 + asc " ==== ==== ==== ==== ==== ==== ==== ====",$8D + dfb 0 + + ldy #$80 +:next ldx #14 + lda #" " +:tab jsr COUT + dex + bne :tab + tya + jsr PRHEX + lda #" " + jsr COUT + jsr COUT +:line lda #" " ; re-loading space due to loop construction + jsr COUT + tya + asl + tax + lda inbuf+1,x + jsr PRHEX + lda inbuf,x + jsr PRHEX + iny + tya + and #$07 + bne :line + lda #" " + jsr COUT + jsr COUT + jsr COUT + jsr COUT + tya + dec + jsr PRHEX + jsr PRCR + cpy #0 + bne :next + rts + +CountKeypress ; Called with Acc = key + ; Do Nothing, continue loop + jmp KeyboardWait + + * * TEST interface * diff --git a/images/BufferCountPage.png b/images/BufferCountPage.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc775a6d4dc85d782bc5c5ea41c7c4f89154eef GIT binary patch literal 17779 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