OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 17.09.2024, 09:44

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 31 ]  Přejít na stránku 1, 2, 3  Další
Autor Zpráva
PříspěvekNapsal: 10.08.2024, 01:21 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
Resil uz nekdy nekdo nastaveni registru flag na konstatntu?
Ve skutecnosti se me jedna o nastaveni celeho AF dvouregistru.

Normalni zpusob je
Kód:
    ld   HL, 0xffff     ; 3:10
    push HL             ; 1:11
    pop  AF             ; 1:10   AF = 0xffff

Ale spoustu hodnot lze urcite nastavit rychleji... napriklad "xor A" nastavuje AF na 0x0044. Ale urcite to neni jedine rychlejsi reseni nez ten petibajtovy kod za 31 taktu.

Mozna ze je to trosku tenky led, protoze nektere bity flagu jsou "nedokumentovane", takze nevim jaka je kompatibilita mezi Z80 klony.
Kód:
Hex    8     4   2    1    8    4    2    1
Bit    7    6    5    4    3    2    1    0
Flag   S    Z   F5    H   F3  P/V    N    C


xor A je popsano jako

Opcode AF
Bytes 1
Cycles 4

(8) S as defined -> 0
(4) Z as defined -> 1
(2) F5 = copy 5th bit result -> 0
(1) H reset -> 0

(8) F3 = copy 3th bit result -> 0
(4) P/V detects parity -> 1
(2) N reset -> 0
(1) C reset -> 0

a vypada to ze "ld A, number" nemeni vubec flag, ani 3. a 5. bit. Takze pokud chci AF = 0x??44

tak staci u nenuloveho ??
xor A ; 1:4
ld A, 0x??; 2:7

Kód:
Org 0x8000

xor a ;--> 0x0044
inc a ;--> 0x0100
inc a ;--> 0x0200
inc a ;--> 0x0300

xor a ;--> 0x0044
inc a ;--> 0x0100
ld a,0x12 ;--> 0x1200  tohle by melo resit zbytek hodnot 0x??44

xor a ;--> 0x0044
dec a ;--> 0xFFBA
dec a ;--> 0xFEAA
dec a ;--> 0xFDAA

xor a ;--> 0x0044
cpl   ;--> 0xFF7E
inc a ;--> 0x0050 !!!
inc a ;--> 0x0100 lepsi je jen inc a po xor a

xor a ;--> 0x0044
cpl   ;--> 0xFF7E
dec a ;--> 0xFEAA to same co 2x dec a
dec a ;--> 0xFDAA to same co 3x dec a

xor a ;--> 0x0044
inc a ;--> 0x0100
cpl   ;--> 0xFE3A

xor a ;--> 0x0044
dec a ;--> 0xFFBA
cpl   ;--> 0x0092 !!!

xor a ;--> 0x0044
inc a ;--> 0x0100
ld a,0x00 ;--> 0x0000 !!!!

xor a ;--> 0x0044
inc a ;--> 0x0100
rra ;--> 0x0001 !!!!

ret


Udelal pro to nekdo tabulku nebo algoritmus? Nebo aspon nejcastejsi konstanty?

Bylo by pekne mit reseni aspon pro 0x0000 .. 0x00FF pokud existuje.

PS: Uznavam ze jsem uz trosku mimo... bezne vody... a mozna by bylo lepsi to resit na anglickem foru. Ale treba to nekoho zaujme jako vyzvu!

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 02:11 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
Kód:
xor a ;--> 0x0044
ccf   ;--> 0x0045 !!!
inc a ;--> 0x0101
inc a ;--> 0x0201

xor a ;--> 0x0044
inc a ;--> 0x0100
inc a ;--> 0x0200
ccf   ;--> 0x0201

xor a ;--> 0x0044
inc a ;--> 0x0100
ccf   ;--> 0x0101
inc a ;--> 0x0201

xor a ;--> 0x0044
inc a ;--> 0x0100
ccf   ;--> 0x0101
dec a ;--> 0x0043 !!!

xor a ;--> 0x0044
ccf   ;--> 0x0045
dec a ;--> 0xFFBB
dec a ;--> 0xFEAB

xor a ;--> 0x0044
dec a ;--> 0xFFBA
ccf   ;--> 0xFFA9
inc a ;--> 0x0051 !!!

xor a ;--> 0x0044
dec a ;--> 0xFFBA
ccf   ;--> 0xFFA9
dec a ;--> 0xFEAB

xor a ;--> 0x0044
dec a ;--> 0xFFBA
dec a ;--> 0xFEAA
ccf   ;--> 0xFEA9

