Intel 4004 Microprocessor Assembler
kod źródłowy: program wynikowy:


listing: $000 kod szesnastkowy:




Co to jest assembler as4004?
Assembler as4004 jest bardzo prostym 2-przebiegowym asemblerem mikroprocesora Intel 4004. Pełny kod tego oprogramowania jest całkowicie napisany w języku JavaScript, więc powinien być w stanie wykonać na dowolnej platformie za pomocą przeglądarki internetowej i zaimplementowanego interpretera JavaScript.

Funkcje Assemblera as4004

Uruchamianie asemblera as4004

Szybki start
Ta część opisu jest przeznaczona dla tych, którzy chcą zobaczyć asembler as4004 w akcji. To może być łatwe do zrealizowania. W ramce poniżej znajduje się prosty przykład programu mikroprocesorowego Intel 4004 - dodawanie dwóch liczb 4-bitowych. Instrukcja FIM służy do inicjalizacji pary rejestrów R0=2 i R1=A. Program ładuje następnie R0 do akumulatora, dodaje zawartość R1 do akumulatora, a następnie używa instrukcji XCH do wymiany wartości R1 i akumulatora, które przechowuje wynik dodawania w R1. Następnie program wprowadza pętlę bez końca, zapisaną jako instrukcja JUN (skok bezwarunkowy), która przeskakuje na własny adres. Wystarczy skopiować ten kod i wkleić go do panelu „kod źródłowy”. Następnie kliknij przycisk „wygeneruj kod”. Jeśli wszystko pójdzie dobrze w panelu „kod obiektu”, powinien pojawić się kod wyniku w formacie HEX.

; dodaj dwie 4-bitowe liczby na Intel 4004
;
	FIM P0, $A2	; zainicjuj: R0=2 R1=A
	LD R0		; załadować R0 do akumulatora
	ADD R1		; dodaj R1 do akumulatora
	XCH R1		; i przechowaj w R1

DONE
	JUN DONE	; niekończąca się pętla jako koniec programu
	


Składnia Assembler
Instrukcje są mnemonikami, po których następuje (opcjonalny) modyfikator:
	KOD OP		MODYFIKATORY 
	-------		---------
	OPC		brak
	OPC D		dane
	OPC R		rejestr
	OPC RX		para rejestrów
	OPC R, AA	rejestr, adres
	OPC P, DD	rejestru para , dane
	OPC C, AA	warunek, adres
	OPC AAA		adres

    Gdzie 

	D   to 4-bitowe dane
	R   jest adresem rejestru
	P   to adres rejestru pary
	AA  to adres 8-bitowy
	AAA to adres 12-bitowy
	C   to warunek
	
  	[0-9] 	.... 	dziesietny
   	$[0-F] 	.... 	hex
  	%[01] 	.... 	binarny
  	0[0-7] 	.... 	ósemkowy
	
Identyfikatory muszą zaczynać się od litery [AZ] i zawierać litery, cyfry i znak podkreślenia [AZ, 0-9, _]. Tylko 6 pierwszych znaków jest znaczących. Wszystkie identyfikatory, liczby, kody operacyjne i pragmy nie uwzględniają wielkości liter i są tłumaczone na wielkie litery. Identyfikatory nie mogą być takie same jak prawidłowe kody. Specjalny identyfikator „*” odnosi się do licznika programu (PC).
  Przykłady:
    * = $100	    ....   Ustaw adres początkowy (PC) na $100 .
    LABEL1  LD R5   ....   Zdefiniuj LABEL1 z adresem instrukcji LD.
         JUN LABEL2 ....   Przejdź do adresu etykiety LABEL2.
    STORE = $080    ....   Zdefiniuj 'PRZECHOWANIE' o wartości $080 .
    HERE = *	    ....   Zdefiniuj 'TUTAJ' z aktualnym adresem (PC).
    HERE2	    ....   Zdefiniuj HERE2 z aktualnym adresem (PC).
	
