MILC logo

IndexVorigeVolgendeLeeg

Mathpack routines
MCCM/WR/JvdM, 00-00-00


    
;De volgende 2 routines horen bij elkaar. Zij kontroleren of een ingetypte
;numerieke ascii-string voldoet aan de voorgeschreven systax zoals die geldt
;voor basic programma's.

;------------------------------
;CHECK SYNTAX NUMERIEKE ASCII_$
;Input: HL = pointer $
;------------------------------
CHK_NUM PUSH HL
        EXX
        POP  HL         ;Adres bewaren in HL' voor evt. checken ven exponent
        EXX
        LD   B,(HL)     ;$-Lengte = teller
        INC  HL         ;Pointer naar 1e karakter
        LD   A,(HL)     ;Haal 1e karakter
        INC  HL         ;Pointer +1
        DEC  B          ;Teller -1
        CP   "&"        ;Decimale notatie ?
        JP   NZ,CHKN_06 ;Ja

;--> Hier indien geen decimale notatie, 2e karakter

        LD   A,(HL)     ;Haal 2e karakter (na "&" teken)
        INC  HL         ;Pointer +1
        DEC  B          ;Waren er maar 1 of 2 karakters ?
        JP   C,CHKN_18  ;Ja   (fout)
        JP   Z,CHKN_18  ;Ja   (fout)
        AND  #DF        ;Uppercase karakter
        CP   "H"        ;Hex notatie ?
        JR   Z,CHKN_03  ;Ja
        CP   "B"        ;Binaire notatie ?
        JP   NZ,CHKN_18 ;Nee   (fout)

;--> Hier indien binaire notatie

        LD   A,#10
        CP   B          ;Meer dan 16 binaire karakters ?
        JP   C,CHKN_18  ;Ja   (fout)
CHKN_01 LD   A,(HL)     ;Haal karakter
        INC  HL         ;Pointer +1
        CP   "0"        ;Binair karakter ?
        JR   Z,CHKN_02  ;Ja
        CP   "1"        ;Binair karakter ?
        JP   NZ,CHKN_18 ;Nee   (fout)
CHKN_02 DJNZ CHKN_01
        OR   A          ;Clear carry
        RET             ;(Binaire notatie is oke)

;--> Hier indien hex. notatie

CHKN_03 LD   A,#04
        CP   B          ;Meer dan 4 hex.karakters ?
        JP   C,CHKN_18  ;Ja   (fout)
CHKN_04 LD   A,(HL)     ;Haal karakter
        INC  HL         ;Pointer +1
        CP   #30        ;Cijfer of letter ?
        JP   C,CHKN_18  ;Nee   (fout)
        CP   #3A        ;Cijfer ?
        JR   C,CHKN_05  ;Ja
        AND  #DF        ;Uppercase letter
        CP   #47        ;Hex. letter ?
        JP   NC,CHKN_18 ;Nee   (fout)
        CP   #41        ;Hex. letter ?
        JP   C,CHKN_18  ;Nee   (fout)
CHKN_05 DJNZ CHKN_04
        OR   A          ;Clear carry
        RET             ;(Hex notatie is oke)

;--> Hier indien decimale notatie (+, -, punt of cijfer verlangd)

