First commit
This commit is contained in:
commit
b434e826fe
|
@ -0,0 +1 @@
|
||||||
|
*.bin
|
|
@ -0,0 +1,116 @@
|
||||||
|
CC0 1.0 Universal
|
||||||
|
|
||||||
|
Statement of Purpose
|
||||||
|
|
||||||
|
The laws of most jurisdictions throughout the world automatically confer
|
||||||
|
exclusive Copyright and Related Rights (defined below) upon the creator and
|
||||||
|
subsequent owner(s) (each and all, an "owner") of an original work of
|
||||||
|
authorship and/or a database (each, a "Work").
|
||||||
|
|
||||||
|
Certain owners wish to permanently relinquish those rights to a Work for the
|
||||||
|
purpose of contributing to a commons of creative, cultural and scientific
|
||||||
|
works ("Commons") that the public can reliably and without fear of later
|
||||||
|
claims of infringement build upon, modify, incorporate in other works, reuse
|
||||||
|
and redistribute as freely as possible in any form whatsoever and for any
|
||||||
|
purposes, including without limitation commercial purposes. These owners may
|
||||||
|
contribute to the Commons to promote the ideal of a free culture and the
|
||||||
|
further production of creative, cultural and scientific works, or to gain
|
||||||
|
reputation or greater distribution for their Work in part through the use and
|
||||||
|
efforts of others.
|
||||||
|
|
||||||
|
For these and/or other purposes and motivations, and without any expectation
|
||||||
|
of additional consideration or compensation, the person associating CC0 with a
|
||||||
|
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
|
||||||
|
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
|
||||||
|
and publicly distribute the Work under its terms, with knowledge of his or her
|
||||||
|
Copyright and Related Rights in the Work and the meaning and intended legal
|
||||||
|
effect of CC0 on those rights.
|
||||||
|
|
||||||
|
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||||
|
protected by copyright and related or neighboring rights ("Copyright and
|
||||||
|
Related Rights"). Copyright and Related Rights include, but are not limited
|
||||||
|
to, the following:
|
||||||
|
|
||||||
|
i. the right to reproduce, adapt, distribute, perform, display, communicate,
|
||||||
|
and translate a Work;
|
||||||
|
|
||||||
|
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||||
|
|
||||||
|
iii. publicity and privacy rights pertaining to a person's image or likeness
|
||||||
|
depicted in a Work;
|
||||||
|
|
||||||
|
iv. rights protecting against unfair competition in regards to a Work,
|
||||||
|
subject to the limitations in paragraph 4(a), below;
|
||||||
|
|
||||||
|
v. rights protecting the extraction, dissemination, use and reuse of data in
|
||||||
|
a Work;
|
||||||
|
|
||||||
|
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||||
|
European Parliament and of the Council of 11 March 1996 on the legal
|
||||||
|
protection of databases, and under any national implementation thereof,
|
||||||
|
including any amended or successor version of such directive); and
|
||||||
|
|
||||||
|
vii. other similar, equivalent or corresponding rights throughout the world
|
||||||
|
based on applicable law or treaty, and any national implementations thereof.
|
||||||
|
|
||||||
|
2. Waiver. To the greatest extent permitted by, but not in contravention of,
|
||||||
|
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
|
||||||
|
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
|
||||||
|
and Related Rights and associated claims and causes of action, whether now
|
||||||
|
known or unknown (including existing as well as future claims and causes of
|
||||||
|
action), in the Work (i) in all territories worldwide, (ii) for the maximum
|
||||||
|
duration provided by applicable law or treaty (including future time
|
||||||
|
extensions), (iii) in any current or future medium and for any number of
|
||||||
|
copies, and (iv) for any purpose whatsoever, including without limitation
|
||||||
|
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
|
||||||
|
the Waiver for the benefit of each member of the public at large and to the
|
||||||
|
detriment of Affirmer's heirs and successors, fully intending that such Waiver
|
||||||
|
shall not be subject to revocation, rescission, cancellation, termination, or
|
||||||
|
any other legal or equitable action to disrupt the quiet enjoyment of the Work
|
||||||
|
by the public as contemplated by Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
3. Public License Fallback. Should any part of the Waiver for any reason be
|
||||||
|
judged legally invalid or ineffective under applicable law, then the Waiver
|
||||||
|
shall be preserved to the maximum extent permitted taking into account
|
||||||
|
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
|
||||||
|
is so judged Affirmer hereby grants to each affected person a royalty-free,
|
||||||
|
non transferable, non sublicensable, non exclusive, irrevocable and
|
||||||
|
unconditional license to exercise Affirmer's Copyright and Related Rights in
|
||||||
|
the Work (i) in all territories worldwide, (ii) for the maximum duration
|
||||||
|
provided by applicable law or treaty (including future time extensions), (iii)
|
||||||
|
in any current or future medium and for any number of copies, and (iv) for any
|
||||||
|
purpose whatsoever, including without limitation commercial, advertising or
|
||||||
|
promotional purposes (the "License"). The License shall be deemed effective as
|
||||||
|
of the date CC0 was applied by Affirmer to the Work. Should any part of the
|
||||||
|
License for any reason be judged legally invalid or ineffective under
|
||||||
|
applicable law, such partial invalidity or ineffectiveness shall not
|
||||||
|
invalidate the remainder of the License, and in such case Affirmer hereby
|
||||||
|
affirms that he or she will not (i) exercise any of his or her remaining
|
||||||
|
Copyright and Related Rights in the Work or (ii) assert any associated claims
|
||||||
|
and causes of action with respect to the Work, in either case contrary to
|
||||||
|
Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
4. Limitations and Disclaimers.
|
||||||
|
|
||||||
|
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||||
|
surrendered, licensed or otherwise affected by this document.
|
||||||
|
|
||||||
|
b. Affirmer offers the Work as-is and makes no representations or warranties
|
||||||
|
of any kind concerning the Work, express, implied, statutory or otherwise,
|
||||||
|
including without limitation warranties of title, merchantability, fitness
|
||||||
|
for a particular purpose, non infringement, or the absence of latent or
|
||||||
|
other defects, accuracy, or the present or absence of errors, whether or not
|
||||||
|
discoverable, all to the greatest extent permissible under applicable law.
|
||||||
|
|
||||||
|
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||||
|
that may apply to the Work or any use thereof, including without limitation
|
||||||
|
any person's Copyright and Related Rights in the Work. Further, Affirmer
|
||||||
|
disclaims responsibility for obtaining any necessary consents, permissions
|
||||||
|
or other rights required for any use of the Work.
|
||||||
|
|
||||||
|
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||||
|
party to this document and has no duty or obligation with respect to this
|
||||||
|
CC0 or use of the Work.
|
||||||
|
|
||||||
|
For more information, please see
|
||||||
|
<http://creativecommons.org/publicdomain/zero/1.0/>
|
|
@ -0,0 +1,15 @@
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .asm .bin
|
||||||
|
|
||||||
|
all: anattos.bin
|
||||||
|
|
||||||
|
.asm.bin:
|
||||||
|
nasm -fbin -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.bin
|
||||||
|
|
||||||
|
run: anattos.bin
|
||||||
|
qemu-system-i386 -fda $<
|
||||||
|
|
||||||
|
.PHONY: all clean run
|
|
@ -0,0 +1,24 @@
|
||||||
|
AnattOS
|
||||||
|
=======
|
||||||
|
AnattOS is a 512 byte memory editor with convenience features for hand
|
||||||
|
programming machine code.
|
||||||
|
|
||||||
|
Interface
|
||||||
|
---------
|
||||||
|
256 bytes of memory are show in a 16 by 16 grid. Each line of 16 bytes is
|
||||||
|
checksummed with Fletcher-16, and the checksum is displayed after the line.
|
||||||
|
The address under the cursor is displayed below the memory dump.
|
||||||
|
|
||||||
|
If the byte under the cursor begins an instruction where the opcode and
|
||||||
|
mod-r/m bytes' fields have the standard meanings, the fields' meanings are
|
||||||
|
decoded and shown below the address. Note that the case of mod=0 r/m=6 is
|
||||||
|
not special cased, and will display `bp` for the r/m field.
|
||||||
|
|
||||||
|
Arrow keys can be used to navigate the memory, and `r` to call into the
|
||||||
|
address under the cursor. When returning to AnattOS the code should restore
|
||||||
|
segment registers, direction flag, and stack pointer to the values they had
|
||||||
|
upon entry.
|
||||||
|
|
||||||
|
Limitations
|
||||||
|
-----------
|
||||||
|
AnattOS is only able to examine first 64KiB of RAM.
|
|
@ -0,0 +1,388 @@
|
||||||
|
; CC0 2021 nortti
|
||||||
|
org 0x7c00
|
||||||
|
|
||||||
|
jmp 0:start
|
||||||
|
|
||||||
|
start:
|
||||||
|
cld
|
||||||
|
cli
|
||||||
|
xor dx, dx
|
||||||
|
mov ds, dx
|
||||||
|
mov ss, dx
|
||||||
|
mov sp, $$
|
||||||
|
sti
|
||||||
|
|
||||||
|
; VGA video memory
|
||||||
|
mov ax, 0xb800
|
||||||
|
mov es, ax
|
||||||
|
|
||||||
|
; Start at bootloader
|
||||||
|
mov bx, $$
|
||||||
|
|
||||||
|
init_screen:
|
||||||
|
; Set 80x25 text mode
|
||||||
|
mov ax, 3
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
; Clear screen
|
||||||
|
xor di, di
|
||||||
|
xor ax, ax
|
||||||
|
mov cx, 80 * 25
|
||||||
|
rep stosw
|
||||||
|
|
||||||
|
mainloop:
|
||||||
|
; Align dump display to 256 byte page
|
||||||
|
mov si, 0xff00
|
||||||
|
and si, bx
|
||||||
|
|
||||||
|
; Display RAM contents
|
||||||
|
xor di, di
|
||||||
|
mov bp, 256
|
||||||
|
.dump:
|
||||||
|
cmp si, bx
|
||||||
|
jne .not_cursor
|
||||||
|
|
||||||
|
; Set cursor
|
||||||
|
pusha
|
||||||
|
|
||||||
|
shr di, 1 ; Cursor position is in char cells
|
||||||
|
|
||||||
|
mov dx, 0x3d4
|
||||||
|
mov al, 0x0f ; Lower 8 bits of position
|
||||||
|
out dx, al
|
||||||
|
inc dx
|
||||||
|
mov ax, di
|
||||||
|
out dx, al
|
||||||
|
|
||||||
|
mov dx, 0x3d4
|
||||||
|
mov al, 0x0e ; Higher 8 bits of position
|
||||||
|
out dx, al
|
||||||
|
inc dx
|
||||||
|
mov ax, di
|
||||||
|
mov al, ah
|
||||||
|
out dx, al
|
||||||
|
|
||||||
|
popa
|
||||||
|
|
||||||
|
.not_cursor:
|
||||||
|
lodsb
|
||||||
|
call hexprint8
|
||||||
|
|
||||||
|
; Fletcher-16
|
||||||
|
add dl, al
|
||||||
|
adc dl, 0
|
||||||
|
add dh, dl
|
||||||
|
adc dh, 0
|
||||||
|
|
||||||
|
inc di
|
||||||
|
inc di
|
||||||
|
|
||||||
|
dec bp
|
||||||
|
test bp, 0x0f
|
||||||
|
jnz .dump
|
||||||
|
|
||||||
|
inc di
|
||||||
|
inc di
|
||||||
|
mov ax, dx
|
||||||
|
call hexprint16
|
||||||
|
xor dx, dx
|
||||||
|
|
||||||
|
add di, (80 - 16*3 - 5)*2
|
||||||
|
|
||||||
|
test bp, bp
|
||||||
|
jnz .dump
|
||||||
|
|
||||||
|
.end_dump:
|
||||||
|
|
||||||
|
; Display address
|
||||||
|
mov di, 17 * 80 * 2
|
||||||
|
mov ax, bx
|
||||||
|
call hexprint16
|
||||||
|
|
||||||
|
xor ax, ax
|
||||||
|
call disasm
|
||||||
|
|
||||||
|
; Read user input
|
||||||
|
int 0x16
|
||||||
|
|
||||||
|
.left:
|
||||||
|
cmp ah, 0x4b
|
||||||
|
jne .right
|
||||||
|
dec bx
|
||||||
|
|
||||||
|
.right:
|
||||||
|
cmp ah, 0x4d
|
||||||
|
jne .up
|
||||||
|
inc bx
|
||||||
|
|
||||||
|
.up:
|
||||||
|
cmp ah, 0x48
|
||||||
|
jne .down
|
||||||
|
sub bx, 16
|
||||||
|
|
||||||
|
.down:
|
||||||
|
cmp ah, 0x50
|
||||||
|
jne .digit09
|
||||||
|
add bx, 16
|
||||||
|
|
||||||
|
.digit09:
|
||||||
|
cmp al, '0'
|
||||||
|
jb .digitaf
|
||||||
|
cmp al, '9'
|
||||||
|
ja .digitaf
|
||||||
|
sub al, '0'
|
||||||
|
jmp digit
|
||||||
|
|
||||||
|
.digitaf:
|
||||||
|
cmp al, 'a'
|
||||||
|
jb .r
|
||||||
|
cmp al, 'f'
|
||||||
|
ja .r
|
||||||
|
sub al, 'a' - 10
|
||||||
|
jmp digit
|
||||||
|
|
||||||
|
.r:
|
||||||
|
cmp al, 'r'
|
||||||
|
mov al, 0xff
|
||||||
|
jne digit.update_nybble
|
||||||
|
|
||||||
|
pusha
|
||||||
|
call bx
|
||||||
|
popa
|
||||||
|
jmp init_screen
|
||||||
|
|
||||||
|
digit:
|
||||||
|
; 00 … 0f are stored nybbles, other values are sentinels
|
||||||
|
test byte [high_nybble], 0xf0
|
||||||
|
jnz .update_nybble
|
||||||
|
|
||||||
|
mov cl, [high_nybble]
|
||||||
|
shl cl, 4
|
||||||
|
or al, cl
|
||||||
|
mov [bx], al
|
||||||
|
inc bx
|
||||||
|
|
||||||
|
mov al, 0xff
|
||||||
|
|
||||||
|
.update_nybble:
|
||||||
|
mov [high_nybble], al
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
; IN:
|
||||||
|
; ah = 0
|
||||||
|
; bx = offset
|
||||||
|
disasm:
|
||||||
|
pusha
|
||||||
|
mov si, bx
|
||||||
|
mov di, 19 * 80 * 2
|
||||||
|
mov cx, 2 * 80
|
||||||
|
push di
|
||||||
|
rep stosw
|
||||||
|
pop di
|
||||||
|
|
||||||
|
; Opcode byte
|
||||||
|
lodsb
|
||||||
|
mov dl, al
|
||||||
|
shr al, 1
|
||||||
|
cmp al, 0x7f ; fe ff
|
||||||
|
jz .do_disasm
|
||||||
|
test al, 0x62 ; add, or, adc, sbb, and, sub, xor, cmp
|
||||||
|
jz .do_disasm
|
||||||
|
cmp al, 0x40
|
||||||
|
jb .no_disasm
|
||||||
|
cmp al, 0x45 ; 80 81 82 83, test, mov
|
||||||
|
jbe .do_disasm
|
||||||
|
cmp al, 0x60 ; c0 c1
|
||||||
|
je .do_disasm
|
||||||
|
jb .no_disasm
|
||||||
|
cmp al, 0x62 ; c4 c5
|
||||||
|
je .do_disasm
|
||||||
|
test al, 0x16 ; d0 d1 d2 d3
|
||||||
|
jnz .no_disasm
|
||||||
|
|
||||||
|
.do_disasm:
|
||||||
|
; Opcode
|
||||||
|
shr al, 1
|
||||||
|
call hexprint8
|
||||||
|
|
||||||
|
inc di
|
||||||
|
inc di
|
||||||
|
|
||||||
|
; Direction / extend
|
||||||
|
mov ax, 0x0700 + ' '
|
||||||
|
test dl, 2
|
||||||
|
jz .print_direction
|
||||||
|
mov al, 's'
|
||||||
|
.print_direction:
|
||||||
|
stosw
|
||||||
|
|
||||||
|
inc di
|
||||||
|
inc di
|
||||||
|
|
||||||
|
; Width
|
||||||
|
mov al, 'b'
|
||||||
|
test dl, 1
|
||||||
|
jz .print_width
|
||||||
|
mov al, 'w'
|
||||||
|
.print_width:
|
||||||
|
stosw
|
||||||
|
|
||||||
|
add di, (80 - 6) * 2
|
||||||
|
|
||||||
|
; Mod-reg-r/m byte
|
||||||
|
lodsb
|
||||||
|
mov dh, al
|
||||||
|
|
||||||
|
; Mode
|
||||||
|
shr al, 6
|
||||||
|
call hexprint4
|
||||||
|
|
||||||
|
inc di
|
||||||
|
inc di
|
||||||
|
|
||||||
|
; Reg or opcode extension
|
||||||
|
mov al, 0x38
|
||||||
|
and al, dh
|
||||||
|
shr al, 3
|
||||||
|
cmp dl, 0x80
|
||||||
|
jb .not_op_ext
|
||||||
|
cmp dl, 0x83 ; 80 81 82 83
|
||||||
|
jbe .op_ext
|
||||||
|
cmp dl, 0x8b ; test mov
|
||||||
|
jbe .not_op_ext
|
||||||
|
|
||||||
|
.op_ext:
|
||||||
|
call hexprint4
|
||||||
|
jmp .skip_print_reg
|
||||||
|
|
||||||
|
.not_op_ext:
|
||||||
|
call .reg
|
||||||
|
|
||||||
|
.skip_print_reg:
|
||||||
|
inc di
|
||||||
|
inc di
|
||||||
|
|
||||||
|
; R/m
|
||||||
|
mov al, 0x07
|
||||||
|
and al, dh
|
||||||
|
cmp dh, 0xc0 ; Hacky way to check if top two bits are both set
|
||||||
|
jb .base
|
||||||
|
call .reg
|
||||||
|
|
||||||
|
.no_disasm:
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
.reg:
|
||||||
|
xor bx, bx
|
||||||
|
mov bl, al
|
||||||
|
|
||||||
|
test dl, 1
|
||||||
|
jz .reg8
|
||||||
|
mov al, byte [bx + register_first]
|
||||||
|
stosw
|
||||||
|
|
||||||
|
shr bx, 1
|
||||||
|
mov al, byte [bx + register_second]
|
||||||
|
stosw
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.reg8:
|
||||||
|
mov cl, al
|
||||||
|
shr cl, 2
|
||||||
|
|
||||||
|
and bl, 3
|
||||||
|
mov al, byte [bx + register_first]
|
||||||
|
stosw
|
||||||
|
|
||||||
|
mov bl, cl
|
||||||
|
mov al, byte [bx + register_halves]
|
||||||
|
stosw
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.base:
|
||||||
|
mov cl, al
|
||||||
|
test al, 4
|
||||||
|
jnz .base47
|
||||||
|
|
||||||
|
mov al, 'b'
|
||||||
|
stosw
|
||||||
|
|
||||||
|
mov bx, 2
|
||||||
|
and bl, cl
|
||||||
|
shr bl, 1
|
||||||
|
mov al, byte [bx + base_first]
|
||||||
|
stosw
|
||||||
|
|
||||||
|
mov al, '+'
|
||||||
|
stosw
|
||||||
|
|
||||||
|
.si_di:
|
||||||
|
mov bl, 1
|
||||||
|
and bl, cl
|
||||||
|
mov al, byte [bx + base_second]
|
||||||
|
stosw
|
||||||
|
|
||||||
|
mov al, 'i'
|
||||||
|
stosw
|
||||||
|
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
.base47:
|
||||||
|
test al, 2
|
||||||
|
jz .si_di
|
||||||
|
|
||||||
|
mov al, 'b'
|
||||||
|
stosw
|
||||||
|
|
||||||
|
mov bx, 7
|
||||||
|
sub bl, cl
|
||||||
|
mov al, byte [bx + base_first]
|
||||||
|
stosw
|
||||||
|
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
register_first db 'acdbsb'
|
||||||
|
base_second db 'sd'
|
||||||
|
|
||||||
|
register_second db 'x'
|
||||||
|
base_first db 'xp'
|
||||||
|
db 'i'
|
||||||
|
|
||||||
|
register_halves db 'lh'
|
||||||
|
|
||||||
|
; IN: ax/al/al = number
|
||||||
|
; UPDATE: di = index into video memory
|
||||||
|
hexprint16:
|
||||||
|
xchg al, ah
|
||||||
|
call hexprint8
|
||||||
|
xchg al, ah
|
||||||
|
|
||||||
|
hexprint8:
|
||||||
|
rol al, 4
|
||||||
|
call hexprint4
|
||||||
|
rol al, 4
|
||||||
|
|
||||||
|
hexprint4:
|
||||||
|
push ax
|
||||||
|
and al, 0xf
|
||||||
|
|
||||||
|
cmp al, 10
|
||||||
|
jb .below_10
|
||||||
|
add al, 'a' - '0' - 10
|
||||||
|
|
||||||
|
.below_10:
|
||||||
|
add al, '0'
|
||||||
|
|
||||||
|
; 07 = white on black
|
||||||
|
mov ah, 0x07
|
||||||
|
stosw
|
||||||
|
pop ax
|
||||||
|
ret
|
||||||
|
|
||||||
|
times 510 - ($ - $$) db 0
|
||||||
|
high_nybble db 0x55, 0xaa
|
Loading…
Reference in New Issue