Login

Subversion Repositories NedoOS

Rev

Rev 1289 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

; ----------------------------------------------------------------------
; ╨Я╨╡╤З╨░╤В╤М ╤Б╤В╤А╨╛╨║ ╨╕╨╖ HL
; ----------------------------------------------------------------------

print:      ld      a, (hl)
            and     a
            ret     z
            call    print_char
            inc     hl
            jr      print

; ----------------------------------------------------------------------
; ╨Ч╨░╨┤╨░╨╡╤В╤Б╤П ╨╜╨╡╨║╨╕╨╣ NameTable = DE
; A = ID ╨║╨╛╨┤╨░ ╨┤╨╗╤П ╨┐╤А╨╛╨┐╨╡╤З╨░╤В╨║╨╕
; ----------------------------------------------------------------------

print_nt:   push    hl
            ld      l, a
            ld      h, 0
            add     hl, hl
            add     hl, de
            ld      a, (hl)
            inc     hl
            ld      h, (hl)
            ld      l, a
            call    print
            pop     hl
            ret

; ----------------------------------------------------------------------
; ╨Т╤Л╨▓╨╛╨┤ [unsigned] int hex 8 ╨╜╨░-╨│╨╛╤А╨░
; ----------------------------------------------------------------------

; === ╨Я╨╡╤З╨░╤В╤М signed int 16
print_int16:

            push    af
            ld      a, b
            cp      $80
            jr      c, .plus
            ld      a, '-'
            call    print_char
            ; BC = (BC ^ FFFF) + 1 = -BC
            ld      a, b
            xor     255
            ld      b, a
            ld      a, c
            xor     255
            add     1
            ld      c, a
            ld      a, b
            adc     0
            ld      b, a
            jr      .prt
.plus:      ld      a, '+'
            call    print_char
.prt:       call    print_sharp
            call    print_uint16.nosharp
            pop     af
            ret

; ==== ╨Я╨╡╤З╨░╤В╤М Signed A
print_int8: push    af
            cp      $80
            jr      c, .plus
            neg
            push    af
            ld      a, '-'
            call    print_char
            pop     af
            jr      .minus
.plus:      push    af
            ld      a, '+'
            call    print_char
            pop     af
.minus:     call    print_sharp
            call    print_uint8.nosharp
            pop     af
            ret

; ==== ╨Я╨╡╤З╨░╤В╤М BC
print_uint16:
            call    print_sharp
.nosharp:   push    af
            push    bc
            ld      a, b
            call    print_uint8.nosharp
            ld      a, c
            call    print_uint8.nosharp
            pop     bc
            pop     af
            ret

; ==== ╨Я╨╡╤З╨░╤В╤М A[7:0]
print_uint8:
            call    print_sharp
.nosharp:   push    af
            rlca
            rlca
            rlca
            rlca
            call    print_nibble
            pop     af
            call    print_nibble
            ret

; ==== ╨Я╨╡╤З╨░╤В╤М A[3:0]
print_nibble:

            push    af
            and     15              ; ╨Я╨╛╨╗╤Г╤З╨╡╨╜╨╕╨╡ ╤В╨╛╨╗╤М╨║╨╛ 3:0
            or      a               ; ╨б╨▒╤А╨╛╤Б AF=0
            daa                     ; ╨Ъ╨╛╤А╤А╨╡╨║╤Ж╨╕╤П ╨╡╤Б╨╗╨╕ >9
            add     0xf0            ; ╨Х╤Б╨╗╨╕ ╨▒╨╛╨╗╤М╤И╨╡ ╤З╨╡╨╝ >9, ╤В╨╛ CF=1
            adc     0x40            ; 0..9 => 30..39, ╨░ ╨╡╤Б╨╗╨╕ CF=1, ╤В╨╛ ╤Б 41..46
            call    print_char
            pop     af
            ret

print_sharp:                        ; ╨Я╨╡╤З╨░╤В╨░╤В╤М ╤А╨╡╤И╨╡╤В╨║╤Г #
            push    af
            ld      a, '#'
            call    print_char
            pop     af
            ret

