Welcome, Guest. Please login or register.


Author Topic: Assembly programozás (Read 254380 times)

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #915 on: 2015.May.20. 16:59:03 »
geco, ez az az oldal, ahol az integer to ASCII konverziós rutin (is) van, erről beszéltem neked a találkozón:
http://map.grauw.nl/sources/external/z80bits.html#5.1
*** Speicherplatz zu klein

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #916 on: 2015.May.20. 17:09:27 »
geco, ez az az oldal, ahol az integer to ASCII konverziós rutin (is) van, erről beszéltem neked a találkozón:
http://map.grauw.nl/sources/external/z80bits.html#5.1

Na, ezt nem garantalom, hogy megy, mar regebben irtam (de en is a fenti otlet alapjan), most epp el kene gondolkodnom, hogy tuti jo-e :) Lenyege, hogy a szam elejen levo nullak helyett szokoz van. A celom az volt, hogy minden szam azonos mennyisegu helyet foglaljon, tehat nem "lenyelem" a kezdo 0-kat, hanem szokozt irok helyette.

Code: ZiLOG Z80 Assembler
  1. ; IX = memory address to write ASCII result
  2. ; HL = number
  3. printdec10:
  4.         LD      DE, $3020 ; leading zero elimination D=must be ASCII code of '0', E = print this if it would print '0' (overriden later to '0' after a non '0' digit, or last digit)
  5.         ld      bc,-10000
  6.         call    .digit
  7.         ld      bc,-1000
  8.         call    .digit
  9.         ld      bc,-100
  10.         ld      A, B ; B set to $FF, faster to transfer to A, than call .digit to set by constant
  11.         call    .div10
  12.         ld      c,-10 ; B is already $FF, no need to set BC, only C (we can do 8 bit math here already as with the next, but I don't need such an "extreme" optimisation)
  13.         LD      A, B
  14.         call    .div10
  15.         ld      a, d ; last digit follows (avoid using the 16 bit stuff here, also zero is printed always, as the last digit!)
  16.         or      l       ; convert to ASCII (always, even with value of zero)
  17.         ld      (ix), a
  18.         inc     ix
  19.         ret
  20. .digit: ld      a, $FF
  21. .div10: inc     a
  22.         add     hl,bc   ; actually this is SUB but BC is "negative", since there is no real 16 bit SUB on Z80 without Carry (only SBC)
  23.         jr      c,.div10        ; based on result of ADD HL,BC
  24.         jr      z, .zero        ; based on result of INC A (ADD HL,BC does not affect Zero flag)
  25.         LD      E, D    ; set conversion mask to ASCII in case of non-zero digit! (further zeroes are zeroes also, not space)
  26. .zero:
  27.         SBC     HL, BC ; "overrun" by the loop, Carry=0 here, ok to use SBC to "roll back" the last ADD
  28.         OR      E ; convert A to ASCII _or_ SPACE
  29.         LD      (IX), A
  30.         INC     IX
  31.         RET
  32.  
« Last Edit: 2015.May.20. 20:07:10 by lgb »

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #917 on: 2015.May.20. 17:11:24 »
Ilyesmire egyébként ott van a Hsoft féle full extrás NUMSTR rutin gyűjtemény is.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: Assembly programozás
« Reply #918 on: 2015.May.20. 18:52:01 »
geco, ez az az oldal, ahol az integer to ASCII konverziós rutin (is) van, erről beszéltem neked a találkozón:
http://map.grauw.nl/sources/external/z80bits.html#5.1
Köszi szépen el is tárolom :)

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #919 on: 2015.June.01. 15:52:49 »
közben megnéztem, hogy csinálja a HiSoft Pascal az egész szám kiírását, de az is kivonásokkal csinálja a 10-zel osztást:
Code: [Select]
;WRITE(e)       
;writes an INTEGER number
  ;input: e in HL
l05e5:  bit     7,h
        jr      z,l05f5          ;jump, if HL>0
        ld      a,"-"
        call    WriteChar_L0112
        or      a
        ex      de,hl
        ld      hl,0
        sbc     hl,de
l05f5:  ld      iy,l061f
        ld      bc,0530h        ;B=5 C="0"
l05fc:  ld      a,"0"
        ld      e,(iy+00h)
        ld      d,(iy+01h)
l0604:  or      a
        sbc     hl,de
        jr      c,l060c
        inc     a
        jr      l0604
