MILC logo

IndexVorigeVolgendeLeeg

Math-pack info v2.00 [2/2]
Jan vd Meer, 00-00-94


    
==============================================================================
===============    MATH-PACK ROUTINES EN HUN ENTRY-ADRESSEN    ===============
==============================================================================


   PRIMAIRE REKENFUNKTIES:
  ---------------------------------------------------------------------------
  | Label  | Adres  | Funktie                                               |
  |--------|--------|-------------------------------------------------------|
  | DECSUB | &H268C | DAC <--- DAC - ARG                                    |
  | DECADD | &H269A | DAC <--- DAC + ARG                                    |
  | DECNRM | &H26FA | normaliseert DAC: eventuele voorloopnullen worden     |
  |        |        |  uit de mantisse verwijderd. Exponent wordt aangepast |
  |        |        |  op dec. punt voor 1e cijfer. Bijvoorbeeld: 0.001234  |
  |        |        |  wordt: .12340000000000E-2 (i.n.) ---> 1.234E-3 (w.n.)|
  | DECROU | &H273C | rondt DAC af tot mantisse van 14 relevante cijfers.   |
  | DECMUL | &H27E6 | DAC <--- DAC * ARG                                    |
  | DECDIV | &H289F | DAC <--- DAC / ARG                                    |
  ---------------------------------------------------------------------------
Noot: Deze routines behandelen de getallen in DAC en ARG als dubbele
      precisie. De registers worden niet bewaard !!!



   GONIOMETRISCHE FUNCTIES, WORTELTREKKEN, KWADRATEREN & AFRONDEN:
  ---------------------------------------------------------------------------
  | Label  | Adres  | Funktie                       | Wijzigt registers     |
  |--------|--------|-------------------------------|-----------------------|
  | COS    | &H2993 | DAC <--- COS(DAC)             |  A,B,C,D,E,H en L     |
  | SIN    | &H29AC | DAC <--- SIN(DAC)             |  A,B,C,D,E,H en L     |
  | TAN    | &H29FB | DAC <--- TAN(DAC)             |  A,B,C,D,E,H en L     |
  | ATN    | &H2A14 | DAC <--- ATN(DAC)             |  A,B,C,D,E,H en L     |
  | LOG    | &H2A72 | DAC <--- LOG(DAC)             |  A,B,C,D,E,H en L     |
  | SQR    | &H2AFF | DAC <--- SQR(DAC)             |  A,B,C,D,E,H en L     |
  | EXP    | &H2B4A | DAC <--- EXP(DAC)             |  A,B,C,D,E,H en L     |
  | RND    | &H2BDF | DAC <--- RND(DAC)             |  A,B,C,D,E,H en L     |
  ---------------------------------------------------------------------------
  Noot: Deze functies hebben dezelfde naam en functie als in BASIC.



 TEKEN-MANIPULATIES:
