home *** CD-ROM | disk | FTP | other *** search
- ( *** NAXOS System-Vocabulary Version 1.0 *** )
-
- ( Name: string.fth )
- ( Version: 1.0 )
- ( Datum: 9.9.88 )
- ( Autor: Volker Everts )
- ( Neu 2.6.91 )
-
- include kern
-
- ( *********************** )
- ( ***** STRING.FTH: ***** )
- ( *********************** )
-
-
-
- ( ** Such- und Vergleichsbefehle ** )
-
- : .$=. ( str1:- => -:- ) ( f )
- ( str => str )
- ( ** Stringvergleich im Codesegment ** )
- ( f := .T. wenn Strings gleich )
- ( f := .F. wenn counts ungleich )
- ( oder Strings ungleich )
- [ $51 ] ( push cx )
- [ $87 $F2 ] ( xchg si,dx )
- [ $89 $DF ] ( mov di,bx )
- [ $8C $C8 ] ( mov ax,cs )
- [ $8E $C0 ] ( mov es,ax )
- [ $8A $0C ] ( mov cl,[si] )
- [ $30 $ED ] ( xor ch,ch )
- [ $A6 ] ( cmpsb )
- [ $75 $0F ] ( jnz ex )
- [ $F8 ] ( clc )
- [ $D0 $D9 ] ( rcr cl,1 )
- [ $73 $03 ] ( jnc rep )
- [ $4E ] ( dec si )
- [ $4F ] ( dec di )
- [ $41 ] ( inc cx )
- [ $F3 $A7 ] ( rep cmpsw )
- [ $75 $03 ] ( jnz ex )
- [ $F9 ] ( stc )
- [ $EB $01 ] ( jmp 1 )
- [ $F8 ] ( ex: clc )
- [ $89 $D6 ] ( mov si,dx )
- [ $59 ] ( pop cx )
- ;
-
- : .^$=. ( ptr1:- => -:- ) ( f )
- ( ptr => ptr )
- ( ** Stringvergleich im Farmemory ** )
- ( f := .T. wenn gleich )
- ( f := .F. wenn counts ungleich )
- ( oder Strings ungleich )
- [ $51 ] ( push cx )
- [ $1E ] ( push ds )
- [ $56 ] ( push si )
- [ $89 $D7 ] ( mov di,dx )
- [ $C4 $3D ] ( les di,[di] )
- [ $C5 $37 ] ( lds si,[bx] )
- [ $8A $0C ] ( mov cl,[si] )
- [ $30 $ED ] ( xor ch,ch )
- [ $A6 ] ( cmpsb )
- [ $75 $0F ] ( jnz ex )
- [ $F8 ] ( clc )
- [ $D0 $D9 ] ( rcr cl,1 )
- [ $73 $03 ] ( jnc rep )
- [ $4E ] ( dec si )
- [ $4F ] ( dec di )
- [ $41 ] ( inc cx )
- [ $F3 $A7 ] ( rep cmpsw )
- [ $75 $03 ] ( jnz ex )
- [ $F9 ] ( stc )
- [ $EB $01 ] ( jmp 1 )
- [ $F8 ] ( clc )
- [ $89 $D6 ] ( mov si,dx )
- [ $5E ] ( pop si )
- [ $1F ] ( pop ds )
- [ $59 ] ( pop cx )
- ;
-
-
- proc ^.search. ( str:len => -:- ) ( f )
- ( ptr => ptr' )
- ( ** Patternsearch über Pointer ** )
- ( ** Patterlänge und Muster in str ** )
- ( ** Suche nach Übereinstimmung ** )
- ( ** ab seg:adr in ptr ** )
- ( ** Suchlänge len ** )
- ( ** f := .T. : Muster gefunden ** )
- ( ** ptr zeigt auf gefundene Adresse ** )
- ( ** f := .F. : kein Muster gefunden ** )
- ( ** ptr enthält ptr + len ** )
- ( ** ptr vorher besser normalisieren ** )
-
- [ $51 ] ( push cx ) ( retten )
- [ $89 $C1 ] ( mov cx,ax ) ( len )
- [ $87 $F2 ] ( xchg si,dx )
- [ $C4 $3F ] ( les di,[bx] ) ( es:di pointer )
- [ $8B $04 ] ( mov ax,[si] ) ( char,count )
- [ $46 ] ( inc si )
- [ $86 $C4 ] ( xchg al,ah ) ( count,char )
- [ $F2 $AE ] ( LO: repnz scasb ) ( Suche )
- [ $E8 $0E $00 ] ( call Vg ) ( Vergleich )
- [ $72 $05 ] ( jc EX +1 ) ( gleich )
- [ $E3 $02 ] ( jcxz EX ) ( len abgelaufen )
- [ $EB $F5 ] ( jmp LO ) ( weiter )
- [ $F8 ] ( EX: clc )
- [ $4F ] ( dec di )
- [ $89 $3F ] ( mov [bx],di ) ( Pointer setzen )
- [ $89 $D6 ] ( mov si,dx )
- [ $59 ] ( pop cx )
- [ $C3 ] ( Ret )
- ( ** Vergleichssubroutine ** )
- ( cf set if equal )
- [ $51 ] ( VG: push cx ) ( retten )
- [ $57 ] ( push di ) ( retten )
- [ $56 ] ( push si )
- [ $4F ] ( dec di )
- [ $B5 $00 ] ( mov ch,0 ) ( cx auf count )
- [ $88 $E1 ] ( mov cl,ah )
- [ $F3 $A6 ] ( repz cmpb ) ( String gleich? )
- [ $F8 ] ( clc ) ( flag false )
- [ $75 $01 ] ( jnz $1 ) ( ungleich )
- [ $F9 ] ( stc ) ( Flag true )
- [ $5E ] ( $1: pop si )
- [ $5F ] ( pop di )
- [ $59 ] ( pop cx )
- ;
-
-
- : ^.scan. ( len:c => -:- )( f )
- ( ptr => ptr )
- ( ** Suche c über Pointer ** )
- ( ** Suchlänge len ** )
- ( f:= .T. wenn gefunden )
- ( ptr zeigt auf adr c )
- ( f:= .F. wenn nicht gefunden )
- ( ptr := len ptr +! )
-
- [ $87 $CA ] ( xchg cx,dx ) ( cx retten )
- [ $C4 $3F ] ( les di,[bx] ) ( es:di laden )
- [ $F2 $AE ] ( repnz scasb ) ( scan )
- [ $F8 ] ( clc ) ( flag false )
- [ $75 $01 ] ( jnz +1 )
- [ $F9 ] ( stc ) ( true )
- [ $4F ] ( dec di ) ( adr korrigieren )
- [ $89 $3F ] ( mov [bx],di ) ( ptr setzen )
- [ $89 $D1 ] ( mov cx,dx )
- ;
-
- : .scan. ( len:c => ?:? )( f )
- ( adr => adr' )
- ( ** Suche c ab adr bis adr+len-1 ** )
- ( ** adr':= adr von c ** )
- ( ** oder adr':= adr+len-1 ** )
- [ $51 ] ( push cx ) ( cx retten )
- [ $89 $D1 ] ( mov cx,dx ) ( len setzen )
- [ $8C $CA ] ( mov dx,cs ) ( cs holen )
- [ $8E $C2 ] ( mov es,dx ) ( es setzen )
- [ $89 $DF ] ( mov di,bx ) ( di laden )
- [ $F2 $AE ] ( repnz scasb ) ( scan )
- [ $F8 ] ( clc ) ( flag false )
- [ $75 $01 ] ( jnz +1 )
- [ $F9 ] ( stc ) ( true )
- [ $4F ] ( dec di ) ( adr korrigieren )
- [ $89 $FB ] ( mov bx,di ) ( adr setzen )
- [ $59 ] ( pop cx )
- ;
-
- : .orscan. ( len:chcl => -:c )( f )
- ( adr => adr' )
- ( ** Suche ch or cl ab adr bis adr+len ** )
- ( ** adr' ist Suchende ** )
- ( ** f:= .T. wenn gefunden ** )
- ( ** c := ch oder cl ** )
- ( ** f:= .F. wenn nichts gefunden ** )
- [ $51 ] ( push cx ) ( rette cx )
- [ $89 $D1 ] ( mov cx,dx )
- [ $4B ] ( dec bx )
- [ $43 ] ( lo: inc bx )
- [ $8A $17 ] ( mov dl,[bx] ) ( scan )
- [ $38 $D0 ] ( cmp al,dl )
- [ $74 $0B ] ( jz cl ) ( cl gefunden )
- [ $38 $D4 ] ( cmp ah,dl )
- [ $74 $05 ] ( jz ch ) ( ch gefunden )
- [ $E2 $F3 ] ( loop lo ) ( loop )
- [ $F8 ] ( clc ) ( flag false )
- [ $EB $03 ] ( jmp ex )
- [ $88 $E0 ] ( ch: mov al,ah )
- [ $F9 ] ( cl: stc ) ( flag true )
- [ $59 ] ( ex: pop cx ) ( cx restore )
- [ $B4 $00 ] ( mov ah,0 )
- ;
-
- : ^replace ( len:chcl => )
- ( ptr => ptr )
- ( ** ersetze alle cl durch ch ** )
- ( ** Adressbereich ptr und len ** )
- [ $87 $CA ] ( xchg cx,dx )
- [ $41 ] ( inc cx )
- [ $C4 $3F ] ( les di,[bx] ) ( es:di )
- [ $F2 $AE ] ( lo: repne scasb ) ( suche c2 )
- [ $E3 $06 ] ( jcxz ex ) ( nichts gefunden )
- [ $26 $88 $65 $FF ] ( mov es:[di-1],ah ) ( ersetze d. ch )
- [ $EB $F6 ] ( jmp lo ) ( weitersuchen )
- [ $89 $D1 ] ( ex: mov cx,dx )
- ;
-
- : .$pos. ( -:c => -:pos ) ( f )
- ( str => str )
- ( ** 1. Position von c im String ** )
- ( ** f := .T. wenn c gefunden ** )
- [ $51 ] ( push cx )
- [ $8A $0F ] ( mov cl,[bx] )
- [ $30 $ED ] ( xor ch,ch )
- [ $8C $CA ] ( mov dx,cs )
- [ $8E $C2 ] ( mov es,dx )
- [ $89 $DF ] ( mov di,bx )
- [ $47 ] ( inc di )
- [ $F2 $AE ] ( repnz scasb )
- [ $B1 $00 ] ( mov cl,0 )
- [ $75 $01 ] ( jnz + 1 )
- [ $41 ] ( inc cx )
- [ $89 $F8 ] ( mov ax,di )
- [ $29 $D8 ] ( sub ax,bx )
- [ $D1 $E9 ] ( shr cl,1 ) ( CF setzen )
- 1-
- [ $59 ] ( pop cx )
- ;
-
-
-
- ( ** String-Parse-Befehle ** )
-
- ( ** Variable für Separierfunktionen ** )
- var nextscan word ( Suchstartadr ) ;
- var found$ word ( Found$adr ) ;
-
-
- : -trailing ( -:- => ?:- )
- ( str -- str ) ( TX )
- ( ** Endende Leerzeichen abschneiden ** )
- ( ** Count in str wird angepasst ** )
- [ $8A $17 ] ( MOV DL,[BX] )
- [ $30 $F6 ] ( XOR DH,DH )
- [ $89 $DF ] ( MOV DI,DX )
- [ $01 $D7 ] ( ADD DI,DX )
- [ $47 ] ( INC DI )
- ( LOOP: )
- [ $4F ] ( DEC DI )
- [ $8A $15 ] ( MOV DL,[DI] )
- [ $80 $FA $20 ] ( CMP DL,20 )
- [ $76 $F8 ] ( JNA LOOP )
- [ $89 $FA ] ( MOV DX,DI )
- [ $29 $DA ] ( SUB DX,BX )
- [ $88 $17 ] ( MOV [BX],DL )
- ;
-
-
- : .nextword. ( -:start => str:next )( f )
- ( => str )
- ( ** Separiere nächstes Wort ** )
- ( ** Entferne führende Separatoren ** )
- ( ** Separator = Zeichen < 33 ** )
- ( ** f:= .F. wenn Separator= 0 ** )
- ( ** f:= .T. wenn gültiges Wort ** )
- ( ** str ist gültige Stringadresse ** )
- [ $89 $C3 ] ( mov bx,ax )
- [ $4B ] ( dec bx )
- [ $43 ] ( L0: inc bx )
- [ $8A $07 ] ( mov al,[bx] )
- [ $3C $00 ] ( cmp al,0 )
- [ $F8 ] ( clc )
- [ $74 $18 ] ( jz ; )
- [ $3C $20 ] ( cmp al,20 )
- [ $76 $F4 ] ( jna L0 )
- [ $4B ] ( dec bx )
- [ $89 $DF ] ( mov di,bx )
- [ $B4 $FF ] ( mov ah,FF )
- [ $47 ] ( L1: inc di )
- [ $FE $C4 ] ( inc ah )
- [ $80 $3D $20 ] ( cmp [di],20 )
- [ $77 $F8 ] ( ja L1 )
- [ $F9 ] ( stc )
- [ $88 $27 ] ( mov [bx],ah )
- [ $89 $F8 ] ( mov ax,di )
- [ $89 $DA ] ( mov dx,bx )
- ;
-
- : .parse. ( => ?:? )( f )
- ( => ? )
- ( ** Separiere Wort ab nextscan ** )
- ( ** Wortseparator Zeichen 0 - 32 ** )
- ( ** Terminator Zeichen 0 ** )
- ( ** f := 0 bei Terminator ** )
- ( ** gefundenes Wort in found$ ** )
- ( ** nextscan neu gesetzt ** )
- nextscan @ .nextword. bx>dx
- found$ dx>! nextscan !
- ;
-
-
-
- ( ** Allgemeine Stringbefehle ** )
-
-
- : clr$ ( => )
- ( str => str )
- ( ** Leerstring erzeugen ** )
- 0 c!
- ;
-
- : len ( => -:c )
- ( str => str )
- ( ** Stringlänge ** )
- c@
- ;
-
-
- : $. ( => ?:? )
- ( str => )
- ( ** String drucken ** )
- count type
- ;
-
-
- : .$>d. ( => d )( f )
- ( str => )
- ( ** String in Doppelzahl wandeln ** )
- ( ** f:=0 wenn erfolglos ** )
- .number.
- ;
-
-
- : $>dos ( => ?:? )
- ( str => ? )
- ( ** counted-String inplace in ASCIIZ-String wandeln ** )
- c@ >bx+ bx+ 0 c!
- ;
-
- : dos>$ ( => ?:? )
- ( str => str )
- ( ** ASCIIZ-string inplace in counted-String wandeln ** )
- 255 c! 0 .$pos. 1- c!
- ;
-
- : ucase ( -:- => ?:? )( TX )
- ( str => str )
- ( ** Ändere a-z in place auf A-Z ** )
- [ $51 ] ( push cx )
- [ $8C $CA ] ( mov dx,cs )
- [ $8E $C2 ] ( mov es,dx )
- [ $89 $F2 ] ( mov dx,si )
- [ $8A $0F ] ( mov cl,[bx] )
- [ $30 $ED ] ( xor ch,ch )
- [ $89 $DE ] ( mov si,bx )
- [ $46 ] ( inc si )
- [ $89 $F7 ] ( mov di,si )
- [ $AC ] ( uc: lodsb )
- [ $3C $61 ] ( cmp al,'a' )
- [ $72 $06 ] ( jb no )
- [ $3C $7A ] ( cmp al,'z' )
- [ $77 $02 ] ( ja no )
- [ $2C $20 ] ( sub al,20 )
- [ $AA ] ( no: stosb )
- [ $E2 $F2 ] ( loop uc )
- [ $89 $D6 ] ( mov si,dx )
- [ $59 ] ( pop cx )
- ;
-
-
-
- ( ** Stringbefehle für den PAD-Bereich ** )
-
-
- : $$. ( => ?:? )
- ( => ? )
- ( ** Drucke PAD-String ** )
- pad count .0=.
- if ." leer!" else type
- endif
- ;
-
- : >$$ ( => ?:? )
- ( str => ? )
- ( ** String nach PAD kopieren ** )
- bx>tx pad bx>dx tx>bx c@ 2+ cmove
- ;
-
- : $$> ( => ?:? )
- ( str => ? )
- ( ** PAD-String in Stringvariable speichern ** )
- ( ** Der String wird abgeschnitten, wenn die ** )
- ( ** Variable nicht genug Platz bietet ** )
- bx>r bx- ( Adresse speichern )
- c@>dx pad c@ ( Längen holen )
- min ( neue aktuelle Länge )
- >r c! ( in pad eintragen )
- pad r> 1+ ( Quelle, Länge )
- r>dx cmove ( String kopieren )
- ;
-
- : $$+ ( => )
- ( str => )
- ( ** String aus str an String in PAD anhängen )
- bx>r count >r >dx ( Länge, Adr sichern )
- pad c@ >tx + c! ( Neue Padlänge )
- pad tx> 1+ bx>+ >dx r> 1+ ( Ziel, Quelle )
- r>bx bx+ cmove ( String kopieren )
- ;
-
- : n>$$ ( -:n => ?:? )
- ( => ? )
- ( ** einfache Zahl in String wandeln ** )
- ( ** String liegt in PAD ** )
- n>d ( doppeltgenaue Zahl erzeugen )
- [ $8E $C2 ] ( Vorzeichen-Byte )
- dabs ( Absolutwert )
- <# # #s ( Zahlenstring erzeugen )
- sign #> ( Vorzeichen )
- bx- c! ( Count-Byte ablegen )
- >$$ ( String nach PAD bringen )
- ;
-
- : left$$ ( -:n => ?:? )
- ( => ? )
- ( ** n linke Zeichen von PAD ** )
- >dx
- pad c@ min ( neue Länge )
- c! ( eintragen )
- $>dos ( 0-Byte )
- ;
-
- : right$$ ( -:n => ?:? )
- ( => ? )
- ( ** die n letzten Zeichen von PAD ** )
- >dx
- pad c@ push min >tx ( Länge festlegen )
- c! >dx pop ( speichern )
- - .0>.
- if
- bx+ bx>dx ( Ziel )
- >bx+ ( Quelle )
- tx> 1+ cmove ( kopieren )
- endif
- ;
-
-
- : mid$$ ( n pos => )
- ( ** n Zeichen von PAD ab pos ** )
- dxpush
- >dx
- pad c@ - 1+ , 0 max
- right$$
- pop
- left$$
- ;
-
-
- dictionary
-
- : main ." Hallo NAXOS-String"
- 0 halt"
- ;
-