xor a ;--> 0x0044
cpl   ;--> 0xFF7E
ccf   ;--> 0xFF6D
inc a ;--> 0x0050 !!!

xor a ;--> 0x0044
cpl   ;--> 0xFF7E
ccf   ;--> 0xFF6D
dec a ;--> 0xFFAB

xor a ;--> 0x0044
inc a ;--> 0x0100
rra   ;--> 0x0001 !!!
ccf   ;--> 0x0010 !!!

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 04:37 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
Kód:
0x0144 == xor a / ccf / rla
0x0110 == xor a / inc a / and a
0x8001 == xor a / inc a / rrca
0x8044 == xor a / ccf / cca

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 08:02 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2506
Has thanked: 320 times
Been thanked: 669 times
Kód:
0x998f == xor a / cpl / daa
0x6025 == xor a / ccf / daa

Tedy, alespoň podle Fuse emulátoru a Devast+...

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 11:13 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
zxcygnus píše:
Kód:
0x998f == xor a / cpl / daa
0x6025 == xor a / ccf / daa

Tedy, alespoň podle Fuse emulátoru a Devast+...

Diky!
Ja se vcera v noci dostal do faze kde jsem uz taky zneuzil fuse a napsal si program (a ted upravil pridanim "daa" a "nop")
Kód:
    org 0x8000
    ld    L, 0x1A       ; 2:7       init   Upper screen
    call 0x1605         ; 3:17      init   Open channel
 
_use_e equ 1
_use_d equ 1
 
 if _use_e
    ld E,max
e_loop
    ld H,high opcode
    ld L, E
    ld A,[HL]
    ld [_first], A
 endif
 
 if _use_d
    ld D,max
d_loop
    ld H,high opcode
    ld L, D
    ld A,[HL]
    ld [_second], A
  endif
 
    ld C,max
c_loop
    ld H,high opcode
    ld L, C
    ld A,[HL]
    ld [_third], A
   
    ld B,max
b_loop
    ld H,high opcode
    ld L, B
    ld A,[HL]
    ld [_fourth], A
   
self_mod_code:
    xor A
_first:
    db 0x00
_second:
    db 0x00
_third:
    db 0x00
_fourth:
    db 0x00

    push af
    pop  hl
   
    call my_print

    djnz b_loop
    dec C
    jr nz, c_loop
  if _use_d
    dec D
    jr nz, d_loop
  endif
  if _use_e
    dec E
    jp nz, e_loop
  endif
    ret


    ; hl = af
my_print:
    push de
    push bc
 
    push DE             ; 1:11      dup   ( a -- a a )
    ld    D, H          ; 1:4       dup
    ld    E, L          ; 1:4       dup
    call PRT_HEX_U16    ; 3:17      hex u.   ( u -- )
    ex   DE, HL         ; 1:4       hex u.
    pop  DE             ; 1:10      hex u.

    ld    A, 0x0D       ; 2:7       cr   Pollutes: AF, AF', DE', BC'
    rst   0x10          ; 1:11      cr   putchar(reg A) with ZX 48K ROM

    ex   DE, HL         ; 1:4       DE --> HL

 if _use_e
    ld    A, L
    add   A, A
    add   A, A
    add   A, A
    add   A, low opcode_text
    ld    E, A
    ld    D, high opcode_text   
    ld   BC, 0x0008     ; 3:10
    call 0x203C         ; 3:17   Print our string with ZX 48K ROM
 endif
 
 if _use_d
    ld    A, H
    add   A, A
    add   A, A
    add   A, A
    add   A, low opcode_text
    ld    E, A
    ld    D, high opcode_text   
    ld   BC, 0x0008     ; 3:10
    call 0x203C         ; 3:17   Print our string with ZX 48K ROM
  endif
    pop  BC
    push Bc
    ld    A, C
    add   A, A
    add   A, A
    add   A, A
    add   A, low opcode_text
    ld    E, A
    ld    D, high opcode_text   
    ld   BC, 0x0008     ; 3:10
    call 0x203C         ; 3:17   Print our string with ZX 48K ROM

    pop  BC
    push BC
    ld    A, B
    add   A, A
    add   A, A
    add   A, A
    add   A, low opcode_text
    ld    E, A
    ld    D, high opcode_text   
    ld   BC, 0x0007     ; 3:10
    call 0x203C         ; 3:17   Print our string with ZX 48K ROM
   
    ld    A, 0x0D       ; 2:7       cr   Pollutes: AF, AF', DE', BC'
    rst   0x10          ; 1:11      cr   putchar(reg A) with ZX 48K ROM

    pop  BC
    pop  de
    ret
   
