|
|
- void print(string);
- void* dump_ax_return(input);
-
- void print(string)
- char* string;
- {
- #asm
- push bp
- mov bp,sp
- mov si,4[bp]
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- new_print_print:
- ; Prints string in si
- ; IN si: zero terminated string to print
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mov ah, #0xE ; Specify 'int 0x10' 'teletype output' function
- ; [AL = Character, BH = Page Number, BL = Colour (in graphics mode)]
- .new_print_printchar:
- lodsb ; Load byte at address SI into AL, and increment SI
- test al, al
- jz .new_print_done ; If the character is zero (NUL), stop writing the string
- int #0x10 ; Otherwise, print the character via 'int 0x10'
- jmp .new_print_printchar ; Repeat for the next character
- .new_print_done:
-
- pop bp
- #endasm
- }
-
-
- void print_stack(argument)
- {
- #asm
- push bp
- mov bp,sp
- push ds
- push ax
-
- mov ax, ss
- mov ds, ax
- mov si,4[bp]
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- print_stack_print:
- ; Prints string in si
- ; IN si: zero terminated string to print
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mov ah, #0xE ; Specify 'int 0x10' 'teletype output' function
- ; [AL = Character, BH = Page Number, BL = Colour (in graphics mode)]
- .print_stack_printchar:
- lodsb ; Load byte at address SI into AL, and increment SI
- test al, al
- jz .print_stack_done ; If the character is zero (NUL), stop writing the string
- int #0x10 ; Otherwise, print the character via 'int 0x10'
- jmp .print_stack_printchar ; Repeat for the next character
- .print_stack_done:
-
- pop ax
- pop ds
- pop bp
- #endasm
- }
-
- void* dump_ax_return(input)
- void* input;
- {
- return input;
- }
-
- void dump_ax(input)
- void* input;
- {
- dump_ax_return(input)
- #asm
- push bp
- mov bp,sp
-
- pusha ; save registers
- mov bx, ax
- mov ah, #0xE ; Teletype output
-
- mov cx, #4 ; 4 nipples in a 16 bit word
- .dump_ax_loop:
- rol bx, #4 ; rotate to next nipple
- mov al, bl ; we copy to al because we need to mask only the low 4 bits
- and al, #%1111 ; Do the masking
- add al, #48 ; convert to ASCII
- cmp al, #57 ; If we are greater than 9 ascii, we add 7 to make digit 10 be represented as 'A'
- jbe .dump_ax_skip ; -|-
- add al, #7 ; -|-
- .dump_ax_skip: ; -|-
- int #0x10 ; BIOS call 'output'
- loop .dump_ax_loop
-
- popa ; restore registers
-
- pop bp
- #endasm
- }
-
- void print_newline()
- {
- #asm
- printCRLF:
- mov ah, #0xE
- mov al, #13
- int #0x10
- mov al, #10
- int #0x10
- ret
- #endasm
- }
|