-----------------------------------------------------------------------------
| Label  | Adres  | Funktie                           | Wijzigt register(s) |
|--------|--------|-----------------------------------|---------------------|
| SIGN   | &H2E71 | AF <--- teken van DAC             |     A               |
|        |        |   NC, Z    (A = &H00) <--- DAC = 0|                     |
|        |        |   NC, NZ   (A = &H01) <--- DAC > 0|                     |
|        |        |   C,S-vlag (A = &HFF) <--- DAC < 0|                     |
| ABSFN  | &H2E82 | DAC <--- ABS(DAC)                 |     A,B,C,D,E,H,L   |
|        |        |   Resultaat: Mantisse positief    |                     |
| NEG    | &H2E8D | DAC <--- NEG(DAC)                 |     A,H,L           |
|        |        |   Teken mantisse + <----  -       |                     |
|        |        |               of - <----  +       |                     |
| SGN    | &H2E97 | DAC <--- SGN(DAC)                 |     A,H,L           |
|        |        |   Resultaat is 2 bytes integer    |                     |
|        |        |   DAC+2 = &H00 <----- DAC = 0     |                     |
|        |        |   DAC+3 = &H00 <-----             |                     |
|        |        |                                   |                     |
|        |        |   DAC+2 = &H01 <----- DAC > 0     |                     |
|        |        |   DAC+3 = &H00 <-----             |                     |
|        |        |                                   |                     |
|        |        |   DAC+2 = &HFF <----- DAC < 0     |                     |
|        |        |   DAC+3 = &HFF <-----             |                     |
|        |        |       (&HF663) <----- &H02        |                     |
-----------------------------------------------------------------------------
   Noot: De funktie SGN is identiek aan de BASIC-funktie SNG( < N > )
         De funktie ABSFN is identiek aan de BASIC-funktie ABS( < N > )
         (Overige funkties hebben geen equivalent in BASIC.)
         De funktie SIGN is soortgelijk als SGN. SIGN geeft echter het
         resultaat in het 'A' register en de vlaggen in het 'F' register zijn
         reeds gezet (voor gebruik in machinetaal). DAC en VALTYP (&HF663)
         blijven ongewijzigd bij SIGN !!




   DATA VERPLAATSINGEN:

  ---------------------------------------------------------------------------
  | Label  | Adres  | Funktie          | Type variabele | wijzigt registers |
  |--------|--------|------------------|----------------|-------------------|
  | MAF    | &H2C4D | ARG <--- DAC     | dubb. precisie | A,B,D,E,H,L       |
  | MAM    | &H2C50 | ARG <--- (HL)    | dubb. precisie | A,B,D,E,H,L       |
  | MOV8DH | &H2C53 | (DE) <--- (HL)   | dubb. precisie | A,B,D,E,H,L       |
  | MFA    | &H2C59 | DAC <--- ARG     | dubb. precisie | A,B,D,E,H,L       |
  | MFM    | &H2C5C | DAC <--- (HL)    | dubb. precisie | A,B,D,E,H,L       |
  | MMF    | &H2C67 | (HL) <--- DAC    | dubb. precisie | A,B,D,E,H,L       |
  | MOV8HD | &H2C6A | (HL) <--- (DE)   | dubb. precisie | A,B,D,E,H,L       |
  | XTF    | &H2C6F | (SP) <--> DAC    | dubb. precisie | A,B,D,E,H,L       |
  | PHA    | &H2CC7 | ARG <--- (SP)    | dubb. precisie | A,B,D,E,H,L       |
  | PHF    | &H2CCC | DAC <--- (SP)    | dubb. precisie | A,B,D,E,H,L       |
  | PPA    | &H2CDC | (SP) <--- ARG    | dubb. precisie | A,B,D,E,H,L       |
  | PPF    | &H2CE1 | (SP) <--- DAC    | dubb. precisie | A,B,D,E,H,L       |
  | PUSHF  | &H2EB1 | DAC <--- (SP)    | enk.  precisie |     D,E           |
  | MOVFM  | &H2EBE | DAC <--- (HL)    | enk.  precisie | B,C,D,E,H,L       |
  | MOVFR  | &H2EC1 | DAC <--- (CBED)  | enk.  precisie |     D,E           |
  | MOVRF  | &H2ECC | (CBED) <--- DAC  | enk.  precisie | B,C,D,E,H,L       |
  | MOVRMI | &H2ED6 | (CBED) <--- (HL) | enk.  precisie | B,C,D,E,H,L       |
  | MOVRM  | &H2EDF | (BCDE) <--- (HL) | enk.  precisie | B,C,D,E,H,L       |
  | MOVMF  | &H2EE8 | (HL) <--- DAC    | enk.  precisie | A,B,D,E,H,L       |
  | MOVE   | &H2EEB | (HL) <--- (DE)   | enk.  precisie | B,C,D,E,H,L       |
  | VMOVAM | &H2EEF | ARG <--- (HL)    | VALTYP         | B,C,D,E,H,L       |
  | MOVVFM | &H2EF2 | (DE) <--- (HL)   | VALTYP         | B,C,D,E,H,L       |
  | VMOVE  | &H2EF3 | (HL) <--- (DE)   | VALTYP         | B,C,D,E,H,L       |
  | VMOVFA | &H2F05 | DAC <--- ARG     | VALTYP         | B,C,D,E,H,L       |
  | VMOVFM | &H2F08 | DAC <--- (HL)    | VALTYP         | B,C,D,E,H,L       |
  | VMOVAF | &H2F0D | ARG <--- DAC     | VALTYP         | B,C,D,E,H,L       |
  | VMOVMF | &H2F10 | (HL) <--- DAC    | VALTYP         | B,C,D,E,H,L       |
  ---------------------------------------------------------------------------