l060c:  add     hl,de
        cp      c
        jr      z,l0614
        call    WriteChar_L0112
        dec     c
l0614:  inc     iy
        inc     iy
        djnz    l05fc
        cp      c
        ret     nz
        jp      WriteChar_L0112
l061f:  dw      10000
        dw      1000
        dw      100
        dw      10
        dw      1
*** Speicherplatz zu klein

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #920 on: 2015.June.01. 19:30:05 »
Nem akarok teljesen hulyenek tunni, de milyen eletkepes alternativa van meg a 10-es kivonogatason kivul? Amire en gondoltam esetleg: logaritmikus kereses alapjan, tehat ugye 4db osszehasonlitassal elvileg meg lehet mondani, hogy melyik szamjegy az. Csak igy a kod lesz csunyan nagy, mert ugye a kulonbozo 10-es helyiertekeknel kulon le kell kodolni. Van mas ertelmes modszer a decimalis kiiratasra, ami hatekony, es osztast nem kivonogatassal csinalja?

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #921 on: 2015.June.01. 20:04:10 »
Ilyesmire egyébként ott van a Hsoft féle full extrás NUMSTR rutin gyűjtemény is.

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #922 on: 2015.June.01. 20:13:32 »
Ez meg az EXDOS-é:
Code: ZiLOG Z80 Assembler
  1.                 SUBTTL  D16
  2.  
  3. ;******************************************************************************
  4. D16::
  5. ;
  6. ; Displays the 16-bit number in HL.
  7. ;
  8. ;
  9.                 PUSH    HL              ; Save number.
  10.                 PUSH    IY
  11.                 CALL    @CLIOB          ; HL -> output buffer.
  12.                 LD      C,L
  13.                 LD      B,H
  14.                 POP     HL
  15.                 LD      DE,SIZEE##+3
  16.                 ADD     HL,DE           ; Point to 32-bit number buffer.
  17.                 POP     DE              ; DE=number to print.
  18. DERRN:          XOR     A               ; No leading character.
  19.                 LD      (HL),A          ; Zero most significant word.
  20.                 DEC     HL
  21.                 LD      (HL),A
  22.                 DEC     HL
  23.                 LD      (HL),D          ; Put number into buffer.
  24.                 DEC     HL
  25.                 LD      (HL),E
  26.                 EX      DE,HL           ; DE->number.
  27.                     ;
  28.                     ;
  29.                     ;
  30. ;
  31. ;
  32. ;
  33.                 SUBTTL  D32
  34.  
  35. ;******************************************************************************
  36. D32::
  37. ;
  38. ; Displays a 32-bit number at (DE) in up to 8 characters, using the character
  39. ; in A as the leading character, or A=0 if none required. The number at (DE)
  40. ; is corrupted, as are HL, BC, HL', DE' and AF'.
  41. ;
  42. ; The number is displayed by subtracting reducing powers of ten from a table.
  43. ; This avoids a 32 by 16 divide by ten, and produces the digits in the required
  44. ; order.
  45. ;
  46. ; This routine is used from the DIR command to print the file sizes. In this
  47. ; case, the numbers are always less than 9 decimal digits, so the power of ten
  48. ; table starts with 10,000,000. In other cases, the routine is used from D16,
  49. ; to print a 16-bit number without leading characters. Thus a larger power of
  50. ; ten table is not needed.
  51. ;
  52. ;
  53.                 EXX
  54.                 LD      E,A             ; E=lead char.
  55.                 LD      D,'0'           ; D='0' to save bytes.
  56.                 EXX
  57.                 LD      HL,P10TAB       ; Giant 32-bit power-of-ten table.
  58. ;
  59. D32.10:         LD      A,(HL)          ; LSB from table.
  60.                 DEC     A               ; Last entry ?
  61.                 JR      NZ,D32.20       ; Go if not.
  62. ;
  63.                 EXX                     ; Else force leading char to '0'.
  64.                 LD      E,D
  65.                 EXX
  66. ;
  67. D32.20:         XOR     A               ; Divide by subtraction, Cy clear.
  68.                 LD      C,A             ; Subtraction count.
  69. ;
  70. D32.30:         PUSH    HL              ; Save table pointer.
  71.                 PUSH    DE              ; Save number pointer.
  72.                 LD      B,4             ; Iteration count.
  73. ;
  74. D32.40:         LD      A,(DE)          ; Subtract no. in table.
  75.                 SBC     A,(HL)
  76.                 LD      (DE),A
  77.                 INC     HL
  78.                 INC     DE
  79.                 DJNZ    D32.40
  80. ;
  81.                 POP     DE
  82.                 POP     HL
  83.                 INC     C
  84.                 JR      NC,D32.30
  85. ;
  86.                 CALL    ADD32           ; Add back last iteration.
  87.                 LD      A,C             ; Get iteration count.
  88.                 EXX
  89.                 DEC     A               ; Adjust for last iteration.
  90.                 JR      Z,D32.60        ; Go if possible leading zero.
  91. ;
  92.                 ADD     A,D             ; Else convert to ASCII.
  93.                 LD      E,D             ; Set leading char to '0'.
  94.                 CODE    MVI L           ; Skip to print char.
  95. ;
  96. D32.60:         OR      E               ; Leading char required ?
  97.                 CALL    NZ,OUCH         ; Print it if yes.
  98. ;
  99.                 EXX
  100.                 LD      A,(HL)          ; End of table (FF) ?
  101.                 INC     A
  102.                 JR      NZ,D32.10       ; Print next digit if not.
  103.                 RET                     ; With A=0.
  104. ;
  105. ;
  106. P10TAB:         DEFW    9680H,98H       ; 10,000,000
  107.                 DEFW    4240H,0FH       ; 1,000,000
  108.                 DEFW    86A0H,1         ; 100,000
  109.                 DEFW    2710H,0         ; 10,000
  110.                 DEFW    3E8H,0          ; 1,000
  111.                 DEFW    64H,0           ; 100
  112.                 DEFW    0AH,0           ; 10
  113.                 DEFW    1,0             ; 1
  114.                 DEFB    0FFH            ; End of table.

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1291
  • Country: hu
  • Stray cat from Commodore alley
