summaryrefslogtreecommitdiff
path: root/stdio.asm
blob: 2e61afce0f7c6de5f60932f63bae0d847c732c29 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
%ifndef _STDIO_ASM
%define _STDIO_ASM

%include "console.asm"

puts:
	; Write string buffer at cursor position
	push bp
	mov bp, sp
	pusha

	mov si, [bp + 4]	; address of string buffer
	mov bx, 0000h		;
	mov ah, 0eh		; BIOS - teletype

.loop:
	lodsb			; load byte at [si] into al
	or al, 0		; 0 | 0 = 0 (detect null terminator)
	je .end
	call putc
	jmp .loop
.end:
	popa
	mov sp, bp
	pop bp
	ret


printi:
    push bp
    mov bp, sp

    mov ax, [bp + 4]    ; integer WORD
    mov cx, 0          ; counter
    cmp ax, 0
    je .write_no_pop

.divide:
    xor dx, dx
    mov di, 10          ; divisor
    div di

    push dx
    inc cx
    cmp ax, 0
    jne .divide

    jmp .write

.write_no_pop:
    or al, 30h
    call putc
    jmp .return

.write:
    pop ax

    or al, 30h
    call putc
    dec cx
    jne .write

.return:
    mov sp, bp
    pop bp
    ret

printh:
    push bp
    mov bp, sp

    mov ax, [bp + 4]    ; integer WORD
    mov cx, 0          ; counter
    cmp ax, 0
    je .write_no_pop

.divide:
    xor dx, dx
    mov di, 16          ; divisor
    div di

    push dx
    inc cx
    cmp ax, 0
    jne .divide

    jmp .write

.write_no_pop:
    or al, 30h
    call putc
    jmp .return

.write:
    pop ax
    cmp al, 10
    jge .alpha

    or al, 30h
    jmp .decimal

.alpha:
    sub al, 10
    add al, 'A'

.decimal:
    call putc
    dec cx
    jne .write

.return:
    mov sp, bp
    pop bp
    ret
%endif