Noot: Een registernaam tussen haakjes (DE), (HL), (SP) betekent, dat het
      betreffende register de pointer bevat naar het geheugenadres waar de
      1e byte van de te verplaatsen 2, 4 of 8 databytes is (of moet worden-)
      opgeslagen.

      4 Registernamen tussen haakjes zoals (CBED) bevatten een getal in enkele
      precisie: Van links naar rechts bevatten de 4 registers het exponentbyte
      (in C), mantissa 1e & 2e cijfer (in B), idem 3e & 4e cijfer (in E) en
      idem 5e & 6e cijfer (in D).

      "VALTYP" betekent dat het aantal te verplaatsen bytes (2, 4 of 8)
      en de juiste plaatsing in DAC of ARG bepaald wordt door de code voor het
      type variabele in geheugenplaats 'VALTYP' (&HF663).



   VERGELIJKINGEN:
  ---------------------------------------------------------------------------
  | Label  | Adres  | Type variabele  | Links  | Rechts | Wijzigt registers |
  |--------|--------|-----------------|--------|--------|-------------------|
  | FCOMP  | &H2F21 | enk.  precisie  | CBED *)| DAC    |    H,L            |
  | ICOMP  | &H2F4D | 2-byte integer  | DE     | HL     |    H,L            |
  | XDCOMP | &H2F5C | dubb. precisie  | ARG    | DAC    |  A,B,C,D,E,H,en L |
  ---------------------------------------------------------------------------
   *) In C: Teken & exponentcodering        in B: 1e & 2e cijfer mantissa
      in E: 3e & 4e cijfer mantissa,        in D: 5e & 6e cijfer mantissa

   Noot: Het resultaat komt in het A-register, de betekenis is:
             A=1   ---------->  links < rechts
             A=0   ---------->  links = rechts
             A=-1 (&HFF) ---->  links > rechts



  INVOER ascii string, UITVOER (naar DAC) integer of getal met drijvende punt
  ---------------------------------------------------------------------------
  | Label  | Adres  | Funktie                                               |
  |--------|--------|-------------------------------------------------------|
  | FIN    | &H3299 | AsciiZ-string, welke een pos./neg. getal (met/zonder  |
  |        |        | dec. punt) voorstelt wordt geconverteerd naar of een  |
  |        |        | integer of een getal met drijvende punt (volgens in-  |
  |        |        | terne notatie) en opgeslagen in DAC.  &  VALTYP       |
  |-------------------------------------------------------------------------|
  | Invoer:     HL <---- Pointer naar in geheugen opgeslagen ascii string.  |
  |              A <---- Eerste teken van de opgeslagen string.         *)  |
  | Uitvoer:   DAC <---- Integer of getal van enkele- of dubbele-precisie.  |
  |              C <---- &HFF: Ascii string bevatte geen decimale punt. **) |
  |                   of &H00: Ascii string bevatte wel decimale punt.      |
  |              B <---- aantal bytes mantissa                         ***) |
  |              D <---- Aantal numerieke karakters in de ascii string      |
  |       (&HF663) <---- VALTYP (&H02, &H04 of &H08)                  ****) |
  | Alle registers worden gewijzigd !!                                      |
  ---------------------------------------------------------------------------
  Noot: De basic-rom moet reeds in page 1 aangeschakeld zijn.