Re: Assembly programozás
« Reply #923 on: 2015.June.01. 23:27:06 »
Nem akarok teljesen hulyenek tunni, de milyen eletkepes alternativa van meg a 10-es kivonogatason kivul?

Én sem akarok teljesen hülyének tűnni, de mit szólnál a helyiérték bitekhez tartozó decimális konstansok iteratív szimbolikus összeadáshoz?

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #924 on: 2015.June.02. 09:41:00 »
Ez meg az EXDOS-é:

Zozo, ezt te disassembláltad és kommentezted fől, vagy ez az eredeti IS kód?
*** Speicherplatz zu klein

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #925 on: 2015.June.02. 09:47:59 »
Zozo, ezt te disassembláltad és kommentezted fől, vagy ez az eredeti IS kód?
Ez az eredeti.

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Assembly programozás
« Reply #926 on: 2015.June.02. 09:51:02 »
Az én verzióm :-)
Code: ZiLOG Z80 Assembler
  1.         ;DE-ben megadott 16 bites érték konvertálása a szövegpufferbe
  2.         ;a bevezető nullákat levágja
  3.         ;HL számpufferre mutat
  4.  
  5. lf1f4:  XOR     A
  6.         LD      (HL),A          ;számpuffer
  7.         DEC     HL              ;felső 16 bitje
  8.         LD      (HL),A          ;nullázva
  9.         DEC     HL
  10.         LD      (HL),D          ;érték
  11.         DEC     HL              ;letárolva
  12.         LD      (HL),E          ;a számpufferbe
  13.         EX      DE,HL           ;DE mutat a számpufferre
  14.  
  15.  
  16.         ;számpufferben megadott 32 bites érték konvertálása a szövegpufferbe
  17.         ;a bevezető nullákat levágja
  18.         ;DE számpufferre mutat
  19.         ;A=bevezető karakter kódja, 00H esetén nem ír ki semmit
  20.  
  21. lf1fd:  EXX    
  22.         LD      E,A             ;0, jelzi, hogy nulla eredmény esetén
  23.                                 ;még bevezető nulláról van szó
  24.         LD      D,30H           ;"0"
  25.         EXX    
  26.         LD      HL,lf233        ;számkonstansok táblázatára mutat
  27. lf205:  LD      A,(HL)         
  28.         DEC     A               ;=1? vagyis a táblázat legkisebb eleme?
  29.         JR      NZ,LF20C        ;ugrás ha nem
  30.         EXX                     ;ha igen
  31.         LD      E,D             ;E="0" mindenképpen kiírja a nulla eredményt is
  32.         EXX                      
  33.  
  34.         ;32 bites osztás (DE)/(HL)
  35.         ;C=az osztás eredménye, (DE)=maradék
  36.      
  37. lf20c:  XOR     A               ;C flag törlése
  38.         LD      C,A             ;C=0
  39.        
  40.         ;az osztást kivonással hajtja végre, amíg negatív nem lesz
  41.  
  42. lf20e:  PUSH    HL
  43.         PUSH    DE
  44.         LD      B,04H           ;4 bájton kell elvégezni a műveletet
  45. lf212:  LD      A,(DE)          ;csökkentendő bájt
  46.         SBC     A,(HL)          ;kivonás
  47.         LD      (DE),A          ;letárolás
  48.         INC     HL              ;mutatók
  49.         INC     DE              ;növelése
  50.         DJNZ    LF212           ;művelet elvégzése a többi bájton
  51.         POP     DE              ;eredeti mutatók
  52.         POP     HL              ;vissza
  53.         INC     C               ;eredmény növelése
  54.         JR      NC,LF20E        ;újabb kivonás, ha még nem negatív az eredmény
  55.         CALL    LF254           ;(DE)+(HL), az utolsó kivonás visszacsinálása
  56.                                 ;így (DE)-ben a maradék lesz
  57.                                 ;HL=HL+4, a következő konstansra mutat
  58.  
  59.         LD      A,C             ;eredmény A-ba
  60.         EXX    
  61.         DEC     A               ;eredmény csökkentése eggyel
  62.                                 ;a visszacsinált kivonás miatt
  63.         JR      Z,LF229         ; (+03h)
  64.         ADD     A,D             ;A+"0", vagyis az eredmény ASCII
  65.                                 ;karakterré konvertálása
  66.         LD      E,D             ;E="0", vagyis ha volt már egy értékes
  67.                                 ;karakter, innentől kezdve kiírja a nulla
  68.                                 ;karaktereket is, a szám elején lévő
  69.                                 ;nullákat levágja
  70.         DB      2EH             ;töltelék bájt az OR E átugrásához
  71. LF229:  OR      E               ;nullás eredmény esetén megvizsgálja, hogy
  72.                                 ;bevezető nulláról, vagy már szám közben
  73.                                 ;lévő nulláról van szó
  74.         CALL    NZ,LF040        ;ha nem bevezető nulla, akkor karakter írása szövegpufferbe
  75.         EXX    
  76.         LD      A,(HL)          ;táblázat következő eleme
  77.         INC     A               ;=255? azaz lista vége?
  78.         JR      NZ,LF205        ;folytatás a következővel, ha még nincs vége
  79.         RET    
  80.  
  81. lf233:  DB      80H,96H,98H,00H ;00989680H=10000000
  82.         DB      40H,42H,0FH,00H ;000F4240H= 1000000
  83.         DB     0A0H,86H,01H,00H ;000186A0H=  100000
  84.         DB      10H,27H,00H,00H ;00002710H=   10000
  85.         DB     0E8H,03H,00H,00H ;000003E8H=    1000
  86.         DB      64H,00H,00H,00H ;00000064H=     100
  87.         DB      0AH,00H,00H,00H ;0000000AH=      10
  88.         DB      01H,00H,00H,00H ;00000001H=       1
  89.         DB      0FFH            ;lista vége

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #927 on: 2015.July.21. 10:12:04 »
flag bitekkel kapcsolatban kérdeznék

a CP és SUB utasításoknál a Sign bit ugyanúgy lesz mindig beállítva (vagy törölve), hogy a Carry is, ugye?
*** Speicherplatz zu klein

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: Assembly programozás
« Reply #928 on: 2015.July.21. 11:24:06 »
flag bitekkel kapcsolatban kérdeznék

a CP és SUB utasításoknál a Sign bit ugyanúgy lesz mindig beállítva (vagy törölve), hogy a Carry is, ugye?

Ezt hogy erted? Most ugy altalaban (nem Z80 only) de szerintem ha pl 130-bol kivonsz egyet, akkor az eredmeny 129, am ez ugye azt is jelenti, hogy legfelso bit 1, azaz az eredmeny kettes komplemenses abrazolassal nezve negativ. Ugyanakkor carry nem volt. Ha viszont pl 10-bol vonsz ki egyet, akkor az eredmeny pozitiv, es carry ismet nincs. Vagy nem igy ertetted?

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Assembly programozás
« Reply #929 on: 2015.July.21. 11:35:17 »
igazad van
*** Speicherplatz zu klein