;  macroassembler-programmierung im M80 v. Microsoft f. die mikroprozessor-Systeme  Intel8048 oä.
;  ggf. macro deklaration entsprechend f. workbench, studio od. simulator abändern!
;  das bsp. zeigt, wie ein standard macro-assembler f. div. MC/uP aussehen könnte.

.XLIST
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; UMBENNEN IN } CODE8048.MAC { UND IM QUELLTEXT ANGEBEN
; IM QUELLTEXT IST DIE ANWEISUNG MIT REG. MITTELS UNTERSTRICH ZU VERBINDEN
; DER MC8-48 BEFEHLSSATZ IN MACROS (FEHLENDE BEFEHLE SIND ENTSP. ZU UMSCHREIBEN)
; WEIL DER MACRO-BERECHNER AUS (HIGH ADR)*32+12H EIN 0+12H MACHT,
; WENN ADR ALS EXT. DEFIENIERT IST, MUSS DAS GESAMTE PROGRAMM IN
; >1> MAC-FILE GESCHRIEBEN WERDEN!
; DER 8048 ADRESSIERT MIT SEINEM PC:
; AB 000H ALS 04XX
; AB 080H ALS 14XX
; AB 100H ALS 24XX
; AB 180H ALS 34XX USW.
; DER STACK BESITZT 16 BYTES = 8 EBENEN
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PORT1 EQU 1 ; 2 PORTS
PORT2 EQU 2
R0 EQU 0 ;8 REGISTER
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4
R5 EQU 5
R6 EQU 6
R7 EQU 7
; ======== FUER TASTENFELD BENOETIGT:
CLR_A MACRO ;CLEAR A
DB 27H
ENDM
CLR_C MACRO ;CLEAR CARRY
DB 97H
ENDM
CPL_A MACRO ;CPL A
DB 37H
ENDM
DEC_A MACRO ;DEC A OHNE CY-VERAENDERUNG!
DB 7
ENDM
INC_A MACRO ;INC A " " "
DB 17H
ENDM
RLC_A MACRO ;RLCA
DB 0F7H
ENDM
RRC_A MACRO ;RRCA
DB 67H
ENDM
LD_AD MACRO DATA ;LD A,DATA
DB 23H ;BSP: LD_A,85H
DB DATA
ENDM
ADD_AD MACRO DATA ;ADD A,DATA
DB 3
DB DATA
ENDM
ADD_AR MACRO REG ;ADD A,REG
DB 0D0H+REG ;BSP: ADD_AR0
ENDM
OR_AD MACRO DATA
DB 43H
DB DATA
ENDM
AND_AD MACRO DATA
DB 53H
DB DATA
ENDM
;
; REGISTER BENUTZUNG
LD_AR MACRO REG ;LD A,REG
DB 0FBH+REG ; BSP: LD_AR3
ENDM
LD_RA MACRO REG ;LD REG,A
DB 0ABH+REG ;BSP: LD_R3A
ENDM
INC_R MACRO REG ;INC REG
DB 18H+REG ;BSP: INC_R3
ENDM
DEC_R MACRO REG ;DEC REG
DB 0C8H+REG
ENDM
EX_AR MACRO REG ;EX A,REG
DB 2BH+REG ;BSP: EX_AR3
ENDM
;
;  UMGANG MIT INDIREKTER ADRESSIERUNG DES RAM-BEREICHES
;  DER BEREICH UMFASST DIE ADR 00...3FH (64 BYTES)
;  00...07H = REGISTER (ZUR FREIEN VERFUEGUNG)
;  08...18H = STACK-POINTER
;  29...3FH = RAM (ZUR FREIEN VERFUEGUNG)
;  MIT DEM INHALT VON R0 ODER R1 WIRD DIE ADR DES RAM-BYTES ANGE-
;  GEBEN. DIESER INHALT KANN SEIN 00...3FH, SOLLTE ABER NUR SEIN
;  19H...3FH
;
LD_AIR MACRO REG ;LD A,RAM
DB 80H+REG ;BSP: LD_AI R0
ENDM
LD_RIA MACRO REG ;LD_RAM,A
DB 90H+REG
ENDM
EX_AIR MACRO REG ;EX A,RAM
DB 20H+REG
ENDM
SW_AIR MACRO REG ;SWAP A, RAM
DB 30H+REG ; (NUR BIT 0...3 (-> 0...3)
ENDM
AND_A MACRO REG ;AND A., RAM
DB 50H+REG
ENDM
ADD_AIR MACRO REG
DB 60H+REG
ENDM
OR_AIR MACRO REG ;OR A, RAM
DB 40H+REG
ENDM
XOR_AIR MACRO REG ; XOR A, RAM
DB 0E0H+REG
ENDM
INC_IR MACRO REG ;INC RAM
DB 10H+REG
ENDM
;
;SUBROUTINEN:
CALLS MACRO ADR ;CALL SUBROUTINE
DB (HIGH ADR)*32+14H
DB LOW ADR
ENDM
RETS MACRO ;RET FROM SUBRDUTINE
DB 83H
ENDM
;
; SPRUENGE
JMP MACRO ADR ;ABSOLUTER SPRUNG AUCH IN ANDERE PAGES
DB (HIGH ADR) *32+4 ; BSP: JMP PHASE
DB LOW ADR
ENDM
;
;RELATIVE SPRUENGE, BEI DENEN DIE HIGH ADR DES PC STEHEN! BLEIBT ! ! !
JBIT MACRO B,ADR ;JR ON BIT,ACCU
DB B*32+12H ;BSP: JBIT BIT,PHASE
LOW ADR ; BZ. BIT EQU 4
ENDM
;
JR_C MACRO ADR ;JP C
DB 0F6H
DB LOW ADR
ENDM
JR_NC MACRO ADR ;JP NC
DB 0E6H vDB LOW ADR
ENDM
JR_Z MACRO ADR ;JP A=O
DB 0C6H
DB LOW ADR
ENDM
JR_NZ MACRO ADR ;JP A/=O
DB 96H
DB LOW ADR
ENDM
;
; DIE BEIDEN PORTS LESEN/SCHREIBEN
INPUT MACRO PORT ; IN A., (PORT)
DB 08H+PORT ; BSP: INPUT PORT2
ENDM
OUTPUT MACRO PORT ;OUT ( PORT ) , A
DB 38H+PORT
ENDM
;
; DATEN_BUS LESEN/SCHREIBEN
INBUS MACRO ;IN A., (BUS)
DB 8
ENDM
OUTBUS MACRO ;OUT (BUS),A
DB 2
ENDM
;
; DER INTERNE TIMER/COUNTER
LD_AT MACRO ;LD A,TIMER
DB 42H
ENDM
LD_TA MACRO ;LD TIMER,A
DB 62H
ENDM
STA_T MACRO ;START TIMER
DB 55H
ENDM
STA-C MACRO ;START COUNTER
DB 45H
ENDM
STP_T MACRO ;STOP TIMER/COUNTER
DB 65H
ENDM
;
; INTERRUPTS:
; INTERRUPT VOM INT-EINGANG
E_EXT MACRO ;ENABLE EXTERNEN IRQ
DB 5
ENDM
D_EXT MACRO ;DISABLE EXT.
DB 15H
ENDM
E_INT MACRO ;ENABLE INTERNEN (TIMER/CNTR) IRQ
DB 25H
ENDM
D_INT MACRO ;DISABLE INT.
DB 35H
ENDM
;---------------------------------
;
; Anweisungen (..mit einem punkt davor sind bereits als macro vorhanden)
; *= siehe Tab. 1, : = siehe Tab. 2, .= ändert Statusreg. , °= siehe Tab. 3
; ; =text, @= ind.adr.prefix(f.memory), data=8bit, F*=Flag(x),
;;ACCUMULATOR      (hex)
;.ADD A,Rr            6*  ;  value.register to accu (siehe Tab.1)
;.ADD A,@R0           60 ; data memory...
;.ADD A,@R1           61
;.ADD A,#data         03 ; value to accu
;.ADDC A,Rf           7*  ;  ... with carry to accu
;.ADDC A,@R0          70
;.ADDC A,@R1          71
;.ADDC A,#data        13    ; value with carry  to accu
;ANL A,Rr             5*      ; and register to accu
;ANL A,@R0            50      ;   ... data memory to accu
;ANL A,@R1            51
;ANL A,#data          53
;ORL A,Rr             4*    ;  or register to accu
;ORL A,@R0            40  ;  ... data memory to accu
;ORL A,@R1            41
;ORL A,#data          43   ; ...value to accu
;XRL A,Rr             D*   ; exclusive or register to accu
;XRL A,@R0            D0   ;  ... data memory to accu
;XRL A,@R1            D1
;XRL A,#data          D3  ; ...value to accu
;INC A                17  ;   value accu +1
;DEC A                07  ; value  accu -1
;CLR A                27  ; clear accu
;CPL A                37  ; complement accu
;RL A                 E7  ;  rotate accu left 
;.RLC A               F7  ;  ... with carry
;RR A                 77 ; rotate accu right
;.RRC A               67 ; ... with carry
;.DA A                57   ; decjmal adjust accu
;SWAP A               47  ; swap nibbles of accu
;
;;DATA MOVES
;MOV A,R r            F*  ; move accu to register
;MOV A,@R0            F0  ; ... data memory
;MOV A,@R1            F1
;MOV A,#data          23 ;  new value to accuv
;MOV R,A r            A*  ; move register to accu
;MOV@R0,A             A0  ; move data memory (adr. into reg.0)  to accu
;MOV@R1,A             A1
;MOV Rr ,#data        B*  ; value to reg. 
;MOV @R0,#data        B0
;MOV @R1,#data        B1
;XCH A,Rr             2*  ; exchange accu and reg.x
;XCH A,@R0            20  ; .. and data memory (adr. into reg.)
;XCH A,@R1            21
;XCHD A,@R0           30  ; exchange nibble of accu and register
;XCHD A,@R1           31
:MOV A,PSW            C7 ; move port status word  to accu
;.MOV PSW,A           D7 ; move accu to  port status word
;MOVX A,@R0           80 ; move external data memory to accu  (adr. into reg.)
;MOVX A,@R1           81
;MOVX @R0,A           90 ; move accu to external data memory (adr. into reg.)
;MOVX @R1.A           91
;MOVP3 A,@A           E3 ; move to accu from page 3
;MOVP A,@A            A3 ; move to accu from current page
;
;; REGISTER
;INC Rr               1* ;   data register +1
;DEC Rr               C* ;  data register -1
;INC @R0              10  ; data memory -1  (adr. into reg.)
;INC @R1              11
;
;;FLAGS
:.CLR C               97  ; clear carry flag
;.CPL C               A7 ; complement flag 
;CLR F0               85 ; clear flag 0
;CPL F0               95 ; complement flag 0
;CLR F1               A5
;CPL F1               B5
;
;;BRANCH
;JMP addr             °4 ; jump unconditional
;JMPP @A              B3  ; jump indirect
;DJNZ Rr,addr         E*  ; decrement register (-1) and skip
;JC addr              F6  ; jump on carry = 1 to adr.
;JNC addr             E6  ; jump on carry = 0 (no)
;JZ  addr             C6  ; jump on accu = 0 (zero)
;JNZ addr             96  ;  jump on accu = >1 (no zero)
;JT0 addr             36 ;  jump on timer 0 to adr.
;JNT0 addr            26  
;JT1 addr             56 ;  ... timer0 =1 to adr.
;JNT1addr             46  :  ..timer0 =0 to adr
;JF0 addr             B6  ;  jump on flag0=1 to adr.
;JF1 addr             76   
;JTF addr             16 ; ... timerflag to adr.
;JNI addr             86 ; jump on interupt =0 to adr.
;JB0 addr             12  ; jump on accu-bit0=1 to adr.
;JB1 addr             32
;JB2 addr             52
;JB3 addr             72
;JB4 addr             92
;JB5 addr             B2
;JB6 addf             D2
;JB7 addr             F2
;
;;TIMER
;MOV A,T              42 ;  read timer/counter
:MOV T,A              62 ; write  timer/counter
;STRT T               55 ; start timer
;STRT CNT             45 ; start counter
;STOP TCNT            65  ; stop timer/counter
;EN TCNTI             25 ;   timer counter on f. interrupt
;DIS TCNTI            35  ;   timer/counter off f. interrupt
;
;;:CONTROL
;EN I                 05 ;  interrupt on
;DIS I                15 ;  Interrupt off
;SEL RBo              C5   ; select register bank 0
;SEL RB1              D5   
;SEL MBO              E5 ; select memory bank 0
;SEL MB1              F5
;
;SUBROUTINE
;CALL addr            °4 ; go to adr
;RET                  83  ; return
;RETR                 93  ; return and restore status 
;NOP                  00  ; no operation
;
;INPUT/OUTPUT:
;IN A,P1              09 ; read port1 to accu
;OUTL P1 A            39 ; output accu to port1
;ANL P1 #data         99 ; and immediate to port
;ORL P1, #data        89 ; or immediate to port
;IN A,P2              0A
;OUT L P2, A          3A
;ANL P2, #data        9A
;ORL P2,#data         8A
;INS A, BUS           08
;OUTL BUS, A          02
;ORL BUS, #data       88
;MOVD A,Pp             0:  ; input expander port to accu
;MOVD Pp,A             3: ; output accu to expander port 
;ANLD Pp,A             9: ;and accu to expander port 
;ORLD Pp,A             8: ; or accu to expander port
;
TAB. 1. REGISTER ACCUMULATOR.
;R r 	MOV A.R 	MOV R.A 	XCH A.R 	MOV R. .DATA 	INC R 	DEC R 	DJNZ R 	ADD A.R 	ADDC A.R	 ANL A.R 	ORL A.R 	XRL A.R
;R0	F8 		A8 		28 		B8 		18 	C8 	E8	68		78 		58 		48		D8
;R1 	F9 		A9 		29 		B9 		19 	C9 	E9 	69		79 		59 		49 		D9 
;R2 	FA 		AA 		2A 		BA 		1A 	CA 	EA 	6A 		7A 		5A 		4A 		DA
;R3 	FB 		AB 		2B 		BB 		1B 	CB 	EB 	6B 		7B 		5B 		4B 		DB
;R4 	FC 		AC 		2C 		BC 		1C 	CC 	EC 	6C 		7C 		5C 		4C 		DC
;R5 	FD 		AD		2D 		BD 		1D 	CD 	ED 	6D 		7D 		5D 		4D 		DD
;R6 	FE		AE 		2E 		BE		1E 	CE 	EE 	6E 		7E 		5E 		4E 		DE
;R7 	FF 		AF 		2F 		BF 		1F 	CF 	EF 	6F 		7F 		5F 		4F 		DF
;
;TAB.2  INPUT/OUTPUT  				TAB.3 BRANCH.
;Port 		IN 	OUT	 AND 	OR 	Page 	JMP 	CALL
;BUS 		08 	02 	98	88 	0 	04 	14
;P1 		09 	39 	99 	89 	1 	24 	34
;P2 		0A 	3A 	9A 	8A 	2 	44 	54
;P4 		0C 	3C 	9C 	8C 	3 	64 	74 
;P5 		0D	30 	9D 	8D  	4 	84	94
;P6 		0E 	3E 	9E 	8E 	5 	A4 	B4
;P7 		0F 	3F 	9F 	8F	6 	C4 	D4 
;	                                        7       E4      F4

;Page: 256 bytes
;Status bit7-0 = (C)arry/ (Aux)iliary carry / Flag / (BS) Reg. Bank Select / 1 / Stackpointer bit2-0 , wobei bit7-4 im Stack abgelegt wird.
;
;Versorgung(vdd,vcc) =5V(10%)/1,5W/0-70gd.Cel./xtal(quarz)=1-6Mhz im Prog.modus 8048 (pin(ea,Vdd))= +12V/50ms
;und vgl.modus=vdd(5V),res(0V),test0(5V),ea(5V), bei 8748 ist Prog.modus (pin(ea,Vdd))= +25V/50ms
;
;pack.type=d or p (>=eingang, port(Px)+bus(DBx)=><, restl.=ausg.)
;Pin1-19=>t0(test),>xtal1,>xtal2,>no.reset,>no.ss(x.takt),>no.int,>ea,no.rd,no.psen(prog.status on),no.wr,ale(adr.ok.low),DB0,DB1,DB2,DB3;DB4,DB5,DB6,DB7(DBx=Bus.pin)
;Pin20-40=>gnd,P20,P21,P22,P23,prog,>vdd,P10,P11,P12,P13,P14,P15,P16,P17,P23,P24,P25,P26,P27(Px=Port.pin),>t1(test),>vcc
;
;--------------------------------------------------------------------------
;quelle: intel MC-48 1977
;--------------------------------------------------------------------------