xscii/xscii.asm

212 lines
8.1 KiB
NASM
Raw Normal View History

EFFECT_NORMAL = '0'
EFFECT_BOLD = '1'
EFFECT_ITALIC = '3'
EFFECT_UNDERLINE = '4'
EFFECT_BLINK = '5'
EFFECT_REVERSE = '7'
COLOUR_GREY = '0'
COLOUR_RED = '1'
COLOUR_GREEN = '2'
COLOUR_YELLOW = '3'
COLOUR_BLUE = '4'
COLOUR_PINK = '5'
COLOUR_CYAN = '6'
COLOUR_WHITE = '7'
macro output_number number, base, offset, character, colour, effect {
call output_bar
mov rbx, colour
mov rbp, effect
call output_colour
mov rbx, number
mov rbp, base
call offset_base
mov rbx, offset
sub rbx, [output_length]
mov rbp, character
call output_align
call output_base
call output_cancel
}
2023-12-12 14:06:27 -05:00
macro output_string index, array, offset, colour, effect {
call output_bar
mov rbx, colour
mov rbp, effect
call output_colour
mov rax, index
mov rbx, offset
mul rbx
mov rbx, array
add rbx, rax
mov rbp, offset
call output_text
call output_cancel
}
format ELF64 executable 3
segment readable executable
entry $
main_loop:
output_number [character_index], 2, 8, align_zero, COLOUR_WHITE, EFFECT_NORMAL
output_number [character_index], 8, 4, align_zero, COLOUR_CYAN, EFFECT_NORMAL
output_number [character_index], 10, 4, align_space, COLOUR_CYAN, EFFECT_ITALIC
output_number [character_index], 16, 3, align_space, COLOUR_CYAN, EFFECT_BOLD
2023-12-12 14:06:27 -05:00
output_string [character_index], code_list, 3, COLOUR_BLUE, EFFECT_BOLD
output_string [character_index], name_list, 24, COLOUR_PINK, EFFECT_NORMAL
mov rax, [character_index]
and rax, 1
cmp rax, 0
je skip_line
2023-12-12 14:06:27 -05:00
mov rbx, align_line
mov rbp, 1
call output_text
skip_line:
inc [character_index]
cmp [character_index], 128
jne main_loop
mov rdi, 0
mov rax, 60
syscall
2023-12-12 14:06:27 -05:00
output_text:
mov rax, 1
mov rdi, 1
2023-12-12 14:06:27 -05:00
mov rsi, rbx
mov rdx, rbp
syscall
ret
output_colour:
2023-12-12 14:06:27 -05:00
mov [output_colour_format + 5], bl
mov [output_colour_format + 2], bpl
mov rbx, output_colour_format
mov rbp, 7
2023-12-12 14:06:27 -05:00
call output_text
ret
output_cancel:
mov rbx, output_colour_cancel
mov rbp, 4
2023-12-12 14:06:27 -05:00
call output_text
ret
output_align:
2023-12-12 14:06:27 -05:00
mov r15, rbx
mov r14, rbp
loop_statement:
mov rbx, r14
mov rbp, 1
2023-12-12 14:06:27 -05:00
call output_text
dec r15
cmp r15, 0
jne loop_statement
ret
output_bar:
mov rbx, COLOUR_GREY
mov rbp, EFFECT_BOLD
call output_colour
mov rbx, align_bar
mov rbp, 3
2023-12-12 14:06:27 -05:00
call output_text
call output_cancel
ret
offset_base:
mov ax, bx
number_loop_statement:
div bpl
2023-12-12 14:06:27 -05:00
mov [output_quotient], al
mov [output_remainder], ah
mov r14, output_format
add r14, [output_length]
mov r15, output_cypher
add r15b, [output_remainder]
mov r13b, BYTE [r15]
mov BYTE [r14], r13b
xor rax, rax
mov al, [output_quotient]
inc [output_length]
2023-12-12 14:06:27 -05:00
cmp rax, 0
jne number_loop_statement
ret
output_base:
output_loop_statement:
mov rbx, output_format
add rbx, [output_length]
dec rbx
mov rbp, 1
2023-12-12 14:06:27 -05:00
call output_text
dec [output_length]
cmp [output_length], 0
jne output_loop_statement
ret
segment readable writable
character_index dq 0
align_zero db '0'
align_line db 10
align_space db ' '
align_bar db ' | '
output_cypher db '0123456789ABCDEF'
output_format db ' '
output_length dq 0
output_quotient db 0
output_remainder db 0
output_colour_format db 27, '[ ;3 m'
output_colour_cancel db 27, '[0m'
code_list db 'NUL', 'SOH', 'STX', 'ETX', 'EOT', 'ENQ', 'ACK', 'BEL', 'BS ', 'HT ', 'LF ', 'VT ', 'FF ', 'CR ', 'SO ', 'SI ', \
'DLE', 'DC1', 'DC2', 'DC3', 'DC4', 'NAK', 'SYN', 'ETB', 'CAN', 'EM ', 'SUB', 'ESC', 'FS ', 'GS ', 'RS ', 'US ', \
' ', '! ', '" ', '# ', '$ ', '% ', '& ',39,' ','( ', ') ', '* ', '+ ', ', ', '- ', '. ', '/ ', \
'0 ', '1 ', '2 ', '3 ', '4 ', '5 ', '6 ', '7 ', '8 ', '9 ', ': ', '; ', '< ', '= ', '> ', '? ', \
'@ ', 'A ', 'B ', 'C ', 'D ', 'E ', 'F ', 'G ', 'H ', 'I ', 'J ', 'K ', 'L ', 'M ', 'N ', 'O ', \
'P ', 'Q ', 'R ', 'S ', 'T ', 'U ', 'V ', 'W ', 'X ', 'Y ', 'Z ', '[ ', '\ ', '] ', '^ ', '_ ', \
'` ', 'a ', 'b ', 'c ', 'd ', 'e ', 'f ', 'g ', 'h ', 'i ', 'j ', 'k ', 'l ', 'm ', 'n ', 'o ', \
'p ', 'q ', 'r ', 's ', 't ', 'u ', 'v ', 'w ', 'x ', 'y ', 'z ', '{ ', '| ', '} ', '~ ', 'DEL'
name_list db 'Null ', 'Start of heading ', 'Start of text ', 'End of text ', \
'End of transmission ', 'Enquiry ', 'Acknowledge ', 'Bell ', \
'Backspace ', 'Horizontal tab ', 'Line feed ', 'Vertical tab ', \
'Form feed ', 'Carriage return ', 'Shift out ', 'Shift in ', \
'Data link escape ', 'Device control 1 ', 'Device control 2 ', 'Device control 3 ', \
'Device control 4 ', 'Negative acknowledge ', 'Synchronous idle ', 'End transmission block ', \
'Cancel ', 'End of medium ', 'Substitute ', 'Escape ', \
'File separator ', 'Group separator ', 'Record separator ', 'Unit separator ', \
'Space ', 'Exclamation mark ', 'Speech mark ', 'Number sign ', \
'Dollar sign ', 'Percent ', 'Ampersand ', 'Quote ', \
'Open parenthesis ', 'Close parenthesis ', 'Asterisk ', 'Plus ', \
'Comma ', 'Minus ', 'Period ', 'Slash ', \
'Zero ', 'One ', 'Two ', 'Three ', \
'Four ', 'Five ', 'Six ', 'Seven ', \
'Eight ', 'Nine ', 'Colon ', 'Semicolon ', \
'Open angled bracket ', 'Equal ', 'Close angled bracket ', 'Question mark ', \
'At sign ', 'Uppercase A ', 'Uppercase B ', 'Uppercase C ', \
'Uppercase D ', 'Uppercase E ', 'Uppercase F ', 'Uppercase G ', \
'Uppercase H ', 'Uppercase I ', 'Uppercase J ', 'Uppercase K ', \
'Uppercase L ', 'Uppercase M ', 'Uppercase N ', 'Uppercase O ', \
'Uppercase P ', 'Uppercase Q ', 'Uppercase R ', 'Uppercase S ', \
'Uppercase T ', 'Uppercase U ', 'Uppercase V ', 'Uppercase W ', \
'Uppercase X ', 'Uppercase Y ', 'Uppercase Z ', 'Opening bracket ', \
'Backslash ', 'Closing bracket ', 'Caret ', 'Underscore ', \
'Grave ', 'Lowercase a ', 'Lowercase b ', 'Lowercase c ', \
'Lowercase d ', 'Lowercase e ', 'Lowercase f ', 'Lowercase g ', \
'Lowercase h ', 'Lowercase i ', 'Lowercase j ', 'Lowercase k ', \
'Lowercase l ', 'Lowercase m ', 'Lowercase n ', 'Lowercase o ', \
'Lowercase p ', 'Lowercase q ', 'Lowercase r ', 'Lowercase s ', \
'Lowercase t ', 'Lowercase u ', 'Lowercase v ', 'Lowercase w ', \
'Lowercase x ', 'Lowercase y ', 'Lowercase z ', 'Opening brace ', \
'Vertical bar ', 'Closing brace ', 'Tilde ', 'Delete '