;#------------------------------------------------------------------------------
;#   Input: 16-bit unsigned number in HL
;#   Output: Print Hex HL
;# Pollutes: A
PRT_HEX_U16:            ;           prt_hex_u16
    ld    A, H          ;  1:4      prt_hex_u16
    call PRT_HEX_A      ;  3:17     prt_hex_u16
    ld    A, L          ;  1:4      prt_hex_u16
    ; fall to prt_hex_a
;#------------------------------------------------------------------------------
;#    Input: A
;#   Output: 00 .. FF
;# Pollutes: A
PRT_HEX_A:              ;           prt_hex_a
    push AF             ; 1:11      prt_hex_a
    rra                 ; 1:4       prt_hex_a
    rra                 ; 1:4       prt_hex_a
    rra                 ; 1:4       prt_hex_a
    rra                 ; 1:4       prt_hex_a
    call PRT_HEX_NIBBLE ; 3:17      prt_hex_a
    pop  AF             ; 1:10      prt_hex_a
    ; fall to prt_hex_nibble
;#------------------------------------------------------------------------------
;#    Input: A = number, DE = adr
;#   Output: (A & $0F) => '0'..'9','A'..'F'
;# Pollutes: AF, AF',BC',DE'
PRT_HEX_NIBBLE:         ;           prt_hex_nibble
    or      $F0         ; 2:7       prt_hex_nibble   reset H flag
    daa                 ; 1:4       prt_hex_nibble   $F0..$F9 + $60 => $50..$59; $FA..$FF + $66 => $60..$65
    add   A, $A0        ; 2:7       prt_hex_nibble   $F0..$F9, $100..$105
    adc   A, $40        ; 2:7       prt_hex_nibble   $30..$39, $41..$46   = '0'..'9', 'A'..'F'
    rst   0x10          ; 1:11      prt_hex_nibble   putchar(reg A) with ZX 48K ROM
    ret                 ; 1:10
; seconds: 0           ;[31:175]

DEFS    (($ + 256 - 1) / (256)) * (256) - $
opcode:
db 0x00 ; zero       ; --------
db 0x00 ; nop        ; --------
db 0x07 ; rlca       ; --503-0C
db 0x0F ; rrca       ; --503-0C
db 0x17 ; rla        ; --503-0C
db 0x1F ; rra        ; --503-0C
db 0x27 ; daa        ; SZ5H3P-C
db 0x2F ; cpl        ; --513-1-
db 0x3F ; ccf        ; --5H3-0C
db 0x3C ; inc a      ; SZ5H3PN-
db 0x3D ; dec a      ; SZ5H3PN-
db 0x87 ; add a,a    ; SZ5H3PNC
db 0x8F ; adc a,a    ; SZ5H3PNC
db 0xA7 ; and a      ; SZ513P00
db 0xB7 ; or a       ; SZ503P00

max equ $-opcode-1

opcode_text:
db "zero   /"    ; --------
db "nop    /"    ; --------
db "rlca   /"    ; --503-0C
db "rrca   /"    ; --503-0C
db "rla    /"    ; --503-0C
db "rra    /"    ; --503-0C
db "daa    /"    ; SZ5H3P-C
db "cpl    /"    ; --513-1-
db "ccf    /"    ; --5H3-0C
db "inc a  /"    ; SZ5H3PN-
db "dec a  /"    ; SZ5H3PN-
db "add a,a/"    ; SZ5H3PNC
db "adc a,a/"    ; SZ5H3PNC
db "and a  /"    ; SZ513P00
db "or a   /"    ; SZ503P00


...a kdyz pouziji jeste instrukce

ld a, const
sub const

s nebo

ld a, const
add a, const

Tak bych mohl dostat celkem slusny vystup.
Ted se snazim zjistit jaky kanal mam zapnout abych mel vystup z fuse do txt souboru na PC.
Ten pak mohu seradit a ziskat tu tabulku.


Přílohy:
flag.tap [757 bajtů]
33 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 12:09 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
zmenil jsem zacatek programu na vystup na kanal 3
Kód:
  if 1
; The channels are used as follows by the Spectrum ROM:
;
; 3 (P) is used by LPRINT and LLIST.
; 2 (S) is used by PRINT and LIST.
; 1 (K) is used by the INPUT command.
; 0 (K) is used by the BASIC line editor; it is always reset to K after each RUN, so redirecting it has no effect.
; -1 (R) inserts the characters where the system variable K-CUR is pointing in memory - typically either in the edit area (E-LINE) when pulling down a BASIC line for editing, or in the internal workspace (WORKSP) when evaluating STR$.
; -2 (S) is used by LOAD to print file information to the screen, and when scrolling the screen.
; -3 (K) is used by SAVE for the "press any key" prompt, and for the "scroll?" prompt when the screen is full.
 
    ld    A, 0x03       ; 2:7       init   Upper screen
    call 0x1601         ; 3:17      init   Open channel
  else
    ld    L, 0x1A       ; 2:7       init   Upper screen  0x1A = 2*stream+22
    call 0x1605         ; 3:17      init   Open channel
 endif

