
|
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
;---------------------------------------------------------------
|