?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;
  3. ;Extended operations
  4. ;
  5. MAXEXT  EQU     0Fh     ;Maximum extended opcode.
  6. ;
  7. ext_high:
  8.         scf             ;Extended operations 128-255.
  9.         ret             ;Entered with (inst+1) = opcode
  10. ;
  11. ext_ops:        ;0       1        2       3      4      5        6        7
  12.         defw    d_save,  d_restr, z_srl,  z_sra, sfont, drawpic, picdata, erapic
  13.         defw    smargin, u_save,  u_restr,pruni, ckuni, fail,    fail,    fail
  14. ;
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16. ;
  17. flags2: defb    0
  18. ;
  19. save_magic:     ;1...5...10..14  15 16
  20.         defb    'ZXZVM savefile',1Ah,2  ;(version 2)
  21.  
  22. save_hdr:
  23.         defs    16      ;Magic number
  24. save_zpc:
  25.         defw    0,0     ;Program counter
  26. save_mlen:
  27.         defw    0       ;DRAM length
  28. save_slen:
  29.         defw    0       ;Z-stack length
  30. save_rlen:
  31.         defw    0       ;Routine stack length
  32.         defs    102     ;Takes it up to 128 bytes
  33.  
  34.                         ;<< v1.01
  35. filever:
  36.         defb    0       ;Savefile version - 1 if the Z-stack has not been
  37.                         ;manipulated due to bug in v1.00, else 2
  38.                         ;>> v1.01
  39.  
  40. d_save: ld      a,1     ;<< v0.02 >> Flag "Save as"
  41.         call    ZXNAME
  42.         ex      de,hl   ;DE = filename parameter
  43.         call    ilprint
  44.         defb    13,10,'$'
  45.         ld      hl,abandoned ;<< v1.01 >>
  46.         ccf               ;<< v0.02 >> Carry-reset return here means "cancel"
  47.         jp      c,badsave ;<< v1.01 >> Don't RET, it will send the Z-machine
  48.                           ;           into hyperspace!
  49.         ex      de,hl   ;Restore filename parameter
  50.         ld      b,1     ;CREATE
  51.         call    ZXOPEN  ;CREATE savefile
  52.         jp      nc,badsave
  53.         ld      a,(v_argc)      ;<< v1.00  Nasty SAVE bug in v3 games
  54.         cp      1               ;         (and maybe others) - the base
  55.         jr      nc,d_sav0       ;         address was not being set to 0
  56.         ld      hl,0            ;         so save was from random address
  57.         ld      (v_arg1),hl
  58. d_sav0: ld      a,(v_argc)      ;>> v1.00
  59.         cp      2
  60.         jr      nc,d_sav1
  61.         ld      hl,0eh
  62.         ld      e,0     ;Address of DRAM length
  63.         call    ZXPKWI  ;BC = DRAM length
  64.         ld      (v_arg2),bc
  65. d_sav1: ld      hl,save_magic
  66.         ld      de,save_hdr
  67.         ld      bc,16
  68.         ldir            ;Copy magic number into header
  69.         ld      hl,(zpc)
  70.         ld      (save_zpc),hl
  71.         ld      hl,(zpc+2)
  72.         ld      (save_zpc + 2),hl
  73.         ld      hl,(zstop)      ;Top of Z-stack
  74.         ld      de,(zsp)        ;Bottom of Z-stack
  75.         and     a
  76.         sbc     hl,de           ;HL = Z-stack length
  77.         ld      (save_slen),hl
  78.         ld      hl,(rstop)
  79.         ld      de,(rsp)        ;Routine stack length
  80.         and     a
  81.         sbc     hl,de
  82.         ld      (save_rlen),hl
  83.         ld      hl,(v_arg2)
  84.         ld      (save_mlen),hl
  85. ;
  86. ;Write out the header
  87. ;
  88.         ld      hl,save_hdr
  89.         ld      bc,128
  90.         call    ZXWRIT
  91.         jp      nc,badsave
  92. ;
  93. ;Write out the memory
  94. ;
  95.         ld      bc,(save_mlen)
  96.         ld      hl,(v_arg1)     ;Base
  97.         call    ZXWMEM          ;Write z-machine memory
  98.         jr      nc,badsave
  99. ;
  100.         call    fixup_stack     ;Write call stack.
  101.         ld      bc,(save_slen)
  102.         ld      hl,(zsp)
  103.         call    ZXWRIT
  104.         call    fixup_stack
  105.         jr      nc,badsave      ;Write routine stack
  106.         ld      bc,(save_rlen)
  107.         ld      hl,(rsp)
  108.         call    ZXWRIT
  109. ;
  110.         ld      b,1
  111.         call    ZXCLSE
  112.  
  113.         ld      a,(zver)        ;<< v0.04  Early versions branch if OK
  114.         cp      4
  115.         jp      c,branch        ;>> v0.04
  116.         scf
  117.         ld      hl,1
  118.         jp      ret_hl
  119. ;
  120. ts_err:
  121.         ld      a,(hl)
  122.         push    hl
  123.         push    af
  124.         and     7fh
  125.         ld      l,a
  126.         ld      h,0
  127.         ld      a,1
  128.         call    ZXZCHR
  129.         pop     af
  130.         pop     hl
  131.         inc     hl
  132.         bit     7,a
  133.         jr      z,ts_err
  134.         ld      hl,0dh
  135.         ld      a,1
  136.         call    ZXZCHR
  137.         scf
  138.         ret
  139.  
  140. badsave:
  141.         call    ts_err
  142.         ld      b,1
  143.         call    ZXCLSE
  144. ;
  145.         ld      a,(zver)        ;<< v0.04 Early versions branch not store
  146.         cp      4
  147.         jp      c,nbranch       ;>> v0.04
  148.  
  149.         scf
  150.         ld      hl,0
  151.         jp      ret_hl
  152. ;
  153. d_restr: ;"restore"
  154.         ld      hl,10h
  155.         call    peek64
  156.         ld      (flags2),a
  157.         xor     a               ;<< v0.02 >> "Load" rather than "Save"
  158.         call    ZXNAME
  159.         ex      de,hl           ;DE = "name" parameter
  160.         call    ilprint
  161.         defb    13,10,'$'
  162.         ld      hl,abandoned    ;<< v1.01 >>
  163.         ccf                     ;<< v0.02 >> Carry reset here does not abort
  164.         jr      c,badsave       ;<< v1.01 >> nor send Z-machine into hyperspace
  165.         ld      b,0     ;Open to read
  166.         ex      de,hl           ;HL = "name" parameter
  167.         ;jr $
  168.         call    ZXOPEN  ;
  169.         jp      nc,badsave
  170.         ld      a,(v_argc)      ;<< v1.00 v3 'save' bug fix
  171.         cp      1
  172.         jr      nc,d_rstr0
  173.         ld      hl,0            ;Start restoring at byte 0
  174.         ld      (v_arg1),hl
  175. d_rstr0:                        ;>> v1.00
  176.         ld      a,(v_argc)
  177.         cp      2
  178.         jr      nc,d_rstr1
  179.         ld      hl,0eh
  180.         ld      e,0     ;Address of DRAM length
  181.         call    ZXPKWI  ;BC = DRAM length
  182.         ld      (v_arg2),bc
  183. d_rstr1:
  184.         ld      hl,save_hdr
  185.         ld      bc,128
  186.         call    ZXREAD
  187.         jp      nc,badsave
  188.         ld      hl,save_hdr
  189.         ld      de,save_magic
  190.         ld      b,15            ;<< v1.01 >> Can be v1 or v2
  191. d_rstr2:
  192.         ld      a,(de)
  193.         cp      (hl)
  194.         inc     hl
  195.         inc     de
  196.         jp      nz,d_rstr3
  197.         djnz    d_rstr2
  198.         ld      a,(hl)          ;<< v1.01 Special check on savefile version
  199.         ld      (filever),a
  200.         or      a               ;== 0
  201.         jp      z,d_rstr3
  202.         cp      3               ;>= 3
  203.         jp      nc,d_rstr3      ;Savefile versions 1 and 2 are acceptable
  204.                                 ;>> v1.01
  205. ;
  206. ;Header recognised. Load Z-memory & stacks
  207. ;
  208.         ld      a,(v_argc)
  209.         or      a
  210.         jr      nz,rstr_tab
  211.         ld      bc,(save_mlen)  ;Load memory
  212.         ld      hl,0            ;Base
  213.         call    ZXRMEM          ;Read z-machine memory
  214.         jp      nc,badsave
  215. ;
  216.         ld      hl,(zstop)
  217.         ld      de,(save_slen)
  218.         and     a
  219.         sbc     hl,de
  220.         ld      (zsp),hl        ;We have now passed the point of no return!
  221.                                 ;Errors now result in game abort!
  222.         ld      hl,(rstop)
  223.         ld      de,(save_rlen)
  224.         and     a
  225.         sbc     hl,de
  226.         ld      (rsp),hl
  227.                                 ;<< v1.01 don't fixup stack for v1 savefile
  228.         push    af
  229.         ld      a,(filever)
  230.         cp      1
  231.         call    nz,fixup_stack
  232.         pop     af              ;>> v1.01 Read call stack
  233.         ld      bc,(save_slen)
  234.         ld      hl,(zsp)
  235.         call    ZXREAD
  236.         push    af              ;<< v1.01
  237.         ld      a,(filever)     ;Don't fixup stack for v1 savefile
  238.         cp      1
  239.         call    nz,fixup_stack
  240.         pop     af              ;>> v1.01
  241.         ret     nc
  242.         ld      bc,(save_rlen)
  243.         ld      hl,(rsp)
  244.         call    ZXREAD
  245.         ret     nc
  246.         call    ZXCLSE
  247.         ld      hl,(save_zpc)   ;Returning from a successful restore.
  248.         ld      (zpc),hl
  249.         ld      hl,(save_zpc+2)
  250.         ld      (zpc+2),hl
  251.         ld      hl,2
  252.         ld      a,(zver)        ;<< v0.04 Branch if successful
  253.         cp      4
  254.         jp      c,branch        ;>> v0.04
  255.         scf
  256.         jp      ret_hl
  257. ;
  258. rstr_tab:
  259. ;
  260. ;Only load memory
  261. ;
  262.         ld      hl,(v_arg1)
  263.         ld      bc,(v_arg2)
  264.         call    ZXRMEM
  265.         jp      nc,badsave
  266.         ld      hl,(v_arg2)
  267.         scf
  268.         jp      ret_hl
  269. ;
  270. d_rstr3:
  271.         ld      hl,badfrm
  272.         jp      badsave
  273. ;
  274. fixup_stack:
  275.         push    af      ;For each entry in the Z-stack, replace its RSP
  276.         push    bc      ;entry with (RSPTOP - RSP). This operation is
  277.         push    de      ;self-inverse.
  278.         push    hl      ;Doing it like this means the stack in the savefile
  279.         push    ix      ;does not depend on the local ZXZVM's setting of
  280.         ld      ix,(zsp) ;RSPTOP.
  281. fixup_s1:
  282.         ld      de,(zstop)
  283.         push    ix
  284.         pop     bc
  285.         call    cpdebc
  286.         jr      z,fixend
  287.         ld      e,(ix+36)
  288.         ld      d,(ix+37)       ;DE = associated RSP
  289.         ld      hl,(rstop)
  290.         and     a
  291.         sbc     hl,de           ;HL = RSP offset
  292.         ld      (ix+36),l       ;<< v1.01 - write back the RESULT, not
  293.         ld      (ix+37),h       ;>> v1.01   the parameter!
  294.         ld      bc,38
  295.         add     ix,bc
  296.         jr      fixup_s1
  297. ;
  298. fixend: pop     ix
  299.         jp      popd
  300. ;
  301. badfrm: defb    'Not a ZXZVM savefile'
  302.         defb    0AEh                    ;'.'+80h
  303. ;
  304. abandoned:
  305.         defb    'Operation abandoned'
  306.         defb    0AEh                    ;'.'+80h
  307. ;
  308. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  309. ;
  310. ;ZXZVM does not support Undo in this incarnation. We can't guarantee
  311. ;enough memory in the target computer to hold the RAMsaved undo image.
  312. ;
  313. ;Possibly in the future this could be implemented (some PCWs have enough
  314. ;memory) but the speed hit might be too much for a 3.5MHz Z80 to take.
  315. ;
  316. u_save: ld      hl,0ffffh       ;RAMsave failed
  317.         scf
  318.         jp      ret_hl
  319. ;
  320. u_restr:
  321.         ld      hl,0            ;RAM restore failed
  322.         scf
  323.         jp      ret_hl
  324. ;
  325. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  326. ;
  327. z_srl:  ld      hl,(v_arg1)     ;logical shift
  328.         ld      bc,(v_arg2)
  329.         bit     7,b
  330.         jr      nz,z_srlr
  331. z_srll: add     hl,hl
  332.         dec     c
  333.         jr      nz,z_srll
  334. z_srlm: scf
  335.         jp      ret_hl
  336. ;
  337. z_srlr: res     7,h
  338.         call    absbc
  339. z_srlt: srl     h
  340.         rr      l
  341.         dec     c
  342.         jr      nz,z_srlt
  343.         jr      z_srlm
  344. ;
  345. ;Arithmetic shift
  346. ;
  347. z_sra:  ld      hl,(v_arg1)
  348.         ld      bc,(v_arg2)
  349.         bit     7,b
  350.         jr      z,z_srll
  351.         call    absbc
  352. z_srar: srl     h
  353.         rr      l
  354.         bit     6,h
  355.         jr      nz,z_srat
  356.         set     7,h
  357. z_srat: dec     c
  358.         jr      nz,z_srar
  359.         scf
  360.         jp      ret_hl
  361. ;
  362. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  363. ;
  364. ;set_font
  365. ;
  366. sfont:  call    flush_buf       ;<< v1.02 >> Flush buffers before
  367.         ld      a,(v_arg1)      ;changing fonts
  368.         call    ZXSFNT
  369.         ld      l,a
  370.         ld      h,0
  371.         scf
  372.         jp      ret_hl
  373. ;
  374. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  375. ;
  376. ;v6 routines (no-ops)
  377. ;
  378. erapic:
  379. drawpic:
  380. smargin:
  381.         scf
  382.         ret
  383. picdata:
  384.         jp      nbranch
  385. ;
  386. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  387. ;
  388. ;Unicode routines
  389. ;
  390. pruni:  ld      hl,(v_arg1)
  391.         ld      a,h
  392.         or      a
  393.         scf
  394.         ret     nz      ;Only allow ASCII characters to print
  395.         jp      prchar
  396. ;
  397. ckuni:  ld      de,(v_arg1)
  398.         ld      hl,0
  399.         ld      a,d
  400.         or      a
  401.         jr      nz,ckunie
  402.         set     0,l
  403.         ld      a,e
  404.         cp      128
  405.         jr      nc,ckunie
  406.         set     1,l
  407. ckunie: scf
  408.         jp      ret_hl
  409.