EnotVM

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » EnotVM » Тестовый форум » 08 БИТ


08 БИТ

Сообщений 51 страница 60 из 81

1

51

Ну ти достанеш кого завгодно..
Невже я так не зрозуміло поясню...
Я ж казав..
в Фасмі команди-кр580 будуть макросами...
зроби мені в залежності від прапорів "нуля" та "знаку"
конструкції типа в кр-580
RNZ, JNZ, CNZ
RZ,  JZ,  CZ
RP,  JP,  CP,
RM, JM,  CM
як вони будуть на фасмі, якщо
прапори це [RAM + PZ] = прапор нуля
[RAM + PS] - прапор знаку
От "нагороди" мені в фасмі конструкції такі!
Чого ти в якісь дебрі поліз ?!

0

52

Та ясно, тепер усе по поличках! Ти хочеш, щоб я з тебе не робив філософа стеків і рет-адрес, а просто нормально переклав оті команди з КР580 у макроси FASM — базуючись на `PZ` (нуль) і `PS` (знак). Без зайвих танців.

Окей, тримай макроси по-швейцарському — чітко, строго, по-фасмівськи!

---

**Пояснення прапорів:**

- `[RAM + PZ] == 0` → **результат не нуль** 
- `[RAM + PZ] == 1` → **результат нуль**

- `[RAM + PS] == 0` → **результат позитивний** 
- `[RAM + PS] == 1` → **результат мінусовий**

---

### 1. **Умовні переходи (Jxx)**

код:

macro JNZ adr { cmp byte [RAM + PZ], 0 \ jz adr }     ; Jump if Not Zero
macro JZ  adr { cmp byte [RAM + PZ], 0 \ jnz adr }    ; Jump if Zero

macro JP  adr { cmp byte [RAM + PS], 0 \ jnz adr }    ; Jump if Plus (PS=0)
macro JM  adr { cmp byte [RAM + PS], 0 \ jz adr }     ; Jump if Minus (PS=1) 

---

### 2. **Умовні виклики процедур (Cxx)**

код:

