[abc80] Fröjdepinnar

H. Peter Anvin hpa at zytor.com
Mon Jan 29 10:25:05 PST 2018


On 01/29/18 01:52, Robert Juhasz wrote:
>>
>> Men... till syvende och sist om man vill ha riktigt mycket olika I/O så blir det ett busskort, vilket jag skissar på till och från men det är svårt att bestämma vad man verkligen vill ha och vad som är onödigt, annars sticker det iväg snabbt som bara den.
> 
> Japp, vet hur det kan vara med ABC80-feature-creep… ;) Snyggt jobbat med SD-interfacet! Genererar du SCK-pulser med 74HC86:an?
> 

Precis.  Upptäckte att Vin < 0 V och > Vdd är faktiskt officiellt
specifierat i databladen till 74HC-serien så länge strömmen är externt
begränsad till typ ±20 mA så de funkar som både buffer och
pulsgenerator: SCK ligger normalt hög, men när RTS ändrar polaritet --
oavsett riktning -- så pulsar den SCK låg i 1,5-2 µs.  Det gör att bara
en OUT behövs per bit.  Idén kanske känns igen från b.la. minnesvärlden
under namnet DDR :)

        ;;
        ;; Read a byte from the serial port in SPI mode
        ;; Bit order is MSB first (standard for SPI)
        ;; Data loaded into A; BC and DE clobbered
        ;; After 8 bits, the clock phase is the same as initial
        ;;
        ;; Total time including setup/return is 320 cycles, averaging
        ;; 75.0 kbps. Peak rate (sender need to keep up) is 88.2 kbps.
        ;;
        ;; The cassette port is not modified, as long as it is not
        ;; changed from an interrupt while this routine is running.
        ;;
spi_get_byte:
        in a,(58)               ; 10
        and 0F7h                ;  7 - Output zero byte; don't confuse
sender
        ld d,a                  ;  4
        xor 10h                 ;  7 - Opposite clock phase
        out (58),a              ; 11 - Generate first clock pulse
        ld e,a                  ;  4
        ld c,58                 ;  7

        in a,(58)               ; 10 - bit 7
        out (c),d               ; 12
        rra                     ;  4
        rl b                    ;  8

        in a,(58)               ; 10 - bit 6
        out (c),e               ; 12
        rra                     ;  4
        rl b                    ;  8

        in a,(58)               ; 10 - bit 5
        out (c),d               ; 12
        rra                     ;  4
        rl b                    ;  8

        in a,(58)               ; 10 - bit 4
        out (c),e               ; 12
        rra                     ;  4
        rl b                    ;  8

        in a,(58)               ; 10 - bit 3
        out (c),d               ; 12
        rra                     ;  4
        rl b                    ;  8

        in a,(58)               ; 10 - bit 2
        out (c),e               ; 12
        rra                     ;  4
        rl b                    ;  8

        in a,(58)               ; 10 - bit 1
        out (c),d               ; 12
        rra                     ;  4
        rl b                    ;  8

        in a,(58)               ; 10 - bit 0
        rra                     ;  4
        ld a,b                  ;  4
        rla                     ;  4

        ret                     ; 10

        ;;
        ;; Send a byte to the serial port in SPI mode
        ;; Bit order is MSB first (standard for SPI)
        ;; Call with data in A; AF, BC and DE clobbered
        ;; After 8 bits, the clock phase is the same as initial
        ;;
        ;; Total time including setup/return is 307 cycles, averaging
        ;; 78.2 kbps. Peak rate (target need to keep up) is 111.1 kbps
        ;; (for the last bit only; other bits are 96.8 kbps)
        ;;
        ;; The cassette port is not modified, as long as it is not
        ;; changed from an interrupt while this routine is running.
        ;;
spi_send_byte:
        ; Rotate the data byte into proper position for OUT
        ; (MSB/bit 7 -> bit 3)
        rlca                    ;  4
        rlca                    ;  4
        rlca                    ;  4
        rlca                    ;  4
        ld b,a                  ;  4

        ld c,08h                ;  7 - Mask for data bit
        in a,(58)               ; 10
        and 0F7h                ;  8 - Initial port state without data bit
        ld d,a                  ;  4 - Initial phase
        xor 10h                 ;  8
        ld e,a                  ;  4 - Opposite phase

        ld a,b                  ;  4
        and a,c                 ;  4
        or e                    ;  4
        out (58),a              ; 11 - bit 7

        ld a,b                  ;  4
	rlca			;  4
	ld b,a			;  4
        and a,c                 ;  4
        or d                    ;  4
        out (58),a              ; 11 - bit 6

        ld a,b                  ;  4
        rlca                    ;  4
        ld b,a                  ;  4
        and a,c                 ;  4
        or e                    ;  4
        out (58),a              ; 11 - bit 5

        ld a,b                  ;  4
        rlca                    ;  4
        ld b,a                  ;  4
        and a,c                 ;  4
        or d                    ;  4
        out (58),a              ; 11 - bit 4

        ld a,b                  ;  4
        rlca                    ;  4
        ld b,a                  ;  4
        and a,c                 ;  4
        or e                    ;  4
        out (58),a              ; 11 - bit 3

        ld a,b                  ;  4
        rlca                    ;  4
        ld b,a                  ;  4
        and a,c                 ;  4
        or d                    ;  4
        out (58),a              ; 11 - bit 2

        ld a,b                  ;  4
        rlca                    ;  4
        ld b,a                  ;  4
        and a,c                 ;  4
        or e                    ;  4
        out (58),a              ; 11 - bit 1

        ld a,b                  ;  4
        rlca                    ;  4
        and a,c                 ;  4
        or d                    ;  4
        out (58),a              ; 11 - bit 0

        ret                     ; 10


More information about the ABC80 mailing list