ve fuse nasel jen
option-->peripherals->General...->zx printer

ale nevim kde nastavit jmeno vystupniho souboru.

Program "nic" nedela, protoze tiskne a tiskne... nikam.
Je mozne ze ceka na stisk klavesy u scroll?
A nebo uz dobehl, ale pred koncem jsem mel napsat
Kód:
    ld    L, 0x1A       ; 2:7       init   Upper screen  0x1A = 2*stream+22
    call 0x1605         ; 3:17      init   Open channel
?

PS: Hmm.. kdyz jsem pridal na konec ten kod a mackal nahodne space tak po 14 minutach emulovaneho casu (mel jsem nastavenou rychlost na 10000%) me to vyhodilo do basicu.
PPS: Nic se mackat nemusi.
PPPS: Ani se nemusi pred return davat ta zmena kanalu, staci pockat 14 minut 23.79s emulovaneho casu. Ale na disk to zadny soubor nevytvari, ani do konzole nic nevypisuje.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 12:26 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2200
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 341 times
Tabuľka "INŠTRUKCIE Z80 A ICH VPLYV NA STAVOVÉ INDIKÁTORY" z príručky Z80. Pri programovaní mám stále poruke.

edit: Neviete prečo vidím jeden obrázok ako náhľad a druhý celý, keď sú rovnakej veľkosti aj typu?


Přílohy:
01.png
01.png [ 12.23 KiB | Zobrazeno 1364 krát ]
02.png
02.png [ 7.51 KiB | Zobrazeno 1364 krát ]

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.
Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 12:36 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
PotPalo asi to chtelo dat oba jako prilozit/zobrazit.

U tohohle je ale pro cloveka nemozne (nebo velmi pracne) vytvorit kod co nastavi to AF.
Protoze si nejses jisty jak bude vypadat 3. a 5. bit. Nastavuje se nebo ne?
V P/V je to P a nebo V? Atd.

Vlastne to mam v popisku:
Kód:
db 0x00 ; zero       ; --------
db 0x00 ; nop        ; --------
db 0x07 ; rlca       ; --503-0C
db 0x0F ; rrca       ; --503-0C
db 0x17 ; rla        ; --503-0C
db 0x1F ; rra        ; --503-0C
db 0x27 ; daa        ; SZ5H3P-C
db 0x2F ; cpl        ; --513-1-
db 0x3F ; ccf        ; --5H3-0C
db 0x3C ; inc a      ; SZ5H3PN-
db 0x3D ; dec a      ; SZ5H3PN-
db 0x87 ; add a,a    ; SZ5H3PNC
db 0x8F ; adc a,a    ; SZ5H3PNC
db 0xA7 ; and a      ; SZ513P00
db 0xB7 ; or a       ; SZ503P00


PS: nop = ld a,a i s priznaky

PPS: Vlastne je to pekna a prehledna tabulka. To "add xx,xx" s nepredvidatelnym bitem je doufam jen pro add HL,xx. jinak by padla ma nadeje na add A, xx a sub xx, ktere v tabulce ani nejsou.

PPS: Uplne offtopic jak prochazim fuse kvuli tisku tak jsem nasel

Kód:
fuse --debugger-command 'br 0x8000' flag_old.tap
fuse --debugger-command='br 0x8000' flag_old.tap
fuse --debugger-command "br 0x8000" flag_old.tap
fuse --debugger-command="br 0x8000" flag_old.tap


Vsechny 4 varianty me vytvori breakpoint na adrese 32768. To je mile, protoze zrovna u toho "flag_old", kde jsem mel jen instrukce a dival se jak to meni priznakovy registr jsem to neustale musel zadavat rucne pokazde co jsem zmenil zdrojak.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Naposledy upravil _dworkin dne 10.08.2024, 12:45, celkově upraveno 1

Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 12:40 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2200
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 341 times
Obidve prílohy som vkladal rovnako, teda Vybrať..., a kliknúť na Přiložit soubor.

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 12:47 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
PotPalo píše:
Obidve prílohy som vkladal rovnako, teda Vybrať..., a kliknúť na Přiložit soubor.


