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