; ╨Я╨╡╤З╨░╤В╤М ╤А╨╡╨│╨╕╤Б╤В╤А╨░ A=0..7; 8/16
print_register:

            push    af
            ld      de, name_r8
            ld      a, (_param_bitdir)      ; ╨Я╨╛╨╗╤Г╤З╨╕╨╝ ╨┐╨░╤А╨░╨╝╨╡╤В╤А╤Л bit/dir
            and     1
            jr      z, .is8bit
            ld      de, name_r16            ; ╨Т╤Л╨▒╤А╨░╤В╤М ╤В╨░╨▒╨╗╨╕╤Ж╤Г ╤Б 16 ╨▒╨╕╤В╨╜╤Л╨╝╨╕ ╤А╨╡╨│╨╕╤Б╤В╤А╨░╨╝╨╕
.is8bit:    pop     af
            call    print_nt
            ret

; ╨а╨░╤Б╤И╨╕╤А╨╡╨╜╨╕╨╡ ╨╖╨╜╨░╨║╨░ A -> BC
signextend: ld      b, 0
            ld      c, a
            bit     7, a
            ret     z
            dec     b
            ret

; ╨Ф╨╛╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡ ╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨╕ ╨┐╤А╨╛╨▒╨╡╨╗╨░╨╝╨╕
spacexpand: ld      a, (_param_cnt)
            sub     7
            jr      nc, .nopad
            neg                 ; a = 7-<cnt>
            ld      b, a
            ld      a, ' '
.sppad:     call    print_char
            djnz    .sppad

            ; ╨Т╤Б╨╡╨│╨┤╨░ ╨┐╨╡╤З╨░╤В╨░╤В╤М ╨┐╤А╨╛╨▒╨╡╨╗ ╨┐╨╛╤Б╨╗╨╡ ╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨╕
.nopad:     ld      a, ' '
            call    print_char
            ret

; ╨з╤В╨╡╨╜╨╕╨╡ ╤Б╨╗╨╛╨▓╨░ ╨▓ BC
readword:   call    read
            ld      c, a
            call    read
            ld      b, a
            ret

; ----------------------------------------------------------------------
; ╨Т╤Л╨▓╨╡╤Б╤В╨╕ modrm ╨▓ ╨┐╨╛╤В╨╛╨║
; ----------------------------------------------------------------------

show_modrm: ; ╨з╨╕╤В╨░╨╡╨╝ ╨▒╨░╨╣╤В modrm
            call    load_modrm

            ; ╨Я╤А╨╛╨▓╨╡╤А╤П╨╡╨╝ ╨╜╨░╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡
.ready:     ld      a, (ix+1)
            and     2
            jr      nz, .dir2

            ; DIR=0
            call    print_part_rm
            ld      a, ','
            call    print_char
            call    print_part_reg
            ret

            ; DIR=1
.dir2:      call    print_part_reg
            ld      a, ','
            call    print_char
            call    print_part_rm
            ret

; ╨Я╨╡╤З╨░╤В╤М r/m ╤З╨░╤Б╤В╨╕ modrm
print_part_rm:

            ld      de, name_modrm_table
            ld      a, (_param_mod)
            and     a
            jr      z, modrm_mod0
            dec     a
            jr      z, modrm_mod1
            dec     a
            jr      z, modrm_mod2
            jr      modrm_mod3

; ============ ╨Э╨╡╤В Displacement
modrm_mod0: call    modrm_leader
            ld      a, (_param_r_m)
            cp      6
            jr      nz, .mm0s
            call    read            ; ╨а╨╡╨╢╨╕╨╝ 6 => 16-╨▒╨╕╤В╨╜╤Л╨╣ ╨░╨┤╤А╨╡╤Б
            ld      c, a
            call    read
            ld      b, a
            call    print_uint16
            jr      .mm1s
.mm0s:      call    print_nt
.mm1s:      ld      a, ']'
            call    print_char
            ret