Jo ale zda se ze system preferuje prvni ze tri "Umistit do prispevku".

Příloha:
flag01.png
flag01.png [ 12.23 KiB | Zobrazeno 1359 krát ]

...
Příloha:
flag02.png
flag02.png [ 7.51 KiB | Zobrazeno 1359 krát ]

...
Příloha:
flag01.png
flag01.png [ 12.23 KiB | Zobrazeno 1359 krát ]

...
Příloha:
flag03.png
flag03.png [ 16.24 KiB | Zobrazeno 1356 krát ]


Aha, tak je neco spatne. Tohle je kdyz dam rucne to umistit... dokonce jsem to editoval a prohodil poradi a je to stejne == legendu "zvetsi".

PS: Mozna je spatne obrazek a ma spatne nastavene informace v hlavicce.

Hmm.. tak asi ne, otevrel jsem "flag01" a dokopiroval do nej druhy obrazek a dal ulozit jako flag03 a stejny vysledek... vsude stejne pise 72*72 ppi.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 14:07 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
Hmmm... tak ani po googleni jsem se s tim vystupem fuse do txt nepohnul.

Zkousel jsem "add a,const" a vypada to ze to pro flag generuje jen (v hex):

00, 01,
05,
08, 09,
0D,
10, 11,
15,
18, 19,
1D,
20, 21
25,
28, 29,
2D,
30, 31,
35,
38, 39,
3D,
40, 41
51,
80, 81,
84,
88, 89,
8C,
90, 91,
98, 99,
9C,
A0, A1,
A4,
A8, A9,
B0, B1,
B4,
B8, B9,
BC

Kód:
    org 0x8000
   
  if 0
; The channels are used as follows by the Spectrum ROM:
;
; 3 (P) is used by LPRINT and LLIST.
; 2 (S) is used by PRINT and LIST.
; 1 (K) is used by the INPUT command.
; 0 (K) is used by the BASIC line editor; it is always reset to K after each RUN, so redirecting it has no effect.
; -1 (R) inserts the characters where the system variable K-CUR is pointing in memory - typically either in the edit area (E-LINE) when pulling down a BASIC line for editing, or in the internal workspace (WORKSP) when evaluating STR$.
; -2 (S) is used by LOAD to print file information to the screen, and when scrolling the screen.
; -3 (K) is used by SAVE for the "press any key" prompt, and for the "scroll?" prompt when the screen is full.
 
    ld    A, 0x03       ; 2:7       init   Upper screen
    call 0x1601         ; 3:17      init   Open channel
  else
    ld    L, 0x1A       ; 2:7       init   Upper screen  0x1A = 2*stream+22
    call 0x1605         ; 3:17      init   Open channel
 endif
 
 table equ 1
 if 0
look_for equ 0xBC
 endif
    ld C,0
c_loop
    ld A,C
    ld [_first], A
   
    ld B,0
b_loop
    ld A,B
    ld [_second], A
   
self_mod_code:
_first equ $+1
    ld A, 0x00
_second equ $+1
    add A, 0x00

    push af
    pop  hl
   
  if table
    call make_table
  else
    call my_print
  endif
 
    djnz b_loop
    dec C
    jr nz, c_loop
 
 
  if table
    ld HL, found
loop:
    ld A,[HL]
    or A
   
    jr z, no_print
   
    ld   A, L
    call PRT_HEX_A
    ld    A, 0x0D       ; 2:7       cr   Pollutes: AF, AF', DE', BC'
    rst   0x10          ; 1:11      cr   putchar(reg A) with ZX 48K ROM
no_print:
    inc L
    jr nz, loop
  endif
    ret

make_table:
    ; HL = AF
    ld   H, high found
    ld [HL],1
    ret

   
    ; hl = af
my_print: 
   
  ifdef look_for
    ld    A, look_for
    cp    L
    ret  nz   
  endif
   
    push BC
    push DE             ; 1:11      dup   ( a -- a a )
    ld    D, H          ; 1:4       dup
    ld    E, L          ; 1:4       dup
    call PRT_HEX_U16    ; 3:17      hex u.   ( u -- )
    ex   DE, HL         ; 1:4       hex u.
    pop  DE             ; 1:10      hex u.

    ld    A, 0x0D       ; 2:7       cr   Pollutes: AF, AF', DE', BC'
    rst   0x10          ; 1:11      cr   putchar(reg A) with ZX 48K ROM

    ld    H, B
    ld    L, C

    ld   DE,_ld_a_n   
    ld   BC, size_ld_a_n; 3:10
    call 0x203C         ; 3:17   Print our string with ZX 48K ROM
    ld    A, L
    call PRT_HEX_A
   
    ld   DE,_add_a_n
    ld   BC, size_add_a_n; 3:10
    call 0x203C         ; 3:17   Print our string with ZX 48K ROM
    ld    A, H
    call PRT_HEX_A
   
    ld    A, 0x0D       ; 2:7       cr   Pollutes: AF, AF', DE', BC'
    rst   0x10          ; 1:11      cr   putchar(reg A) with ZX 48K ROM

    pop  BC
    ret
   
