Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Вектор (http://zx-pk.ru/forumdisplay.php?f=55)
-   -   Определение типа процессора на клонах Вектора (http://zx-pk.ru/showthread.php?t=20002)

ivagor 7th September 2012 07:15

Определение типа процессора на клонах Вектора
 
Выкладываю фрагмент своей программки с subjем, определяются Z80, 580ВМ1, 580ВМ80, 1821ВМ85:

;Определение типа процессора
xra a
dcr a
jpe cpuNotZ80
;Z80
lxi h,Z80txt
shld cputype+1
jmp PrintResult

cpuNotZ80:
push psw
pop h
mov e,l
mvi a,00001010b
xra l
mov l,a
push h
pop psw
push psw
pop h
mov a,l
xra e
cpi 00001000b
jz ItsVM1 ;переход, если 580ВМ1
cpi 00000010b
jnz PrintResult ;переход, если 580ВМ80
;1821ВМ85
lxi h,i8085txt

Несомненно можно сделать короче, но мне не кажется это важным для данного применения.

PPC 7th September 2012 18:33

Спасибо, ivagor
Вот мой вариант, но не определяет i8085

;OUTPUT
; <A> - CPU type: 0-i8080, 1-KP580BM1, 2-Zilog z80
; <HL>- 0-terminated string with corresponding CPU type
;REMARKS: <BC> and <FLAGS> are not saved

CPUTXT: lxi h,_z80
lxi b,0220h
mov a,b
inr b
rpo ; 2 is returned when z80
lxi h,_580VM1
push b
pop psw
push psw
pop b
mov a,c
sui 21h
rp ; 1 is returned when KP580BM1
lxi h,_i8080
xra a
ret

DSeg

_i8080: DB "i8080",0
_580VM1:DB "KP580BM1",0
_z80: DB "z80",0

Tim0xA 7th September 2012 18:57

У меня в архиве нашелся еще один вариант
Code:

                cpu 8080
                org 100h
       
                lxi        d, hellojpg
                mvi        c, 9
                call        5
                call        cpudetect
                mvi        c, 9
                call        5
                ret
hellojpg        db        "DETECTING CPU TYPE",0dh,0ah,"THE CPU IS: $"
msg_z80                db        "Z80$"
msg_8080        db        "KP580BM80A$"
msg_vm1                db        "KP580BM1$"
cpudetect:        lxi        d, msg_z80
                xra        a
                dcr        a
                rpo
                lxi        h, 0020h
                push        h
                pop        psw
                push        psw
                pop        h
                mvi        a, 20h
                ana        l
                jz        kr580
                lxi        d, msg_vm1
                ret
kr580:                lxi        d, msg_8080
                ret
                end


svofski 7th September 2012 19:12

Узнаю свой код? Кто бы еще назвал метку hellojpg :D

ivagor 7th September 2012 21:41

1 Attachment(s)
Ну вы даете!
Мне стало стыдно за страшный первоначальный вариант, поэтому пришлось улучшать. Решил сделать под дос, поэтому в качестве прототипа взял вариант svofski.
Code:

                .org 100h

                lxi        d, msg_cpu
                mvi        c, 9
                call        5
                call        cpudetect
                mvi        c, 9
                call        5
                ret
msg_cpu                .db        "CPU $"
msg_z80                .db        "Z80$"
msg_8080        .db        "580BM80$"
msg_8085        .db        "1821BM85$"
msg_vm1                .db        "580BM1$"
cpudetect:        lxi        d, msg_z80
                xra        a
                dcr        a
                rpo
                mvi        l, 00001000b
                push        h
                pop        psw
                push        psw
                pop        h
                xra        a
                ora        l
                lxi        d, msg_8085
                rz
                lxi        d, msg_8080
                rpo
                lxi        d, msg_vm1
                ret

                .end


ivagor 8th September 2012 07:53

1 Attachment(s)
Еще один вариант, он на два байта короче и, если заменить возвраты на переходы, может обойтись без стека (сама детектилка, без обращений к дос). Используются недокументированные команды 8080 и 8085.
Code:

                .org 100h

                lxi        d, msg_cpu
                mvi        c, 9
                call        5
                call        cpudetect
                mvi        c, 9
                call        5
                ret
msg_cpu                .db        "CPU $"
msg_z80                .db        "Z80$"
msg_8085        .db        "1821BM85$"
msg_8080        .db        "580BM80$"
msg_vm1                .db        "580BM1$"
cpudetect:        lxi        d, msg_z80
                xra        a
                dcr        a
                rpo
                lxi        d, msg_8080
                lxi        h, 3835h
                shlx
                mov        d, h
                mov        e, l
                dsub        d
                lxi        d, msg_vm1
                rz
                lxi        d, msg_8085
                ret

                .end


P.S.
Добавил в архив "автономный" вариант, работающий без доса на клонах вектора.

PPC 8th September 2012 14:15

Ещё бы очень хотелось, чтобы в аккумуляторе возвращались различные значения, ну, скажем, 0,1,2,3 или, если слишком код распухнет какие-нибудь 1,2,4,8. Первое предпочтительнее, потому что легче потом использовать в самомодифицирующемся коде для вычисления адреса перехода.

ivagor 8th September 2012 14:44

Quote:

Originally Posted by PPC (Post 538248)
Ещё бы очень хотелось, чтобы в аккумуляторе возвращались различные значения, ну, скажем, 0,1,2,3

Например так? :
<A> - CPU type: 0-i8080, 1-KP580BM1, 2-Zilog z80, 3-1821BM85
Code:

cpudetect:        lxi        d, msg_z80
                xra        a
                dcr        a
                mvi        a, 2
                rpo
                lxi        d, msg_8080
                lxi        h, первые две буквы msg_8080
                xra        a
                shlx
                mov        d, h
                mov        e, l
                dsub        d
                lxi        d, msg_vm1
                mvi        a, 1
                rz
                lxi        d, msg_8085
                mvi        a, 3
                ret

А лучше (на 2 байта короче) так:
<A> - CPU type: 0-i8080, 1-KP580BM1, 2-1821BM85, 3-Zilog z80
Code:

cpudetect:        lxi        d, msg_z80
                xra        a
                dcr        a
                mvi        a, 3
                rpo
                lxi        d, msg_8080
                lxi        h, первые две буквы msg_8080
                xra        a
                shlx
                inr        a
                mov        d, h
                mov        e, l
                dsub        d
                lxi        d, msg_vm1
                rz
                lxi        d, msg_8085
                inr        a
                ret


PPC 8th September 2012 15:30

Вот, прямо из печки

Code:

;OUTPUT
; <A> - CPU type: 0-i8080, 1-KP580BM1, 2-Zilog z80, 3-i8085
; <HL>- 0-terminated string with corresponding CPU type
;REMARKS: <BC> and <FLAGS> are not saved

CPUTXT:        lxi        h,_z80
        lxi        b,0208h
        mov        a,b
        inr        b
        rpo        ; 2 is returned when z80
        push        b
        pop        psw
        push        psw
        pop        b
        xra        a
        ora        c
        lxi        h,_i8085
        mov        a,b
        rz
        lxi        h,_580VM1
        mov        a,c
        sui        9h
        rp        ; 1 is returned when KP580BM1
        lxi        h,_i8080
        xra        a
        ret


_i8080:        DB        "i8080",0
_580VM1:  DB        "KP580BM1",0
_z80:        DB        "z80",0
_i8085:      DB        "i8085",0



---------- Post added at 06:30 ---------- Previous post was at 06:28 ----------

Quote:

Originally Posted by ivagor (Post 538254)
Например так? :
А лучше (на 2 байта короче) так:
<A> - CPU type: 0-i8080, 1-KP580BM1, 2-1821BM85, 3-Zilog z80
Code:

cpudetect:        lxi        d, msg_z80
                xra        a
                dcr        a
                mvi        a, 3
                rpo
                lxi        d, msg_8080
                lxi        h, первые две буквы msg_8080
                xra        a
                shlx
                inr        a
                mov        d, h
                mov        e, l
                dsub        d
                lxi        d, msg_vm1
                rz
                lxi        d, msg_8085
                inr        a
                ret


Вот этот! Это-запредел. Мой уже смотрится уродливо :-)

ivagor 8th September 2012 15:48

В принципе можно еще пару байт сбросить заменой lxi d на mvi e, если адреса всех текстовых сообщений (вернее попарно msg_z80 и msg_8080; msg_vm1 и msg_8085) имеют одинаковый старший байт.

Все варианты хорошие, только некоторые более спортивные :)


All times are GMT +4. The time now is 23:40.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.