From 129a8fa831bda5afdb459117de089657cc9f4a60 Mon Sep 17 00:00:00 2001 From: hugova Date: Thu, 3 Apr 2025 00:29:15 +0200 Subject: [PATCH] Initial commit --- macros/16add.s | 72 ++++++++++++++++++++++ macros/16aritmatic.s | 140 +++++++++++++++++++++++++++++++++++++++++++ macros/16sub.s | 0 macros/timer.s | 34 +++++++++++ 4 files changed, 246 insertions(+) create mode 100644 macros/16add.s create mode 100755 macros/16aritmatic.s create mode 100644 macros/16sub.s create mode 100644 macros/timer.s diff --git a/macros/16add.s b/macros/16add.s new file mode 100644 index 0000000..9292f9b --- /dev/null +++ b/macros/16add.s @@ -0,0 +1,72 @@ +;; 16bit addition macro. +;; b_low may be A and b_hi may be X or Y +;; You may append a ! att the end to skipp the CLC instruction (makes it run 2 cykles faster) +;; It will change the A-register. +;; examples is: +;; Add_16 a, b +;; Add_16, a_low, a_hi, b_low, b_hi +;; Add_16 a_low, a_hi, A, b_hi +;;Se below for some fast 16bit logic +;;http://6502.org/tutorials/compare_beyond.html + +;;Helper macro 2x 16bit addresses +.macro __Add_16_2 a_, b_ + .assert .not .match ({a_}, X) ,error, "a_ is not allowed to be X" + .assert .not .match ({b_}, X) ,error, "b_ is not allowed to be X" + .assert .not .match ({a_}, Y) ,error, "a_ is not allowed to be y" + .assert .not .match ({b_}, Y) ,error, "b_ is not allowed to be y" + .assert .not .match ({a_}, A) ,error, "a_ is not allowed to be A" + .assert .not .match ({b_}, A) ,error, "b_ is not allowed to be A" + .assert .not .match (.left (1, {a_}), #) ,error, "b_ is not allowed to start with #" + .assert .not .match (.left (1, {b_}), #) ,error, "b_ is not allowed to start with #" + LDA >b_ + ASC >b_ + STA >a_ + LDA = 4 + __Add_16_1 a_low, a_hi, b_low, b_hi +.else + __Add_16_2 a_low, a_hi +.endif +CLC +.endmacro diff --git a/macros/16aritmatic.s b/macros/16aritmatic.s new file mode 100755 index 0000000..b12bb7d --- /dev/null +++ b/macros/16aritmatic.s @@ -0,0 +1,140 @@ +;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*- + +;; A file containing 16-bit macro arithmatic. +;; You may add ,! ass a 5:th parameter to skipp flagg clearing. +;; This will make it run faster but will have unintended behavior. + +;;Se below for some fast 16bit logic +;;http://6502.org/tutorials/compare_beyond.html + +;; Addition always uses the A register +;; a = a + b +;.macro Add_16 a_low, a_hi, b_low, b_hi, fast_unsafe +;;; IF to run it fast +;.ifblank fast_unsafe +; CLC +;.endif +;.if .not .match ({b_low}, a) +; LDA b_low +;.endif ;;untested +; ADC a_low +; STA a_low +;.if .match ({b_hi}, x) ;;Untested +; TXA +;.else +; LDA b_hi +;.endif +; ADC a_hi +; STA a_hi +;.endmacro +.include "16add.s" + +;; Subtraction uses always uses A register +;; a = a - b +.macro Sub_16 a_low, a_hi, b_low, b_hi, fast_unsafe +;; IF to run it fast +.ifblank fast_unsafe + SEC +.endif +;; if b_low = A and b_hi =A +.if .match({b_low}, a) .and .match({b_hi}, a) ;;untested + .LOCAL rewrite + .LOCAL rewrite2 + STA rewrite +1 + STA rewrite2 + 1 + LDA a_low + rewrite: + SBC #b_low + STA a_low + LDA a_hi + rewrite2: + SBC #b_hi + STA a_hi +;; if b_low = A +.elseif .match({b_low}, a) ;;untested + .LOCAL rewrite + STA rewrite +1 + LDA a_low + rewrite: + SBC #b_low + STA a_low + LDA a_hi + SBC b_hi + STA a_hi +.elseif .match({b_hi}, a) ;;untested + .LOCAL rewrite + STA rewrite +1 + LDA a_low + SBC b_low + STA a_low + LDA a_hi + rewrite: + SBC #b_hi + STA a_hi +.else + LDA a_low + SBC b_low + STA a_low + LDA a_hi + SBC b_hi + STA a_hi +.endif +.endmacro + +;; Subtraction uses always uses A register +;; a = (A, a_hi) - b +.macro Sub_16_A a_low, a_hi, b_low, b_hi, fast_unsafe +;; IF to run it fast +.ifblank fast_unsafe + SEC +.endif + SBC b_low + STA a_low + LDA a_hi + SBC b_hi + STA a_hi +.endmacro + + +;; Multiplication of 2 +;; a = a*2 +.macro Mult_16 low_, hi_, NOT_ROL +;; IF NOT_ROL +.ifblank fast_unsafe + ASL low_ + ROL hi_ +.else + ROL low_ + ROL hi_ +.endif +.endmacro + +.macro Mov_16 a_low, a_hi, b_low, b_hi + LDA b_low + STA a_low + LDA b_hi + STA a_hi +.endmacro + +;;http://www.6502.org/tutorials/compare_beyond.html +;;Larger then operation, uses the A register +;;IF a < b then: jump to label +; C =0 if jump to LABEL +.macro Lag_16 a_low, a_hi, b_low, b_hi, label + .LOCAL LABEL + LDA a_hi + CMP b_hi + BCC label + BNE LABEL + LDA a_low +.if .match ({b_low}, a) + .LOCAL next + STY next +1 +next: + CMP #$ff +.else + CMP b_low +.endif + BCC label + LABEL: +.endmacro diff --git a/macros/16sub.s b/macros/16sub.s new file mode 100644 index 0000000..e69de29 diff --git a/macros/timer.s b/macros/timer.s new file mode 100644 index 0000000..92c7059 --- /dev/null +++ b/macros/timer.s @@ -0,0 +1,34 @@ +;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*- + +;; Max 0.9s +;; Exempel i kod: +;; +;; time_start +;; ... +;; time_stop +;; +;; Läs tiden genom att undersöka värdet i $f1 (BSD-format) +time = $f1 +.macro time_start + PHA + LDA $DC08 ; Bit 0..3: Tenth seconds in BCD-format, others may be 0 or 1 + ;;;;Clear all time data and set time =1. + AND #%11110000 + STA $DC08 + INC $DC08 + LDA $DC08 + ;;Time is only at bit 0 ..3 + AND #%00001111 + STA time + PLA +.endmacro + +.macro time_stop + PHA + LDA $DC08 ; Bit 0..3: Tenth seconds in BCD-format, others may be 0 or 1 + AND #%00001111 + SEC + SBC time + STA time + PLA +.endmacro