;#------------------------------------------------------------------------------
;#   Input: 16-bit unsigned number in HL
;#   Output: Print Hex HL
;# Pollutes: A
PRT_HEX_U16:            ;           prt_hex_u16
    ld    A, H          ;  1:4      prt_hex_u16
    call PRT_HEX_A      ;  3:17     prt_hex_u16
    ld    A, L          ;  1:4      prt_hex_u16
    ; fall to prt_hex_a
;#------------------------------------------------------------------------------
;#    Input: A
;#   Output: 00 .. FF
;# Pollutes: A
PRT_HEX_A:              ;           prt_hex_a
    push AF             ; 1:11      prt_hex_a
    rra                 ; 1:4       prt_hex_a
    rra                 ; 1:4       prt_hex_a
    rra                 ; 1:4       prt_hex_a
    rra                 ; 1:4       prt_hex_a
    call PRT_HEX_NIBBLE ; 3:17      prt_hex_a
    pop  AF             ; 1:10      prt_hex_a
    ; fall to prt_hex_nibble
;#------------------------------------------------------------------------------
;#    Input: A = number, DE = adr
;#   Output: (A & $0F) => '0'..'9','A'..'F'
;# Pollutes: AF, AF',BC',DE'
PRT_HEX_NIBBLE:         ;           prt_hex_nibble
    or      $F0         ; 2:7       prt_hex_nibble   reset H flag
    daa                 ; 1:4       prt_hex_nibble   $F0..$F9 + $60 => $50..$59; $FA..$FF + $66 => $60..$65
    add   A, $A0        ; 2:7       prt_hex_nibble   $F0..$F9, $100..$105
    adc   A, $40        ; 2:7       prt_hex_nibble   $30..$39, $41..$46   = '0'..'9', 'A'..'F'
    rst   0x10          ; 1:11      prt_hex_nibble   putchar(reg A) with ZX 48K ROM
    ret                 ; 1:10
; seconds: 0           ;[31:175]

_ld_a_n:
db "ld a,$"
size_ld_a_n equ $-_ld_a_n
_add_a_n
db "/add a,$"
size_add_a_n equ $-_add_a_n


DEFS    (($ + 256 - 1) / (256)) * (256) - $

found:

ds 256

Ten kod umoznuje bud najit hodnoty flag, ze udela 256 bajtovou tabulku s jednickama nebo nulama.
A nebo kdyz definujete look_for tak vam to najde vsechny varianty (kde se meni "A")

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 14:12 
Offline
Kecálek

Registrován: 10.07.2014, 01:57
Příspěvky: 183
Has thanked: 28 times
Been thanked: 252 times
_dworkin píše:
ve fuse nasel jen
option-->peripherals->General...->zx printer

ale nevim kde nastavit jmeno vystupniho souboru.


este treba zapnut Options > Peripherals > General > Emulate printers

a potom si pozriet manual, cast "PRINTER EMULATION":

