test_bytearray.py

#! /usr/bin/python3
# ===================================================================
# play/test byte and bytearry
# ===================================================================
#
# From: www.masswerk.at/6502/6502_instruction_set.html
#
# 16-bit address words are little endian, lo(w)-byte first,
# followed by the hi(gh)-byte. (An assembler will use a human
# readable, big-endian notation as in $HHLL.)
#
# The available 16-bit address space is conceived as consisting
# of pages of 256 bytes each, with address hi-bytes represententing
# the page index. An increment with carry may affect the hi-byte
# and may thus result in a crossing of page boundaries, adding
# an extra cycle to the execution.
# Increments without carry do not affect the hi-byte of an address
# and no page transitions do occur. Generally, increments of
# 16-bit addresses include a carry, increments of zeropage
# addresses don't.
# Notably this is not related in any way to the state of the
# carry bit of the accumulator.
#
# Branch offsets are signed 8-bit values, -128 ... +127,
# negative offsets in two's complement. Page transitions may
# occur and add an extra cycle to the exucution.
#
# ===================================================================

# -------------------------------------------------------------------
# ---- functions
# -------------------------------------------------------------------

# ---- create a byte from two nibbles

def create_byte_from_nibbles(n1,n2):
    return((n1 & 0xF) << 4) | (n2 & 0xF)

# ---- convert an int to bit string

def bit_string(n,minlen=8):
    lsb = n & 0xFF             # least significant byte
    return f'0b{lsb:0{minlen}b}'

# ---- convert an int to hex string

def hex_string(n,minlen=8):
    return f'0x{n:0{minlen}X}'

# ---- display byte array

def display_array(a):
    i = 0
    for b in a:
        xx = hex_string(b,2)
        bb = bit_string(b)
        print(f'[{i:4}]  {b:3}  {xx}  {bb}')
        i = i + 1

# ---- convert int to two bytes

def convert_int_to_two_bytes(n):
    b2 = bytearray(2)
    b2[0] = n & 0xFF
    b2[1] = (n >> 8) & 0xFF
    return b2

# ---- convert two bytes to int

def convert_two_bytes_to_int(b2):
    return int.from_bytes(b2,byteorder='little')


# -------------------------------------------------------------------
# ---- main
# -------------------------------------------------------------------

if __name__ == '__main__':

    print()
    print('---- bytearray ---------------------------------')

    ary = bytearray(8)

    ary[0] = 255
    ary[2] = 0
    ary[2] = 32 
    ary[3] = 0x44
    ary[4] = 0b101
    ary[7] = 1

    display_array(ary)

    print()
    print('---- int to two byte; two bytes to int ---------')

    def test_b2(n):
        print(f'------ test {n}')
        b2 = convert_int_to_two_bytes(n)
        display_array(b2)
        n = convert_two_bytes_to_int(b2)
        print(f'int is {n}')

    test_b2(43)
    test_b2(-43)
    test_b2(23456)
    test_b2(-1)
    test_b2(1234567)
    test_b2(0xFFFFFFFF)

    print()
    print('---- 0xABCD ------------------------------------')
    test_b2(0xABCD)