?login_element?

Subversion Repositories NedoOS

Rev

Rev 583 | Blame | Compare with Previous | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM128
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. EGA=1
  5. bmpbuf=0xbf00
  6. egagfx=0x6000 ;converted gfx (256 tiles *32 bytes vertically) = 0x2000
  7.  
  8. muz=0xc000
  9. muzplay=muz+3
  10.  
  11. INTSTACK=0x3f00
  12.  
  13.         org PROGSTART
  14. begin
  15.         ld sp,0x4000
  16.         OS_HIDEFROMPARENT
  17.  
  18.         if EGA
  19.         ld e,0 ;EGA
  20.         else
  21.         ld e,3 ;6912
  22.         endif
  23.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  24.  
  25.         if EGA
  26.         ld e,0
  27.         OS_CLS
  28.  
  29.         ;jr $
  30.         ;ld de,dirname
  31.         ;OS_CHDIR
  32.         ld de,gfxname
  33.         call openstream_file
  34.         ;or a
  35.         ;jp nz,noloadgfx
  36.         ld de,bmpbuf
  37.         ld hl,14+2
  38. ;DE = Buffer address, HL = Number of bytes to read
  39.         call readstream_file
  40.         ld de,bmpbuf
  41.         ld hl,(bmpbuf+14)
  42.         dec hl
  43.         dec hl
  44. ;DE = Buffer address, HL = Number of bytes to read
  45.         call readstream_file
  46.         ld de,bmpbuf
  47.         ld hl,16384+(4*16);16504 ;8bit bmp 128x128
  48. ;DE = Buffer address, HL = Number of bytes to read
  49.         call readstream_file
  50.         call closestream_file
  51.  
  52.         call recodepal
  53.         ld de,pal
  54.         OS_SETPAL
  55.        
  56.         ld hl,bmpbuf+(128*127)+(4*16);+0x76 ;bottom
  57.         ld e,0
  58. recodegfx0
  59.         push hl
  60.         ld lx,16
  61. recodegfx0bmpline
  62.         ld d,egagfx/256
  63.         call recodegfxsubchr
  64.         inc hl
  65.         inc hl
  66.         call recodegfxsubchr
  67.         inc hl
  68.         inc hl
  69.         call recodegfxsubchr
  70.         inc hl
  71.         inc hl
  72.         call recodegfxsubchr
  73.         inc hl        
  74.         inc hl
  75.         inc e
  76.         dec lx
  77.         jr nz,recodegfx0bmpline
  78.         pop hl
  79.         ld bc,-(128*8)
  80.         add hl,bc
  81.        
  82.         inc e
  83.         dec e
  84.         jr nz,recodegfx0
  85.        
  86.         endif
  87.  
  88.  
  89.         OS_GETMAINPAGES
  90. ;dehl=номера страниц в 0000,4000,8000,c000
  91.         ld a,l
  92.         LD (pgmuznum),A
  93.         ld hl,wasmuz
  94.         ld de,muz
  95.         ld bc,muzsz
  96.         ldir
  97.  
  98.         ;OS_GETSCREENPAGES
  99.         ;if EGA
  100.         ;ld a,e
  101.         ;SETPG32KLOW
  102.         ;ld a,d
  103.         ;ld (pgc000),a
  104.         ;SETPG32KHIGH
  105.         ;else ;6912
  106.         ;ld a,d
  107.         ;SETPG16K
  108.         ;endif
  109.         ;call setpgs_scr
  110.  
  111.          ld a,(pgmuznum)
  112.         SETPG32KHIGH
  113.          ;ld a,(pgmuznum)
  114.          ld hl,muzplay
  115.          OS_SETMUSIC
  116.  
  117.         call swapimer
  118.  
  119.         include "eric1.asm"
  120.  
  121. ;oldtimer
  122. ;        dw 0
  123. quiter
  124.         halt
  125. pgmuznum=$+1
  126.         ld a,0
  127.         SETPG32KHIGH
  128.         ;ld a,(pgmuznum)
  129.           ld hl,muz
  130.           OS_SETMUSIC
  131.         ;call muz ;shutay
  132.         halt
  133.         call swapimer
  134.         QUIT ;rasmer
  135.  
  136.  
  137. swapimer
  138.         di
  139.         ld de,0x0038
  140.         ld hl,oldimer
  141.         ld bc,3
  142. swapimer0
  143.         ld a,(de)
  144.         ldi ;[oldimer] -> [0x0038]
  145.         dec hl
  146.         ld (hl),a ;[0x0038] -> [oldimer]
  147.         inc hl
  148.         jp pe,swapimer0
  149.         ei
  150.         ret
  151. oldimer
  152.         jp on_int ;заменится на код из 0x0038
  153.         jp 0x0038+3
  154.  
  155. on_int
  156. ;restore stack with de
  157.         ld (on_int_hl),hl
  158.         ld (on_int_sp),sp
  159.         pop hl
  160.         ld (on_int_sp2),sp
  161.         ld (on_int_jp),hl
  162.         ld sp,INTSTACK
  163.         push af
  164.         push bc
  165.         push de
  166.        
  167. ;imer_curscreen_value=$+1
  168.          ;ld a,0
  169.          ;ld bc,0x7ffd
  170.          ;out (c),a
  171.  
  172.         ex de,hl;ld hl,0
  173. on_int_sp=$+1
  174.         ld (0),hl ;ok ;восстановили запоротый стек
  175.        
  176.         push ix
  177.         push iy
  178.         ex af,af'
  179.        exx
  180.        push af
  181.        push bc
  182.        push de
  183.        push hl
  184.        ;ld a,(curscreen)
  185.        ;ld e,a
  186.        ;OS_SETSCREEN ;вызываем здесь, а не в рандомном месте, иначе даже с одной задачей можем получить непредсказуемую задержку, которую не фиксирует наш таймер? с несколькими задачами надо учитывать и системный - TODO
  187. ;curpalette=$+1
  188.        ;ld de,wolfpal
  189.        ;OS_SETPAL
  190.        
  191.        call oldimer ;ei
  192.        
  193.        GET_KEY
  194.        ld (curkey),a
  195.  
  196.        pop hl
  197.        pop de
  198.        pop bc
  199.        pop af
  200.        exx
  201.        ex af,af'
  202.         pop iy
  203.         pop ix
  204.        
  205.         ;ld hl,(timer)
  206.         ;inc hl
  207.         ;ld (timer),hl
  208.  
  209.         pop de
  210.         pop bc
  211.         pop af
  212. on_int_hl=$+1
  213.         ld hl,0
  214. on_int_sp2=$+1
  215.         ld sp,0
  216.         ;ei
  217. on_int_jp=$+1
  218.         jp 0
  219.  
  220.  
  221.         if EGA
  222.        
  223.         macro RECODEBYTE
  224.         ld a,(hl)
  225.         ld ($+4),a
  226.         ld a,(trecodebyteleft)
  227.         ld b,a
  228.         inc hl
  229.         ld a,(hl)
  230.         dec hl
  231.         ld ($+4),a
  232.         ld a,(trecodebyteright)
  233.         or b
  234.         endm
  235.        
  236. recodegfxsubchr
  237. ;из hl в de
  238. ;de растёт по +256 (сохраняем положение в конце)
  239. ;hl растёт по -128 (возвращаем в конце как было)
  240.         push bc
  241.         push hl
  242.         ld c,128
  243.         dup 7
  244.         RECODEBYTE
  245.         ld b,0xff
  246.         ld (de),a
  247.         inc d
  248.         add hl,bc
  249.         edup
  250.         RECODEBYTE        
  251.         ld (de),a
  252.         inc d
  253.         pop hl
  254.         pop bc
  255.         ret
  256.  
  257. recodepal
  258.         ld hl,bmpbuf;+54
  259.         ld ix,pal
  260.         ld b,16
  261. recodepal0
  262.         ld e,(hl)
  263.         inc hl
  264.         ld d,(hl)
  265.         inc hl
  266.         push hl
  267.         ld l,(hl) ;e=B, d=G, l=R
  268.         call readfile_rgbtopal
  269.         pop hl
  270.         inc hl
  271.         inc hl
  272.         djnz recodepal0
  273.         ret
  274.  
  275. readfile_rgbtopal
  276. ;e=B, d=G, l=R
  277.         call calcRGBtopal_pp
  278.         ld (ix+1),a
  279.         call calcRGBtopal_pp
  280.         ld (ix),a
  281.         inc ix
  282.         inc ix
  283.         ret
  284.  
  285. calcRGBtopal_pp
  286. ;e=B, d=G, l=R
  287. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  288.         xor a
  289.         rl e  ;B
  290.         rra
  291.         rl l  ;R
  292.         rra
  293.         rrca
  294.         rrca
  295.         rl d  ;G
  296.         rra
  297.         rl e  ;b
  298.         rra
  299.         rl l  ;r
  300.         rra
  301.         rl d  ;g
  302.         rra
  303.         cpl
  304.         ret
  305.  
  306. ;INTSTACK ;затирает процедуры выше (по доке надо 0x3b00+)
  307.  
  308. pal
  309.         ds 32
  310.      
  311.         include "../../_sdk/file.asm"
  312. ;dirname
  313. ;        db "eric",0
  314. gfxname
  315.         db "eric/ericgfx.bmp",0
  316.  
  317.         align 256
  318. trecodebyteleft
  319.         dup 256
  320. ;%00003210 => %.3...210
  321. _3=$&8
  322. _210=$&7
  323.         db (_3*0x08) + (_210*0x01)
  324.         edup
  325.        
  326. trecodebyteright
  327.         dup 256
  328. ;%00003210 => %3.210...
  329. _3=$&8
  330. _210=$&7
  331.         db (_3*0x10) + (_210*0x08)
  332.         edup
  333.  
  334.         endif
  335.  
  336. wasmuz
  337.         incbin "ericmuz.bin"
  338. muzsz=$-wasmuz
  339.  
  340. end
  341.  
  342.         display "End=",end
  343.         ;display "Free after end=",/d,#c000-end
  344.         display "Size ",/d,end-begin," bytes"
  345.         savebin "eric.com",begin,end-begin