*)     Data-invoer in het 'A' register is niet nodig bij Turbo-R. (genegeerd)
**)    Bij een integere waarde betekent "&HFF" dat het getal negatief is.
***)   Alleen geldig bij getal in dubbele precisie.
****)  De variabele codering die in VALTYP wordt gezet hangt af van de
       getalswaarde, welke de ascii-string blijkt voor te stellen.

   Als niet zeker is, dat de string een getal met dubbele precisie
   voorstelt, dan dienen v¢¢r het gebruik van deze routine de 8 geheugen-
   plaatsen DAC+0 t/m DAC+7 gewist te worden door ze te vullen met &H00.

   Een ascii-string, welke een getal voorstelt met decimale punt erin, wordt
   altijd geconverteerd naar een getal met drijvende decimale punt. (enkele
   of dubbele precisie)

   Voor een integere waarde mag de ascii-string bestaan uit:
            Alleen cijfers met teken erv¢¢r. (+ teken niet verplicht)
        of: &H....   1 - 4 hex  karakters
        of: &O....   1 - 6 octal karakters (binnen range &O0 - &O177777)
        of: &B....   1 - 16 binaire karakters "0" of "1"

   Voor een waarde in enkele- of dubbele precisie mag de string bestaan uit:
            Alleen cijfers met teken erv¢¢r (+teken niet verplicht) met- of
            zonder decimale punt.
        of: Een wetenschappelijke notatie.
            Notatie als macht (...^..) is niet toegestaan.


   CONVERSIE WAARDE IN DAC naar afdrukbare ascii-string
  ---------------------------------------------------------------------------
  | Label  | Adres  | Funktie                                               |
  |--------|--------|-------------------------------------------------------|
  | FOUT   | &H3425 | Conversie van (DAC) naar dubbele precisie en daarna   |
  |        |        | conversie naar ascii-string.   (&HF663) <---- &H08    |
  |-------------------------------------------------------------------------|
  | Waarde in DAC positief: 1e karakter van de string is een spatie.        |
  | Waarde in DAC negatief: 1e karakter is minteken. DAC neg. ----> DAC pos.|
  |                                                                         |
  | Indien de waarde van de exponent (i.n.) buiten het bereik -1 t/m +14    |
  | ligt, dan wordt de wetenschappelijke notatie gebruikt. (Decimale punt   |
  | na 1e cijfer van de mantissa)                                           |
  | uitvoer: HL <---- pointer naar startadres van de string.                |
  ---------------------------------------------------------------------------
  Noot: De basic-rom moet reeds in page 1 aangeschakeld zijn.


   CONVERSIE WAARDE IN DAC naar afdrukbare geformatteerde ascii-string
   (Vergelijkbaar met basicfunktie "PRINT USING")
  ---------------------------------------------------------------------------
  | Label  | Adres  | Funktie                                               |
  |--------|--------|-------------------------------------------------------|
  | PUFOUT | &H3426 | Als funktie FOUT (zie boven) doch geformateerd        |
  |-------------------------------------------------------------------------|
  | invoer:   A <---- formaat codering                                      |
  |                bit 7:  0 = ongeformateerd      1 = geformateerd         |
  |                bit 6:  0 = zonder komma's      1 = met komma's om de    |
  |                                                    drie cijfers.        |
  |                bit 5:  0 = geen betekenis      1 = voorafgaande spaties |
  |                                                    worden opgevuld met  |
  |                                                    punten.              |
  |                bit 4:  0 = geen betekenis      1 = een "$" wordt voor de|
  |                                                    waarde geplakt.      |
  |                bit 3:  0 = geen betekenis      1 = een "+" wordt voor   |
  |                                                    een positieve waarde |
  |                                                    gezet.               |
  |                bit 2:  0 = geen betekenis      1 = het +/-teken komt na |
  |                                                    de waarde.           |
  |                bit 1:  niet gebruikt                                    |
  |                bit 0:  0 = fixed point         1 = floating point       |
  |           B <---- aantal cijfers voor (excl.) de decimale punt.         |
  |           C <---- aantal cijfers na   (incl.) de decimale punt.         |
  |                                                                         |
  | uitvoer: HL <---- pointer naar startadres van de string.                |
  ---------------------------------------------------------------------------
  Noot: Indien het A register = &H00 dan wordt de inhoud van de overige
        registers genegeerd en de funktie FOUT (Label &H3425) uitgevoerd.
        De basic-rom moet reeds in page 1 aangeschakeld zijn !!!


  CONVERSIE INTEGER (in DAC) naar binaire/octal/hexadecimale ascii-string.
  ---------------------------------------------------------------------------
  | Label  | Adres  | Funktie                                               |
  |--------|--------|-------------------------------------------------------|
  | FOUTB  | &H371A | Maakt van de 2-byte integer in DAC+2, +3 een binair   |
  |        |        | uitgedrukte ascii-string.                             |
  | FOUTO  | &H371E | Maakt van de 2-byte integer in DAC+2, +3 een octaal   |
  |        |        | uitgedrukte ascii-string.                             |
  | FOUTH  | &H3722 | Maakt van de 2-byte integer in DAC+2, +3 een hexade-  |
  |        |        | cimaal uitgedrukte ascii-string.                      |
  |-------------------------------------------------------------------------|
  | invoer: DAC+2 (lowbyte), DAC+3 (highbyte) <----- 2-byte integer         |
  |         VALTYP <--- 2                                                   |
  | uitvoer:    HL <--- Pointer naar beginadres van de string.              |
  ---------------------------------------------------------------------------

