diff --git a/Makefile b/Makefile index 01be640..2573c13 100644 --- a/Makefile +++ b/Makefile @@ -13,8 +13,10 @@ ASFLAGS = -plosgff SRC = \ src/crt0.s \ src/bios.s \ +src/_mulint.s \ src/random.c \ src/console.c \ +src/convert.c \ OBJ_1 = $(notdir $(SRC:.c=.rel)) OBJ_2 = $(notdir $(OBJ_1:.s=.rel)) diff --git a/include/convert.h b/include/convert.h new file mode 100644 index 0000000..949603d --- /dev/null +++ b/include/convert.h @@ -0,0 +1,5 @@ +#pragma once + +#include "types.h" + +uint32_t uint16_to_bcd(uint16_t value); diff --git a/include/types.h b/include/types.h index 42e764e..680d0d5 100644 --- a/include/types.h +++ b/include/types.h @@ -1,7 +1,9 @@ #pragma once -typedef signed char int8_t; -typedef short int int16_t; +typedef signed char int8_t; +typedef signed short int int16_t; +typedef signed long int int32_t; -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned long int uint32_t; diff --git a/src/_mulint.s b/src/_mulint.s new file mode 100644 index 0000000..145e61f --- /dev/null +++ b/src/_mulint.s @@ -0,0 +1,73 @@ +;-------------------------------------------------------------------------- +; _mulchar.s +; +; Copyright (C) 2000, Michael Hope +; +; This library is free software; you can redistribute it and/or modify it +; under the terms of the GNU General Public License as published by the +; Free Software Foundation; either version 2, or (at your option) any +; later version. +; +; This library is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this library; see the file COPYING. If not, write to the +; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, +; MA 02110-1301, USA. +; +; As a special exception, if you link this library with other files, +; some of which are compiled with SDCC, to produce an executable, +; this library does not by itself cause the resulting executable to +; be covered by the GNU General Public License. This exception does +; not however invalidate any other reasons why the executable file +; might be covered by the GNU General Public License. +;-------------------------------------------------------------------------- + +.area _CODE + +.globl __mulint + +__mulint: + pop af + pop bc + pop de + push de + push bc + push af + + ;; 16-bit multiplication + ;; + ;; Entry conditions + ;; bc = multiplicand + ;; de = multiplier + ;; + ;; Exit conditions + ;; hl = less significant word of product + ;; + ;; Register used: AF,BC,DE,HL +__mul16:: + xor a,a + ld l,a + or a,b + ld b,#16 + + ;; Optimise for the case when this side has 8 bits of data or + ;; less. This is often the case with support address calls. + jr NZ,2$ + ld b,#8 + ld a,c +1$: + ;; Taken from z88dk, which originally borrowed from the + ;; Spectrum rom. + add hl,hl +2$: + rl c + rla ;DLE 27/11/98 + jr NC,3$ + add hl,de +3$: + djnz 1$ + ret diff --git a/src/convert.c b/src/convert.c new file mode 100644 index 0000000..3b2d8b1 --- /dev/null +++ b/src/convert.c @@ -0,0 +1,65 @@ +#include "convert.h" + +uint32_t uint16_to_bcd(uint16_t value) __naked { + value; + + __asm + ld iy, #2 + add iy, sp + + ld h, 1(iy) + ld l, 0(iy) + + ld bc, #16*256+0 + ld de, #0 + loop: + add hl, hl + + ld a, e + adc a, a + daa + ld e, a + + ld a, d + adc a, a + daa + ld d, a + + ld a, c + adc a, a + daa + ld c, a + + djnz loop + + ex de, hl + ld e, c + + ret + ; Bin2Bcd: + ; LD BC, 16*256+0 ; handle 16 bits, one bit per iteration + ; LD DE, 0 + ; cvtLoop: + ; ADD HL, HL + + ; LD A, E + ; ADC A, A + ; DAA + ; LD E, A + + ; LD A, D + ; ADC A, A + ; DAA + ; LD D, A + + ; LD A, C + ; ADC A, A + ; DAA + ; LD C, A + + ; DJNZ cvtLoop + + ; EX HL, DE + ; RET + __endasm; +}