PRINTHEX is probably the last of the utility routines that I needed to write in order to get a simple hex loader to run.
It accepts a 16-bit integer value from the accumulator R0 and prints it out as a 4-digit hexadecimal number. Leading zeros are not suppressed.
It is based on the decimal number print routine PRINTNUM, but with the added complication that the hex character sequence is not contiguous in the ascii table.
This is likely to be the last of the hand-assembled routines, because my motivation is from now on to use the TASM32 assembler - kindly customised for the Suite-16 instruction set by Frank Eggink.
Having a working hex loader with hex dump and simple monitor commands will be the next goal!
Here's just the PRINTHEX assembly code - it fits nicely into 48 words of memory:
// 0x0070 ---------------------------PRINTHEX-----------------------------------------
// Prints out contents of R0 as a 4 digit hexadecimal number to the terminal
// Leading zeroes are not suppressed
// R1 = Heximation Value
// R2 = digit
// R3 = 0x30
// R4 = temporary storage for accumulator (Heximated value)
// R6 = temporary store for output character
0x1200, // SET R2, 0x0000
0x0000,
0x1300, // SET R3, 0x0030
0x0030,
0x1100, // R1 = 4096
0x1000,
0x088C, // CALL Heximate
0x1100, // R1 = 256
0x0100,
0x088C, // CALL Heximate
0x1100, // R1 = 16
0x0010,
0x088C, // CALL Heximate
0x0A30, // ADI 0x30 to make a number
0x3600, // Store in R6
0x0B3A, // SBI 0x3A - is it bigger than ascii 9
// 0x0080 ---------------------------------------------------------
0x0284, // BLT 0x84 - Print decimal digit
0x0A41, // ADDI 0x41 - make it a hex digit
0x0C00, // putchar R0
0x0086, // BRA CRLF
0x2600, // LD from R6
0x0C00, // putchar R0
0x1000, // SET R0, CR
0x000D,
0x0C00, // putchar R0, CR
0x0B03, // SBI 0x03 Set R0, LF
0x0C00, // putchar R0, LF
0x0003, // BRA START
// 0x008C ------------------------Heximate--------------------------------
0xB100, // SUB R1, :Heximate
0x0290, // BLT 0x90
0xE200, // INC R2
0x008C, // BRA 0x08C
// 0x0090 ---------------------------------------------------------
0x3400, // Store R0 in R4 temporary store the remainder
0x2200, // MOV R2, R0 get the count from R2
0x0A30, // ADI 0x30 to make a number
0x3600, // ST R0, R6 - temporary save to R6
0x0B3A, // SBI 0x3A - is it bigger than ascii 9
0x0299, // BLT 0x99 Print decimal digit
0x0A41, // ADI 0x41 - make it a hex digit
0x0C00, // putchar R0
0x009B, // BRA 0x9B Restore R0
0x2600, // Get R0 back from R6
0x0C00, // putchar R0 Print it as a decimal digit
0x2400, // Get R0 back from R4
0xA100, // ADD R1 adds DEC value to restore R0
0x1200, // SET R2,0 Reset R2
0x0000,
0x0900, // RET
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.