source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/makefile@ 629

Last change on this file since 629 was 625, checked in by Krister Nordvall, 21 months ago

Changes:

  • Added a configuration option to let the BIOS store RamVars to an UMB when Full operating mode is enabled. This is primarily for XT class machines with RAM in the UMA (which apparently is a common thing these days).
  • Added two new builds specifically for IBM PS/2 machines. This is for support of the new McIDE adapter from the guys at zzxio.com. Note that the additional hardware specific code (under the USE_PS2 define) is for the PS/2 machines themselves and not for the McIDE adapters, so any controller in an IBM PS/2 machine can be used with the USE_PS2 define.
  • Moved pColorTheme out of the range of ROMVARS being copied over when doing "Load old settings from EEPROM" in XTIDECFG. This fixed a serious bug from r592 where loading a BIOS from file and then loading the old settings from ROM would corrupt 7 bytes of code somewhere in the loaded BIOS.
  • Optimizations (speed and size) to the library. Browsing the menus in XTIDECFG should now feel a little less sluggish.
  • Hopefully fixed a problem with the PostCommitHook script where it sometimes wouldn't find the CommitInProgress file. I say hopefully because testing this is a nightmare.
File size: 17.1 KB
Line 
1####################################################################################################
2# Makefile to build XTIDE Universal BIOS. #
3# #
4# Valid makefile targets are: #
5# all Removes existing files and builds binary files in \Build (without checksums) #
6# small Builds only binaries smaller than or equal to 8 kiB (without checksums) #
7# large Builds only binaries larger than 8 kiB (without checksums) #
8# custom Builds custom binary without checksum (change DEFINES_CUSTOM / BIOS_SIZE_CUSTOM first) #
9# clean Removes all files from \Build #
10# checksum* Same as 'all' but also applies checksums to the binaries #
11# strings* Compress src\Strings.asm to src\StringsCompressed.asm #
12# unused* Checks if there are any unused functions that can be removed to save space #
13# #
14# * at the end of target name means that Perl is required for the job. #
15# Build directory must be created manually if it does not exist. #
16# #
17# #
18# Following modules can be included or excluded: #
19# MODULE_8BIT_IDE Support for 8-BIT IDE cards like XTIDE #
20# MODULE_8BIT_IDE_ADVANCED Support for memory mapped and DMA based cards like JRIDE and XTCF #
21# MODULE_ADVANCED_ATA Native support for some VLB IDE controllers (requires USE_386) #
22# MODULE_COMPATIBLE_TABLES Support for ill behaving software that tries to access DPT directly #
23# MODULE_BOOT_MENU Boot Menu for selection of drive to boot from #
24# MODULE_EBIOS Enhanced functions for accessing drives over 8.4 GB #
25# MODULE_HOTKEYS Hotkey Bar to boot from any drive #
26# MODULE_IRQ IDE IRQ support #
27# MODULE_SERIAL Virtual hard disks using serial port #
28# MODULE_SERIAL_FLOPPY Virtual floppy drives using serial port (requires MODULE_SERIAL) #
29# MODULE_STRINGS_COMPRESSED Use compressed strings to save space #
30# MODULE_VERY_LATE_INIT Initialize on INT 13h if our INT 19h handler is not called #
31# MODULE_POWER_MANAGEMENT Power Management support #
32# MODULE_WIN9X_CMOS_HACK Hack for Windows 9x compatibility #
33# MODULE_MFM_COMPATIBILITY Restores BDA drive count for MFM/SCSI controllers that expect to be #
34# the only hard drive controller in the system #
35# #
36# Not modules but these affect the assembly: #
37# ELIMINATE_CGA_SNOW Prevents CGA snowing at the cost of a few bytes #
38# RELOCATE_INT13H_STACK ** Relocates INT 13h stack to beginning of stolen conventional memory #
39# NO_ATAID_VALIDATION *** Excludes code that tries to ensure proper communication with drives #
40# NO_ATAID_CORRECTION Excludes code that corrects illegal CHS values from some CF cards #
41# USE_086 Applies WORD alignment padding for use with 8086/V30 CPUs only #
42# USE_186 Use instructions supported by 80188/80186 and V20/V30 and later #
43# USE_286 Use instructions supported by 286 and later (defines USE_UNDOC_INTEL)#
44# USE_386 Use instructions supported by 386 and later (defines USE_286) #
45# USE_AT Use features supported on AT and later systems (not available on XT) #
46# USE_PS2 For use with IBM PS/2 machines only (defines USE_AT) #
47# USE_UNDOC_INTEL Optimizations for Intel CPUs - do NOT use on NEC V20/V30/Sony CPUs #
48# USE_NEC_V Optimizations for use with NEC V20/V30 CPUs only #
49# CLD_NEEDED Only needed for compatibility with buggy software/BIOSes #
50# EXTRA_LOOP_UNROLLING_SMALL Improves transfer speed on some CPU + IDE controller combinations #
51# EXTRA_LOOP_UNROLLING_LARGE Same as above but faster and uses more ROM space #
52# #
53# ** AT Builds only (when USE_AT is defined) #
54# *** Use this only when certain known good drives are not being detected (eg WD Caviars) #
55####################################################################################################
56
57###########################################
58# Source files and destination executable #
59###########################################
60
61# Assembly source code file (*.asm):
62SRC_ASM = Src/Main.asm
63
64# Program executable file name without extension:
65PROG = ide
66
67
68#######################################
69# Destination and include directories #
70#######################################
71
72# Directory where binary file will be compiled to
73BUILD_DIR = Build
74
75# Subdirectories where included files are:
76HEADERS = Inc/
77HEADERS += Inc/Controllers/
78HEADERS += Src/
79HEADERS += Src/Handlers/
80HEADERS += Src/Handlers/Int13h/
81HEADERS += Src/Handlers/Int13h/EBIOS/
82HEADERS += Src/Handlers/Int13h/Tools/
83HEADERS += Src/Handlers/Int19h/
84HEADERS += Src/Device/
85HEADERS += Src/Device/IDE/
86HEADERS += Src/Device/MemoryMappedIDE/
87HEADERS += Src/Device/Serial/
88HEADERS += Src/Initialization/
89HEADERS += Src/Initialization/AdvancedAta/
90HEADERS += Src/Menus/
91HEADERS += Src/Menus/BootMenu/
92HEADERS += Src/Libraries/
93HEADERS += Src/VariablesAndDPTs/
94
95# Subdirectories where library files are:
96LIBS = ../Assembly_Library/Inc/
97LIBS += ../Assembly_Library/Src/
98LIBS += ../Assembly_Library/Src/Display/
99LIBS += ../Assembly_Library/Src/File/
100LIBS += ../Assembly_Library/Src/Keyboard/
101LIBS += ../Assembly_Library/Src/Menu/
102LIBS += ../Assembly_Library/Src/Menu/Dialog/
103LIBS += ../Assembly_Library/Src/String/
104LIBS += ../Assembly_Library/Src/Time/
105LIBS += ../Assembly_Library/Src/Util/
106LIBS += ../Assembly_Library/Src/Serial/
107LIBS += ../XTIDE_Universal_BIOS/Inc/
108HEADERS += $(LIBS)
109
110
111##################################
112# Assembler preprocessor defines #
113##################################
114DEFINES_COMMON = MODULE_STRINGS_COMPRESSED MODULE_HOTKEYS MODULE_8BIT_IDE MODULE_EBIOS MODULE_SERIAL MODULE_SERIAL_FLOPPY MODULE_POWER_MANAGEMENT NO_ATAID_VALIDATION CLD_NEEDED EXTRA_LOOP_UNROLLING_SMALL
115DEFINES_COMMON_LARGE = MODULE_BOOT_MENU MODULE_8BIT_IDE_ADVANCED MODULE_COMPATIBLE_TABLES EXTRA_LOOP_UNROLLING_LARGE
116
117DEFINES_XT = $(DEFINES_COMMON) ELIMINATE_CGA_SNOW MODULE_8BIT_IDE_ADVANCED
118DEFINES_XTPLUS = $(DEFINES_XT) USE_186
119DEFINES_AT = $(DEFINES_COMMON) USE_AT USE_286 MODULE_IRQ MODULE_COMPATIBLE_TABLES
120DEFINES_386 = $(DEFINES_AT) USE_386 MODULE_ADVANCED_ATA MODULE_WIN9X_CMOS_HACK
121DEFINES_PS2 = USE_PS2 USE_286 MODULE_STRINGS_COMPRESSED MODULE_HOTKEYS MODULE_BOOT_MENU MODULE_EBIOS MODULE_SERIAL MODULE_SERIAL_FLOPPY MODULE_IRQ MODULE_POWER_MANAGEMENT NO_ATAID_VALIDATION CLD_NEEDED
122
123DEFINES_XT_LARGE = $(DEFINES_XT) $(DEFINES_COMMON_LARGE)
124DEFINES_XTPLUS_LARGE = $(DEFINES_XTPLUS) $(DEFINES_COMMON_LARGE)
125DEFINES_AT_LARGE = $(DEFINES_AT) $(DEFINES_COMMON_LARGE)
126DEFINES_386_LARGE = $(DEFINES_386) $(DEFINES_COMMON_LARGE)
127DEFINES_PS2_LARGE = $(DEFINES_PS2) MODULE_COMPATIBLE_TABLES
128
129DEFINES_XT_TINY = MODULE_STRINGS_COMPRESSED MODULE_8BIT_IDE NO_ATAID_VALIDATION NO_ATAID_CORRECTION CLD_NEEDED
130
131DEFINES_CUSTOM = ?
132
133
134###################
135# Other variables #
136###################
137
138# Target size of the BIOS, used in Main.asm for number of 512B blocks (CNT_ROM_BLOCKS) and by checksum Perl script below ('make checksum').
139# Note! The size must be a multiple of 2 KB for compatibility reasons.
140BIOS_SIZE_TINY = 4096
141BIOS_SIZE_SMALL = 8192
142BIOS_SIZE_LARGE = 12288
143BIOS_SIZE_CUSTOM = ?
144
145# Add -D in front of every preprocessor define declaration
146DEFS_XT = $(DEFINES_XT:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_SMALL)
147DEFS_XTPLUS = $(DEFINES_XTPLUS:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_SMALL)
148DEFS_AT = $(DEFINES_AT:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_SMALL)
149DEFS_386 = $(DEFINES_386:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_SMALL)
150DEFS_PS2 = $(DEFINES_PS2:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_SMALL)
151DEFS_XT_LARGE = $(DEFINES_XT_LARGE:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_LARGE)
152DEFS_XTPLUS_LARGE = $(DEFINES_XTPLUS_LARGE:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_LARGE)
153DEFS_AT_LARGE = $(DEFINES_AT_LARGE:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_LARGE)
154DEFS_386_LARGE = $(DEFINES_386_LARGE:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_LARGE)
155DEFS_PS2_LARGE = $(DEFINES_PS2_LARGE:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_LARGE)
156DEFS_XT_TINY = $(DEFINES_XT_TINY:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_TINY)
157DEFS_CUSTOM = $(DEFINES_CUSTOM:%=-D%) -DBIOS_SIZE=$(BIOS_SIZE_CUSTOM)
158
159# Add -I in front of all header directories
160IHEADERS = $(HEADERS:%=-I%)
161
162# Path + target file to be built
163TARGET = $(BUILD_DIR)/$(PROG)
164
165
166#########################
167# Compilers and linkers #
168#########################
169
170# Make
171MAKE = mingw32-make.exe
172
173# Assembler
174AS = nasm.exe
175
176# use this command to erase files.
177RM = -del /Q
178
179
180#############################
181# Compiler and linker flags #
182#############################
183
184# Assembly compiler flags
185ASFLAGS = -f bin # Produce binary object files
186ASFLAGS += $(IHEADERS) # Set header file directory paths
187ASFLAGS += -Worphan-labels # Warn about labels without colon
188ASFLAGS += -Ox # Optimize operands to their shortest forms
189
190
191############################################
192# Build process. Actual work is done here. #
193############################################
194
195all: clean small large
196 @echo All done!
197
198small: xt_tiny xt xtplus at 386 ps2
199 @echo All small binaries built!
200
201large: xt_large xtplus_large at_large 386_large ps2_large
202 @echo All large binaries built!
203
204ps2:
205 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_PS2) -l"$(TARGET)_ps2.lst" -o"$(TARGET)_ps2.bin"
206 @echo * Small PS/2 version "$(TARGET)_ps2.bin" built.
207
208ps2_large:
209 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_PS2_LARGE) -l"$(TARGET)_ps2l.lst" -o"$(TARGET)_ps2l.bin"
210 @echo * Large PS/2 version "$(TARGET)_ps2l.bin" built.
211
212386:
213 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_386) -l"$(TARGET)_386.lst" -o"$(TARGET)_386.bin"
214 @echo * Small 386 version "$(TARGET)_386.bin" built.
215
216386_large:
217 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_386_LARGE) -l"$(TARGET)_386l.lst" -o"$(TARGET)_386l.bin"
218 @echo * Large 386 version "$(TARGET)_386l.bin" built.
219
220at:
221 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_AT) -l"$(TARGET)_at.lst" -o"$(TARGET)_at.bin"
222 @echo * Small AT version "$(TARGET)_at.bin" built.
223
224at_large:
225 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_AT_LARGE) -l"$(TARGET)_atl.lst" -o"$(TARGET)_atl.bin"
226 @echo * Large AT version "$(TARGET)_atl.bin" built.
227
228xtplus:
229 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XTPLUS) -l"$(TARGET)_xtp.lst" -o"$(TARGET)_xtp.bin"
230 @echo * Small XT Plus version "$(TARGET)_xtp.bin" built.
231
232xtplus_large:
233 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XTPLUS_LARGE) -l"$(TARGET)_xtpl.lst" -o"$(TARGET)_xtpl.bin"
234 @echo * Large XT Plus version "$(TARGET)_xtpl.bin" built.
235
236xt:
237 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XT) -l"$(TARGET)_xt.lst" -o"$(TARGET)_xt.bin"
238 @echo * Small XT version "$(TARGET)_xt.bin" built.
239
240xt_large:
241 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XT_LARGE) -l"$(TARGET)_xtl.lst" -o"$(TARGET)_xtl.bin"
242 @echo * Large XT version "$(TARGET)_xtl.bin" built.
243
244xt_tiny:
245 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XT_TINY) -l"$(TARGET)_tiny.lst" -o"$(TARGET)_tiny.bin"
246 @echo * Tiny XT version "$(TARGET)_tiny.bin" built.
247
248custom:
249 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_CUSTOM) -l"$(TARGET)_cstm.lst" -o"$(TARGET)_cstm.bin"
250 @echo * Custom version "$(TARGET)_cstm.bin" built.
251
252strings: src\Strings.asm
253 @$(AS) src\Strings.asm $(ASFLAGS) $(DEFS_AT_LARGE) -DCHECK_FOR_UNUSED_ENTRYPOINTS -DMODULE_STRINGS_COMPRESSED_PRECOMPRESS -o build\Strings.bin -l build\StringsPrecompress.lst
254 @perl ..\Tools\StringsCompress.pl < build\StringsPrecompress.lst > src\StringsCompressed.asm
255 @echo StringsCompressed.asm updated!
256
257clean:
258 @$(RM) $(BUILD_DIR)\*.*
259 @echo Deleted "(*.*)" from "$(BUILD_DIR)/"
260
261checksum: all
262 @perl ..\Tools\checksum.pl $(TARGET)_tiny.bin $(BIOS_SIZE_TINY)
263 @perl ..\Tools\checksum.pl $(TARGET)_xt.bin $(BIOS_SIZE_SMALL)
264 @perl ..\Tools\checksum.pl $(TARGET)_xtp.bin $(BIOS_SIZE_SMALL)
265 @perl ..\Tools\checksum.pl $(TARGET)_at.bin $(BIOS_SIZE_SMALL)
266 @perl ..\Tools\checksum.pl $(TARGET)_386.bin $(BIOS_SIZE_SMALL)
267 @perl ..\Tools\checksum.pl $(TARGET)_ps2.bin $(BIOS_SIZE_SMALL)
268 @perl ..\Tools\checksum.pl $(TARGET)_xtl.bin $(BIOS_SIZE_LARGE)
269 @perl ..\Tools\checksum.pl $(TARGET)_xtpl.bin $(BIOS_SIZE_LARGE)
270 @perl ..\Tools\checksum.pl $(TARGET)_atl.bin $(BIOS_SIZE_LARGE)
271 @perl ..\Tools\checksum.pl $(TARGET)_386l.bin $(BIOS_SIZE_LARGE)
272 @perl ..\Tools\checksum.pl $(TARGET)_ps2l.bin $(BIOS_SIZE_LARGE)
273
274unused:
275 @echo "XT Tiny"
276 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XT_TINY) -o"$(TARGET)_unused_tiny.asm" -l"$(TARGET)_unused_tiny.lst"
277 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XT_TINY) -o"$(TARGET)_unused_tiny.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
278 @perl ..\Tools\unused.pl $(TARGET)_unused_tiny.lst $(TARGET)_unused_tiny.asm
279 @echo "XT Small"
280 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XT) -o"$(TARGET)_unused_xt.asm" -l"$(TARGET)_unused_xt.lst"
281 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XT) -o"$(TARGET)_unused_xt.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
282 @perl ..\Tools\unused.pl $(TARGET)_unused_xt.lst $(TARGET)_unused_xt.asm
283 @echo "XT Large"
284 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XT_LARGE) -o"$(TARGET)_unused_xtl.asm" -l"$(TARGET)_unused_xtl.lst"
285 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XT_LARGE) -o"$(TARGET)_unused_xtl.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
286 @perl ..\Tools\unused.pl $(TARGET)_unused_xtl.lst $(TARGET)_unused_xtl.asm
287 @echo "XT Plus Small"
288 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XTPLUS) -o"$(TARGET)_unused_xtp.asm" -l"$(TARGET)_unused_xtp.lst"
289 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XTPLUS) -o"$(TARGET)_unused_xtp.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
290 @perl ..\Tools\unused.pl $(TARGET)_unused_xtp.lst $(TARGET)_unused_xtp.asm
291 @echo "XT Plus Large"
292 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XTPLUS_LARGE) -o"$(TARGET)_unused_xtpl.asm" -l"$(TARGET)_unused_xtpl.lst"
293 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_XTPLUS_LARGE) -o"$(TARGET)_unused_xtpl.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
294 @perl ..\Tools\unused.pl $(TARGET)_unused_xtpl.lst $(TARGET)_unused_xtpl.asm
295 @echo "AT Small"
296 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_AT) -o"$(TARGET)_unused_at.asm" -l"$(TARGET)_unused_at.lst"
297 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_AT) -o"$(TARGET)_unused_at.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
298 @perl ..\Tools\unused.pl $(TARGET)_unused_at.lst $(TARGET)_unused_at.asm
299 @echo "AT Large"
300 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_AT_LARGE) -o"$(TARGET)_unused_atl.asm" -l"$(TARGET)_unused_atl.lst"
301 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_AT_LARGE) -o"$(TARGET)_unused_atl.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
302 @perl ..\Tools\unused.pl $(TARGET)_unused_atl.lst $(TARGET)_unused_atl.asm
303 @echo "386 Small"
304 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_386) -o"$(TARGET)_unused_386.asm" -l"$(TARGET)_unused_386.lst"
305 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_386) -o"$(TARGET)_unused_386.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
306 @perl ..\Tools\unused.pl $(TARGET)_unused_386.lst $(TARGET)_unused_386.asm
307 @echo "386 Large"
308 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_386_LARGE) -o"$(TARGET)_unused_386l.asm" -l"$(TARGET)_unused_386l.lst"
309 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_386_LARGE) -o"$(TARGET)_unused_386l.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
310 @perl ..\Tools\unused.pl $(TARGET)_unused_386l.lst $(TARGET)_unused_386l.asm
311 @echo "PS/2 Small"
312 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_PS2) -o"$(TARGET)_unused_ps2.asm" -l"$(TARGET)_unused_ps2.lst"
313 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_PS2) -o"$(TARGET)_unused_ps2.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
314 @perl ..\Tools\unused.pl $(TARGET)_unused_ps2.lst $(TARGET)_unused_ps2.asm
315 @echo "PS/2 Large"
316 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_PS2_LARGE) -o"$(TARGET)_unused_ps2l.asm" -l"$(TARGET)_unused_ps2l.lst"
317 @$(AS) "$(SRC_ASM)" $(ASFLAGS) $(DEFS_PS2_LARGE) -o"$(TARGET)_unused_ps2l.asm" -E -DCHECK_FOR_UNUSED_ENTRYPOINTS
318 @perl ..\Tools\unused.pl $(TARGET)_unused_ps2l.lst $(TARGET)_unused_ps2l.asm
319
Note: See TracBrowser for help on using the repository browser.