Remove leftovers from previous experiments
This commit is contained in:
parent
c58f367330
commit
c0b8c107c4
@ -1,32 +0,0 @@
|
|||||||
org 0x100
|
|
||||||
|
|
||||||
jmp init
|
|
||||||
|
|
||||||
%defstr V VERSION
|
|
||||||
banner: db "RDOS KERNEL ", V, 0x0A, 0x0D, '$', 0x1A
|
|
||||||
|
|
||||||
%include "kernel/far.asm"
|
|
||||||
%include "kernel/char.asm"
|
|
||||||
%include "kernel/drive.asm"
|
|
||||||
%include "kernel/fat.asm"
|
|
||||||
|
|
||||||
section .text
|
|
||||||
|
|
||||||
init: call rstseg
|
|
||||||
call dinit
|
|
||||||
|
|
||||||
mov dx, banner
|
|
||||||
call puts
|
|
||||||
|
|
||||||
mov dl, 0
|
|
||||||
call select
|
|
||||||
|
|
||||||
mov dx, 3
|
|
||||||
call setclus
|
|
||||||
call rdfat
|
|
||||||
mov dx, bx
|
|
||||||
inc dx
|
|
||||||
call wdfat
|
|
||||||
|
|
||||||
hlt: hlt
|
|
||||||
jmp hlt
|
|
144
com/a86.asm
144
com/a86.asm
@ -1,144 +0,0 @@
|
|||||||
org 0x100
|
|
||||||
|
|
||||||
jmp init
|
|
||||||
|
|
||||||
fcb1 equ 0x5C
|
|
||||||
eof equ 0x1A
|
|
||||||
stack equ 0x10 ; stack size
|
|
||||||
|
|
||||||
dumpax push ax
|
|
||||||
push cx
|
|
||||||
push dx
|
|
||||||
mov dx, ax
|
|
||||||
call dmpdx0
|
|
||||||
mov al, 0x0A
|
|
||||||
call dmpdx3
|
|
||||||
mov al, 0x0D
|
|
||||||
call dmpdx3
|
|
||||||
pop dx
|
|
||||||
pop cx
|
|
||||||
pop ax
|
|
||||||
ret
|
|
||||||
dmpdx0 mov ah, 0xe
|
|
||||||
mov cl, 4
|
|
||||||
; this double-call is essentially a 4 times repeating loop
|
|
||||||
call dmpdx1
|
|
||||||
dmpdx1: call dmpdx2
|
|
||||||
dmpdx2: ; grab highest nibble from dx
|
|
||||||
mov al, dh
|
|
||||||
; remove highest nibble from dx
|
|
||||||
shl dx, cl
|
|
||||||
; shift away second-highest nibble that we accidentally copied
|
|
||||||
shr al, cl
|
|
||||||
; map 0-9 to ascii codes for '0' to '9'
|
|
||||||
add al, 0x30
|
|
||||||
; if result is larger than '9', ...
|
|
||||||
cmp al, 0x3a
|
|
||||||
jl dmpdx3
|
|
||||||
; ... add 7 so we continue at 'A'
|
|
||||||
add al, 7
|
|
||||||
dmpdx3: int 0x10
|
|
||||||
ret
|
|
||||||
|
|
||||||
free dw 0 ; free ram size
|
|
||||||
lncnt dw 0 ; line count
|
|
||||||
rdptr dw 0xFFFF ; infile blk ptr
|
|
||||||
|
|
||||||
getc mov bx, [rdptr]
|
|
||||||
cmp bx, 0x80
|
|
||||||
jc l01
|
|
||||||
mov ah, 0x14
|
|
||||||
mov dx, fcb1
|
|
||||||
int 0x21
|
|
||||||
cmp al, 1
|
|
||||||
je l02
|
|
||||||
mov bx, 0
|
|
||||||
l01 mov al, [0x80+bx]
|
|
||||||
cmp al, eof
|
|
||||||
je l02
|
|
||||||
cmp al, 0
|
|
||||||
je l02
|
|
||||||
cmp al, 0x0A
|
|
||||||
jne l01b
|
|
||||||
inc word [lncnt]
|
|
||||||
l01b inc bx
|
|
||||||
mov [rdptr], bx
|
|
||||||
jmp l03
|
|
||||||
l02 mov al, 0x1A
|
|
||||||
l03 cmp al, eof
|
|
||||||
ret
|
|
||||||
|
|
||||||
newlin mov dl, 0x0A
|
|
||||||
mov ah, 2
|
|
||||||
int 0x21
|
|
||||||
mov dl, 0x0D
|
|
||||||
int 0x21
|
|
||||||
ret
|
|
||||||
|
|
||||||
error mov dl, [bx]
|
|
||||||
mov ah, 2
|
|
||||||
int 0x21
|
|
||||||
inc bx
|
|
||||||
cmp dl, 0x20
|
|
||||||
jne error
|
|
||||||
mov ax, [lncnt]
|
|
||||||
call dumpax
|
|
||||||
call newlin
|
|
||||||
int 0x20
|
|
||||||
|
|
||||||
e_eof db "EOF "
|
|
||||||
e_dup db "DUPSYM "
|
|
||||||
|
|
||||||
tok1:
|
|
||||||
s_ws db " " ; also used for tabs
|
|
||||||
s_com db ","
|
|
||||||
s_obr db "["
|
|
||||||
s_cbr db "]"
|
|
||||||
s_plu db "+"
|
|
||||||
s_min db "-"
|
|
||||||
|
|
||||||
align 2
|
|
||||||
tok2:
|
|
||||||
reg8 db "AL","CL","DL","BL","AH","CH","DH","BH"
|
|
||||||
reg16 db "AX","CX","DX","BX","SP","BP","SI","DI"
|
|
||||||
sreg db "ES","CS","SS","DS"
|
|
||||||
s_db db "DB"
|
|
||||||
s_dw db "DW"
|
|
||||||
|
|
||||||
tok3:
|
|
||||||
s_org db "ORG"
|
|
||||||
s_equ db "EQU"
|
|
||||||
|
|
||||||
; TODO: parse a line into wordlist of tokens and ptrs to strings
|
|
||||||
rline: ret
|
|
||||||
|
|
||||||
; clear symbol table
|
|
||||||
main mov byte [init], 0
|
|
||||||
call rline
|
|
||||||
int 0x20
|
|
||||||
|
|
||||||
align 16
|
|
||||||
|
|
||||||
; stuff behind here gets overwritten
|
|
||||||
; by symbol table and program data
|
|
||||||
|
|
||||||
init mov ax, [6]
|
|
||||||
mov dx, sp
|
|
||||||
sub dx, stack
|
|
||||||
cmp ax, dx
|
|
||||||
jc il01
|
|
||||||
mov ax, dx
|
|
||||||
il01 sub ax, init
|
|
||||||
shr ax, 1
|
|
||||||
and ax, 0xFFF0
|
|
||||||
mov [free], ax
|
|
||||||
; open input file
|
|
||||||
mov ah, 0x0F
|
|
||||||
mov dx, fcb1
|
|
||||||
int 0x21
|
|
||||||
mov bx, e_op
|
|
||||||
test al, al
|
|
||||||
jnz error
|
|
||||||
jmp main
|
|
||||||
|
|
||||||
e_op db "NOFILE "
|
|
@ -1,28 +0,0 @@
|
|||||||
errcll: ; put return address into dx
|
|
||||||
pop dx
|
|
||||||
errjmp: call dmpdx
|
|
||||||
xor ax, ax
|
|
||||||
int 0x16
|
|
||||||
int 0x19
|
|
||||||
dmpdx: ; setup bx and ah for int 10h call
|
|
||||||
xor bx, bx
|
|
||||||
mov ah, 0x0e
|
|
||||||
mov cl, 4
|
|
||||||
; this double-call is essentially a 4 times repeating loop
|
|
||||||
call dmpdx1
|
|
||||||
dmpdx1: call dmpdx2
|
|
||||||
dmpdx2: ; grab highest nibble from dx
|
|
||||||
mov al, dh
|
|
||||||
; remove highest nibble from dx
|
|
||||||
shl dx, cl
|
|
||||||
; shift away second-highest nibble that we accidentally copied
|
|
||||||
shr al, cl
|
|
||||||
; map 0-9 to ascii codes for '0' to '9'
|
|
||||||
add al, 0x30
|
|
||||||
; if result is larger than '9', ...
|
|
||||||
cmp al, 0x3a
|
|
||||||
jl dmpdx3
|
|
||||||
; ... add 7 so we continue at 'A'
|
|
||||||
add al, 7
|
|
||||||
dmpdx3: int 0x10
|
|
||||||
ret
|
|
26
inc/bpb.asm
26
inc/bpb.asm
@ -1,26 +0,0 @@
|
|||||||
BPBOFF equ 0xB
|
|
||||||
|
|
||||||
; DOS 2.0 BPB
|
|
||||||
BPBSS equ 0 ; word
|
|
||||||
BPBSC equ 2 ; byte
|
|
||||||
BPBRSC equ 3 ; word
|
|
||||||
BPBFN equ 5 ; byte
|
|
||||||
BPBRDE equ 6 ; word
|
|
||||||
BPBTS equ 8 ; word
|
|
||||||
BPBMD equ 10 ; byte
|
|
||||||
BPBFS equ 11 ; word
|
|
||||||
BPBSIZ2 equ 13 ; size constant
|
|
||||||
|
|
||||||
; DOS 3.31 BPB
|
|
||||||
BPBSPT equ 0x0D ; word
|
|
||||||
BPBNOS equ 0x0F ; word
|
|
||||||
BPBHS equ 0x11 ; dword
|
|
||||||
BPBLTS equ 0x15 ; dword
|
|
||||||
BPBSIZ3 equ 25 ; size constant
|
|
||||||
|
|
||||||
; DOS 3.4 EBPB
|
|
||||||
BPBDN equ 0x19 ; byte
|
|
||||||
BPBFALG equ 0x1A ; byte
|
|
||||||
BPBSIG equ 0x1B ; byte
|
|
||||||
BPBSER equ 0x1C ; dword serial number
|
|
||||||
BPBSIZ4 equ 32 ; size constant
|
|
11
inc/mbr.asm
11
inc/mbr.asm
@ -1,11 +0,0 @@
|
|||||||
mbrtab: equ 0x1BE ; start of partition table
|
|
||||||
mbrsig: equ 0x1FE ; start of signature
|
|
||||||
mbrmn: equ 0x55AA ; signature value
|
|
||||||
|
|
||||||
pardn: equ 0x00 ; byte: partition active flag
|
|
||||||
parchs: equ 0x01 ; 3 bytes: CHS for first sector
|
|
||||||
partyp: equ 0x04 ; byte: partition type
|
|
||||||
parend: equ 0x05 ; 3 bytes: CHS for last sector
|
|
||||||
paroff: equ 0x08 ; dword: partition offset in sectors
|
|
||||||
parlen: equ 0x0C ; dword: partition length in sectors
|
|
||||||
parsiz: equ 0x10
|
|
53
lib/dump.asm
53
lib/dump.asm
@ -1,53 +0,0 @@
|
|||||||
dump:
|
|
||||||
push ax
|
|
||||||
push cx
|
|
||||||
push dx
|
|
||||||
push bx
|
|
||||||
mov al, 0x0A
|
|
||||||
call putc
|
|
||||||
mov al, 0x0D
|
|
||||||
call putc
|
|
||||||
mov cx, 4
|
|
||||||
.loop_line:
|
|
||||||
push cx
|
|
||||||
push bx
|
|
||||||
mov ax, bx
|
|
||||||
call print16
|
|
||||||
mov al, ':'
|
|
||||||
call putc
|
|
||||||
mov al, ' '
|
|
||||||
call putc
|
|
||||||
mov cx, 0x8
|
|
||||||
.loop_bin:
|
|
||||||
mov ax, [bx]
|
|
||||||
xchg al, ah
|
|
||||||
inc bx
|
|
||||||
inc bx
|
|
||||||
call print16
|
|
||||||
mov dl, ' '
|
|
||||||
call CONOUT
|
|
||||||
loop .loop_bin
|
|
||||||
pop bx
|
|
||||||
mov cx, 0x10
|
|
||||||
.loop_ascii:
|
|
||||||
mov dl, '.'
|
|
||||||
cmp byte [bx], 0x20
|
|
||||||
jc .print
|
|
||||||
cmp byte [bx], 0x80
|
|
||||||
jnc .print
|
|
||||||
mov dl, [bx]
|
|
||||||
.print:
|
|
||||||
inc bx
|
|
||||||
call CONOUT
|
|
||||||
loop .loop_ascii
|
|
||||||
pop cx
|
|
||||||
mov dl, 0x0A
|
|
||||||
call CONOUT
|
|
||||||
mov dl, 0x0D
|
|
||||||
call CONOUT
|
|
||||||
loop .loop_line
|
|
||||||
pop bx
|
|
||||||
pop dx
|
|
||||||
pop cx
|
|
||||||
pop ax
|
|
||||||
ret
|
|
@ -1,65 +0,0 @@
|
|||||||
%define mcb_first 0x5F
|
|
||||||
|
|
||||||
; This alloc uses an MCB-like list always starting at a fixed offset.
|
|
||||||
; Boot components may use it to allocate space during early boot.
|
|
||||||
; The list ends with the most recently allocated arena at its end,
|
|
||||||
; contrary to how the MCBs work on DOS.
|
|
||||||
|
|
||||||
; Memory Layout:
|
|
||||||
; 0000 Interrupt table
|
|
||||||
; 0400 BIOS data area
|
|
||||||
; 05F0 16 bytes Arena header 1
|
|
||||||
; 0600 BX paragraphs Arena 1
|
|
||||||
; .... 16 bytes Arena header 2
|
|
||||||
; .... BX paragraphs Arena 2
|
|
||||||
; ...
|
|
||||||
; .... 16 bytes Arena header n
|
|
||||||
; .... BX paragraphs Arena n
|
|
||||||
; Unmanaged memory
|
|
||||||
|
|
||||||
; Take note that this mechanism works differently than under DOS -
|
|
||||||
; but this one is optimized for fast and small alloc.
|
|
||||||
|
|
||||||
; Typical usecases:
|
|
||||||
; - Diskette Parameter Table (See interrupt 1Eh)
|
|
||||||
; - Partition table
|
|
||||||
; - Boot sector relocations
|
|
||||||
; - Boot sector data (FAT table, rootdir)
|
|
||||||
|
|
||||||
; Allocate paragraphs in unmanaged memory
|
|
||||||
; IN BX requested memory in paragraphs
|
|
||||||
; OUT AX output segment
|
|
||||||
early_alloc:
|
|
||||||
push ds
|
|
||||||
push bx
|
|
||||||
push si
|
|
||||||
; si is used as zero register
|
|
||||||
; this allows the opcodes to use a byte as disp instead of word
|
|
||||||
xor si, si
|
|
||||||
mov ax, mcb_first
|
|
||||||
.next:
|
|
||||||
mov ds, ax
|
|
||||||
inc ax
|
|
||||||
; DS is seg of arena header
|
|
||||||
; AX is seg of arena
|
|
||||||
cmp BYTE [si], 0x4D
|
|
||||||
jne .here
|
|
||||||
add ax, WORD [si+3]
|
|
||||||
jmp .next
|
|
||||||
.here:
|
|
||||||
; mark as item
|
|
||||||
mov BYTE [si], 0x4D
|
|
||||||
; write segment length in paragraphs
|
|
||||||
mov WORD [si+3], bx
|
|
||||||
; if allocation is higher than CS, then we are in managed memory
|
|
||||||
; set ourself as owner then, otherwise use dummy value 8
|
|
||||||
mov bx, cs
|
|
||||||
cmp ax, bx ; CF = CS in unmanaged memory
|
|
||||||
jnc .setup_owner
|
|
||||||
mov bx, 8
|
|
||||||
.setup_owner:
|
|
||||||
mov WORD [si+1], bx
|
|
||||||
pop si
|
|
||||||
pop bx
|
|
||||||
pop ds
|
|
||||||
ret
|
|
@ -1,46 +0,0 @@
|
|||||||
; Parse ASCIIZ string into FCB
|
|
||||||
; IN SI ptr to filename
|
|
||||||
; BX ptr to FCB
|
|
||||||
fcb_parse:
|
|
||||||
push di
|
|
||||||
push ax
|
|
||||||
mov di, bx
|
|
||||||
xor ax, ax
|
|
||||||
stosb
|
|
||||||
.cleanout:
|
|
||||||
push di
|
|
||||||
mov cx, 0x0A
|
|
||||||
mov al, 0x20
|
|
||||||
rep stosb
|
|
||||||
pop di
|
|
||||||
.base_loop:
|
|
||||||
call .read
|
|
||||||
cmp al, 0x2E
|
|
||||||
je .ext_start
|
|
||||||
cmp al, 0x20
|
|
||||||
je .ret
|
|
||||||
stosb
|
|
||||||
jmp .base_loop
|
|
||||||
.ext_start:
|
|
||||||
mov di, bx
|
|
||||||
add di, 9
|
|
||||||
.ext_loop:
|
|
||||||
call .read
|
|
||||||
cmp al, 0x20
|
|
||||||
je .ret
|
|
||||||
stosb
|
|
||||||
jmp .ext_loop
|
|
||||||
.read:
|
|
||||||
lodsb
|
|
||||||
test al, al
|
|
||||||
jz .eret
|
|
||||||
cmp al, 0x0D
|
|
||||||
je .eret
|
|
||||||
ret
|
|
||||||
.eret:
|
|
||||||
dec si
|
|
||||||
pop ax
|
|
||||||
.ret:
|
|
||||||
pop ax
|
|
||||||
pop di
|
|
||||||
ret
|
|
14
lib/fdc.asm
14
lib/fdc.asm
@ -1,14 +0,0 @@
|
|||||||
; FDC Descriptor / BIOS parameter block
|
|
||||||
fdc_ss: equ 0x0B ; WORD sector size
|
|
||||||
fdc_sc: equ 0x0D ; BYTE sectors per cluster
|
|
||||||
fdc_rsc: equ 0x0E ; WORD reserved sectors
|
|
||||||
fdc_fn: equ 0x10 ; BYTE FAT tables
|
|
||||||
fdc_rde: equ 0x11 ; WORD root directory entries
|
|
||||||
fdc_ts: equ 0x13 ; WORD total sector count
|
|
||||||
; 0 if >65535, use lrgts then
|
|
||||||
fdc_mi: equ 0x15 ; BYTE media descriptor byte
|
|
||||||
fdc_sf: equ 0x16 ; WORD sectors per FAT
|
|
||||||
fdc_spt: equ 0x18 ; WORD sectors per track
|
|
||||||
fdc_nos: equ 0x1A ; WORD sides/heads
|
|
||||||
fdc_po: equ 0x1C ; DWORD partition offset
|
|
||||||
fdc_lrgts: equ 0x20 ; DWORD large sector count
|
|
15
lib/log2.asm
15
lib/log2.asm
@ -1,15 +0,0 @@
|
|||||||
; Calculate dual logarithm (int)
|
|
||||||
; IN AX number
|
|
||||||
; OUT AX dual logarithm
|
|
||||||
log2:
|
|
||||||
push cx
|
|
||||||
mov cx, 15
|
|
||||||
.loop:
|
|
||||||
rcl ax, 1
|
|
||||||
jc .ret
|
|
||||||
loop .loop
|
|
||||||
.ret:
|
|
||||||
cmc
|
|
||||||
mov ax, cx
|
|
||||||
pop cx
|
|
||||||
ret
|
|
124
lib/nasmcomp.asm
124
lib/nasmcomp.asm
@ -1,124 +0,0 @@
|
|||||||
; Pseudo-Instruction: fill bytes until offset
|
|
||||||
%macro pad 1.nolist
|
|
||||||
times (%1 - ($-$$)) nop
|
|
||||||
%endmacro
|
|
||||||
|
|
||||||
; REGISTERS
|
|
||||||
%define a al
|
|
||||||
%define b ch
|
|
||||||
%define c cl
|
|
||||||
%define d dh
|
|
||||||
%define e dl
|
|
||||||
%define h bh
|
|
||||||
%define l bl
|
|
||||||
%define m byte [bx]
|
|
||||||
|
|
||||||
; REGISTER PAIRS
|
|
||||||
%define bc cx
|
|
||||||
%define de dx
|
|
||||||
%define hl bx
|
|
||||||
|
|
||||||
; INSTRUCTIONS
|
|
||||||
; data movement
|
|
||||||
; 'mov' can stay literal
|
|
||||||
%define mvi mov
|
|
||||||
%define lxi mov
|
|
||||||
%macro lda 1
|
|
||||||
mov al, byte [%1]
|
|
||||||
%endmacro
|
|
||||||
%macro sta 1
|
|
||||||
mov byte [%1], al
|
|
||||||
%endmacro
|
|
||||||
%macro lhld 1
|
|
||||||
mov bx, word [%1]
|
|
||||||
%endmacro
|
|
||||||
%macro shld 1
|
|
||||||
mov word [%1], bx
|
|
||||||
%endmacro
|
|
||||||
%macro ldax 1
|
|
||||||
mov al, byte [%1]
|
|
||||||
%endmacro
|
|
||||||
%macro stax 1
|
|
||||||
mov byte [%1], al
|
|
||||||
%endmacro
|
|
||||||
%macro xchg 1
|
|
||||||
xchg dx, bx
|
|
||||||
%endmacro
|
|
||||||
; addition
|
|
||||||
%macro add 1
|
|
||||||
add al, %1
|
|
||||||
%endmacro
|
|
||||||
%macro adi 1
|
|
||||||
add al, %1
|
|
||||||
%endmacro
|
|
||||||
%macro adc 1
|
|
||||||
adc al, %1
|
|
||||||
%endmacro
|
|
||||||
%macro aci 1
|
|
||||||
adc al, %1
|
|
||||||
%endmacro
|
|
||||||
; subtraction
|
|
||||||
%macro sub 1
|
|
||||||
sub al, %1
|
|
||||||
%endmacro
|
|
||||||
%macro sui 1
|
|
||||||
sub al, %1
|
|
||||||
%endmacro
|
|
||||||
%macro sbb 1
|
|
||||||
sub al, %1
|
|
||||||
%endmacro
|
|
||||||
%macro sbi 1
|
|
||||||
sub al, %1
|
|
||||||
%endmacro
|
|
||||||
; increment / decrement
|
|
||||||
%define inr inc
|
|
||||||
%define dcr dec
|
|
||||||
%define inx inc
|
|
||||||
%define dcx dec
|
|
||||||
; pointer arithmetic
|
|
||||||
%macro dad 1
|
|
||||||
add bx, %1
|
|
||||||
%endmacro
|
|
||||||
; 'daa' stays literal
|
|
||||||
|
|
||||||
;ANA S 10100SSS ZSCPA AND register with A
|
|
||||||
;ANI # 11100110 db ZSPCA AND immediate with A
|
|
||||||
;ORA S 10110SSS ZSPCA OR register with A
|
|
||||||
;ORI # 11110110 ZSPCA OR immediate with A
|
|
||||||
;XRA S 10101SSS ZSPCA ExclusiveOR register with A
|
|
||||||
;XRI # 11101110 db ZSPCA ExclusiveOR immediate with A
|
|
||||||
|
|
||||||
;CMP S 10111SSS ZSPCA Compare register with A
|
|
||||||
;CPI # 11111110 ZSPCA Compare immediate with A
|
|
||||||
|
|
||||||
;RLC 00000111 C Rotate A left
|
|
||||||
;RRC 00001111 C Rotate A right
|
|
||||||
;RAL 00010111 C Rotate A left through carry
|
|
||||||
;RAR 00011111 C Rotate A right through carry
|
|
||||||
;CMA 00101111 - Compliment A
|
|
||||||
;CMC 00111111 C Compliment Carry flag
|
|
||||||
;STC 00110111 C Set Carry flag
|
|
||||||
;JMP a 11000011 lb hb - Unconditional jump
|
|
||||||
;Jccc a 11CCC010 lb hb - Conditional jump
|
|
||||||
;CALL a 11001101 lb hb - Unconditional subroutine call
|
|
||||||
;Cccc a 11CCC100 lb hb - Conditional subroutine call
|
|
||||||
;RET 11001001 - Unconditional return from subroutine
|
|
||||||
;Rccc 11CCC000 - Conditional return from subroutine
|
|
||||||
;RST n 11NNN111 - Restart (Call n*8)
|
|
||||||
;PCHL 11101001 - Jump to address in H:L
|
|
||||||
;PUSH RP 11RP0101 *2 - Push register pair on the stack
|
|
||||||
;POP RP 11RP0001 *2 *2 Pop register pair from the stack
|
|
||||||
;XTHL 11100011 - Swap H:L with top word on stack
|
|
||||||
;SPHL 11111001 - Set SP to content of H:L
|
|
||||||
;IN p 11011011 pa - Read input port into A
|
|
||||||
;OUT p 11010011 pa - Write A to output port
|
|
||||||
;EI 11111011 - Enable interrupts
|
|
||||||
;DI 11110011 - Disable interrupts
|
|
||||||
;HLT 01110110 - Halt processor
|
|
||||||
;NOP 00000000 - No operation
|
|
||||||
|
|
||||||
%macro cnz 1
|
|
||||||
jz %%skip
|
|
||||||
call near %1
|
|
||||||
%%skip:
|
|
||||||
%endmacro
|
|
142
lib/opcode80.asm
142
lib/opcode80.asm
@ -1,142 +0,0 @@
|
|||||||
; BYTE name length
|
|
||||||
; n BYTES name
|
|
||||||
; BYTE opcode template (variable parts zero)
|
|
||||||
;
|
|
||||||
; BYTE operand 1
|
|
||||||
; BYTE operand 2
|
|
||||||
|
|
||||||
; operand types:
|
|
||||||
; 0x00 none
|
|
||||||
; 0x1n reg8, opcode |= (reg8 << n)
|
|
||||||
; 0x2n reg16, opcode |= (reg8 << n)
|
|
||||||
; 0x3n reg16b, opcode |= (reg8 << n)
|
|
||||||
; 0x7n 3-bit number, opcode |= (num << n)
|
|
||||||
; 0x80 imm8, encoded as extra byte
|
|
||||||
; 0x81 imm16, encoded as extra word
|
|
||||||
|
|
||||||
registers:
|
|
||||||
.reg8:
|
|
||||||
db "B", 0
|
|
||||||
db "C", 0
|
|
||||||
db "D", 0
|
|
||||||
db "E", 0
|
|
||||||
db "H", 0
|
|
||||||
db "L", 0
|
|
||||||
db "M", 0
|
|
||||||
db 0
|
|
||||||
.reg16:
|
|
||||||
db "BC", 0
|
|
||||||
db "DE", 0
|
|
||||||
db "HL", 0
|
|
||||||
db "SP", 0
|
|
||||||
db 0
|
|
||||||
.reg16b:
|
|
||||||
db "BC", 0
|
|
||||||
db "DE", 0
|
|
||||||
db "HL", 0
|
|
||||||
db "AF", 0
|
|
||||||
db 0
|
|
||||||
.end:
|
|
||||||
db 0
|
|
||||||
|
|
||||||
opcodes:
|
|
||||||
; Data movement
|
|
||||||
db 3, "MOV", 0b01000000, 0x13, 0x10
|
|
||||||
db 3, "MVI", 0b00000110, 0x13, 0x80
|
|
||||||
db 3, "LXI", 0b00000001, 0x24, 0x81
|
|
||||||
db 3, "LDA", 0b00111010, 0x81, 0x00
|
|
||||||
db 3, "STA", 0b00110010, 0x81, 0x00
|
|
||||||
db 4, "LHLD", 0b00101010, 0x81, 0x00
|
|
||||||
db 4, "SHLD", 0b00100010, 0x81, 0x00
|
|
||||||
db 4, "LDAX", 0b00001010, 0x24, 0x00
|
|
||||||
db 4, "STAX", 0b00000010, 0x24, 0x00
|
|
||||||
db 4, "XCHG", 0b11101011, 0x00, 0x00
|
|
||||||
|
|
||||||
; Addition / Subtraction
|
|
||||||
db 3, "ADD", 0b10000000, 0x10, 0x00
|
|
||||||
db 3, "ADI", 0b11000110, 0x80, 0x00
|
|
||||||
db 3, "ADC", 0b10001000, 0x10, 0x00
|
|
||||||
db 3, "ACI", 0b11001110, 0x80, 0x00
|
|
||||||
db 3, "SUB", 0b10010000, 0x10, 0x00
|
|
||||||
db 3, "SUI", 0b11010110, 0x80, 0x00
|
|
||||||
db 3, "SBB", 0b10011000, 0x10, 0x00
|
|
||||||
db 3, "SBI", 0b11011110, 0x80, 0x00
|
|
||||||
db 3, "INR", 0b00000100, 0x13, 0x00
|
|
||||||
db 3, "DCR", 0b00000101, 0x13, 0x00
|
|
||||||
db 3, "INX", 0b00000011, 0x24, 0x00
|
|
||||||
db 3, "DCX", 0b00001011, 0x24, 0x00
|
|
||||||
db 3, "DAD", 0b00001001, 0x24, 0x00
|
|
||||||
|
|
||||||
; BCD
|
|
||||||
db 3, "DAA", 0b00100111, 0x00, 0x00
|
|
||||||
|
|
||||||
; Bitwise operations
|
|
||||||
db 3, "ANA", 0b10100000, 0x10, 0x00
|
|
||||||
db 3, "ANI", 0b11100110, 0x80, 0x00
|
|
||||||
db 3, "ORA", 0b10110000, 0x10, 0x00
|
|
||||||
db 3, "ORI", 0b11110110, 0x80, 0x00
|
|
||||||
db 3, "XRA", 0b10101000, 0x10, 0x00
|
|
||||||
db 3, "XRI", 0b11101110, 0x80, 0x00
|
|
||||||
db 3, "CMP", 0b10111000, 0x10, 0x00
|
|
||||||
db 3, "CPI", 0b11111110, 0x80, 0x00
|
|
||||||
|
|
||||||
; Rotate
|
|
||||||
db 3, "RLC", 0b00000111, 0x00, 0x00
|
|
||||||
db 3, "RRC", 0b00001111, 0x00, 0x00
|
|
||||||
db 3, "RAL", 0b00010111, 0x00, 0x00
|
|
||||||
db 3, "RAR", 0b00011111, 0x00, 0x00
|
|
||||||
|
|
||||||
; Complement
|
|
||||||
db 3, "CMA", 0b00101111, 0x00, 0x00
|
|
||||||
db 3, "CMC", 0b00111111, 0x00, 0x00
|
|
||||||
db 3, "STC", 0b00110111, 0x00, 0x00
|
|
||||||
|
|
||||||
; Jump
|
|
||||||
db 3, "JMP", 0b11000011, 0x81, 0x00
|
|
||||||
db 3, "JNZ", 0b11000010, 0x81, 0x00
|
|
||||||
db 2, "JZ", 0b11001010, 0x81, 0x00
|
|
||||||
db 3, "JNC", 0b11010010, 0x81, 0x00
|
|
||||||
db 2, "JC", 0b11011010, 0x81, 0x00
|
|
||||||
db 3, "JPO", 0b11100010, 0x81, 0x00
|
|
||||||
db 3, "JPE", 0b11101010, 0x81, 0x00
|
|
||||||
db 2, "JP", 0b11110010, 0x81, 0x00
|
|
||||||
db 2, "JM", 0b11111010, 0x81, 0x00
|
|
||||||
|
|
||||||
; Call
|
|
||||||
db 4, "CALL", 0b11001101, 0x81, 0x00
|
|
||||||
db 3, "CNZ", 0b11000100, 0x81, 0x00
|
|
||||||
db 2, "CZ", 0b11001100, 0x81, 0x00
|
|
||||||
db 3, "CNC", 0b11010100, 0x81, 0x00
|
|
||||||
db 2, "CC", 0b11011100, 0x81, 0x00
|
|
||||||
db 3, "CPO", 0b11100100, 0x81, 0x00
|
|
||||||
db 3, "CPE", 0b11101100, 0x81, 0x00
|
|
||||||
db 2, "CP", 0b11110100, 0x81, 0x00
|
|
||||||
db 2, "CM", 0b11111100, 0x81, 0x00
|
|
||||||
|
|
||||||
; Return
|
|
||||||
db 3, "RET", 0b11001001, 0x00, 0x00
|
|
||||||
db 3, "RNZ", 0b11000000, 0x00, 0x00
|
|
||||||
db 2, "RZ", 0b11001000, 0x00, 0x00
|
|
||||||
db 3, "RNC", 0b11010000, 0x00, 0x00
|
|
||||||
db 2, "RC", 0b11011000, 0x00, 0x00
|
|
||||||
db 3, "RPO", 0b11100000, 0x00, 0x00
|
|
||||||
db 3, "RPE", 0b11101000, 0x00, 0x00
|
|
||||||
db 2, "RP", 0b11110000, 0x00, 0x00
|
|
||||||
db 2, "RM", 0b11111000, 0x00, 0x00
|
|
||||||
|
|
||||||
db 3, "RST", 0b11000111, 0x73, 0x00
|
|
||||||
db 4, "PCHL", 0b11101001, 0x00, 0x00
|
|
||||||
db 4, "PUSH", 0b11000101, 0x34, 0x00
|
|
||||||
db 3, "POP", 0b11000001, 0x34, 0x00
|
|
||||||
db 4, "XTHL", 0b11100011, 0x00, 0x00
|
|
||||||
db 4, "SPHL", 0b11111001, 0x00, 0x00
|
|
||||||
|
|
||||||
db 2, "IN", 0b11011011, 0x80, 0x00
|
|
||||||
db 3, "OUT", 0b11010011, 0x80, 0x00
|
|
||||||
|
|
||||||
db 2, "EI", 0b11111011, 0x00, 0x00
|
|
||||||
db 2, "DI", 0b11110011, 0x00, 0x00
|
|
||||||
db 3, "HLT", 0b01110110, 0x00, 0x00
|
|
||||||
db 3, "NOP", 0b00000000, 0x00, 0x00
|
|
||||||
|
|
||||||
db 0
|
|
@ -1,30 +0,0 @@
|
|||||||
popcnt:
|
|
||||||
push bx
|
|
||||||
push cx
|
|
||||||
|
|
||||||
mov bx, ax
|
|
||||||
and ax, 0x5555 ; 8x 01
|
|
||||||
and bx, 0xaaaa ; 8x 10
|
|
||||||
shr bx, 1
|
|
||||||
add ax, bx
|
|
||||||
|
|
||||||
mov bx, ax
|
|
||||||
and ax, 0x3333 ; 4x 0011
|
|
||||||
and bx, 0xcccc ; 4x 1100
|
|
||||||
mov cl, 2
|
|
||||||
shr bx, cl
|
|
||||||
add ax, bx
|
|
||||||
|
|
||||||
mov bx, ax
|
|
||||||
and ax, 0x0f0f ; 2x 00001111
|
|
||||||
and bx, 0xf0f0 ; 2x 11110000
|
|
||||||
mov cl, 4
|
|
||||||
shr bx, cl
|
|
||||||
add ax, bx
|
|
||||||
|
|
||||||
add al, ah
|
|
||||||
xor ah, ah
|
|
||||||
|
|
||||||
pop cx
|
|
||||||
pop bx
|
|
||||||
ret
|
|
@ -1,32 +0,0 @@
|
|||||||
; important functions in this file: kprintf
|
|
||||||
|
|
||||||
; print a word
|
|
||||||
; in: ax
|
|
||||||
print16:
|
|
||||||
xchg ah,al
|
|
||||||
call print8
|
|
||||||
xchg ah,al
|
|
||||||
|
|
||||||
; print a byte
|
|
||||||
; in: al
|
|
||||||
print8:
|
|
||||||
push ax ; avoid destroying ah
|
|
||||||
push bx
|
|
||||||
xor bx, bx
|
|
||||||
aam 16 ; high nibble moved into ah, low nibble into al
|
|
||||||
add ax, 0x3030
|
|
||||||
push ax
|
|
||||||
xchg al, ah
|
|
||||||
call .nib
|
|
||||||
pop ax
|
|
||||||
call .nib
|
|
||||||
pop bx
|
|
||||||
pop ax
|
|
||||||
ret
|
|
||||||
.nib:
|
|
||||||
cmp al, 0x3a
|
|
||||||
jl .out
|
|
||||||
add al, 0x07
|
|
||||||
.out:
|
|
||||||
call putc
|
|
||||||
ret
|
|
105
lib/printf.asm
105
lib/printf.asm
@ -1,105 +0,0 @@
|
|||||||
printf:
|
|
||||||
cld
|
|
||||||
pop si
|
|
||||||
push bp
|
|
||||||
mov bp, sp
|
|
||||||
.loop:
|
|
||||||
mov al, [cs:si]
|
|
||||||
inc si
|
|
||||||
cmp al, 0x00
|
|
||||||
je .end
|
|
||||||
cmp al, 0x25
|
|
||||||
je .handle_25h
|
|
||||||
.literal:
|
|
||||||
call putc
|
|
||||||
jmp .loop
|
|
||||||
.end:
|
|
||||||
pop bp
|
|
||||||
push si
|
|
||||||
ret
|
|
||||||
.handle_25h:
|
|
||||||
mov al, [cs:si]
|
|
||||||
inc si
|
|
||||||
cmp al, 0x25
|
|
||||||
je .literal
|
|
||||||
cmp al, 0x58 ; 'X'
|
|
||||||
je .printhex
|
|
||||||
cmp al, 0x55 ; 'U'
|
|
||||||
je .printdec
|
|
||||||
cmp al, 0x53 ; 'S'
|
|
||||||
je .printstr
|
|
||||||
mov al, 0x3F
|
|
||||||
jmp .literal
|
|
||||||
.printhex:
|
|
||||||
add bp, 2
|
|
||||||
mov ax, [bp]
|
|
||||||
mov bx, 0x0010
|
|
||||||
call print_number
|
|
||||||
jmp .loop
|
|
||||||
.printdec:
|
|
||||||
add bp, 2
|
|
||||||
mov ax, [bp]
|
|
||||||
mov bx, 0x000A
|
|
||||||
call print_number
|
|
||||||
jmp .loop
|
|
||||||
.printstr:
|
|
||||||
add bp, 2
|
|
||||||
mov ax, [bp]
|
|
||||||
call print_string
|
|
||||||
jmp .loop
|
|
||||||
|
|
||||||
; converts a integer to ascii
|
|
||||||
; in ax input integer
|
|
||||||
; bx base
|
|
||||||
; cx minimum number of digits
|
|
||||||
; out bx garbled
|
|
||||||
; dx garbled
|
|
||||||
print_number_padded:
|
|
||||||
xor dx, dx
|
|
||||||
div bx
|
|
||||||
push dx
|
|
||||||
dec cx
|
|
||||||
jz .nopad
|
|
||||||
call print_number_padded
|
|
||||||
jmp print_number.end
|
|
||||||
.nopad:
|
|
||||||
call print_number
|
|
||||||
jmp print_number.end
|
|
||||||
|
|
||||||
; converts a integer to ascii
|
|
||||||
; in ax input integer
|
|
||||||
; bx base
|
|
||||||
; out bx garbled
|
|
||||||
; dx garbled
|
|
||||||
print_number:
|
|
||||||
xor dx, dx
|
|
||||||
div bx ; ax = dx:ax / 10, dx = dx:ax % 10
|
|
||||||
push dx
|
|
||||||
and ax, ax
|
|
||||||
jz .end
|
|
||||||
call print_number
|
|
||||||
.end:
|
|
||||||
pop bx
|
|
||||||
xor bh, bh
|
|
||||||
add bx, print_chars
|
|
||||||
mov al, [cs:bx]
|
|
||||||
call putc
|
|
||||||
ret
|
|
||||||
|
|
||||||
; putc's a string
|
|
||||||
; in DS:AX null-terminated string
|
|
||||||
print_string:
|
|
||||||
push si
|
|
||||||
mov si, ax
|
|
||||||
.loop:
|
|
||||||
lodsb
|
|
||||||
cmp al, 0x00
|
|
||||||
je .end
|
|
||||||
call putc
|
|
||||||
jmp .loop
|
|
||||||
.end:
|
|
||||||
pop si
|
|
||||||
ret
|
|
||||||
|
|
||||||
print_chars:
|
|
||||||
db "0123456789ABCDEF"
|
|
Loading…
Reference in New Issue
Block a user