wok diff runcom/stuff/debug8086.S @ rev 11674

add runcom
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Feb 18 09:00:05 2012 +0100 (2012-02-18)
parents
children f32d3ba00836
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/runcom/stuff/debug8086.S	Sat Feb 18 09:00:05 2012 +0100
     1.3 @@ -0,0 +1,477 @@
     1.4 +// Usage:
     1.5 +//
     1.6 +// f DX:CX                 load one CHS sector to 0000:7C00
     1.7 +// t                       trace one step
     1.8 +// g <address>             go to adrs
     1.9 +// d <address>             display 16 bytes, CR for next 16 bytes...
    1.10 +// e <address> <words>...  enter memory byte/word/dword
    1.11 +// m <segment>             self move
    1.12 +// + <segment>             default segment offset
    1.13 +//
    1.14 +// Example:
    1.15 +// m 0FC0                  move debugger to 0FC0:0000 0FC0:01FF
    1.16 +// f 1			   read floppy boot sector to 0000:7C00
    1.17 +// f 80 1		   read hard disk master boot sector to 0000:7C00
    1.18 +// g 7C0E		   ...
    1.19 +
    1.20 +#define ADJESDI		16 bytes	add segment overflow support for e and d
    1.21 +#define ASCIIDUMP	20 bytes	display hexa and ascii datas
    1.22 +#define INPUTBUFFER	 2 bytes	overload init code with a 32+ bytes input buffer
    1.23 +//#define CPU186       -26 bytes	80186+ CPU
    1.24 +
    1.25 +.macro pusham
    1.26 +	pushw	%ax
    1.27 +	pushw	%cx
    1.28 +	pushw	%dx
    1.29 +	pushw	%bx
    1.30 +	movw	%sp, %bx
    1.31 +	leaw	14(%bx), %bx	# adjust SP with [FLAGS CS IP AX CX DX BX] size
    1.32 +	pushw	%bx	# %sp
    1.33 +	pushw	%bp
    1.34 +	pushw	%si
    1.35 +	pushw	%di
    1.36 +.endm
    1.37 +
    1.38 +.macro popam
    1.39 +	popw	%di
    1.40 +	popw	%si
    1.41 +	popw	%bp
    1.42 +	popw	%ax	# %sp
    1.43 +	popw	%bx
    1.44 +	popw	%dx
    1.45 +	popw	%cx
    1.46 +	popw	%ax
    1.47 +.endm
    1.48 +
    1.49 +#ifdef INPUTBUFFER
    1.50 +//#define ABS(x)		(x-(setvectors-_start))
    1.51 +#define ABS(x)		(x-30)
    1.52 +#else
    1.53 +#define ABS(x)		(x)
    1.54 +#endif
    1.55 +
    1.56 +#define SEGREGSZ	6
    1.57 +#define REGSZ	16
    1.58 +#define USER_SP		REGSZ+SEGREGSZ-10(%bp)
    1.59 +#define USER_FLAGS	REGSZ+SEGREGSZ+4(%bp)
    1.60 +#define USER_FLAGS_HIGH	REGSZ+SEGREGSZ+5(%bp)
    1.61 +#define USER_IP		REGSZ+SEGREGSZ(%bp)
    1.62 +#define USER_CS		REGSZ+SEGREGSZ+2(%bp)
    1.63 +#define USER_CSIP	REGSZ+SEGREGSZ(%bp)
    1.64 +
    1.65 +.macro initcode
    1.66 +	movw	$0x0FC0, %di	# move (and jump) to 0FC0:0000
    1.67 +	subw	$_startz-_start, USER_IP
    1.68 +	movw	USER_IP, %ax
    1.69 +#ifdef CPU186
    1.70 +	cld			# ensure movsb will work
    1.71 +	shrw	$4, %ax		# _start MUST be aligned on paragraph
    1.72 +#else
    1.73 +	movb	$4, %cl
    1.74 +	shrw	%cl, %ax	# _start MUST be aligned on paragraph
    1.75 +#endif
    1.76 +	addw	USER_CS, %ax	# normalize %cs to have _start=0
    1.77 +	movw	%ax, %ds
    1.78 +.endm
    1.79 +	.text
    1.80 +	.code16
    1.81 +#ifdef CPU186
    1.82 +	.arch	i186
    1.83 +#else
    1.84 +	.arch	i8086
    1.85 +#endif
    1.86 +	.org	0
    1.87 +
    1.88 +	.globl	_start
    1.89 +_start:
    1.90 +	pushf
    1.91 +	pushw	%cs
    1.92 +	stc
    1.93 +	call	init		# the start code will be overwritten by the input buffer
    1.94 +_startz:
    1.95 +
    1.96 +#ifdef INPUTBUFFER
    1.97 +isinit:
    1.98 +	initcode
    1.99 +	movw	$setvectors, %si
   1.100 +	jmp	moveself
   1.101 +#endif
   1.102 +
   1.103 +setvectors:
   1.104 +	xorw	%si, %si	# set interrupt vectors in 0 segment
   1.105 +	movw	%si, %ds
   1.106 +	movb	$0xF9, %ch	# skip nmi
   1.107 +hooklp:				# interrupts: 0=div0 1=step 2=nmi 3=brk 4=ov 5=bound 6=invalid
   1.108 +	movw	$ABS(dbgstart), (%si)	# set %cs:dbgstart
   1.109 +	lodsw			# %si += 2
   1.110 +	movw	%cs, (%si)	# to interrupt vector
   1.111 +skiphook:
   1.112 +	lodsw			# %si += 2
   1.113 +	shrb	$1,%ch
   1.114 +	jnc	skiphook
   1.115 +	jnz	hooklp		# note %cx will be cleared: SP will be untouched
   1.116 +#ifdef CPU186
   1.117 +	decw	(3-7)*4(%si)	# update int3 vector
   1.118 +#else
   1.119 +	movb	$ABS(int3), (3-7)*4(%si)	# update int3 vector
   1.120 +#endif
   1.121 +	jmp	dbgstartz	# registers are already pushed by startup code
   1.122 +
   1.123 +regs:
   1.124 +	.ascii	"ss"
   1.125 +	.ascii	"es"
   1.126 +	.ascii	"ds"  
   1.127 +	.ascii	"di"  
   1.128 +	.ascii	"si"  
   1.129 +	.ascii	"bp"  
   1.130 +	.ascii	"sp"  
   1.131 +	.ascii	"bx"  
   1.132 +	.ascii	"dx"  
   1.133 +	.ascii	"cx"  
   1.134 +	.ascii	"ax"  
   1.135 +	.ascii	"ip"  
   1.136 +	.ascii	"cs"  
   1.137 +# Bit   Label    Desciption
   1.138 +# ---------------------------
   1.139 +# 0      CF      Carry flag
   1.140 +# 2      PF      Parity flag
   1.141 +# 4      AF      Auxiliary carry flag
   1.142 +# 6      ZF      Zero flag
   1.143 +# 7      SF      Sign flag
   1.144 +# 8      TF      Trap flag
   1.145 +# 9      IF      Interrupt enable flag
   1.146 +# 10     DF      Direction flag
   1.147 +# 11     OF      Overflow flag
   1.148 +	.ascii	"oditsz?a?p c="	# flags bits
   1.149 +
   1.150 +int3:
   1.151 +#ifdef CPU186
   1.152 +	.byte	0x68		# push $0x086A	OV UP DI NT PL ZR - NA - PO - NC
   1.153 +# interrupt entry point: the registers [FLAGS CS IP] are already pushed
   1.154 +dbgstart:
   1.155 +	.byte	0x6A, 0x08	# push $0x08	NV UP DI NT PL NZ - NA - PO - NC
   1.156 +	popf
   1.157 +init:
   1.158 +	pushaw		#    [FLAGS CS IP] AX CX DX BX SP BP SI DI [DS ES SS]
   1.159 +#else
   1.160 +	stc
   1.161 +	.byte	0x73		# jnc
   1.162 +# interrupt entry point: the registers [FLAGS CS IP] are already pushed
   1.163 +dbgstart:
   1.164 +	clc
   1.165 +	pushw	%ax
   1.166 +	sbbw	%ax,%ax		# copy CF to SF
   1.167 +	clc
   1.168 +	popw	%ax
   1.169 +init:
   1.170 +	cld			# ensure movsb will work
   1.171 +	pusham		#    [FLAGS CS IP] AX CX DX BX SP BP SI DI [DS ES SS]
   1.172 +#endif
   1.173 +	pushw	%ds
   1.174 +	pushw	%es
   1.175 +	pushw	%ss
   1.176 +	movw	%sp, %bp
   1.177 +#ifdef CPU186
   1.178 +	pushf
   1.179 +	addw	$6, USER_SP	# adjust SP with [FLAGS CS IP] size
   1.180 +	popf
   1.181 +#endif
   1.182 +	jc	isinit
   1.183 +	jns	notint3
   1.184 +	decw	USER_IP
   1.185 +	lesw	USER_CSIP, %di
   1.186 +#define OPCODE_BRK     0xCC
   1.187 +	.byte	0xB0		# movb $IM, %al
   1.188 +break:
   1.189 +	.byte	0xCC
   1.190 +	stosb
   1.191 +notint3:
   1.192 +dbgstartz:
   1.193 +dbgregslp:
   1.194 +	call	getcmd
   1.195 +	.byte	0x81, 0xC3	# addw	$0, %bx
   1.196 +offset_value:
   1.197 +	.word	0
   1.198 +	movw	%bx, %es
   1.199 +	xchgw	%ax, %di
   1.200 +	subb	$'m', %al
   1.201 +	jne	isinotmove
   1.202 +#ifdef INPUTBUFFER
   1.203 +ismove:
   1.204 +	xchgw	%ax, %si
   1.205 +moveself:
   1.206 +#else
   1.207 +isinit:
   1.208 +	jmp	ismove
   1.209 +	initcode
   1.210 +ismove:
   1.211 +#endif
   1.212 +	movw	%di, %es	# move code to %di:0
   1.213 +	pushw	%di
   1.214 +#ifdef INPUTBUFFER
   1.215 +	xorw	%di, %di	# and jmp into (%di:setvectors) with retf
   1.216 +#else
   1.217 +	movw	$setvectors, %di	# and jmp into (%di:setvectors) with retf
   1.218 +	movw	%di, %si
   1.219 +#endif
   1.220 +	movw	$_end-setvectors, %cx
   1.221 +	pushw	%di
   1.222 +	rep	movsb
   1.223 +	retf
   1.224 +
   1.225 +isinotmove:
   1.226 +	subb	$'+'-'m', %al
   1.227 +	jne	not_offset
   1.228 +	movw	%di, ABS(offset_value)
   1.229 +not_offset:
   1.230 +	orb	$1, USER_FLAGS_HIGH	# set TF
   1.231 +	subb	$'t'-'+', %al
   1.232 +	je	done
   1.233 +	subb	$'d'-'t', %al
   1.234 +	xchgw	%ax, %cx
   1.235 +	jcxz	dump		# 'd' ?
   1.236 +	loop	noenter		# 'e' ?
   1.237 +nextval:
   1.238 +	call	getval
   1.239 +	jcxz	dbgregslp
   1.240 +	xchgb	%dl, %dh
   1.241 +mextmsb:
   1.242 +	stosb
   1.243 +	xchgw	%ax, %dx
   1.244 +	xchgb	%al, %dh
   1.245 +#ifdef ADJESDI
   1.246 +	call	adjustESDI
   1.247 +#endif
   1.248 +	decw	%cx
   1.249 +	loopne	mextmsb
   1.250 +	jmp	nextval
   1.251 +noenter:
   1.252 +	loop	not_floppy_load	# f DX:CX ?
   1.253 +	movw	%es, %dx
   1.254 +	movw	%cx, %es
   1.255 +	movw	%di, %cx
   1.256 +	movw	$0x0201, %ax
   1.257 +	movw	$0x7C00, %bx
   1.258 +	pushw	%bx
   1.259 +	int	$0x13
   1.260 +	popw	%di
   1.261 +godbgregslpifc:	
   1.262 +	jc	dbgregslp
   1.263 +dump:
   1.264 +	movw	%es, %ax
   1.265 +	call	putax
   1.266 +	movw	%di, %ax
   1.267 +	call	putax
   1.268 +	movw	$16, %cx
   1.269 +dhex:
   1.270 +	movb	%es:(%di), %ah
   1.271 +#ifdef ASCIIDUMP
   1.272 +	movb	%ah, (%si)
   1.273 +	incw	%si
   1.274 +#endif
   1.275 +#ifdef ADJESDI
   1.276 +	call	incESDI
   1.277 +#else
   1.278 +	incw	%di
   1.279 +#endif
   1.280 +	movb	$0x01, %dh	# the data has 2 digits
   1.281 +	call	putx
   1.282 +	loop	dhex
   1.283 +#ifdef ASCIIDUMP
   1.284 +	movb	$16, %cl
   1.285 +	subw	%cx, %si
   1.286 +dascii:
   1.287 +	lodsb
   1.288 +	cmpb	$0x7F, %al
   1.289 +	jnc	skipascii
   1.290 +	cmpb	$0x20, %al
   1.291 +	cmc
   1.292 +skipascii:
   1.293 +	call	dbgputcbit
   1.294 +	loop	dascii
   1.295 +#endif
   1.296 +	call	dbgputcr
   1.297 +	int	$0x16
   1.298 +	cmpb	$13, %al
   1.299 +	je	dump
   1.300 +notdump:
   1.301 +not_floppy_load:
   1.302 +	stc
   1.303 +	loop	godbgregslpifc	# g ?
   1.304 +isgo:
   1.305 +	andb	$0xfe, USER_FLAGS_HIGH	# clear TF
   1.306 +	xchgw	%ax, %cx
   1.307 +	jcxz	done
   1.308 +setbreak:
   1.309 +	movb	$OPCODE_BRK, %al
   1.310 +	xchgb	%al, %es:(%di)
   1.311 +	movb	%al, ABS(break)
   1.312 +done:
   1.313 +	popw	%ax  	# %ss
   1.314 +	popw	%es
   1.315 +	popw	%ds
   1.316 +#ifdef CPU186
   1.317 +	popaw
   1.318 +#else
   1.319 +	popam
   1.320 +#endif
   1.321 +	iret
   1.322 +
   1.323 +#ifdef ADJESDI
   1.324 +adjustESDI:
   1.325 +	decw	%di
   1.326 +incESDI:
   1.327 +	incw	%di
   1.328 +	jnz	esok
   1.329 +	pushw	%es
   1.330 +	addb	$0x10,-3(%bp)
   1.331 +	popw	%es
   1.332 +esok:
   1.333 +	ret
   1.334 +#endif
   1.335 +
   1.336 +putreg:
   1.337 +	call	dbgput2c
   1.338 +	movb	$'=', %al
   1.339 +	call	dbgputc
   1.340 +putr16:
   1.341 +#	movw	_start-ABS(regs)-2(%bp,%si), %ax
   1.342 +	.byte	0x8b, 0x42, _start-ABS(regs)-2
   1.343 +putax:
   1.344 +	movb	$0x07, %dh	# the data has 4 digits
   1.345 +putx:
   1.346 +putxlp:  
   1.347 +#ifdef CPU186
   1.348 +	rolw	$4, %ax
   1.349 +#else
   1.350 +	pushw	%cx
   1.351 +	movb	$4, %cl
   1.352 +	rolw	%cl, %ax
   1.353 +	popw	%cx
   1.354 +#endif
   1.355 +	pushw	%ax
   1.356 +	andb	$0xf, %al
   1.357 +	addb	$0x90, %al
   1.358 +	daa
   1.359 +	adcb	$0x40, %al
   1.360 +	daa
   1.361 +	call	dbgputc
   1.362 +	popw	%ax
   1.363 +	shrb	$1, %dh
   1.364 +	jc	putxlp
   1.365 +dbgputcbit:
   1.366 +	jc	dbgputc  
   1.367 +	mov	$0x20, %al
   1.368 +dbgputc:
   1.369 +	movw	$7, %bx
   1.370 +	mov	$0xE, %ah
   1.371 +	int	$0x10
   1.372 +	xchgw	%ax, %bx
   1.373 +	ret
   1.374 +
   1.375 +getline:
   1.376 +	movw	$ABS(regs), %si
   1.377 +	movw	$13, %cx
   1.378 +regslp:
   1.379 +	call	putreg		# display register name and value
   1.380 +	loop	regslp
   1.381 +	movw	USER_FLAGS, %dx
   1.382 +	pushw	%si
   1.383 +	movb	$13, %cl
   1.384 +	stc			# add trailing =
   1.385 +	rcrw	%cl, %dx
   1.386 +nextbit:
   1.387 +	lodsb
   1.388 +	shlw	$1, %dx
   1.389 +	call	dbgputcbit	# display active flags bits
   1.390 +	loop	nextbit
   1.391 +	popw	%si
   1.392 +	movb	$8, %cl
   1.393 +stacklp:
   1.394 +	lodsw			# si += 2
   1.395 +	call	putr16		# display flags and the beginning of the stack
   1.396 +	loop	stacklp
   1.397 +	call	dbgputcr
   1.398 +getlinebs:
   1.399 +	cmpw	$ABS(buffer), %si
   1.400 +	je	getc
   1.401 +	decw	%si
   1.402 +getlinelp:
   1.403 +	call	dbgputc
   1.404 +getc:
   1.405 +	int	$0x16
   1.406 +	cmpb	$8, %al
   1.407 +	je	getlinebs
   1.408 +	orb	$0x20, %al
   1.409 +	movb	%al, (%si)
   1.410 +	inc	%si
   1.411 +	cmpb	$0x2D, %al
   1.412 +	jne	getlinelp
   1.413 +dbgputcr:
   1.414 +	movw	$ABS(crlf), %si
   1.415 +dbgput2c:
   1.416 +	call	dbgput1c
   1.417 +dbgput1c:
   1.418 +	lodsb
   1.419 +	jmp	dbgputc
   1.420 +
   1.421 +getcmd:
   1.422 +	pushw	%cs
   1.423 +	popw	%ds
   1.424 +	call	getline
   1.425 +	lodsb
   1.426 +	xchgw	%ax, %di
   1.427 +# get value in DX:AX, BX is segment CX is digits count.
   1.428 +getval:
   1.429 +	xorw	%bx, %bx
   1.430 +	xorw	%cx, %cx
   1.431 +getvalz:
   1.432 +	pushw	%bx			# save segment
   1.433 +	xorw	%bx, %bx
   1.434 +	mul	%bx			# clear %dx:%ax
   1.435 +	decw	%cx
   1.436 +isx:
   1.437 +	incw	%cx
   1.438 +	orb	$0xE0, %dh
   1.439 +getvalbit:
   1.440 +	shlw	$1, %bx
   1.441 +	rclw	$1, %dx
   1.442 +	jc	getvalbit
   1.443 +	orb	%al, %bl
   1.444 +gotspc:
   1.445 +	lodsb
   1.446 +	cmpb	$0x20, %al		# space ?
   1.447 +	jne	notspc
   1.448 +	jcxz	gotspc
   1.449 +notspc:
   1.450 +	sub	$'0', %al
   1.451 +	cmpb	$10, %al		# in 0..9 ?
   1.452 +	jb	isx
   1.453 +	sub	$'a'-'0'-10, %al
   1.454 +	cmpb	$16, %al		# in a..f ?
   1.455 +	jb	isx
   1.456 +	cmpb	$':'-'a'+10, %al
   1.457 +	popw	%ax
   1.458 +	je	getvalz			# store segment in %bx
   1.459 +	xchgw	%ax, %bx
   1.460 +	pushw	%dx
   1.461 +#ifdef CPU186
   1.462 +	shlw	$12, %dx
   1.463 +#else
   1.464 +	pushw	%cx
   1.465 +	movb	$12, %cl
   1.466 +	shlw	%cl, %dx
   1.467 +	popw	%cx
   1.468 +#endif
   1.469 +	addw	%dx, %bx
   1.470 +	popw	%dx
   1.471 +	ret
   1.472 +
   1.473 +crlf:
   1.474 +	.byte	13,10
   1.475 +_end:
   1.476 +buffer:
   1.477 +
   1.478 +	.org	510
   1.479 +	.byte	0x55, 0xAA
   1.480 +