Pragmy zaczynają się od kropki (.) I muszą być jedynym wyrażeniem w wierszu:
    .BYTE BB 	.... 	Podaj 8-bitowy bajt przy aktualnym adresie do kodu..
    .END 	.... 	Koniec źródła, zatrzymaj montaż. (znak '$' to opcja)
 
  ; komentarz 	.... 	Dowolna sekwencja znaków zaczynająca się od średnika
			do końca linii są ignorowane.
Asembler nie potrzebuje żadnego specjalnego formatowania z następującym wykluczeniem: - między etykietą a opkodem i dowolnymi operandami musi być biała spacja.
Dozwolona jest tylko jedna instrukcja na linię.


Przykład kodu
Ten przykładowy kod pochodzi z „MCS-4 Micro Computer Set” - Intel Corporation 1973.
Przykład wykonuje logiczną „i” funkcję na danych w dwóch 4-bitowych portach wejściowych ROM i wyświetla wynik na porcie wyjściowym RAM. Ten program pokazuje, jak i4004 uzyskuje dostęp do swoich portów wyjściowych i wejściowych. Pokazuje również kilka podstawowych instrukcji (np. natychmiastowe załadowanie), podprogramy, skoki itp.

; czterobitowa procedura „AND” na Intel 4004
;
START	FIM 4P, 0	; łADUJ ROM PORT 0 ADRES
	SRC 4P		; WYŚLIJ ADRES PORTU ROM
	RDR		; CZYTAJ WEJŚCIE A
	XCH 0		; A DO REJESTRU 0
	INC 8		; łADUJ ROM PORT 1 ADRES
	SRC 4P		; WYŚLIJ ADRES PORTU ROM
	RDR		; CZYTAJ WEJŚCIE B
	XCH 1		; B DO REJESTRU 1
	JMS AND		; WYKONAJ "AND"
	XCH 2		; WYNIK łADOWANIA C
	WMP		; ZACHOWAJ W PORCIE PAMIĘCI 0
	JUN START	; RESTART
	NOP
*=104
;			'PODPROGRAM' "AND"
AND	CLB		; CZYŚĆ AKUMULATOR I 'PRZENIESIENIE'
	XCH 2		; CZYŚĆ REJESTR 2
	LDM 4		; łADUJ PĘTLA LICZ (LC)
AND_3	XCH 0		; ZAłADUJ A, LC DO REJESTRU 0
	RAR		; OBRÓĆ NAJMNIEJ ZNACZĄCY BII DO PRZENIESIENIA
	XCH 0		; POWRÓT OBRÓCONY A DO REG 0, LC DO ACC
	JCN CZ, ROTR1	; SKOK DO ROTR1 JEŚLI PRZENIESIENIE ZERO
	XCH 1		; ZAłADUJ B, LC DO AKUMULATORA
	RAR		; OBRÓĆ NAJMNIEJ ZNACZĄCY BIT DO PRZENIESIENIA
	XCH 1		; POWRÓT OBRACANY B DO REG 1, LC DO ACC
ROTR2	XCH 2		; ZAłADUJ REZULTAT CZĘŚCIOWY C, LC DO REG 2
	RAR		; OBRÓĆ PRZENIEŚ DO CZĘŚCIOWEGO REZULTATU MSB
	XCH 2		; ZAłADUJ LC, POWRÓT C DO REJESTRU 2
	DAC		; ZMNIEJSZENIE AKUMULATORA (LC)
	JCN ANZ, AND_3	; PĘTLA JEŻELI LC NIE ZERO
	BBL 0		; POWRÓT
ROTR1	XCH 1		; ZAłADUJ B, LC DO REJESTRU 1
	RAR		; OBRÓĆ B
	XCH 1		; POWRÓT OBRACANY B DO REG 1, LC DO ACC
	CLC		; CZYŚĆ PRZENIESIENIE
	JUN ROTR2	; POWRÓT DO PĘTLI
CZ=10
ANZ=12
$
 



Tekst oryginalny: http://e4004.szyc.org/