?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM128
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. SCRHGT=192
  5.  
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;        
  7.         org PROGSTART
  8. begin
  9.         ld sp,0x4000 ;не должен опускаться ниже 0x3b00! иначе возможна порча OS
  10.         ld hl,1234
  11.         OS_HIDEFROMPARENT
  12.         ld e,0+0x80 ;EGA + keep gfx pages
  13.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  14.  
  15.         ld e,0
  16.         OS_CLS
  17.  
  18.         ld a,(user_scr0_low)
  19.         SETPG8000
  20.         ld a,(user_scr0_high)
  21.         SETPGC000
  22.  
  23.         call start
  24.        
  25.         YIELDGETKEYLOOP
  26.         QUIT
  27.  
  28. ;General Mandelbrot calculation idea was taken from https://www.pouet.net/prod.php?which=87739
  29. ;(C) litwr 2021
  30. ;Thanks to reddie for some help with optimization
  31. ;for pasmo assembler
  32. ;128x256 Mandelbrot for the Amstrad CPC, 16 color mode
  33.  
  34. ;SCR_SET_MODE            EQU #BC0E
  35. ;SCR_SET_INK             EQU #BC32  
  36. ;KM_WAIT_CHAR                   EQU #BB06
  37.  
  38. start
  39.  
  40. sqrbase equ 0x6000 ;must be $xx00
  41. initer  equ     7
  42. idx     equ     -36       ;-.0703125
  43. idy     equ     18        ;.03515625
  44. ix0     equ     -62*idx
  45. imx     equ     10*idx          ; x move
  46. sf4     equ     436/4           ; sf/4
  47.  
  48.     ld hl,sqrbase
  49.     ;push hl
  50.     ld bc,0
  51.     ld de,0
  52. sqrloop:
  53.     ;pop hl
  54.     ld (hl),c
  55.     inc l
  56.     ld (hl),b
  57.     inc hl
  58.    push hl
  59.     inc e
  60.     push de
  61.     ld h,d
  62.     ld l,e
  63.     add hl,hl
  64.     ld d,l
  65.     ld e,h
  66.     ld a,e
  67. r0l:
  68.     ld hl,0
  69.     add hl,de
  70.     ld (r0l+1),hl
  71.     adc a,c
  72.     ld c,a
  73.     ld a,0
  74.     adc a,b
  75.     ld b,a
  76. r4l:
  77.     ld hl,sqrbase
  78.     dec hl
  79.     ld (hl),b
  80.     dec l
  81.     ld (hl),c
  82.     ld (r4l+1),hl
  83.     pop de
  84.    pop hl
  85.     ;jr c,mandel0
  86.  
  87.     inc de
  88.     jr nc,sqrloop
  89.  
  90. ;mandel0:
  91.         ;pop hl
  92.        
  93.        
  94.        
  95. mandel:
  96.     ld ixl,0
  97.         ld hl,0x8000;$c040  ;scrtop
  98.         ld c,SCRHGT
  99.         exx;push hl
  100.     ld hl,(dy)
  101.     ld a,h
  102.     ld h,l
  103.     srl h
  104.     rra
  105.     ld l,a       ;dy*128
  106.     ld (r5),hl
  107. loop0:
  108.         exx
  109.         ld b,160;40
  110.         exx
  111. x0=$+1
  112.     ld hl,ix0
  113.     ld (r4),hl
  114. loop2:
  115.     ld hl,(r4)
  116.     ld de,(dx)
  117.      sra d
  118.      rr e
  119.     add hl,de
  120.     ld (r4),hl
  121.     ld b,h
  122.     ld c,l   ;r0
  123. niter=$+2
  124.     ld ixh,initer
  125.     ld hl,(r5)
  126. loc1:
  127.     ld d,h
  128.     ld e,l
  129.     res 0,l
  130.     ld a,sqrbase/256
  131.     add a,h
  132.     ld h,a
  133.     ld a,(hl)
  134.     inc l
  135.     ld h,(hl)
  136.     ld l,a
  137.     ex de,hl  ;de = r3 = sqr[r1&0xfffe]
  138.     add hl,bc   ;r1 += r0
  139.     ld a,b
  140.     ld b,h
  141.     ld h,a
  142.     ld a,c
  143.     ld c,l
  144.     ld l,a
  145.     res 0,l
  146.     ld a,sqrbase/256
  147.     add a,h
  148.     ld h,a
  149.     ld a,(hl)
  150.     inc l
  151.     ld h,(hl)
  152.     ld l,a       ;r0 = sqr[r0&0xfffe]
  153.     add hl,de
  154.     ld a,h
  155.     cp 8
  156.     jr nc,loc2
  157.  
  158.     push hl   ;r0 += r3
  159.     ld h,b
  160.     ld l,c
  161.     ld a,sqrbase/256
  162.     add a,h
  163.     ld h,a
  164.     res 0,l
  165.     ld a,(hl)
  166.     inc l
  167.     ld h,(hl)
  168.     ld l,a      ;r1 = sqr[r1&0xfffe]
  169. r5=$+1
  170.     ld bc,0
  171.     add hl,bc    ;add   r5, r1  ;sets C=0
  172.     pop bc   ;r0
  173.     sbc hl,bc  ;sub     r0, r1
  174.     push hl
  175. r4=$+1
  176.     ld hl,0
  177.     add hl,bc    ;r0 += r4
  178.     sbc hl,de    ;r0 -= r3
  179.     sbc hl,de
  180.     ld b,h     ;r0 -= r3
  181.     ld c,l
  182.     pop hl
  183.     dec ixh
  184.     jr nz,loc1
  185. loc2:
  186.     ld a,ixh   ;color
  187.     and 15   ;16 colors
  188.     ld hl,c8t
  189.     add a,l
  190.     ld l,a
  191.     ld a,(hl)
  192.     ;ld c,(hl)
  193.     ;ld a,ixl
  194.     ;xor 1
  195.     ;ld ixl,a
  196.     ;jp nz,lx1
  197.  
  198. ;tcolor=$+1
  199. ;    ld a,0
  200. ;    or c
  201.         exx;pop hl  ;scrtop
  202.         ;dec hl
  203.         ld (hl),a
  204.         ld a,h
  205.         xor 0x40
  206.         ld h,a
  207.         bit 6,h
  208.         jr nz,nextpixelq
  209.         xor 0x20
  210.         ld h,a
  211.         and 0x20
  212.         jr nz,$+3
  213.          inc hl
  214. nextpixelq
  215.         dec b
  216.         exx;push hl
  217.     ;ld c,a
  218.     ;ld a,$3f
  219.     ;xor h
  220.     ;ld h,a
  221.     ;ld a,$c0
  222.     ;xor l
  223.     ;ld l,a
  224.     ;ld (hl),c
  225.     ;ld a,l
  226.     ;and $3f
  227.     jp nz,loop2
  228.  
  229. ;next line
  230.         ;exx;pop hl  ;scrtop
  231.         ;ld de,40;$840
  232.         ;add hl,de
  233.         ;jr nc,lx10
  234.         ;ld de,$c040
  235.         ;add hl,de
  236. ;lx10:
  237.         ;exx;push hl
  238.        
  239.     ld de,(dy)
  240.     ld hl,(r5)
  241.     sbc hl,de   ;it seems, C=0 is always here
  242.     ld (r5),hl
  243.         exx
  244.         dec c
  245.         exx
  246.     jp nz,loop0
  247.  
  248. ;next frame
  249.  
  250.     ld hl,(x0)
  251.     ld de,(mx)
  252.     add hl,de
  253.     ld (x0),hl   ;x0 += mx
  254.     ld hl,niter
  255.     inc (hl)     ;iter++
  256.     ld hl,dx
  257.     ;push hl
  258. lx5:
  259.     ;pop hl
  260.     ld a,l
  261.     cp (mx&0xff)+2
  262.     jp z,lx2 ;перебираем dx, dy, mx
  263.  
  264.     ld (dx1p),a
  265.     ld (dx2p),a
  266.     ;add a,2
  267.     ;ld l,a
  268.    push hl
  269.     ld de,sqrbase-sf4
  270. dx1p=$+1
  271.     ld hl,(dx)
  272.     push hl
  273.     add hl,de
  274.     res 0,l
  275.     ld c,(hl)
  276.     inc l
  277.     ld b,(hl)
  278.     ld de,sqrbase+sf4
  279.     pop hl
  280.     add hl,de
  281.     res 0,l
  282.     or a ;sets C=0
  283.     ld a,(hl)
  284.     inc l
  285.     ld h,(hl)
  286.     ld l,a
  287.     sbc hl,bc  ;C=0
  288. dx2p=$+1
  289.     ld (dx),hl
  290.    pop hl
  291.     inc hl
  292.     inc hl
  293.     jr lx5
  294.  
  295. lx2:
  296.         ;pop hl
  297.     ;call KM_WAIT_CHAR
  298.     jp mandel
  299.  
  300. ;lx1:ld a,c
  301. ;    rrca
  302. ;    ld (tcolor),a
  303. ;    jp loop2
  304.  
  305. dx:     dw idx
  306. dy:     dw idy
  307. mx:     dw imx
  308. c8t:    ;db 0, 8, $22, $88, $2a, $28, 2, $8a
  309.         ;db $80, $20, $a0, $a8, $82, $a2, $aa, $a
  310. _=0
  311.         dup 8
  312.         db _*9
  313. _=_+1
  314.         edup
  315. _=0
  316.         dup 8
  317.         db _*9+0xc0
  318. _=_+1
  319.         edup
  320.        
  321. end
  322.  
  323.         display "End=",end
  324.         display "Free after end=",/d,#c000-end
  325.         display "Size ",/d,end-begin," bytes"
  326.        
  327.         savebin "mandelbr.com",begin,end-begin
  328.        
  329.         LABELSLIST "../../../us/user.l"
  330.