Prosze bardzo (polecam zbior IOMAC.LIB zawierajacy caly blok WE/WY w postaci makr, to jest wycinake zawierajacy kilka makr pomocniczych i makro XIO:
(etykiety systemowe sa wczesniej inkludowane za zbioru SYSEQU)
; MACRO: @CH
;
; Loads IOCB number (parameter 1) into X register.
;
; If parameter value is 0 to 7, immediate channel number
; is assumed.
;
; If parameter value is > 7 then a memory location
; is assumed to contain the channel number.
;
.MACRO @CH
.IF %1>7
LDA %1
ASL A
ASL A
ASL A
ASL A
TAX
.ELSE
LDX #%1*16
.ENDIF
.ENDM
;
;
; MACRO: @CV
;
; Loads Constant or Value into accumultor (A-register)
;
; If value of parameter 1 is 0-255, @CV
; assumes it's an (immediate) constant.
;
; Otherwise the value is assumed to
; be a memory location (non-zero page).
;
;
;
.MACRO @CV
.IF %1<256
LDA #%1
.ELSE
LDA %1
.ENDIF
.ENDM
;
;
;
;
; MACRO: @FL
;
; @FL is used to establish a filespec (file name)
;
; If a literal string is passed, @FL will
; generate the string in line, jump
; around it, and place its address
; in the IOCB pointed to by the X-register.
;
; If a non-zero page label is passed
; the MACRO assumes it to be the label
; of a valid filespec and uses it instead.
;
;
;
.MACRO @FL
.IF %1<256
JMP *+%1+4
@F .BYTE %$1,0
LDA # <@F
STA ICBADR,X
LDA # >@F
STA ICBADR+1,X
.ELSE
LDA # <%1
STA ICBADR,X
LDA # >%1
STA ICBADR+1,X
.ENDIF
.ENDM
.PAGE " XIO macro"
;
; MACRO: XIO
;
; FORM: XIO cmd,ch[,aux1,aux2][,filespec]
;
; ch is given as in the @CH macro
; cmd, aux1, aux2 are given as in the @CV macro
; filespec is given as in the @FL macro
;
; performs familiar XIO operations with/for OS/A+
;
; If aux1 is given, aux2 must also be given
; If aux1 and aux2 are omitted, they are set to zero
; If the filespec is omitted, "S:" is assumed
;
.MACRO XIO
.IF %0<2 .OR %0>5
.ERROR "XIO: wrong number of arguments"
.ELSE
@CH %2
@CV %1
STA ICCOM,X ; COMMAND
.IF %0>=4
@CV %3
STA ICAUX1,X
@CV %4
STA ICAUX2,X
.ELSE
LDA #0
STA ICAUX1,X
STA ICAUX2,X
.ENDIF
.IF %0=2 .OR %0=4
@FL "S:"
.ELSE
@@IO .= %0
@FL %$(@@IO)
.ENDIF
JSR CIO
.ENDIF
.ENDM
I jeszcze jedno z makr stosowanych przeze mnie i Pirxa:
;-------------------------------------
.MACRO MOVE.L
; MOVE.L source_addr,dest_addr,length
; Moves 'length' bytes long block of bytes
; beginning from 'source_addr' to 'dest_addr'
; The macro tries to create the optimal code for given data
; CAUTION! Blocks shouldn't overlap! Macro is self-modyfying!
.IF %3<$0100
LDX #%3-1
@MC LDA %1,X
STA %2,X
DEX
.IF %3>$7F
CPX #$FF
BNE @MC
.ELSE
BPL @MC
.ENDIF
.ENDIF
.IF %3&$FF<>$00
.IF %3>$0100
LDA #$00
STA ?LI
STA ?LI+1
?MO LDA %1
?MO1 STA %2
INC ?MO+1
BNE ?MO2
INC ?MO+2
?MO2 INC ?MO1+1
BNE ?MO3
INC ?MO1+2
?MO3 INC ?LI
BNE ?MO4
INC ?LI+1
?MO4 LDA ?LI+1
CMP # >%3
BNE ?MO
LDA ?LI
CMP # <%3
BNE ?MO
;lda #0
;sta ?LI
;sta ?LI+1
BEQ ?MO5
?LI .WORD 0
?MO5
.ENDIF
.ELSE
LDX # >%3
LDY #$00
?MO LDA %1,Y
?MO1 STA %2,Y
INY
BNE ?MO
INC ?MO+2
INC ?MO1+2
DEX
BNE ?MO
.ENDIF
.ENDM
No to jeszcze takie malenstwo, a jak przydatne:
; adds %1 to %2 and saves result in %3
; if there is no %3, result goes to %2
.MACRO ADD.W
CLC
LDA %2
ADC %1
.IF %0=3
STA %3
.ELSE
STA %2
.ENDIF
LDA %2+1
ADC %1+1
.IF %0=3
STA %3+1
.ELSE
STA %2+1
.ENDIF
.ENDM
(etykiety zaczynajace sie od ? sa etykietami lokalnymi makra, a nazwy zaczynajace sie od @ sa makrami pomocniczymi w wiekszym bloku makr - np. zestaw procedor we/wy)
Zwroc uwage na kompilacje warunkowa i generowanie roznego kodu w zaleznosci od parametrow. Piszesz sobie zestaw takich makr (jak chcesz podesle wieksze zbiory) i zapominasz o typowych konstrukcjach kodu, bo nie musisz juz o nich pamietac, wplatane sa w kod w miare potrzeby jako makra wlasnie.....
Prosze mi pokazac inny, tak elastyczny assembler!!
A TU znajduje sie instrukcja do MAC65 a takze OMC - czyli odpowiednik MAC65 na PC.
Bla bla bla bla, bla bla bla. Bla bla bla - bla - bla. Blabla bleee.