Noot: Er zijn geen strings gereserveerd. Het startadres van de string van 
      de uitvoerroutine is normaal FBUFFR (vanaf &HF7C5). In sommige gevallen
      kan het enigzins verschillen. Dit geldt ook voor de routines "FOUT" en
      "PUFOUT" voor conversie naar een string.



   TYPE CONVERSIE:
  --------------------------------------------------------------------------
  | label  | adres  | functie                                              |
  |------------------------------------------------------------------------|
  | FRCINT | &H2F8A | Converteert (DAC) naar een 2-byte integer (DAC+2, 3).|
  | FRCSNG | &H2FB2 | Converteert (DAC) naar een enkele precisie waarde.   |
  | FRCDBL | &H303A | Converteert (DAC) naar een dubbele precisie waarde.  |
  | FIXER  | &H30BE | (DAC) <--- SGN(DAC) * INT(ABS(DAC))                  |
  |             Alle registers kunnen gewijzigd worden                     |
  --------------------------------------------------------------------------

Noot: Na het aanroepen van een van deze routines, bevat VALTYP (&HF663) de
      code (2, 4 of 8) van het gewijzigde getalstype in DAC.
      De basic-rom moet reeds in page 1 aangeschakeld zijn !!
      Alle registers worden veranderd.



   REKENFUNKTIES MET 2 INTEGERE GETALLEN:
   (Positief +1 t/m +32767 of negatief -1 t/m -32768)
  --------------------------------------------------------------------------
  | Label  | Adres  | Funktie           | Wijzigt registers                |
  |--------|--------|-------------------|----------------------------------|
  | UMULT  | &H314A | DE <--- BC * DE   | A,B,C,D,E                        |
  | ISUB   | &H3167 | HL <--- DE - HL   | Alle                             |
  | IADD   | &H3172 | HL <--- DE + HL   | Alle                             |
  | IMULT  | &H3193 | HL <--- DE * HL   | Alle                             |
  | IDIV   | &H31E6 | HL <--- DE \ HL   | Alle                             |
  | IMOD   | &H323A | HL <--- DE mod HL | Alle                             |
  |        |        | DE <--- (2 * resultaat indien getallen positief)     |
  --------------------------------------------------------------------------
Noot: De routine IDIV geeft, indien DE en HL beiden met een POSITIEF integer
      getal geladen waren, de rest * 2 terug in register DE. De rest verkrijgt
      men door (DE)/2. De routine IMOD heeft men dan niet nodig.

      Bij de routines IDIV en IMOD moeten BEIDE getallen positief of negatief
      zijn om een geldige uitkomst te verkrijgen.

      Negatieve getallen als twee complement! en #02 in VALTYP zetten.




   MACHTSVERHEFFEN:
 -----------------------------------------------------------------------------
 | Label  | Adres  | Funktie                  | Grondtal | Macht | Resultaat |
 |--------|--------|--------------------------|----------|-------|-----------|
 | SGNEXP | &H37C8 | macht van enk. precisie  |    DAC   |  ARG  |    DAC    |
 | DBLEXP | &H37D7 | macht van dubb. precisie |    DAC   |  ARG  |    DAC    |
 | INTEXP | &H383F | macht van 2-byte integer |    DE    |  HL   |    DAC    |
 -----------------------------------------------------------------------------

 Noot: Alle registers worden gewijzigd.





  @@@  EXTRA: @@@

  --------------------------------------------------------------------------
  | Label  | Adres  | Funktie                                              |
  |--------|--------|------------------------------------------------------|
  | PRTHL  | &H3412 | Zet HL decimaal op het scherm.                       |
  --------------------------------------------------------------------------

Noot: Deze, wellicht meest gebruikte, MP-routine is niet officieel! Page 1 
      hoeft hierbij niet op de ROM te staan.

