08 БИТ
08 БИТ
Сообщений 51 страница 60 из 81
Поделиться512025-04-26 11:26:41
Ну ти достанеш кого завгодно..
Невже я так не зрозуміло поясню...
Я ж казав..
в Фасмі команди-кр580 будуть макросами...
зроби мені в залежності від прапорів "нуля" та "знаку"
конструкції типа в кр-580
RNZ, JNZ, CNZ
RZ, JZ, CZ
RP, JP, CP,
RM, JM, CM
як вони будуть на фасмі, якщо
прапори це [RAM + PZ] = прапор нуля
[RAM + PS] - прапор знаку
От "нагороди" мені в фасмі конструкції такі!
Чого ти в якісь дебрі поліз ?!
Поделиться522025-04-26 11:31:49
Та ясно, тепер усе по поличках! Ти хочеш, щоб я з тебе не робив філософа стеків і рет-адрес, а просто нормально переклав оті команди з КР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`-файл з усім цим.
Дяка!
Поделиться532025-04-26 11:37:59
Ага, от ми й дійшли до старої, як 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.
Як думаєш, буде зручно?
Дяка!
Поделиться542025-04-26 11:41:19
От і добре! А тепер — тримай свою "КР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` файлі?
Дяка!
Поделиться552025-04-26 11:47:11
Так, у 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-бітних процесорах **немає умовних команд виклику та повернення**, тому що інструкції переходу вже дозволяють досягти бажаного результату за допомогою комбінування умовних переходів, що робить архітектуру більш універсальною й спрощеною для більшості задач.
Дяка!
Поделиться562025-04-26 12:54:09
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:
}
Поделиться572025-04-26 14:28:14
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
}
Поделиться582025-04-26 14:28:39
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:
Поделиться592025-04-26 21:57:52
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;
Поделиться602025-04-27 17:13:21
Чи правильна відповідність кольорів Паскаля та Дельфі
код
{Відповідність кольорів 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;});
Быстрый ответ
Похожие темы
| 32 Бита | Тестовый форум | 2025-05-15 |
| ПЕРЕВАЛОЧНА БАЗА ДЛЯ ПОВІДОМЛЕНЬ | Тестовый форум | 2025-05-15 |
| ASM32 (2026) | Тестовый форум | Вчера |