Any printout is appended to one (or both) of two files, depending on the printer — these default to printout.txt for text output, and printout.pbm for graphics (PBM images are supported by most image viewers and converters). These names can be changed with the --textfile and --graphicsfile options from the command line or configuration file. While the ZX Printer can only output graphically, simulated text output is generated at the same time using a crude sort of OCR based on the current character set (a bit like using SCREEN$). There is currently no support for graphics when using the serial/parallel output, though any escape codes used will be `printed' faithfully. (!)


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 14:13 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
sub ma dokaze nastavit F na (v hex):
02, 03,
06,
0A, 0B,
0E,
12, 13,
16,
1A, 1B,
1E,
22, 23,
26,
2A, 2B,
2E,
32, 33,
36,
3A, 3B,
3E,
42,
82, 83,
87,
8A, 8B,
8F,
92, 93,
97,
9A,
9B,
9F,
A2, A3,
A7,
AA, AB,
AF,
B2, B3,
B7,
BA, BB,
BF
Kód:
    org 0x8000
   
  if 0
; The channels are used as follows by the Spectrum ROM:
;
; 3 (P) is used by LPRINT and LLIST.
; 2 (S) is used by PRINT and LIST.
; 1 (K) is used by the INPUT command.
; 0 (K) is used by the BASIC line editor; it is always reset to K after each RUN, so redirecting it has no effect.
; -1 (R) inserts the characters where the system variable K-CUR is pointing in memory - typically either in the edit area (E-LINE) when pulling down a BASIC line for editing, or in the internal workspace (WORKSP) when evaluating STR$.
; -2 (S) is used by LOAD to print file information to the screen, and when scrolling the screen.
; -3 (K) is used by SAVE for the "press any key" prompt, and for the "scroll?" prompt when the screen is full.
 
    ld    A, 0x03       ; 2:7       init   Upper screen
    call 0x1601         ; 3:17      init   Open channel
  else
    ld    L, 0x1A       ; 2:7       init   Upper screen  0x1A = 2*stream+22
    call 0x1605         ; 3:17      init   Open channel
 endif
 
 table equ 1
 if 0
look_for equ 0xBC
 endif
    ld C,0
c_loop
    ld A,C
    ld [_first], A
   
    ld B,0
b_loop
    ld A,B
    ld [_second], A
   
self_mod_code:
_first equ $+1
    ld A, 0x00
_second equ $+1
    sub 0x00

    push af
    pop  hl
   
  if table
    call make_table
  else
    call my_print
  endif
 
    djnz b_loop
    dec C
    jr nz, c_loop
 
 
  if table
    ld HL, found
loop:
    ld A,[HL]
    or A
   
    jr z, no_print
   
    ld   A, L
    call PRT_HEX_A
    ld    A, 0x0D       ; 2:7       cr   Pollutes: AF, AF', DE', BC'
    rst   0x10          ; 1:11      cr   putchar(reg A) with ZX 48K ROM
no_print:
    inc L
    jr nz, loop
  endif
    ret

make_table:
    ; HL = AF
    ld   H, high found
    ld [HL],1
    ret

   
    ; hl = af
my_print: 
   
  ifdef look_for
    ld    A, look_for
    cp    L
    ret  nz   
  endif
   
    push BC
    push DE             ; 1:11      dup   ( a -- a a )
    ld    D, H          ; 1:4       dup
    ld    E, L          ; 1:4       dup
    call PRT_HEX_U16    ; 3:17      hex u.   ( u -- )
    ex   DE, HL         ; 1:4       hex u.
    pop  DE             ; 1:10      hex u.

    ld    A, 0x0D       ; 2:7       cr   Pollutes: AF, AF', DE', BC'
    rst   0x10          ; 1:11      cr   putchar(reg A) with ZX 48K ROM

    ld    H, B
    ld    L, C

    ld   DE,_ld_a_n   
    ld   BC, size_ld_a_n; 3:10
    call 0x203C         ; 3:17   Print our string with ZX 48K ROM
    ld    A, L
    call PRT_HEX_A
   
    ld   DE,_sub_n
    ld   BC, size_sub_n; 3:10
    call 0x203C         ; 3:17   Print our string with ZX 48K ROM
    ld    A, H
    call PRT_HEX_A
   
    ld    A, 0x0D       ; 2:7       cr   Pollutes: AF, AF', DE', BC'
    rst   0x10          ; 1:11      cr   putchar(reg A) with ZX 48K ROM

    pop  BC
    ret
   
;#------------------------------------------------------------------------------
;#   Input: 16-bit unsigned number in HL
;#   Output: Print Hex HL
;# Pollutes: A
PRT_HEX_U16:            ;           prt_hex_u16
    ld    A, H          ;  1:4      prt_hex_u16
    call PRT_HEX_A      ;  3:17     prt_hex_u16
    ld    A, L          ;  1:4      prt_hex_u16
    ; fall to prt_hex_a
;#------------------------------------------------------------------------------
;#    Input: A
;#   Output: 00 .. FF
;# Pollutes: A
PRT_HEX_A:              ;           prt_hex_a
    push AF             ; 1:11      prt_hex_a
    rra                 ; 1:4       prt_hex_a
    rra                 ; 1:4       prt_hex_a
    rra                 ; 1:4       prt_hex_a
    rra                 ; 1:4       prt_hex_a
    call PRT_HEX_NIBBLE ; 3:17      prt_hex_a
    pop  AF             ; 1:10      prt_hex_a
    ; fall to prt_hex_nibble
;#------------------------------------------------------------------------------
;#    Input: A = number, DE = adr
;#   Output: (A & $0F) => '0'..'9','A'..'F'
;# Pollutes: AF, AF',BC',DE'
PRT_HEX_NIBBLE:         ;           prt_hex_nibble
    or      $F0         ; 2:7       prt_hex_nibble   reset H flag
    daa                 ; 1:4       prt_hex_nibble   $F0..$F9 + $60 => $50..$59; $FA..$FF + $66 => $60..$65
    add   A, $A0        ; 2:7       prt_hex_nibble   $F0..$F9, $100..$105
    adc   A, $40        ; 2:7       prt_hex_nibble   $30..$39, $41..$46   = '0'..'9', 'A'..'F'
    rst   0x10          ; 1:11      prt_hex_nibble   putchar(reg A) with ZX 48K ROM
    ret                 ; 1:10
; seconds: 0           ;[31:175]

_ld_a_n:
db "ld a,$"
size_ld_a_n equ $-_ld_a_n
_sub_n
db "/sub $"
size_sub_n equ $-_sub_n


DEFS    (($ + 256 - 1) / (256)) * (256) - $

found:

ds 256

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 14:26 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
ub880d píše:
_dworkin píše:
ve fuse nasel jen
option-->peripherals->General...->zx printer

ale nevim kde nastavit jmeno vystupniho souboru.


este treba zapnut Options > Peripherals > General > Emulate printers

a potom si pozriet manual, cast "PRINTER EMULATION":

Any printout is appended to one (or both) of two files, depending on the printer — these default to printout.txt for text output, and printout.pbm for graphics (PBM images are supported by most image viewers and converters). These names can be changed with the --textfile and --graphicsfile options from the command line or configuration file. While the ZX Printer can only output graphically, simulated text output is generated at the same time using a crude sort of OCR based on the current character set (a bit like using SCREEN$). There is currently no support for graphics when using the serial/parallel output, though any escape codes used will be `printed' faithfully. (!)



