012
27.04.2021, 20:40 Uhr
mwd
|
Hier mal ein Beispiel mit FORTH, weil es so schön ist. Das Modul M001 steckt dabei im Aufsatz auf Steckplatz 10h (also 16 dezimal). Muß man seinen Gegebenheiten anpassen. Mit 0 START wir der Bitmode eingestellt und alle Bits des Port A auf Ausgang. Jetzt können Werte an den Port ausgegeben werden (SET) oder auch einzelne Bits gesetzt oder gelöscht werden (BITSET BITCLR). Am Ende sind zwei Schleifen programmiert, ein Lauflicht und ein Zähler. Ähnliche Worte sind leicht zu ergänzen, womit der Spielerei keine Grenzen gesetzt sind. Die LED's sind mittels Kollektorschaltung angeschlossen (extrem großer Eingangswiderstand).
Quellcode: | CREATE 2/ HEX E1 C, ( POP HL ) 2CCB , ( SRA H ) 1DCB , ( RR L ) E5 C, ( PUSH HL ) C3 C, NEXT , ( JP NEXT ) DECIMAL SMUDGE CREATE 2* HEX E1 C, ( POP HL ) 29 C, ( ADD HL,HL) E5 C, ( PUSH HL ) C3 C, NEXT , ( JP NEXT ) DECIMAL SMUDGE : U.BIN ( N -> ) BASE @ SWAP 2 BASE ! S->D <# 2 0 DO 2 0 DO 4 0 DO # LOOP 32 HOLD LOOP 32 HOLD LOOP #> TYPE SPACE BASE ! ; CREATE WAIT ( b -> ) HEX E1 C, 7D C, C5 C, 141E , CD C, F00C , C1 C, C3 C, NEXT , DECIMAL SMUDGE
: 50MS ( N -> ) 0 DO 8 WAIT LOOP ; HEX 04 CONSTANT DWA 05 CONSTANT DWB 06 CONSTANT SWA 07 CONSTANT SWB CF CONSTANT BITMODE DECIMAL : INITPIO ( n -> ) BITMODE SWA BUSOUT SWA BUSOUT ; : GET ( -> B ) DWA BUSIN ; : SET ( B -> ) DWA BUSOUT ; : START ( n -> ) 1 16 SWITCH INITPIO ; : 2^ ( B# -> n ) -DUP 0= IF 1 ELSE 1 SWAP 0 DO 2* LOOP ENDIF ; : BITSET ( B# -> ) 2^ GET OR SET ; : BITCLR ( B# -> ) 2^ 255 XOR GET AND SET ; : L1 0 SET 2 50MS 0 BEGIN 8 MOD DUP 2^ SET 1+ 2 50MS ?TERMINAL UNTIL DROP ; : L2 0 BEGIN 256 MOD DUP SET 1+ 2 50MS ?TERMINAL UNTIL DROP ;
|
Viele Grüße, Matthias. |