From 7dec8b6c81be45800d6d54cbdef19c6aa62e5750 Mon Sep 17 00:00:00 2001 From: Ain <41307858+nero@users.noreply.github.com> Date: Mon, 14 Oct 2019 21:04:40 +0000 Subject: [PATCH] Use nasm compat file to allow custom asm variant (I dont want to re-implement all those nasm features later) --- Makefile | 2 +- lib/nasmcomp.asm | 124 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 lib/nasmcomp.asm diff --git a/Makefile b/Makefile index 79aac34..5229dd6 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ QEMU = qemu-system-$(QEMU_ARCH) QEMU_ARGS = $(addprefix --option-rom ,$(ROMS)) NASM = nasm -NASM_ARGS = -s -I lib +NASM_ARGS = -s -Ilib -Plib/nasmcomp.asm -w-macro-params EMUL = utils/emul diff --git a/lib/nasmcomp.asm b/lib/nasmcomp.asm new file mode 100644 index 0000000..4fbebf8 --- /dev/null +++ b/lib/nasmcomp.asm @@ -0,0 +1,124 @@ +; Pseudo-Instruction: fill bytes until offset +%macro pad 1.nolist +times (%1 - ($-$$)) nop +%endmacro + +; REGISTERS +%define a al +%define b ch +%define c cl +%define d dh +%define e dl +%define h bh +%define l bl +%define m byte [bx] + +; REGISTER PAIRS +%define bc cx +%define de dx +%define hl bx + +; INSTRUCTIONS +; data movement +; 'mov' can stay literal +%define mvi mov +%define lxi mov +%macro lda 1 + mov al, byte [%1] +%endmacro +%macro sta 1 + mov byte [%1], al +%endmacro +%macro lhld 1 + mov bx, word [%1] +%endmacro +%macro shld 1 + mov word [%1], bx +%endmacro +%macro ldax 1 + mov al, byte [%1] +%endmacro +%macro stax 1 + mov byte [%1], al +%endmacro +%macro xchg 1 + xchg dx, bx +%endmacro +; addition +%macro add 1 + add al, %1 +%endmacro +%macro adi 1 + add al, %1 +%endmacro +%macro adc 1 + adc al, %1 +%endmacro +%macro aci 1 + adc al, %1 +%endmacro +; subtraction +%macro sub 1 + sub al, %1 +%endmacro +%macro sui 1 + sub al, %1 +%endmacro +%macro sbb 1 + sub al, %1 +%endmacro +%macro sbi 1 + sub al, %1 +%endmacro +; increment / decrement +%define inr inc +%define dcr dec +%define inx inc +%define dcx dec +; pointer arithmetic +%macro dad 1 + add bx, %1 +%endmacro +; 'daa' stays literal + +;ANA S 10100SSS ZSCPA AND register with A +;ANI # 11100110 db ZSPCA AND immediate with A +;ORA S 10110SSS ZSPCA OR register with A +;ORI # 11110110 ZSPCA OR immediate with A +;XRA S 10101SSS ZSPCA ExclusiveOR register with A +;XRI # 11101110 db ZSPCA ExclusiveOR immediate with A + +;CMP S 10111SSS ZSPCA Compare register with A +;CPI # 11111110 ZSPCA Compare immediate with A + +;RLC 00000111 C Rotate A left +;RRC 00001111 C Rotate A right +;RAL 00010111 C Rotate A left through carry +;RAR 00011111 C Rotate A right through carry +;CMA 00101111 - Compliment A +;CMC 00111111 C Compliment Carry flag +;STC 00110111 C Set Carry flag +;JMP a 11000011 lb hb - Unconditional jump +;Jccc a 11CCC010 lb hb - Conditional jump +;CALL a 11001101 lb hb - Unconditional subroutine call +;Cccc a 11CCC100 lb hb - Conditional subroutine call +;RET 11001001 - Unconditional return from subroutine +;Rccc 11CCC000 - Conditional return from subroutine +;RST n 11NNN111 - Restart (Call n*8) +;PCHL 11101001 - Jump to address in H:L +;PUSH RP 11RP0101 *2 - Push register pair on the stack +;POP RP 11RP0001 *2 *2 Pop register pair from the stack +;XTHL 11100011 - Swap H:L with top word on stack +;SPHL 11111001 - Set SP to content of H:L +;IN p 11011011 pa - Read input port into A +;OUT p 11010011 pa - Write A to output port +;EI 11111011 - Enable interrupts +;DI 11110011 - Disable interrupts +;HLT 01110110 - Halt processor +;NOP 00000000 - No operation + +%macro cnz 1 + jz %%skip + call near %1 +%%skip: +%endmacro