Diky moc!

Ja jsem fakt uplne SLEPY a to jsem to prohlizel vickrat...

PS: Doporucuji zmenit radek 97 (pocitano od 1) u add_flag a sub_flag

na
Kód:
    ld    A, ' '        ; 2:7       space   Pollutes: AF, AF', DE', BC'

Aby to tisklo mezeru a ne novy radek za tim cislem "AF".

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 10.08.2024, 16:31 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1305
Has thanked: 102 times
Been thanked: 195 times
Posilam zip obsahujici 3 asm soubory z kterych jsem to generoval a pak jeden sileny txt, kde je v prvnim sloupci serazeny AF.

Nekolik radku muze mit stejnou hodnotu AF, pokazde s jinym kodem.
Nektere AF zase chybi.
V ramci stejneho AF to neni nijak razeno, prvni neni nejefektivnejsi.
Nedoplnoval jsem tam "ld A, xx" takze tam nejsou vsechny varianty ktere lze tim dosahnout.
S "F" si nejsem jisty zda je to kompletni.
Urcite tam neni ta varianta kdy se to nacita ze zasobniku.

Takze na rucni hledni s pouzitim lidskeho mysleni je tohle uz vhodny.
Na to co potrebuji ja... jeste zdaleka ne... .)))

PS: flag_print ma zmrseny vypis, musel jsem to rucne (regexpem) editovat. Nasteti kazdy radek zacina nulou, protoze jinak se me to zase nechtelo spravne radit kdyz ty hex cisla nezacinaji 0x. Protoze ZX ROMKA me to zalamovala na 32 radku a ke vsemu kdyz je prvni znak mezera na novem radku tak ji ignoruje?
Existuje poke co zmeni sirku obrazovky pro tu tiskarnu?

PPS: Kdyz dam emulator rychle tak spadne.... a kdyz pomalu tak tisk trva vecnost... .)))

PPPS: Mozne F hodnoty co me sli nastavit jsou

0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x12, 0x13, 0x14, 0x16, 0x17, 0x18, 0x1A, 0x1B, 0x1C, 0x1E, 0x1F, 0x20, 0x21, 0x23, 0x24, 0x25, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4D, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x64, 0x68, 0x69, 0x6C, 0x6D, 0x78, 0x7A, 0x7B, 0x7C, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9B, 0x9C, 0x9F, 0xA0, 0xA1, 0xA3, 0xA4, 0xA5, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAF, 0xB0, 0xB1, 0xB3, 0xB4, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBE, 0xBF

je mozne ze reseni je vic, protoze jsem po add/sub nedelal zadne ccf protoze to meni krom C i H a resetuje N.

A je divny ze tam neni 0x15 protoze jsem ji uvadel v add verzi.


Přílohy:
set_flag.zip [89.76 KiB]
37 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 31 ]  Přejít na stránku 1, 2, 3  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz