From 049b5595209068faca2d4f7dc76a9b7fdd35a528 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Mon, 13 Jan 2020 00:32:47 -0500 Subject: [PATCH] gr_viewer: add simple gr_viewer --- gr_viewer/Makefile | 31 ++ gr_viewer/gr_viewer.dsk | Bin 0 -> 143360 bytes gr_viewer/hardware.inc | 89 +++++ gr_viewer/hello.bas | 4 + gr_viewer/loader.s | 823 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 947 insertions(+) create mode 100644 gr_viewer/Makefile create mode 100644 gr_viewer/gr_viewer.dsk create mode 100644 gr_viewer/hardware.inc create mode 100644 gr_viewer/hello.bas create mode 100644 gr_viewer/loader.s diff --git a/gr_viewer/Makefile b/gr_viewer/Makefile new file mode 100644 index 00000000..f43c6744 --- /dev/null +++ b/gr_viewer/Makefile @@ -0,0 +1,31 @@ +include ../Makefile.inc + +DOS33 = ../dos33fs-utils/dos33 +TOKENIZE = ../asoft_basic-utils/tokenize_asoft +PNG2DHGR = ../hgr-utils/png2dhgr + +all: gr_viewer.dsk + +gr_viewer.dsk: HELLO LOADER + $(DOS33) -y gr_viewer.dsk SAVE A HELLO + $(DOS33) -y gr_viewer.dsk BSAVE -a 0x1000 LOADER +# $(DOS33) -y gr_viewer.dsk BSAVE -a 0x800 F02.GR + +### + +HELLO: hello.bas + ../asoft_basic-utils/tokenize_asoft < hello.bas > HELLO + +### + +LOADER: loader.o + ld65 -o LOADER loader.o -C ../linker_scripts/apple2_1000.inc + +loader.o: loader.s + ca65 -o loader.o loader.s -l loader.lst + +#### + + +clean: + rm -f *~ *.o LOADER HELLO diff --git a/gr_viewer/gr_viewer.dsk b/gr_viewer/gr_viewer.dsk new file mode 100644 index 0000000000000000000000000000000000000000..0aa99779f899931ec3d17d903e97110b7fe20c25 GIT binary patch literal 143360 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 Y&(>y_eq6cJ$2$qZp0T2Q#7T(%0KIe4ApigX literal 0 HcmV?d00001 diff --git a/gr_viewer/hardware.inc b/gr_viewer/hardware.inc new file mode 100644 index 00000000..37327dbc --- /dev/null +++ b/gr_viewer/hardware.inc @@ -0,0 +1,89 @@ +;; HARDWARE LOCATIONS + +KEYPRESS = $C000 +KEYRESET = $C010 + +;; SOFT SWITCHES +CLR80COL = $C000 ; PAGE0/PAGE1 normal +SET80COL = $C001 ; PAGE0/PAGE1 switches PAGE0 in Aux instead +EIGHTYCOLOFF = $C00C +EIGHTYCOLON = $C00D +SPEAKER = $C030 +SET_GR = $C050 +SET_TEXT = $C051 +FULLGR = $C052 +TEXTGR = $C053 +PAGE0 = $C054 +PAGE1 = $C055 +LORES = $C056 ; Enable LORES graphics +HIRES = $C057 ; Enable HIRES graphics +AN3 = $C05E ; Annunciator 3 + +PADDLE_BUTTON0 = $C061 +PADDL0 = $C064 +PTRIG = $C070 + +; Language card +; C080 +; C08B + +;; BASIC ROUTINES + +;NORMAL = $F273 + +;; MONITOR ROUTINES + +;HLINE = $F819 ;; HLINE Y,$2C at A +;VLINE = $F828 ;; VLINE A,$2D at Y +;CLRSCR = $F832 ;; Clear low-res screen +;CLRTOP = $F836 ;; clear only top of low-res screen +;SETCOL = $F864 ;; COLOR=A +;TEXT = $FB36 +;TABV = $FB5B ;; VTAB to A +;BELL = $FBDD ;; ring the bell +;BASCALC= $FBC1 ;; +;VTAB = $FC22 ;; VTAB to CV +;HOME = $FC58 ;; Clear the text screen +WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us +;SETINV = $FE80 ;; INVERSE +;SETNORM= $FE84 ;; NORMAL +;COUT = $FDED ;; output A to screen +;COUT1 = $FDF0 ;; output A to screen + + + + + + +COLOR_BLACK = 0 +COLOR_RED = 1 +COLOR_DARKBLUE = 2 +COLOR_PURPLE = 3 +COLOR_DARKGREEN = 4 +COLOR_GREY = 5 +COLOR_MEDIUMBLUE = 6 +COLOR_LIGHTBLUE = 7 +COLOR_BROWN = 8 +COLOR_ORANGE = 9 +COLOR_GREY2 = 10 +COLOR_PINK = 11 +COLOR_LIGHTGREEN = 12 +COLOR_YELLOW = 13 +COLOR_AQUA = 14 +COLOR_WHITE = 15 + +COLOR_BOTH_BLACK = $00 +COLOR_BOTH_RED = $11 +COLOR_BOTH_DARKBLUE = $22 +COLOR_BOTH_DARKGREEN = $44 +COLOR_BOTH_GREY = $55 +COLOR_BOTH_MEDIUMBLUE = $66 +COLOR_BOTH_LIGHTBLUE = $77 +COLOR_BOTH_BROWN = $88 +COLOR_BOTH_ORANGE = $99 +COLOR_BOTH_PINK = $BB +COLOR_BOTH_LIGHTGREEN = $CC +COLOR_BOTH_YELLOW = $DD +COLOR_BOTH_AQUA = $EE +COLOR_BOTH_WHITE = $FF + diff --git a/gr_viewer/hello.bas b/gr_viewer/hello.bas new file mode 100644 index 00000000..4d02d77e --- /dev/null +++ b/gr_viewer/hello.bas @@ -0,0 +1,4 @@ + 5 HOME + 10 PRINT "SIMPLE LORES IMAGE VIEWER" + 20 PRINT CHR$(4)+"BRUN LOADER" + diff --git a/gr_viewer/loader.s b/gr_viewer/loader.s new file mode 100644 index 00000000..897ebc94 --- /dev/null +++ b/gr_viewer/loader.s @@ -0,0 +1,823 @@ +; Loader for GR-loader + + +nibtbl = $300 ; nothing uses the bottom 128 bytes of $300, do they? +bit2tbl = $380 ; bit2tbl: .res 86 ; = nibtbl+128 +filbuf = $3D6 ; filbuf: .res 4 ; = bit2tbl+86 + +; read any file slot 6 version +; based on FASTLD6 and RTS copyright (c) Peter Ferrie 2011-2013,2018 + +; modified to assembled with ca64 -- vmw +; added code to patch it to run from current disk slot -- vmw + + +.include "hardware.inc" +LZ4_SRC = $00 +LZ4_DST = $02 +LZ4_END = $04 +COUNT = $06 +DELTA = $08 +WHICH = $f0 + + + adrlo = $26 ; constant from boot prom + adrhi = $27 ; constant from boot prom + tmpsec = $3c ; constant from boot prom + reqsec = $3d ; constant from boot prom + sizelo = $44 + sizehi = $45 + secsize = $46 + TEMPY = $fa + namlo = $fb + namhi = $fc + step = $fd ; state for stepper motor + tmptrk = $fe ; temporary copy of current track + phase = $ff ; current phase for /seek + OUTL = $fe ; for picking filename + OUTH = $ff + + dirbuf = $b000 + ; note, don't put this immediately below + ; the value being read as destaddr-4 + ; is temporarily overwritten during read + ; process + + + ; note also, can't load file bigger than $8000 (32k) in size? + ; seems to break things? + +start: + jsr init ; unhook DOS, init nibble table + + lda #1 + sta WHICH + + bit SET_GR + bit LORES + bit FULLGR + bit PAGE1 + +clear_out_ram: + ldx #$14 + stx OUTH + ldy #0 + sty OUTL + lda #$77 +clear_ram_outer: + ldy #0 +clear_ram_inner: + dey + sta (OUTL),Y + bne clear_ram_inner + + inx + stx OUTH + cpx #$c0 + bne clear_ram_outer + +;====================== + +which_load_loop: + ldy #0 ; load first filename + lda filenames_low,Y + sta OUTL + lda filenames_high,Y + sta OUTH + +opendir_filename: + + ; clear out the filename with $A0 (space) + + lda #filename + sta namhi + + ldy #29 +wipe_filename_loop: + lda #$A0 + sta (namlo),Y + dey + bpl wipe_filename_loop + + ldy #0 +copy_filename_loop: + lda (OUTL),Y + beq copy_filename_done + ora #$80 + sta (namlo),Y + iny + bne copy_filename_loop + +copy_filename_done: + jsr opendir ; open and read entire file into memory + + + ;============================== + ;============================== + + +loop_forever: + + ; wait until keypressed + +wait_until_keypress: + lda KEYPRESS ; check if keypressed + bpl wait_until_keypress ; if not, loop + bit KEYRESET + + inc WHICH + lda WHICH + cmp #4 + bne no_new + lda #1 + sta WHICH + +no_new: + clc + adc #'0' + sta gr_filename+2 + + ; hope they updated the WHICH_LOAD value + + jmp which_load_loop + +; filename to open is 30-character Apple text, must be padded with space ($A0) +filename: + .byte $A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0 + .byte $A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0 + .byte $A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0 + +filenames_low: + .byte gr_filename + +gr_filename: + .byte "F01.GR",0 + + ;unhook DOS and build nibble table + +init: + ; patch to use current drive + + ; locate input paramater list + jsr $3E3 + ; result is in A:Y + sta $FF + sty $FE + ldy #1 + lda ($FE),y + + ; list+1 should have slot<<8 + + + ora #$80 ; add in $80 + + ; c0e0 + sta mlsmc06+1 + + ; c0e8 + clc + adc #8 + sta mlsmc02+1 + + ; c0e9 + clc + adc #1 + sta mlsmc01+1 + + ; c0ec + clc + adc #3 + sta mlsmc03+1 + sta mlsmc04+1 + sta mlsmc05+1 + + jsr $fe93 ; clear COUT + jsr $fe89 ; clear KEYIN + + ;======================== + ; Create nibble table + ; Note: the table starts 16 bytes in, and is sparse + ; so it doesn't entirely look like the DOS33 table at + + ldy #0 + ldx #3 +L1: stx $3c ; store tempx (3?) + txa ; a=x (a=3) + asl ; a*=2 (a=6) + bit $3c ; a&tempx, set N/V (a=6) + beq L3 ; if 0, skip to L3 + ora $3c ; a|=tempx (a=7) + eor #$ff ; a=~a (a=f8) + and #$7e ; a&=0x7e 0111 1110 (a=78) +L2: bcs L3 ; this set way back at asl?? + lsr ; a>>1 a=3c c=0 + ; a=1e c=0 + ; a=0f c=0 + ; a=07 c=1 + bne L2 ; if a!=0 goto l2 + tya ; if a==0, a=y + sta nibtbl, x ; write out to table + iny ; increment y +L3: inx ; increment x x=4, a=0f + bpl L1 ; loop while high bit not set + + rts + + ;=========================== + ; opendir + ;=========================== + + ; turn on drive and read volume table of contents +opendir: +mlsmc01:lda $c0e9 ; turn slot#6 drive on + ldx #0 + stx adrlo ; zero out adrlo + stx secsize ; zero out secsize + lda #$11 ; a=$11 (VTOC) + jsr readdirsec +firstent: + + lda dirbuf+1 + + ; lock if entry not found +entry_not_found: + beq entry_not_found + + ; read directory sector + + ldx dirbuf+2 + jsr seekread1 + ldy #7 ;number of directory entries in a sector + ldx #$2b ;offset of filename in directory entry +nextent: + tya + pha ; was **phy** + txa + pha ; was **phx** + ldy #$1d + + ; match name backwards (slower but smaller) + +L4: + lda (namlo), y + cmp dirbuf, x + beq foundname + pla + + ; move to next directory in this block, if possible + + clc + adc #$23 + tax + pla + tay ; was **ply** + dey + bne nextent + beq firstent ; was **bra** + +foundname: + dex + dey + bpl L4 + pla + tay ; was **ply** + pla + + ; read track/sector list + + lda dirbuf-32, y + ldx dirbuf-31, y + jsr seekread1 + + ; read load offset and length info only, initially + + lda #filbuf + jsr seekread + + ; reduce load offset by 4, to account for offset and length + + sec + lda filbuf + sbc #4 + sta adrlo + + lda filbuf+1 + sbc #0 + sta adrhi + + ; save on stack bytes that will be overwritten by extra read + + ldy #3 +L5: + lda (adrlo), y + pha + dey + bpl L5 + + lda adrhi + pha + lda adrlo + pha + + ; increase load size by 4, to account for offst and length + + lda filbuf+2 + adc #3 + sta sizelo + sta secsize + + lda filbuf+3 + adc #0 + sta sizehi + beq readfirst + lda #0 ; was **stz secsize** + sta secsize + +readfirst: + ldy #$0c + + ; read a file sector + +readnext: + tya + pha + lda dirbuf, y ; A = track + ldx dirbuf+1, y ; x = sector + jsr seekread1 + pla + tay + + ; if low count is non-zero then we are done + ; (can happen only for partial last block) + + lda secsize + bne readdone + + ; continue if more than $100 bytes left + + dec sizehi + bne L6 + + ; set read size to min(length, $100) + + lda sizelo + beq readdone + sta secsize +L6: + inc adrhi + iny + iny + bne readnext + + ; save current address for after t/s read + + lda adrhi + pha + lda adrlo + pha + lda #0 + sta adrlo ; was **stz adrlo** + + ; read next track/sector sector + + lda dirbuf+1 + ldx dirbuf+2 + jsr readdirsec + clc + + ; restore current address +readdone: + pla +; sta adrhi +; pla + sta adrlo ; code originally had this backwards + pla + sta adrhi + bcc readfirst + +mlsmc02:lda $c0e8 + + ; restore from stack bytes that were overwritten by extra read + + ldx #3 + ldy #0 +L7: + pla + sta (adrlo), y + iny + dex + bpl L7 + + rts + + + ;====================== + ; readdirsec + ;====================== + ; a = track? + ; x = sector? +readdirsec: + ldy #>dirbuf +seekread: + sty adrhi +seekread1: + sta phase + lda sectbl, x + sta reqsec + jsr readadr + + ; if track does not match, then seek + + cpx phase + beq checksec + jsr seek + + + ;========================================= + ; re merge in with qkumba's recent changes + ; to fix seek problem? + ;========================================= + + ; [re-]read sector + +re_read_addr: + jsr readadr +checksec: + cmp reqsec + bne re_read_addr + + ;========================= + ; read sector data + ;========================= + +readdata: + jsr readd5aa + eor #$ad ; zero A if match + bne re_read_addr + +L12: +mlsmc03:ldx $c0ec ; read until valid data (high bit set) + bpl L12 + eor nibtbl-$80, x + sta bit2tbl-$aa, y + iny + bne L12 +L13: +mlsmc04:ldx $c0ec ; read until valid data (high bit set) + bpl L13 + eor nibtbl-$80, x + sta (adrlo), y ; the real address + iny + cpy secsize + bne L13 + ldy #0 +L14: + ldx #$a9 +L15: + inx + beq L14 + lda (adrlo), y + lsr bit2tbl-$aa, x + rol + lsr bit2tbl-$aa, x + rol + sta (adrlo), y + iny + cpy secsize + bne L15 + rts + + ; no tricks here, just the regular stuff + + ;======================= + ; readaddr -- read the address field + ;======================= + ; Find address field, put track in cutrk, sector in tmpsec + +readadr: + jsr readd5aa + cmp #$96 + bne readadr + ldy #3 ; three? + ; first read volume/volume + ; then track/track + ; then sector/sector? +adr_read_two_bytes: + tax + jsr readnib + rol + sta tmpsec + jsr readnib + and tmpsec + dey + bne adr_read_two_bytes + rts + + ;======================== + ; make sure we see the $D5 $AA pattern + +readd5aa: +L16: + jsr readnib +L17: + cmp #$d5 + bne L16 + jsr readnib + cmp #$aa + bne L17 + tay ; we need Y=#$AA later + +readnib: +mlsmc05:lda $c0ec ; read until valid (high bit set) + bpl readnib + +seekret: + rts + + ;===================== + ; SEEK + ;===================== + ; current track in X? + ; desired track in phase + +seek: + ldy #0 + sty step + asl phase ; multiply by two + txa ; current track? + asl ; mul by two +copy_cur: + tax + sta tmptrk + sec + sbc phase + beq L22 + bcs L18 + eor #$ff + inx + bcc L19 +L18: + sbc #1 + dex +L19: + cmp step + bcc L20 + lda step +L20: + cmp #8 + bcs L21 + tay + sec +L21: + txa + pha + ldx step1, y +L22: + php + bne L24 +L23: + clc + lda tmptrk + ldx step2, y +L24: + stx tmpsec + and #3 + rol + tax + lsr +mlsmc06:lda $c0e0, x +L25: + ldx #$12 +L26: + dex + bpl L26 + dec tmpsec + bne L25 + bcs L23 + plp + beq seekret + pla + inc step + bne copy_cur + + +.if 0 + ;============================== + ; old code + + + ; [re-]read sector + +re_read_addr: + jsr readadr + +repeat_until_right_sector: + cmp reqsec + bne re_read_addr + + ;========================== + ; read sector data + ;========================== + ; + +readdata: +mlsmc07: + ldy $c0ec ; read data until valid + bpl readdata +find_D5: + cpy #$d5 ; if not D5, repeat + bne readdata +find_AA: +mlsmc08: + ldy $c0ec ; read data until valid, should be AA + bpl find_AA + cpy #$aa ; we need Y=#$AA later + bne find_D5 +find_AD: +mlsmc09:lda $c0ec ; read data until high bit set (valid) + bpl find_AD + eor #$ad ; should match $ad + bne * ; lock if didn't find $ad (failure) +L12: +mlsmc0A:ldx $c0ec ; read data until high bit set (valid) + bpl L12 + eor nibtbl-$80, x + sta bit2tbl-$aa, y + iny + bne L12 +L13: +mlsmc0B:ldx $c0ec ; read data until high bit set (valid) + bpl L13 + eor nibtbl-$80, x + sta (adrlo), y ; the real address + iny + cpy secsize + bne L13 + ldy #0 +L14: + ldx #$a9 +L15: + inx + beq L14 + lda (adrlo), y + lsr bit2tbl-$aa, x + rol + lsr bit2tbl-$aa, x + rol + sta (adrlo), y + iny + cpy secsize + bne L15 + rts + + ; no tricks here, just the regular stuff + + ;================= + ; readadr -- read address field + ;================= + ; Find address field, put track in cutrk, sector in tmpsec +readadr: +mlsmc0C:lda $c0ec ; read data until we find a $D5 + bpl readadr +adr_d5: + cmp #$d5 + bne readadr + +adr_aa: +mlsmc0D:lda $c0ec ; read data until we find a $AA + bpl adr_aa + cmp #$aa + bne adr_d5 + +adr_96: +mlsmc0E:lda $c0ec ; read data until we find a $96 + bpl adr_96 + cmp #$96 + bne adr_d5 + + ldy #3 ; three? + ; first read volume/volume + ; then track/track + ; then sector/sector? +adr_read_two_bytes: + sta curtrk ; store out current track + tax +L20: +mlsmc0F:lda $c0ec ; read until full value + bpl L20 + rol + sta tmpsec +L21: +mlsmc10:lda $c0ec ; read until full value + bpl L21 ; sector value is (v1<<1)&v2???? + and tmpsec + dey ; loop 3 times + bne adr_read_two_bytes + +seekret: + rts ; return + + ;================ + ; SEEK + ;================ + ; current track in curtrk + ; desired track in phase + +seek: + asl curtrk ; multiply by 2 + asl phase ; multiply by 2 + lda #0 + sta step +copy_cur: + lda curtrk ; load current track + sta tmptrk ; store as temptrk + sec ; calc current-desired + sbc phase + beq seekret ; if they match, we are done! + + bcs seek_neg ; if negative, skip ahead + eor #$ff ; ones-complement the distance + inc curtrk ; increment current (make it 2s comp?) + bcc L114 ; skip ahead +seek_neg: + adc #$fe + dec curtrk +L114: + cmp step + bcc L115 + lda step +L115: + cmp #8 + bcs L116 + tay + sec +L116: + lda curtrk + ldx step1, y + bne L118 +L117: + clc + lda tmptrk + ldx step2, y +L118: + stx tmpsec + and #3 + rol + tax +mlsmc11:sta $c0e0, x +L119: + ldx #$13 +L120: + dex + bne L120 + dec tmpsec + bne L119 + lsr + bcs L117 + inc step + bne copy_cur +.endif + + +step1: .byte $01, $30, $28, $24, $20, $1e, $1d, $1c +step2: .byte $70, $2c, $26, $22, $1f, $1e, $1d, $1c + +sectbl: .byte $00,$0d,$0b,$09,$07,$05,$03,$01,$0e,$0c,$0a,$08,$06,$04,$02,$0f + + +; From $BA96 of DOS33 +;nibtbl: .res 128 ; = * +; .byte $00,$01,$98,$99,$02,$03,$9C,$04 ; $BA96 ; 00 +; .byte $05,$06,$A0,$A1,$A2,$A4,$A4,$A5 ; $BA9E ; 08 +; .byte $07,$08,$A8,$A9,$AA,$09,$0A,$0B ; $BAA6 ; 10 +; .byte $0C,$0D,$B0,$B1,$0E,$0F,$10,$11 ; $BAAE ; 18 +; .byte $12,$13,$B8,$14,$15,$16,$17,$18 ; $BAB6 ; 20 +; .byte $19,$1A,$C0,$C1,$C2,$C3,$C4,$C5 ; $BABE ; 28 +; .byte $C6,$C7,$C8,$C9,$CA,$1B,$CC,$1C ; $BAC6 ; 30 +; .byte $1D,$1E,$D0,$D1,$D2,$1E,$D4,$D5 ; $BACE ; 38 +; .byte $20,$21,$D8,$22,$23,$24,$25,$26 ; $BAD6 ; 40 +; .byte $27,$28,$E0,$E1,$E2,$E3,$E4,$29 ; $BADE ; 48 +; .byte $2A,$2B,$E8,$2C,$2D,$2E,$2F,$30 ; $BAE6 ; 50 +; .byte $31,$32,$F0,$F1,$33,$34,$35,$36 ; $BAEE ; 58 +; .byte $37,$38,$F8,$39,$3A,$3B,$3C,$3D ; $BAF6 ; 60 +; .byte $3E,$3F,$13,$00,$01,$02,$01,$00 ; $BAFE ; 68 +; .byte $00,$00,$00,$00,$00,$00,$00,$00 +; .byte $00,$00,$00,$00,$00,$00,$00,$00 + + +;bit2tbl: .res 86 ; = nibtbl+128 +;filbuf: .res 4 ; = bit2tbl+86 + ;dataend = filbuf+4 + +