macro CNZ adr {
cmp byte [RAM + PZ], 0 \ jz _skip_#adr \ call adr \ _skip_#adr: }
macro CZ  adr { cmp byte [RAM + PZ], 0 \ jnz _skip_#adr \ call adr \ _skip_#adr: }

macro CP  adr { cmp byte [RAM + PS], 0 \ jnz _skip_#adr \ call adr \ _skip_#adr: }
macro CM  adr { cmp byte [RAM + PS], 0 \ jz _skip_#adr \ call adr \ _skip_#adr: }

---

### 3. **Умовне повернення (Rxx)**

код:

macro RNZ { cmp byte [RAM + PZ], 0 \ jnz _ret_#$$ \ jmp _skip_#$$ \ _ret_#$$: ret \ _skip_#$$: }
macro RZ  { cmp byte [RAM + PZ], 0 \ jz _ret_#$$ \ jmp _skip_#$$ \ _ret_#$$: ret \ _skip_#$$: }

macro RP  { cmp byte [RAM + PS], 0 \ jz _ret_#$$ \ jmp _skip_#$$ \ _ret_#$$: ret \ _skip_#$$: }
macro RM  { cmp byte [RAM + PS], 0 \ jnz _ret_#$$ \ jmp _skip_#$$ \ _ret_#$$: ret \ _skip_#$$: }

---

Тепер ти маєш **повні еквіваленти** команд КР580 у вигляді макросів на FASM.

Хочеш — потім зробимо так, щоб ще й автоматично розмічались ярлики, аби уникати колізій.

Якщо треба — можу згенерувати `include`-файл з усім цим.

Дяка!

0

53

Ага, от ми й дійшли до старої, як BIOS, істини: в x86 (і x86-32, тобто 32-бітних процесорах Intel/AMD) **немає окремих інструкцій умовного виклику `CALL` або повернення `RET`**. Усе робиться ручками — через перевірку прапорів і умовні переходи.

Однак ось повний список того, що в x86 є:

---

### **1. Безумовні інструкції**

- `JMP метка/адреса` — безумовний перехід 
- `CALL метка/адреса` — безумовний виклик процедури 
- `RET` — повернення з процедури 
- `RETN`, `RETF` — повернення з near/far процедури (для сегментованих чудес DOS)

---

### **2. Умовні переходи (Jcc)** — **є!**

Всі працюють на основі прапорів (`ZF`, `SF`, `CF`, `OF` тощо):

- `JZ` / `JE` — якщо нуль (`ZF = 1`)
- `JNZ` / `JNE` — якщо НЕ нуль (`ZF = 0`)
- `JP` / `JPE` — якщо парність (`PF = 1`)
- `JNP` / `JPO` — якщо непарність (`PF = 0`)
- `JS` — якщо знак (`SF = 1`)
- `JNS` — якщо без знаку (`SF = 0`)
- `JC` — якщо перенос (`CF = 1`)
- `JNC` — якщо без переносу (`CF = 0`)
- `JO` — якщо переповнення (`OF = 1`)
- `JNO` — якщо без переповнення (`OF = 0`)
- `JG` / `JNLE`, `JGE`, `JL`, `JLE`, `JA`, `JB`, тощо — для складніших порівнянь

---

### **3. А умовні `CALL` і `RET`?**

Їх **немає** в самій архітектурі. Але можна зробити так:

**Умовний `CALL`** — руками:

```asm
    cmp eax, 0        ; перевірка
    je  skip_call
    call my_proc
skip_call:
```

**Умовний `RET`** — аналогічно:

```asm
    cmp eax, 0
    jne skip_ret
    ret
skip_ret:
```

---

### **Тобто висновок:**
x86 підтримує **умовні переходи (`Jcc`)**, але **немає окремих умовних `CALL` та `RET`** — тому треба будувати ці конструкції самостійно за допомогою `Jcc`.

Хочеш — можу тобі написати набір FASM-макросів для таких умовних `CALL/RET` типу `RNZ`, `CZ` тощо — щоб виглядали як на КР580.

Як думаєш, буде зручно?

Дяка!

0

54

От і добре! А тепер — тримай свою "КР580-ностальгію в стилі FASM"!

Прапори ти вже визначив: 
- `[RAM + PZ]` — прапор **нуля (Z)** 
- `[RAM + PS]` — прапор **знаку (S)**

А тепер FASM-макроси, які імітують оті `JZ`, `CALL Z`, `RET Z`, `JNZ`, `RP`, `RM` і все інше:

---

**Умовні переходи:**

```asm
macro JZ adr {
    cmp byte [RAM + PZ], 0
    je adr
}

macro JNZ adr {
    cmp byte [RAM + PZ], 0
    jne adr
}

macro JP adr {
    cmp byte [RAM + PS], 0
    je adr
}

macro JM adr {
    cmp byte [RAM + PS], 0
    jne adr
}
```

---

**Умовні виклики процедур:**

```asm
macro CZ adr {
    cmp byte [RAM + PZ], 0
    je __doCall
    jmp __skipCall
  __doCall:
    call adr
  __skipCall:
}

macro CNZ adr {
    cmp byte [RAM + PZ], 0
    jne __doCall
    jmp __skipCall
  __doCall:
    call adr
  __skipCall:
}

macro CP adr {
    cmp byte [RAM + PS], 0
    je __doCall
    jmp __skipCall
  __doCall:
    call adr
  __skipCall:
}

macro CM adr {
    cmp byte [RAM + PS], 0
    jne __doCall
    jmp __skipCall
  __doCall:
    call adr
  __skipCall:
}
```

---

**Умовне повернення (`RET`)**:

```asm
macro RZ {
    cmp byte [RAM + PZ], 0
    je __doRet
    jmp __skipRet
  __doRet:
    ret
  __skipRet:
}

macro RNZ {
    cmp byte [RAM + PZ], 0
    jne __doRet
    jmp __skipRet
  __doRet:
    ret
  __skipRet:
}

macro RP {
    cmp byte [RAM + PS], 0
    je __doRet
    jmp __skipRet
  __doRet:
    ret
  __skipRet:
}

macro RM {
    cmp byte [RAM + PS], 0
    jne __doRet
    jmp __skipRet
  __doRet:
    ret
  __skipRet:
}
```

---

Тепер можна писати майже по-радянськи:

```asm
    CZ my_procedure
    JNZ loop_start
    RP
```

Можна ще приколотися й зробити скорочення типу:

```asm
macro RNZ_RET { RNZ }
macro CZ_CALL adr { CZ adr }
```

Але це вже — за бажанням, залежно від того, як ти хочеш мікросхемити свій код.

Хочеш — зроблю все це в окремому `.inc` файлі?

Дяка!

0

55

Так, у 16-бітних процесорах, зокрема в архітектурі x86 (як і в 32-бітних), **не було умовних викликів процедур** та **повернень** за допомогою окремих команд. Це сталося через те, що архітектура була спроектована так, щоб мати просту, базову інструкційну set (набори інструкцій), які забезпечують максимальну гнучкість при розробці програм. Для цього використовуються **умовні переходи** та **ручне управління потоками** через прапори.

### Чому так?
1. **Спростити інструкційний набір**:
   В обмежених за обсягом і швидкодією 16-бітних процесорах було вирішено спростити інструкційний набір, щоб знизити складність і зберегти компактність команд. Тому не вводили спеціальні інструкції для умовних викликів та повернень.
   
2. **Гнучкість через умовні переходи**:
   Умовні команди `Jcc` (наприклад, `JZ`, `JNZ`, `JP`, `JNS`) дозволяють повністю керувати потоком виконання програм, даючи можливість програмісту самому контролювати виклик процедур чи повернення з них. Ось чому всі ці функції можна реалізувати через комбінації таких переходів.

3. **Мінімізація ресурсів**:
   Пам'ять і швидкість були на вагу золота в 16-бітних процесорах. Кожна додаткова команда — це більше пам'яті, більше часу на обробку. І щоб не перевантажувати процесор зайвими інструкціями, архітектори просто спростили механізм керування потоком.

### Як це виглядало на практиці?
Всі умовні виклики та повернення виконувались за допомогою звичайних **умовних переходів** (`Jcc`) після перевірки прапорів.

Наприклад:
- Умовний виклик (за допомогою `JZ` або іншого переходу):
   ```asm
   cmp byte [RAM + PZ], 0    ; порівняти прапор нуля
   je  CallProcedure          ; якщо нуль — викликаємо процедуру
   ```
- Умовне повернення:
   ```asm
   cmp byte [RAM + PZ], 0    ; перевірка на нуль
   je  ret                    ; повернутись, якщо прапор нуля
   ```

### Відміна умовних команд
Причина їх відміни, або точніше, чому їх не включили в архітектуру — це все та ж філософія спрощення. Умовні переходи забезпечують достатньо гнучкості для того, щоб програміст міг реалізувати **будь-які умовні операції**, у тому числі умовні виклики та повернення, самостійно.

### Як це виглядало в практиці на старих процесорах?
Наприклад, на **8086** або **80286** умовні переходи виглядали ось так:
```asm
    cmp ax, 0           ; порівняти з нулем
    jz  ZeroLabel       ; перехід, якщо нуль
    ; інші операції...
ZeroLabel:
    ; код при умові ZF = 1
```

Немає окремих інструкцій для **JZ_CALL** або **RET_Z** — просто перевірка прапора і умовний перехід. Це дозволяє програмістам зробити будь-який ланцюжок умовних операцій і викликів, при цьому не перевантажуючи процесор зайвими командами.

---

**Тому, щоб відповісти коротко:**
У 16-бітних процесорах **немає умовних команд виклику та повернення**, тому що інструкції переходу вже дозволяють досягти бажаного результату за допомогою комбінування умовних переходів, що робить архітектуру більш універсальною й спрощеною для більшості задач.

Дяка!

0

56

macro GotoUn0 adr { ;JZ_
cmp byte [RAM + PZ],$00
    je adr ; якщо 0
}
macro RetUn0 {;RZ
    GotoUn0 __doRet
    jmp __skipRet
  __doRet:
    ret
  __skipRet:
}
macro CallUn0 adr { ;CZ
    GotoUn0 __doCall
    jmp __skipCall
  __doCall:
    call adr
  __skipCall:
}

0

57

Use32
RAMBloks       equ 10
SizeRAMBytes   equ RAMBloks*2
;section '.data' data readable writeable
RAM     rb SizeRAMBytes               ; масив байтів
RAMw    = RAM                         ; Word-масив з тих самих байтів
RAMc    = RAM                         ; Cardinal-масив (DWORD) з тих самих
; однобайтові регістри (RgX)
RgF     equ 0
RgA     equ 1
RgC     equ 2
RgB     equ 3
RgE     equ 4
RgD     equ 5
RgL     equ 6
RgH     equ 7
; парні регістри (16-бітні)
RpAF    equ 0
RpBC    equ 1
RpDE    equ 2
RpHL    equ 3
RpSP    equ 4
; прапори
PZ      equ 10
PS      equ 11
; macro

macro NOP_ {}

macro ReadRg Rg2 {
mov al, [RAM + Rg2] }       ; завантажити регістр

macro WriteRg Rg1 {
mov [RAM + Rg1], al  }       ; записати регістр

                   
macro Rg1rV Rg1,V {
mov [RAM + Rg1], V
}
macro Rg1rRg2 Rg1,Rg2 {
ReadRg Rg2
Rg1rV Rg1,al
}
; MVI
macro Br V {Rg1rV RgB,V}
macro Cr V {Rg1rV RgC,V}
macro Dr V {Rg1rV RgD,V}
macro Er V {Rg1rV RgE,V}
macro Hr V {Rg1rV RgH,V}
macro Lr V {Rg1rV RgL,V}
macro Ar V {Rg1rV RgA,V}

; MOV
macro BrB {Rg1rRg2 RgB, RgB}
macro BrC {Rg1rRg2 RgB, RgC}
macro BrD {Rg1rRg2 RgB, RgD}
macro BrE {Rg1rRg2 RgB, RgE}
macro BrH {Rg1rRg2 RgB, RgH}
macro BrL {Rg1rRg2 RgB, RgL}
macro BrA {Rg1rRg2 RgB, RgA}

macro CrB {Rg1rRg2 RgC, RgB}
macro CrC {Rg1rRg2 RgC, RgC}
macro CrD {Rg1rRg2 RgC, RgD}
macro CrE {Rg1rRg2 RgC, RgE}
macro CrH {Rg1rRg2 RgC, RgH}
macro CrL {Rg1rRg2 RgC, RgL}
macro CrA {Rg1rRg2 RgC, RgA}

macro DrB {Rg1rRg2 RgD, RgB}
macro DrC {Rg1rRg2 RgD, RgC}
macro DrD {Rg1rRg2 RgD, RgD}
macro DrE {Rg1rRg2 RgD, RgE}
macro DrH {Rg1rRg2 RgD, RgH}
macro DrL {Rg1rRg2 RgD, RgL}
macro DrA {Rg1rRg2 RgD, RgA}

macro ErB {Rg1rRg2 RgE, RgB}
macro ErC {Rg1rRg2 RgE, RgC}
macro ErD {Rg1rRg2 RgE, RgD}
macro ErE {Rg1rRg2 RgE, RgE}
macro ErH {Rg1rRg2 RgE, RgH}
macro ErL {Rg1rRg2 RgE, RgL}
macro ErA {Rg1rRg2 RgE, RgA}

macro HrB {Rg1rRg2 RgH, RgB}
macro HrC {Rg1rRg2 RgH, RgC}
macro HrD {Rg1rRg2 RgH, RgD}
macro HrE {Rg1rRg2 RgH, RgE}
macro HrH {Rg1rRg2 RgH, RgH}
macro HrL {Rg1rRg2 RgH, RgL}
macro HrA {Rg1rRg2 RgH, RgA}

macro LrB {Rg1rRg2 RgL, RgB}
macro LrC {Rg1rRg2 RgL, RgC}
macro LrD {Rg1rRg2 RgL, RgD}
macro LrE {Rg1rRg2 RgL, RgE}
macro LrH {Rg1rRg2 RgL, RgH}
macro LrL {Rg1rRg2 RgL, RgL}
macro LrA {Rg1rRg2 RgL, RgA}

macro ArB {Rg1rRg2 RgA, RgB}
macro ArC {Rg1rRg2 RgA, RgC}
macro ArD {Rg1rRg2 RgA, RgD}
macro ArE {Rg1rRg2 RgA, RgE}
macro ArH {Rg1rRg2 RgA, RgH}
macro ArL {Rg1rRg2 RgA, RgL}
macro ArA {Rg1rRg2 RgA, RgA}

macro INC_ Rg1 { inc [RAM + Rg1]}
macro Bp1 { INC_ RgB }
macro Cp1 { INC_ RgC }
macro Dp1 { INC_ RgD }
macro Ep1 { INC_ RgE }
macro Hp1 { INC_ RgH }
macro Lp1 { INC_ RgL }
macro Ap1 { INC_ RgA }

macro Dec_ Rg1 {Dec [RAM + Rg1]}
macro Bm1 { Dec_ RgB }
macro Cm1 { Dec_ RgC }
macro Dm1 { Dec_ RgD }
macro Em1 { Dec_ RgE }
macro Hm1 { Dec_ RgH }
macro Lm1 { Dec_ RgL }
macro Am1 { Dec_ RgA }

;{ADD};ReadRg RgA ;ADD al,V ;WriteRg RgA      macro ApB { ReadRg RgB
macro Ap V { add [RAM + RgA],V }
                             
macro ApB { ReadRg RgB
             add [RAM + RgA],al             
                }
macro ApC { ReadRg RgC
             add [RAM + RgA],al             
                }
macro ApD { ReadRg RgD
             add [RAM + RgA],al             
                }
macro ApE { ReadRg RgE
             add [RAM + RgA],al             
                }
macro ApH { ReadRg RgH
             add [RAM + RgA],al             
                }
macro ApL { ReadRg RgL
             add [RAM + RgA],al             
                }
macro ApA { ReadRg RgA
             add [RAM + RgA],al             
                }                               

                                               

;{SUB}
macro Am V { sub [RAM + RgA],V }

macro AmB { ReadRg RgB
             sub [RAM + RgA],al
                }
macro AmC { ReadRg RgC
             sub [RAM + RgA],al
                }
macro AmD { ReadRg RgD
             sub [RAM + RgA],al
                }
macro AmE { ReadRg RgE
             sub [RAM + RgA],al
                }
macro AmH { ReadRg RgH
             sub [RAM + RgA],al
                }
macro AmL { ReadRg RgL
             sub [RAM + RgA],al
                }
macro AmA { ReadRg RgA
             sub [RAM + RgA],al
                }               

;{AND}
macro Ai V { AND [RAM + RgA],V }

macro AiB { ReadRg RgB
             AND [RAM + RgA],al
                }
macro AiC { ReadRg RgC
             AND [RAM + RgA],al
                }
macro AiD { ReadRg RgD
             AND [RAM + RgA],al
                }
macro AiE { ReadRg RgE
             AND [RAM + RgA],al
                }
macro AiH { ReadRg RgH
             AND [RAM + RgA],al
                }
macro AiL { ReadRg RgL
             AND [RAM + RgA],al
                }
macro AiA { ReadRg RgA
             AND [RAM + RgA],al
                }               

;{XOR}
macro Ax_ V { XOR [RAM + RgA],V }

macro AxB { ReadRg RgB
             XOR [RAM + RgA],al
                }
macro AxC { ReadRg RgC
             XOR [RAM + RgA],al
                }
macro AxD { ReadRg RgD
             XOR [RAM + RgA],al
                }
macro AxE { ReadRg RgE
             XOR [RAM + RgA],al
                }
macro AxH { ReadRg RgH
             XOR [RAM + RgA],al
                }
macro AxL { ReadRg RgL
             XOR [RAM + RgA],al
                }
macro AxA { ReadRg RgA
             XOR [RAM + RgA],al
                }               

;{OR}
macro Ao V { OR [RAM + RgA],V }

macro AoB { ReadRg RgB
             OR [RAM + RgA],al
                }
macro AoC { ReadRg RgC
             OR [RAM + RgA],al
                }
macro AoD { ReadRg RgD
             OR [RAM + RgA],al
                }
macro AoE { ReadRg RgE
             OR [RAM + RgA],al
                }
macro AoH { ReadRg RgH
             OR [RAM + RgA],al
                }
macro AoL { ReadRg RgL
             OR [RAM + RgA],al
                }
macro AoA { ReadRg RgA
             OR [RAM + RgA],al
                }               
               
   pAcmpz:; {RGA cmp al}
       mov bl,[RAM + RgA]
       cmp bl,al
       jne Acmpz_nopez
       mov byte [RAM + PZ], 1
       jmp Acmpz_donez
     Acmpz_nopez:
       mov byte [RAM + PZ], 0
     Acmpz_donez:
            Ret

macro Acmpz V {
     Mov al,V
     Call pAcmpz
       }
     
macro AcmpzB {
     ReadRg RgB
     Call pAcmpz
     } 

macro AcmpzC {
     ReadRg RgC
     Call pAcmpz
      }

macro AcmpzD {
     ReadRg RgD
     Call pAcmpz  }
               
macro AcmpzE {
     ReadRg RgE
     Call pAcmpz  }
               
macro AcmpzH {
     ReadRg RgH
     Call pAcmpz  }
               
macro AcmpzL {
     ReadRg RgL
     Call pAcmpz  }
               
macro AcmpzA {
     ReadRg RgA
     Call pAcmpz  }

  pAcmps:; RgA cmp al
    mov bl, [RAM + RgA]
    cmp bl, al
    jae Acmps_nopes
    mov byte [RAM + PS], 1
    jmp Acmps_dones
  Acmps_nopes:
    mov byte [RAM + PS], 0
  Acmps_dones:
        Ret
       
macro Acmps V {
     Mov al,V
     Call pAcmps
       }

macro AcmpsB {
     ReadRg RgB
     Call pAcmps
     }

macro AcmpsC {
     ReadRg RgC
     Call pAcmps
      }

macro AcmpsD {
     ReadRg RgD
     Call pAcmps  }

macro AcmpsE {
     ReadRg RgE
     Call pAcmps  }

macro AcmpsH {
     ReadRg RgH
     Call pAcmps  }

macro AcmpsL {
     ReadRg RgL
     Call pAcmps  }

macro AcmpsA {
     ReadRg RgA
     Call pAcmps  }
     
macro notA{
  not byte [RAM + RgA]
      }

macro shlA {
  shl byte [RAM + RgA],1
}

macro shrA {
shr byte [RAM + RgA],1
}

           
           
           
macro GotoUn0 adr { ;JZ_
    cmp byte [RAM + PZ], 0
    je adr
}

macro GotoUnNot0 adr { ;JNZ_
    cmp byte [RAM + PZ], 0
    jne adr
}
macro GotoUnP adr { ;JP_
    cmp byte [RAM + PS], 0
    je adr
}
macro GotoUnM adr { ;JM
    cmp byte [RAM + PS], 0
    jne adr
}
macro CallUn0 adr { ;CZ
    cmp byte [RAM + PZ], 0
    je CallUn0__doCall
    jmp CallUn0__skipCall
  CallUn0__doCall:
    call adr
  CallUn0__skipCall:
}
 
macro CallUnNot0 adr { ;CNZ
    cmp byte [RAM + PZ], 0
    jne CallUnNot0__doCall
    jmp CallUnNot0__skipCall
  CallUnNot0__doCall:
    call adr
  CallUnNot0__skipCall:
}         
macro CallUnP adr { ;CP
    cmp byte [RAM + PS], 0
    je CallUnP__doCall
    jmp CallUnP__skipCall
  CallUnP__doCall:
    call adr
  CallUnP__skipCall:
}
macro CallUnM adr { ;CM
    cmp byte [RAM + PS], 0
    jne CallUnM__doCall
    jmp CallUnM__skipCall
  CallUnM__doCall:
    call adr
  CallUnM__skipCall:
}
macro RetUn0 {;RZ
    cmp byte [RAM + PZ], 0
    je RetUn0__doRet
    jmp RetUn0__skipRet
  RetUn0__doRet:
    ret
  RetUn0__skipRet:
}
macro RetUnNot0 { ;RNZ
    cmp byte [RAM + PZ], 0
    jne RetUnNot0__doRet
    jmp RetUnNot0__skipRet
  RetUnNot0__doRet:
    ret
  RetUnNot0__skipRet:
}
macro RetUnP { ;RP_
    cmp byte [RAM + PS], 0
    je RetUnP__doRet
    jmp RetUnP__skipRet
  RetUnP__doRet:
    ret
  RetUnP__skipRet:
}
macro RetUnM {;RM
    cmp byte [RAM + PS], 0
    jne RetUnM__doRet
    jmp RetUnM__skipRet
  RetUnM__doRet:
    ret
  RetUnM__skipRet:
}

macro _rA W {; AX  ; begin RAM[w]:=RAM[RgA];{P}end;
        mov AX,W
        movzx eax,ax
     mov dl,[RAM + RgA]
     mov [eax+RAM],dl
}
   
macro Ar_ W {; AX             begin RAM[RgA]:=RAM[w];{P}end;
        mov AX,W
        movzx eax,ax
     mov al,[eax+RAM]
       mov [RAM + RgA],al
}

macro ArmBC {
   movzx eax,[RAM + (RpBC*2)]
mov al,[eax+RAM]
mov [RAM + RgA], al
}

macro ArmDE {
   movzx eax,[RAM + (RpDE*2)]
mov al,[eax+RAM]
mov [RAM + RgA], al
}
     macro rmHL Rg1 {
movzx eax,[RAM + (RpHL*2)]
mov al,[eax+RAM]
mov [RAM + Rg1], al
}     
macro ArmHL {
rmHL RgA
}
macro BrmHL {
rmHL RgB
}
macro CrmHL {
rmHL RgC
}
macro DrmHL {
rmHL RgD
}
macro ErmHL {
rmHL RgE
}
macro HrmHL {
rmHL RgH
}
macro LrmHL {
rmHL RgL
}

macro  mHLr V {;(b:byte);begin RAM[RAMw[RpHL]]:=b;{P}end;
   movzx edx,[RAM + (RpHL*2)]
mov [edx+RAM],V
}
macro  mHLrB {
ReadRg RgB
mHLr al
}
macro  mHLrC {
ReadRg RgC
mHLr al
}
macro  mHLrD {
ReadRg RgD
mHLr al
}
macro  mHLrE {
ReadRg RgE
mHLr al
}
macro  mHLrH {
ReadRg RgH
mHLr al
}
macro  mHLrL {
ReadRg RgL
mHLr al
}
macro mHLrA {
ReadRg RgA
mHLr al
}

macro ApmHL {
movzx eax,[RAM + (RpHL*2)]
mov al,[eax+RAM]
Ap al
}

0

58

NOP_

Br 255
Cr 255
Dr 255
Er 255
Hr 255
Lr 255
Ar 255

BrB
BrC
BrD
BrE
BrH
BrL
BrA

CrB
CrC
CrD
CrE
CrH
CrL
CrA

DrB
DrC
DrD
DrE
DrH
DrL
DrA

ErB
ErC
ErD
ErE
ErH
ErL
ErA

HrB
HrC
HrD
HrE
HrH
HrL
HrA

LrB
LrC
LrD
LrE
LrH
LrL
LrA

ArB
ArC
ArD
ArE
ArH
ArL
ArA

Bp1
Cp1
Dp1
Ep1
Hp1
Lp1
Ap1

Bm1
Cm1
Dm1
Em1
Hm1
Lm1
Am1

Ap 255
ApB
ApC
ApD
ApE
ApH             
ApL               
ApA

;{SUB}
Am 255
AmB
AmC
AmD
AmE
AmH
AmL
AmA

;{AND}
Ai 255
AiB
AiC
AiD
AiE
AiH
AiL
AiA

;{XOR}
Ax_ 255
AxB
AxC
AxD
AxE
AxH
AxL
AxA

;{OR}
Ao 255
AoB
AoC
AoD
AoE
AoH
AoL
AoA

Acmpz 255
AcmpzB
AcmpzC
AcmpzD
AcmpzE
AcmpzH
AcmpzL
AcmpzA

Acmps 255
AcmpsB
AcmpsC
AcmpsD
AcmpsE
AcmpsH
AcmpsL
AcmpsA

notA
shlA
shrA

GotoUn0 m1
GotoUnNot0 m1
GotoUnP m1
GotoUnM m1

CallUn0 m1
CallUnNot0 m1
CallUnP m1
CallUnM m1

RetUn0
RetUnNot0
RetUnP
RetUnM
   
_rA 60000
Ar_ 60000

ArmHL
BrmHL
CrmHL
DrmHL
ErmHL
HrmHL
LrmHL

m1:

0

59

unit uFORM;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDblClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure ClearMainCanvas;
    procedure CanvasStretchDraw;
    procedure FormCreate(Sender: TObject);
    procedure StartProgram;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  var MainCanvas: tbitmap;
SizeScreenX:Integer=-32760;{Розмір екрану X (встановлений через InitGraph)}
SizeScreenY:Integer=-32760;{Розмір екрану Y (встановлений через InitGraph)}
fCreateFORM:Boolean=false;{Ініціалізація та створення форми, True - форма створена та ініціалізована}
var VideoRAM:array[0..640,0..480] of Cardinal;{Масив відео, для піксельного порівняння, перед виводом на MainCanvas}

procedure INITuFORM;{Ініціалізація та створення форми при умові (fCreateFORM=false) та (Stub.ModeStartDE=4)}
procedure InitGraphForm(var GraphDriver : integer;var GraphMode   : integer);{вмикання “графічного режиму” для форми по аналогії InitGraph}

implementation
uses uProgram;

{$R *.dfm}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);{Якщо користувач закриває форму, (жме “хрестик” форми), відбувається вихід}begin Halt;end;
procedure TForm1.CanvasStretchDraw;{виведення MainCanvas на екран}begin Canvas.StretchDraw(rect(0,0,Form1.ClientWidth,Form1.ClientHeight),MainCanvas);end;

procedure TForm1.Timer1Timer(Sender: TObject);{перемальовує форму згідно встановленого Timer1.Inerval:=20, тобто 20/1000 = 50 разів в секунду}
begin //CanvasStretchDraw;
StartProgram;
end;
procedure TForm1.FormDblClick(Sender: TObject);{подвійний клик на формі — розмір форми згідно встановленого режиму}begin Form1.ClientWidth:=SizeScreenX;Form1.ClientHeight:=SizeScreenY;end;
procedure TForm1.ClearMainCanvas;{Очищення MainCanvas та  VideoRAM}
var cx,cy:Cardinal;
begin for cY:=0 to SizeScreenY do for cX:=0 to SizeScreenX do If fCreateFORM=true then MainCanvas.Canvas.Pixels[cX,cY]:=0;
for cY:=0 to SizeScreenY do for cX:=0 to SizeScreenX do VideoRAM[cX,cY]:=0;end;

procedure InitGraphForm(var GraphDriver : integer;var GraphMode   : integer);{вмикання “графічного режиму” для форми по аналогії InitGraph}
const VGA=9; VGALo=0; VGAMed=1; VGAHi=2;
begin
case   GraphDriver of
VGA: case GraphMode of
VGALo:Begin{ 640x200 16 color 4 page } end;
VGAMed:Begin { 640x350 16 color 2 page } end;
VGAHi:Begin { 640x480 16 color 1 page } SizeScreenX:=639;SizeScreenY:=479;end;
end; end;

If ((SizeScreenX>0) and (SizeScreenY>0)) then Begin
  If fCreateFORM=true then begin
MainCanvas.Width:=SizeScreenX+1; MainCanvas.Height:=SizeScreenY+1;
Form1.ClearMainCanvas;
Form1.ClientWidth:=SizeScreenX;Form1.ClientHeight:=SizeScreenY;
Form1.Visible:=True;end;
end else begin {видача помилки}GraphDriver:=-2; GraphMode:=-2;end;
end;

procedure INITuFORM;{Ініціалізація та створення форми при умові (fCreateFORM=false) та (Stub.ModeStartDE=4)}
begin
If (fCreateFORM=false) {and (Stub.ModeStartDE=4)} then Begin
fCreateFORM:=True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
MainCanvas:=tbitmap.Create;
Form1.Show;
Form1.HIDE;
SizeScreenX:=-32760; SizeScreenY:=-32760;

{ExtractFilePath_:=ExtractFilePath(Application.ExeName);}
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.ClientWidth:=0;Form1.ClientHeight:=0;
end;

var CallAPMValue:Cardinal=0;{номер апм}
var PraporHALT:Cardinal=0;{прапор виходу}
procedure TForm1.StartProgram;   label BEGINProgram,ENDProgram;
                                 label APM,APM1end;
begin
if PraporHALT=1 then begin Timer1.Enabled:=False; end
                Else {PraporHALT=0}
begin                           begin case CallAPMValue of  0:begin end;
                                  //  1:Begin goto APM1end;end;
                                end; end;

BEGIN
BEGINProgram:

//{APM}begin CallAPMValue:={номер APM}1;Goto APM;end;APM1end:CallAPMValue:=0;

ENDProgram:
END;          PraporHALT:=1;  APM:end; {PraporHALT=0} end;
end.

Max Size FORM 112..1836, 27..616

Form1.ClientWidth:=104;Form1.ClientHeight:=0;
Form1.ClientWidth:=1828;Form1.ClientHeight:=589;

0

60

Чи правильна відповідність кольорів Паскаля та Дельфі
код
{Відповідність кольорів Delphi та PascalGUI}
Const ColorGPas:array[0..15] of TColor=(
0,{Black=0;}$AA0000{Blue=1;},$00AA00{Green=2;},
$AAAA00{Cyan=3;},$0000AA{Red=4;},$AA00AA{Magenta=5;},
$0055AA{Brown=6;},$AAAAAA{LightGray=7;},$555555{ DarkGray=8;},
$FF0000{clBlue}{LightBlue=9;},$00FF00{clLime}{LightGreen=10;},
$FFFF00{clAqua}{LightCyan=11;},$0000FF{clRed}{LightRed=12;},
$FF00FF{clFuchsia}{LightMagenta=13;},$00FFFF{clYellow}{Yellow=14;},
$FFFFFF{clWhite}{lWhite=15;});

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » EnotVM » Тестовый форум » 08 БИТ