mirror of
https://github.com/Ed94/bare_x86.git
synced 2024-09-19 20:57:33 -07:00
162 lines
2.5 KiB
ArmAsm
162 lines
2.5 KiB
ArmAsm
%ifndef AAL_routines_Def
|
|
|
|
%include "AAL.x86.S"
|
|
|
|
|
|
;=============================================================================================================
|
|
; Routines
|
|
;=============================================================================================================
|
|
|
|
out_Dump:
|
|
; Args:
|
|
; BX = StartLocation
|
|
; CX = ByteCount
|
|
%define StartLocation BX
|
|
%define ByteCount DX
|
|
push BX
|
|
push SI
|
|
xor SI, SI
|
|
|
|
.loop:
|
|
cmp SI, ByteCount
|
|
je .break
|
|
|
|
|
|
push BX
|
|
push DX
|
|
push SI
|
|
mov AX, StartLocation
|
|
add AX, SI
|
|
Hex16_ToString AX, .HexStr
|
|
String_Out .HexStr, 4
|
|
pop SI
|
|
pop DX
|
|
pop BX
|
|
Char_Out ' '
|
|
|
|
; Get next set of byte, organize to big endian.
|
|
mov AH, [StartLocation + SI]
|
|
add SI, 1
|
|
mov AL, [StartLocation + SI]
|
|
mov [.HexNum], AX
|
|
|
|
push BX
|
|
push DX
|
|
push SI
|
|
Hex16_ToString [.HexNum], .HexStr
|
|
String_Out .HexStr, 4
|
|
pop SI
|
|
pop DX
|
|
pop BX
|
|
Char_Out ' '
|
|
|
|
mov AH, BIOS_Wait
|
|
mov CX, 0x02
|
|
int SystemService
|
|
|
|
inc SI
|
|
jmp .loop
|
|
|
|
.break:
|
|
pop SI
|
|
pop BX
|
|
ret
|
|
|
|
.HexNum : dw 0x0000
|
|
.HexStr : dw ' '
|
|
%undef StartLocation
|
|
%undef ByteCount
|
|
|
|
|
|
; Prints out a 16-bit hex value.
|
|
h16_toString:
|
|
; Arg - DX : Hex Num
|
|
; ArgStr: String
|
|
%define argStr BP + 6
|
|
push BX
|
|
push BP
|
|
mov BP, SP
|
|
|
|
; Half-Byte index
|
|
push SI
|
|
xor SI, SI
|
|
|
|
.loop:
|
|
; If all 4-bit slots translate, break
|
|
cmp SI, 4
|
|
je .break
|
|
|
|
; Get latest half-byte from DX
|
|
mov AX, DX
|
|
; Doing only the first right-most digit
|
|
and AX, 0x000F
|
|
; Get ASCII numeral or alpha character
|
|
add AL, 0x30
|
|
; 0->9 (<= 0x39), A->F (>= 0x39)
|
|
cmp AL, 0x39 ; Numeral offset
|
|
jle .SetCharVal
|
|
add AL, 0x7 ; A-F offset
|
|
|
|
.SetCharVal:
|
|
; Add the char value to the string
|
|
mov BX, [argStr]
|
|
; Move to last half-byte
|
|
add BX, 3
|
|
; Go to the current half-byte via index offset
|
|
sub BX, SI
|
|
; Write ascii hex value to half-byte in ArgStr
|
|
mov [BX], AL
|
|
; Rotate the next half-byte over
|
|
ror DX, 4
|
|
|
|
inc SI
|
|
jmp .loop
|
|
|
|
.break:
|
|
pop SI
|
|
pop BP
|
|
pop BX
|
|
%undef argStr
|
|
ret
|
|
|
|
|
|
; Print out an ascii string of speicifed length
|
|
out_string:
|
|
; Arg - BX: String
|
|
%define argLen BP + 4 ; String Length
|
|
; Store previous state of BP and set it to SP
|
|
; pusha ; 14 bytes
|
|
push BP ; 4 bytes
|
|
mov BP, SP
|
|
; Using the source index
|
|
push SI ; 0 bytes...
|
|
xor SI, SI
|
|
|
|
; Backup BX for later
|
|
mov CX, BX
|
|
mov AH, Video_TeleType
|
|
|
|
.loop:
|
|
; Bounds check
|
|
cmp SI, [argLen]
|
|
je .break
|
|
|
|
; Output a character
|
|
mov BX, CX
|
|
mov AL, [BX + SI]
|
|
xor BH, BH ; Clear BH for correct active page
|
|
int VideoService
|
|
|
|
add SI, 0x1
|
|
jmp .loop
|
|
|
|
.break:
|
|
pop SI
|
|
pop BP
|
|
%undef argLen
|
|
ret
|
|
|
|
|
|
%define AAL_routines_Def
|
|
%endif
|