CHKN_06 CP   "+"        ;Plus-teken ?  (v¢¢r getal)
        JR   Z,CHKN_07  ;Ja
        CP   "-"        ;Min-teken ?   (v¢¢r getal)
        JR   Z,CHKN_07  ;Ja
        CP   #2E        ;Punt ?
        JR   Z,CHKN_08  ;Ja   (verder cijfers zonder punt verlangd)
        CP   #30        ;Cijfer ?
        JP   C,CHKN_18  ;Nee   (fout)
        CP   #3A        ;Cijfer ?
        JP   NC,CHKN_18 ;Nee   (fout)
        XOR  A
        OR   B          ;Was er maar 1 karakter ('n cijfer) aanwezig ?
        RET  Z          ;Ja   (decimale notatie oke)
        JR   CHKN_09    ;(1e cijfer gevonden, nog geen punt)

;--> Hier indien 1e karakter "+" of "-" teken was (punt of cijfer verlangd)

CHKN_07 XOR  A
        OR   B          ;Geen karakters meer aanwezig ?
        JP   Z,CHKN_18  ;Nee   (fout)
        LD   A,(HL)     ;Haal 2e karakter (na +/- teken)
        INC  HL         ;Pointer +1
        DEC  B          ;Teller -1
        CP   #2E        ;Punt ?
        JR   Z,CHKN_08  ;Ja    (verder cijfers zonder punt verlangd)
        CP   #30        ;Cijfer ?
        JP   C,CHKN_18  ;Nee   (fout)
        CP   #3A        ;Cijfer ?
        JP   NC,CHKN_18 ;Nee   (fout)
        XOR  A
        OR   B          ;Laatste karakter gehad ?
        RET  Z          ;Ja   (notatie oke)
        JR   CHKN_09    ;Nee  (Cijfer gevonden, nog geen punt)

;--> Hier indien punt gevonden en nog geen cijfers

CHKN_08 XOR  A
        OR   B          ;Geen karakters meer aanwezig ?
        JP   Z,CHKN_18  ;Nee   (fout)
        LD   A,(HL)     ;Haal volgende karakter
        INC  HL         ;Pointer +1
        DEC  B          ;Teller -1
        CP   #30        ;Cijfer of letter ?
        JP   C,CHKN_18  ;Nee   (fout)
        CP   #3A        ;Cijfer ?
        JP   NC,CHKN_18 ;Nee   (fout)
        XOR  A
        OR   B          ;Laatste karakter gehad ?
        RET  Z          ;Ja   (notatie oke)
        JR   CHKN_12    ;(punt + 1e cijfer gevonden)

;--> Hier als er 1 cijfer is gevonden en nog geen punt

CHKN_09 LD   A,(HL)
        INC  HL
        CP   #2E        ;Punt ?
        JR   NZ,CHKN_10 ;Nee
        DEC  B          ;Ja, dan teller -1, Laatste karakter gehad ?
        RET  Z          ;Ja    (notatie oke)
        JR   CHKN_12    ;Nee   (punt gevonden na cijfers)
CHKN_10 CP   #30        ;Cijfer of letter ?  (v¢¢r dec.punt)
        JP   C,CHKN_18  ;Nee   (fout)
        CP   #3A        ;Cijfer ?  (v¢¢r dec.punt)
        JR   NC,CHKN_11 ;Nee
        DJNZ CHKN_09    ;Ja,  dan check next kar.
        OR   A          ;Clear carry
        RET             ;(Decimale notatie oke)
;-------
CHKN_11 DEC  B
        AND  #DF        ;Uppercase
        CP   #44        ;Letter "D" ?
        JR   Z,CHKN_14  ;Ja   (wetenschappelijke notatie)
        CP   #45        ;Letter "E" ?
        JR   Z,CHKN_14  ;Ja   (wetenschappelijke notatie)
        JP   CHKN_18    ;Nee   (fout)

;--> Hier als cijfer(s) + punt gehad, cijfer of exponentletter verlangd

CHKN_12 LD   A,(HL)     ;Haal kar.
        INC  HL         ;Pointer +1
        CP   #30        ;Cijfer of letter ?
        JR   C,CHKN_18  ;Nee   (fout)
        CP   #3A        ;Cijfer ?
        JR   NC,CHKN_13 ;Nee
        DJNZ CHKN_12    ;Ja   check next kar.
        OR   A          ;Clear carry
        RET             ;(Notatie oke)
;------
CHKN_13 DEC  B
        AND  #DF        ;Uppercase kar.
        CP   #44        ;Letter "D" ?
        JR   Z,CHKN_14  ;Ja
        CP   #45        ;Letter "E" ?
        JR   NZ,CHKN_18 ;Nee   (fout)

;--> Wetenschappelijke notatie, letter "D" of "E" gehad
;   + of - of cijfer verlangd

CHKN_14 XOR  A
        OR   B          ;Alle karakters gehad ?
        JR   Z,CHKN_18  ;Ja   (fout)
        LD   A,(HL)     ;Haal karakter
        CP   "-"        ;Min-teken ?
        JR   Z,CHKN_15  ;Ja
        CP   "+"        ;Plus-teken ?
        JR   NZ,CHKN_16 ;Nee

;--> Letter "D" of "E"  &  "-" of "+" gehad, nog 1 of 2 cijfers verlangd

CHKN_15 INC  HL         ;Pointer +1
        DEC  B          ;Alle karakters gehad ?
        JR   Z,CHKN_18  ;Ja   (fout)

;--> Hier indien "D" of "E" gehad & wel of geen "+" of "-" teken
;    (nog 1 of 2 cijfers voor exponent verlangd)

CHKN_16 LD   A,#02
        CP   B          ;Meer dan 2 karakters over ?
        JR   C,CHKN_18  ;Ja   (fout)
CHKN_17 LD   A,(HL)
        INC  HL
        CP   #30        ;Cijfer ?
        JR   C,CHKN_18  ;Nee   (fout)
        CP   #3A        ;Cijfer ?
        JR   NC,CHKN_18 ;Nee   (fout)
        DJNZ CHKN_17
        CALL CHK_EXP    ;Check waarde exponent (Sets carry indien te groot)
        RET  NC         ;Return indien exponent oke
        LD   HL,TEXT_2  ;Txtpointer `Waarde exponent te groot'
        JR   CHKN_19

;--> Foutafhandeling

CHKN_18 LD   HL,TEXT_1  ;Txtpointer `Syntax fout'
CHKN_19 CALL MESSAGE    ;Message naar scherm
        RET
;---------------
TEXT_1  DEFB "Syntax fout in ingetypte waarde",#00
TEXT_2  DEFB "Waarde van exponent is te groot",#00
;---------------
MESSAGE NOP             ;Hier komt de routine om foutmelding naar scherm
                        ;te sturen
        RET
;-------------------------
;CHECK WAARDE VAN EXPONENT   page 0
;-------------------------
CHK_EXP DEC  HL
        LD   A,(HL)     ;Haal laatste karakter = cijfer van exponent
        SUB  #30        ;Conversie naar binair
        LD   E,A        ;Opslaan in `E'
        DEC  HL
        LD   A,(HL)     ;Haal voorlaatste karakter
        CP   #2D        ;"-" Teken ?
        JR   Z,CHK_EX2  ;Ja   (neg. exponent 1 decade)
        CP   #2B        ;"+" Teken ?
        JR   Z,CHK_EX3  ;Ja   (pos. exponent 1 decade)
        CP   #3A        ;Cijfer ?
        JR   C,CHK_EX1  ;Ja   (2 decades)
        CP   #44        ;Letter `D' ?
        JR   Z,CHK_EX3  ;Ja   (pos. exponent 1 decade)
        CP   #45        ;Letter `E' ?
        JR   Z,CHK_EX3  ;Ja   (pos. exponent 1 decade)

;--> Hier indien exponent 2 cijfers

CHK_EX1 SUB  #30        ;Conversie naar binair 1e cijfer
        LD   C,A        ;1x
        ADD  A,A        ;2x
        ADD  A,A        ;4x
        ADD  A,C        ;5x
        ADD  A,A        ;10x
        ADD  A,E        ;Waarde exponent 2 cijfers
        LD   E,A        ;Opslaan in `E'
        DEC  HL
        LD   A,(HL)
        CP   #2D        ;"-" Teken ?
        JR   NZ,CHK_EX3 ;Nee  (pos. exponent 2 decades)

;--> Hier indien neg. exponent

CHK_EX2 SET  7,E        ;Set bit 7 als merkteken `negatief'

;--> Plaats van decimale punt bepalen

CHK_EX3 EXX             ;HL' = Pointer naar string (lengte byte)
        PUSH HL
        EXX
        POP  HL         ;HL = Pointer naar string (lengte byte)
        LD   B,#00      ;Preset teller voor aantal cijfers v¢¢r de punt
        LD   C,B        ;C = #00 = teller voor aantal nullen achter de punt
CHK_EX4 INC  HL         ;Pointer naar karakter
        LD   A,(HL)     ;Haal karakter
        CP   #30        ;Een nul ?
        JR   Z,CHK_EX4  ;Ja   (negeren)
        CP   #2E        ;Punt achter nul(len) ? of 1e kar. een punt
        JR   Z,CHK_EX7  ;Ja   (Nullen achter de punt tellen)

;Hier indien 1e karakter geen nul en ook geen punt is

CHK_EX5 CP   #2E        ;Punt ?
        JR   Z,CHK_EX8  ;Ja
        CP   #44        ;Letter `D' of `E'
        JR   NC,CHK_EX8 ;Ja
        INC  B          ;Nee,   tel dan aantal cijfers v¢¢r de punt
                        ; of v¢¢r "D" of "E" indien er geen punt is
        INC  HL
        LD   A,(HL)     ;Haal karakter
        JR   CHK_EX5    ;(Check next)

;--> Nullen achter de punt tellen bij 0.0000xxxxxxx (of .0000xxxxxxxxxx)

CHK_EX6 INC  C          ;Tel aantal nullen achter de punt
CHK_EX7 INC  HL
        LD   A,(HL)
        CP   #30        ;Een nul ?
        JR   Z,CHK_EX6  ;Ja

;--> Check waarde exponent

CHK_EX8 BIT  7,E        ;Negatieve exponent ?
        JR   NZ,CHK_EX9 ;Ja
        LD   A,63       ;Max. waarde indien geen nullen achter de punt
        ADD  A,C        ;+ Aantal nullen na punt = Re‰le max. waarde exponent
        SUB  E          ;Exponent te groot ?
        RET  C          ;Ja
        XOR  A
        OR   B          ;Zijn er cijfers v¢¢r de punt ?
        RET  Z          ;Nee
        LD   A,63       ;Max. waarde indien geen cijfers v¢¢r de punt
        SUB  B          ;Minus aantal cijfers v¢¢r de punt
                        ;= re‰ele max. waarde exponent
        SUB  E          ;Exponent te groot ?
        RET             ;(Carry set indien ja,  else no carry)

;--> Check waarde negatieve exponent

CHK_EX9 RES  7,E        ;Reset markeringsbit `neg.exponent'
        LD   A,63       ;Max. waarde indien geen cijfers v¢¢r de punt
        ADD  A,B        ;Plus aantal cijfers v¢¢r de punt
                        ;= re‰ele max. waarde exponent
        SUB  E          ;Exponent te groot ?
        RET  C          ;Ja
        XOR  A
        OR   C          ;Zijn er nullen v¢¢r en achter de punt ?
        RET  Z          ;Nee
        LD   A,63       ;Max. waarde indien geen nullen achter de punt
        SUB  C          ;Re‰ele max. waarde exponent
        SUB  E          ;Exponent te groot ?
        RET             ;Carry set indien ja, else no carry
;---------------------------------------------------------------

    

Index

Vorige

Volgende