; ============= Displacement 8
modrm_mod1: call    modrm_leader
            ld      a, (_param_r_m)
            call    print_nt
            call    read
            call    print_int8
            jr      modrm_mod0.mm1s

; ============= Displacement 16
modrm_mod2: call    modrm_leader
            ld      a, (_param_r_m)
            call    print_nt
            call    read            ; 16-╨▒╨╕╤В╨╜╤Л╨╣ ╨░╨┤╤А╨╡╤Б
            ld      c, a
            call    read
            ld      b, a
            call    print_int16
            jr      modrm_mod0.mm1s

; ============= Register
modrm_mod3: ld      a, (_param_r_m)
            call    print_register
            ret

; ╨Я╨╡╤З╨░╤В╤М ╤Б╨╡╨│╨╝╨╡╨╜╤В╨╜╨╛╨│╨╛ ╨┐╤А╨╡╤Д╨╕╨║╤Б╨░
modrm_leader:
            ld      de, name_modrm_table
            bit     0, (ix+1) ; bitdir
            ld      a, 8
            jr      z, .bytep
            ld      a, 9
.bytep:     call    print_nt
            ld      a, '['
            call    print_char
            ld      a, (_param_segpfx)
            and     a
            ret     z
            push    de
            ld      de, name_seg
            call    print_nt
            ld      a, ':'
            call    print_char
            pop     de
            ret

; ----------------------------------------------------------------------
; ╨Ч╨░╨│╤А╤Г╨╖╨║╨░ modrm ╨╕ ╤А╨░╨╖╨▒╨╛╤А
; ----------------------------------------------------------------------

load_modrm:

            call    read
            push    bc
            ld      b, a
            and     7
            ld      (_param_r_m), a
            ld      a, b
            rrca
            rrca
            rrca
            ld      b, a
            and     7
            ld      (_param_reg), a
            ld      a, b
            rrca
            rrca
            rrca
            and     3
            ld      (_param_mod), a
            pop     bc
            ret

; ╨Т╤Л╨┤╨░╤З╨░ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ A ╨▓ ╨╖╨░╨▓╨╕╤Б╨╕╨╝╨╛╤Б╤В╨╕ ╨╛╤В DIR
print_part_reg:

            ld      a, (_param_reg)
            call    print_register
            ret

; ----------------------------------------------------------------------
; ╨Т╤Л╤З╨╕╤Б╨╗╨╡╨╜╨╕╨╡ ╤Б╨╡╨│╨╝╨╡╨╜╤В╨╜╨╛╨│╨╛ ╨┐╤А╨╡╤Д╨╕╨║╤Б╨░, ╨╡╤Б╨╗╨╕ ╨╛╨╜ ╨╡╤Б╤В╤М
; ----------------------------------------------------------------------
deb_setprefix:

            ld      b, 1
            cp      $26
            jr      z, .set     ; es=1
            inc     b
            cp      $2e
            jr      z, .set     ; cs
            inc     b
            cp      $36
            jr      z, .set     ; ss
            inc     b
            cp      $3e
            jr      z, .set     ; ds
            inc     b
            cp      $64
            jr      z, .set     ; fs
            inc     b
            cp      $65
            jr      z, .set     ; gs
            cp      $66
            jr      z, .opsize
            cp      $67
            jr      z, .adsize
            ret                 ; ZF=0
.set:       ld      a, b
            ld      (_param_segpfx), a
            ret                 ; ZF=1
.opsize:    ret                 ; ╨а╨░╤Б╤И╨╕╤А╨╡╨╜╨╕╨╡ ╨┤╨╛ 32-╤Е ╨▒╨╕╤В ╨╜╨╡ ╤А╨╡╨░╨╗╨╕╨╖╨╛╨▓╨░╨╜╨╛
.adsize:    ret                 ; ╨а╨░╤Б╤И╨╕╤А╨╡╨╜╨╕╨╡ ╨┤╨╛ 32-╤Е ╨▒╨╕╤В ╨╜╨╡ ╤А╨╡╨░╨╗╨╕╨╖╨╛╨▓╨░╨╜╨╛