Listing 2 van 'Met mathpack routines rekenen in ML' Jan vd Meer?, 00-00-00 ;ASSEMBLERLISTING 2 ;------------------ ; Voorbeeld voor uitvoeren van een deling. ;(Efficientere programmering is mogelijk, doch minder overzichtelijk) ;De met "***" gemerkte subroutines staan op de abonnement disk. NEXT NOP ;Zie assemblerlisting 1 DELING LD HL,STRING1 ;Opslagadres voor string 1 (deeltal) CALL INPUT_$ ;Intypen numerieke ascii-string *** CALL LENGTE ;Eventuele overtollige eindspaties verwijderen *** CALL CHK_NUM ;Syntax kontroleren, genereert foutmelding bij *** ; syntaxfout en zet dan C-vlag v¢¢r RET JR C,DELING ;(String opnieuw intypen) LD A,#FF ;Markering 'basicrom aanschakelen' ;(Entry-adres routine "FIN" staat al in subroutine) CALL DUBBEL ;Mathpack routine uitvoeren en converteren naar ; dubbele precisie indien resultaat 'n integer LD HL,RESULT1 ;Opslagadres voor resultaat LD A,(VALTYP) LD (HL),A ;VALTYP opslaan INC HL ;Doeladres LD DE,DAC ;Bronadres (resultaat vertaling deler) EX DE,HL ;Verwissel bron- en doeladres LD BC,#0008 ;Aantal bytes LDIR ;Mathpack notatie opslaan DELIN_1 LD HL,STRING1 ;Opslagadres voor string 1 (deler) CALL INPUT_$ ;Intypen numerieke ascii-string *** CALL LENGTE ;Eventuele overtollige eindspaties verwijderen *** CALL CHK_NUM ;Syntax kontroleren, genereert foutmelding bij *** ; syntaxfout en zet C-vlag v¢¢r RET JR C,DELIN_1 ;(String opnieuw intypen) LD HL,FIN ;Entry-adres mathpackroutine "FIN" LD (ENTRY_A),HL; invullen in subroutine in page 3 LD A,#FF ;Markering 'basicrom aanschakelen' CALL DUBBEL ;Mathpack routine uitvoeren en converteren naar ; dubbele precisie indien resultaat 'n integer LD A,(DAC) ;Haal 1e byte van resultaat (notatie deler) OR A ;Is resultaat NUL ? JR NZ,DELIN_2 ;Nee NOP ;Hier foutmelding programmeren, JR DELIN_1 ;die terugkeert naar "DELIN_1" voor nieuwe ingave DELIN_2 LD HL,MAF ;Entry-adres routine "MAF" (DAC ---> ARG) LD (ENTRY_A),HL; invullen in subroutine in page 3 XOR A ;Markering 'geen basicrom' CALL #F55E ;Mathpackroutine uitvoeren (deler van DAC naar ARG) LD A,#08 ;VALTYP, gewenst voor uitkomst (dubbele precisie) LD (VALTYP),A ;Set VALTYP LD HL,RESULT1+1;Opslagadres van notatie deeltal (Bronadres) LD DE,DAC ;Doeladres LD BC,#0008 ;Aantal bytes LDIR ;Notatie deeltal naar DAC kopi‰ren LD HL,DECDIV ;Entry-adres voor mathpack 'deling' LD (ENTRY_A),HL; invullen in subroutine in page 3 XOR A ;Markering 'geen basicrom' CALL DUBBEL ;Mathpack routine uitvoeren en converteren naar ; dubbele precisie indien resultaat integer ;(Resultaat staat in DAC) ;--> Resultaat bewaren voor later gebruik DELIN_3 LD HL,RESULT2 ;Opslagadres voor te bewaren resultaat LD A,(VALTYP) ;Haal VALTYP op LD (HL),A ;VALTYP-code opslaan INC HL ;Doeladres LD DE,DAC ;Bronadres (resultaat deling) EX DE,HL ;Verwissel bron- en doeladres LD BC,#0008 ;Aantal bytes LDIR ;Mathpack notatie opslaan ;--> Resultaat vertalen naar afdrukbare string DELIN_4 LD HL,FOUT ;Entry-adres routine 'FOUT' LD (ENTRY_A),HL; invullen in subroutine in page 3 LD A,#FF ;Markering 'basicrom aanschakelen' CALL #F55E ;Mathpack routine uitvoeren, returns pointer ;naar afdrukbare string in HL NOP ;HIER KOMT TE PROGRAMMEREN ROUTINE OM AFDRUKBARE ;STRING (resultaat) NAAR SCHERM TE STUREN. RST 0 ;Einde programma ;---------------------------- ;MATHPACKFUNKTIE UITVOEREN ;+ CONVERSIE DUBBELE PRECISIE ;---------------------------- DUBBEL CALL #F55E ;Mathpack subroutine in page 3 uitvoeren LD A,(VALTYP) ;Haal type van resultaat op CP #02 ;Resultaat is integer ? RET NZ ;Nee (is enkele- of dubbele presisie) LD HL,FRCDBL ;Call-adres voor routine "FRCDBL" LD (ENTRY_A),HL; invullen in subroutine in page 3 LD A,#FF ;Markering 'basicrom aanschakelen' CALL #F55E ;Mathpack-notatie (in DAC) converteren ; naar dubbele precisie (resultaat in DAC) RET ;------------------------ EINDE LISTING 2 -------------------------- |