Op en aanmerkingen over deze file graag sturen naar:

Jan van der Meer
Rensumaheerd 16
9736 AA Groningen
^/*\^ 050-417266

;------------------------------------------------------------------
;ML-PROGRAMMA VOOR UITVOERING VAN EEN MATHPACK ROUTINE WELKE OOK DE
;BASIC-ROM (in page 1) GEBRUIKT. B.v. mathpack-routine "FIN"
;Onderstaand programma werkt op elke MSX computer (in COM-files, geen basic)
;-------------------------------------------------------------------
;Opmerking: De inputbuffer (#F55E t/m #F65F = 258 bytes) wordt alleen gebruikt
;           voor input via het toetsenbord en is dus vrij voor gebruik als
;           geheugen in pagina 3. Omdat pagina 3 nooit weggeschakeld wordt kan
;           dit geheugengebied gebruikt worden voor 'lastige' klussen, welke
;           anders in conflict komen met benodigde slotomschakelingen.
;           Gebruik van dit geheugengebied heeft als bijkomend voordeel, dat
;           er geen geheugen behoeft te worden gereserveerd elders in pag. 3


        LD   HL,COPY_ML ;Beginadres te kopie‰ren ML-code
        LD   DE,#F55E   ;Input-buffer, te gebruiken als tijdelijke
                        ; opslagplaats voor ML-routine
        LD   BC,#004D   ;Aantal bytes van ML-routine
        LDIR            ;Kopi‰er ML-code naar input-buffer
        LD   HL,GETAL   ;Ascii-Z string (getalswaarde in ascii)
        LD   DE,#F600   ;Opslagadres (in input-buffer)
        LD   BC,#0016   ;Maximum mogelijke aantal bytes (21 + eindnul = 22)
        LDIR            ;Ascii-Z string kopi‰ren naar input-buffer
        CALL #F55E      ;ML-routine (in buffer) uitvoeren
        JR   VERVOLG
;=======================

;--> Instellingen betreffende RAM in pag.1 opvragen en opslaan

COPY_ML IN   A,(#A8)    ;Lees slotregister
        LD   (#F65E),A  ;Opslaan in input-buffer
        LD   A,(#FFFF)  ;Lees komplement van subslotregister
        CPL             ;Converteer naar werkelijke inhoud van subslotregister
        LD   (#F65F),A  ;Opslaan in input-buffer

;--> Basic-ROM aanschakelen

        LD   A,(#FCC1)  ;Slotadres basic-ROM
        LD   HL,#4000   ;Pagina identificatie
        CALL #0024      ;Schakel basic-ROM in pagina 1

;--> Mathpack routine uitvoeren

        LD   HL,#F600   ;Input benodigd voor MATHPACK routine "FIN"
        LD   A,(HL)     ;Idem
        PUSH IX         ;Save
        PUSH IY         ;Save
ENTRY_M LD   IX,#3299   ;Entry adres MATHPACK routine "FIN"
                        ;Conversie ascii-Z naar notatie in 'DAC' & 'VALTYP'
                        ;Het adres komt na kopi‰ren in #F57D te staan. Als
                        ;er een andere routine nodig is kan het adres van die
                        ;routine in #F5D7 worden ingevuld voordat de routine
                        ;met "CALL #F55E" wirdt aangeroepen.
        LD   IY,(#FCC0) ;Slot ID basic-ROM
        CALL #001C      ;Call mathpack-routine

;--> RAM terugschakelen in pagina 1

        LD   A,(#F65E)  ;Haal oude instelling slotregister
        OUT  (#A8),A    ;Herstel instelling slotregister
        LD   A,(#F65F)  ;Haal oude instelling subslotregister
        LD   (#FFFF),A  ;Herstel instelling subslotregister
        POP  IY         ;Herstel IY
        POP  IX         ;Herstel IX
        RET             ;Terug naar normale ML-routine
;---------------
GETAL   DEFB "12345.6789" ;(11 BYTES) voorbeeld van mogelijke ascii-Z string
        DEFS 11           ;+ 11 NUL-bytes = totaal 22 bytes
;========================

VERVOLG NOP             ;Hier komt het vervolg van het ML-programma


    

Index

Vorige

Volgende