diff --git a/src/hbas.c b/src/hbas.c index 5e810fe..bd8ae6e 100644 --- a/src/hbas.c +++ b/src/hbas.c @@ -29,6 +29,7 @@ SOFTWARE. #include "error.h" #include "instructions.c" #include "hash.c" +#include "register.c" void hd(char *data, size_t len) { @@ -381,37 +382,6 @@ size_t label_lookup(LabelVec *labels, char *name, size_t len) return INVALID; } -int parse_register(char *name, size_t len) -{ - if (name[0] != 'r') - { - return 256; // Register name should start with 'r' - } - if (len > 4) - { - return 256; // Register name too long - } - uint16_t rv = 0; - if (len > 2 && name[1] == '0') - { - return 256; // Extra zero suffix - } - for (size_t ii = 1; ii < len; ii += 1) - { - char chr = name[ii]; - if (!(chr >= '0' && chr <= '9')) - { - return 256; // Register name must only contain numbers - } - rv = rv * 10 + (chr - '0'); - } - if (rv > 255) - { - return 256; // Register number too large - } - return (int)rv; -} - // safety: assumes the buffer has enough place for specified integer size AsmError push_int_le(char *buf, uint64_t val, size_t size, uint8_t sign) { diff --git a/src/register.c b/src/register.c new file mode 100644 index 0000000..ee8637c --- /dev/null +++ b/src/register.c @@ -0,0 +1,30 @@ +int parse_register(char *name, size_t len) +{ + if (name[0] != 'r') + { + return 256; // Register name should start with 'r' + } + if (len > 4) + { + return 256; // Register name too long + } + uint16_t rv = 0; + if (len > 2 && name[1] == '0') + { + return 256; // Extra zero suffix + } + for (size_t ii = 1; ii < len; ii += 1) + { + char chr = name[ii]; + if (!(chr >= '0' && chr <= '9')) + { + return 256; // Register name must only contain numbers + } + rv = rv * 10 + (chr - '0'); + } + if (rv > 255) + { + return 256; // Register number too large + } + return (int)rv; +} \ No newline at end of file