?login_element?

Subversion Repositories NedoOS

Rev

Rev 1424 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM1024
  2.           include "in_zxzvm.asm"
  3.  
  4. peek64  equ     ZXPK64
  5.  
  6.  
  7.         org     7000h   ;Program Segment Prefix (aka Zero Page). Those
  8. begin
  9.         jp      main    ;things are so useful!
  10. zinum:  defb    7       ;<< v0.02 >> Pretend to be a C128
  11.  
  12. param   equ     705Ch   ;Where the FCB parameter would be.
  13.  
  14.         org     7100h
  15. main:   ld      (isp),sp        ;Save BASIC's SP
  16.         ld      hl,0
  17.         ld      (cycles),hl
  18.         ld      de,param
  19.         call    ZXINIT  ;Initialise the I/O code
  20.         jp      nc,syserr
  21.         call    ZXVER
  22.         ld      hl,vererr
  23.         cp      VMVER
  24.         jp      nz,syserr
  25.         call    ZXIHDR
  26.         jp      nc,syserr
  27.         call    init_hdr
  28.         jp      nc,syserr
  29.         call    init_scr
  30.         jp      nc,syserr
  31.         call    init_rnd
  32.         jp      nc,syserr
  33.         call    init_stack
  34.         jp      nc,syserr
  35.         call    test_mem        ;<< v0.02 Check we can write Z-memory
  36.         jp      nc,syserr       ;>> v0.02
  37.         ld      a,1
  38.         ld      (running),a
  39.         call    showpc
  40. zloop:  call    zinst
  41.         push    hl              ;<< v0.02
  42.         push    af
  43.         ld      hl,(cycles)
  44.         inc     hl
  45.         ld      (cycles),hl     ;CALL ZXRCPU once every 2048 z-cycles.
  46.         ld      a,h
  47.         cp      8
  48.         jr      c,zlp0
  49.         ld      hl,0
  50.         ld      (cycles),hl
  51.         call    ZXRCPU
  52. zlp0:                           ; v0.02 >>
  53. zlp1:   pop     af
  54.         pop     hl
  55.  
  56.         call    showpc
  57.         jp      nc,zmstop
  58.         ld      a,(running)     ;Running = 1 to continue
  59.         dec     a               ;        = 0 to quit
  60.         jr      z,zloop         ;        = 2 to restart
  61.         inc     a
  62.         jr      z,zmexit
  63.         cp      2
  64.         jr      z,zmreset
  65.         jp      stub
  66. ;
  67. zmstop: push    hl
  68.         call    flush_buf
  69.         call    showstk
  70.         ld      de,anykey
  71.         ld      c,9
  72.         call    ZXFDOS
  73.         ld      c,6
  74.         ld      e,0FDh
  75.         call    ZXFDOS
  76.         pop     hl
  77.         jp      syserr
  78. ;
  79. zmexit: call    flush_buf
  80.         ld      de,anykey
  81.         ld      c,9
  82.         call    ZXFDOS
  83.         ld      c,6
  84.         ld      e,0FDh
  85.         call    ZXFDOS
  86.         scf
  87.         call    ZXEXIT
  88.         ld      sp,(isp)
  89.         ret                     ;<< v0.02 >> Spectrum-specific code removed
  90. ;                               ;from ZXZVM
  91. zmreset:
  92.         call    ZXRST           ;Restart
  93.         jp      nc,syserr
  94.         call    ZXIHDR
  95.         jp      nc,syserr
  96.         call    init_hdr
  97.         jp      nc,syserr
  98.         call    init_scr
  99.         jp      nc,syserr
  100.         call    init_rnd
  101.         jp      nc,syserr
  102.         call    init_stack
  103.         jp      nc,syserr
  104.         ld      a,1
  105.         ld      (running),a
  106.         jp      zloop
  107.  
  108. stub:   ld      a,8
  109.         ld      (5C3Ah),a
  110.         ld      hl,msg1
  111. syserr: xor     a
  112.         call    ZXEXIT
  113. ;
  114. ;ZXEXIT should not return if called with Carry reset. But in case it does,
  115. ;      reboot!
  116. ;
  117.         rst     0
  118.         di
  119.         halt
  120. ;
  121. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  122. ;
  123. ;Numerical data
  124. ;
  125. cycles: defw    0       ;No. of Z-machine cycles executed modulo 2048
  126. isp:    defw    0       ;BASIC's SP
  127. zsp:    defw    0       ;Z-machine stack pointer
  128. zstop:  defw    0       ;Top of Z-machine stack
  129. rsp:    defw    0       ;Routine stack pointer
  130. rstop:  defw    0       ;Top of routine stack
  131. zpc:    defw    0,0     ;Z-machine program counter
  132. zipc:   defw    0,0     ;Address of last opcode (as opposed to data)
  133. zver:   defb    0       ;Version of the Z-Machine
  134. inst:   defw    0       ;Current instruction
  135. running:
  136.         defb    0       ;SET to 1 while the Z-machine is running
  137. ;
  138. ;Some strings
  139. ;
  140. msg1:   defb    '9 Stub encountere'
  141.         defb    0E4h            ;'d'+80h
  142. ;
  143. vererr: defb    'A Version mismatc'
  144.         defb    0E8h            ;'h'+80h
  145. ;
  146. memerr: defb    '4 Memory test faile'   ;<< v0.02
  147.         defb    0E4h            ;'d'+80h;>> v0.02
  148. ;
  149. anykey: defb    13,10,'Press SPACE to finish',13,10,'$'
  150. ;
  151. zvbad:  defb    'A Story type '
  152. zvbuf:  defb    '000'
  153. ;
  154. ;;;;;;;;;;;;;;;;;;; SET up the header ;;;;;;;;;;;;;;;;;;;;;
  155. ;
  156. init_hdr:
  157.         ld      e,0
  158.         ld      hl,0
  159.         call    ZXPEEK          ;Get Z-file version
  160.         ld      (zver),a
  161.         ld      de,zvbuf
  162.         ld      l,a
  163.         ld      h,0             ;CREATE the "invalid version" error
  164.         call    spdec3
  165.         ex      de,hl
  166.         dec     hl
  167.         set     7,(hl)          ;Fatal error, so set bit 7 of last char
  168.         ld      hl,zvbad
  169.         ld      a,(zver)        ;v5 only?
  170.         cp      8
  171.         jr      z,verok
  172.         cp      3       ;<< v0.04 v3 support
  173.         jr      z,verok ;>> v0.04
  174.         cp      4       ;<< v1.10 v4 support
  175.         jr      z,verok ;>> v1.10
  176.         cp      5
  177.         jp      nz,ihdr8
  178. verok:  ld      hl,001Eh        ;Interpreter no.
  179.         ld      a,(zinum)       ;The interpreter number we pretend to be
  180.         call    ZXPOKE
  181.         ld      hl,001Fh
  182.         ld      a,'I'           ;<< v1.03 >> Our release number
  183.         call    ZXPOKE
  184. ;
  185. ;Get g_addr, address of globals table; also strings & routines
  186. ;
  187.         ld      e,0
  188.         ld      hl,08h
  189.         call    ZXPKWI
  190.         ld      (d_addr),bc     ;Dictionary
  191.         call    ZXPKWI
  192.         ld      (obj_addr),bc
  193.         call    ZXPKWI
  194.         ld      (g_addr),bc
  195. ;
  196.         ld      hl,28h
  197.         call    ZXPKWI
  198.         ld      (r_offs),bc
  199.         call    ZXPKWI
  200.         ld      (s_offs),bc
  201. ;
  202. ;Work out which upack_addr to use
  203. ;
  204.         ld      a,(zver)
  205.         ld      l,a
  206.         ld      h,0
  207.         add     hl,hl
  208.         ld      de,upack_table
  209.         add     hl,de
  210.         ld      e,(hl)
  211.         inc     hl
  212.         ld      d,(hl)
  213.         ld      (upack_addr+1),de
  214. ;
  215. ;Compute property sizes
  216. ;
  217.         ld      a,(zver)
  218.         cp      4
  219.         jr      c,psv3
  220.         ld      a,03Fh
  221.         ld      (psmask),a
  222.         ld      (pnmask),a
  223.         ld      hl,14
  224.         ld      (objlen),hl
  225.         ld      hl,126
  226.         ld      (ptlen),hl
  227.         jr      psv4
  228.  
  229. psv3:   ld      a,0E0h
  230.         ld      (psmask),a
  231.         ld      a,01Fh
  232.         ld      (pnmask),a
  233.         ld      hl,9
  234.         ld      (objlen),hl
  235.         ld      hl,62
  236.         ld      (ptlen),hl
  237. psv4:   scf
  238.         ret
  239. ;
  240. ihdr8:  and     a
  241.         ret
  242. ;
  243. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  244. ;
  245. init_scr:
  246.         ld      a,-1    ;erase_window(-1)
  247.         call    ZXERAW
  248.         xor     a
  249.         ld      (abbrev),a
  250.         ld      (alpha),a
  251.         ld      (dalpha),a
  252.         ld      (shift),a
  253.         ld      (multi),a
  254.         ld      (timer),a
  255.         call    inibuf  ;Initialise I/O buffering
  256.         scf
  257.         ret
  258. ;
  259. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  260. ;
  261. ;Initialise the random number generator
  262. ;
  263. init_rnd:
  264.         xor     a
  265.         ld      (rmode),a
  266.         ld      hl,0
  267.         call    random  ;Seed the generator
  268.         scf
  269.         ret
  270. ;
  271. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  272. ;
  273. ;Stack frame format (little-endian):
  274. ;
  275. ;+0:  DD pc             ;Previous ZPC
  276. ;+4:  DS 30             ;Local variables
  277. ;+34: DB call type      ;0=function, 1=procedure, 2=interrupt
  278. ;+35: DB pcount         ;Count of parameters
  279. ;+36: DW rsp            ;Routine stack pointer
  280. ;
  281. init_stack:
  282.         call    ZXTMEM
  283.         inc     hl              ;1st unusable byte
  284.         ld      (zsp),hl
  285.         ld      (zstop),hl
  286.         ld      de,-2048        ;2k call stack
  287.         add     hl,de
  288.         ld      (rsp),hl        ;Routine stack
  289.         ld      (rstop),hl
  290.         call    mkframe         ;Returns HL->frame
  291.         ret     nc
  292.         push    hl
  293.         pop     ix              ;IX -> frame
  294.         ld      de,(rsp)
  295.         ld      (ix+36),e
  296.         ld      (ix+37),d       ;Routine stack pointer
  297.         ld      (ix+34),1       ;Procedure
  298.         ld      (ix+35),0       ;No local variables
  299.         ld      hl,6
  300.         ld      e,0             ;00000006
  301.         call    ZXPKWD          ;PC high
  302.         ld      (zpc),bc
  303.         ld      bc,0
  304.         ld      (zpc+2),bc
  305.         scf
  306.         ret
  307. ;
  308. mkframe:
  309.         push    de
  310.         ld      hl,(zsp)
  311.         ld      de,-38          ;Frame size
  312.         add     hl,de
  313.         ld      (zsp),hl
  314.         push    hl
  315.         ld      de,(rstop)      ;CALL stack hits routine stack?
  316.         and     a
  317.         sbc     hl,de
  318.         pop     hl
  319.         ccf
  320.         jp      nc,spfail1              ;Stack overflow!
  321.         push    hl
  322.         ld      e,38
  323. mframe1:
  324.         ld      (hl),0          ;Initialise the frame to zeroes.
  325.         inc     hl
  326.         dec     e
  327.         jr      nz,mframe1
  328.         pop     hl
  329.         pop     de
  330.         ret
  331. ;
  332. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  333. ;
  334. zinst:  ld      hl,(zpc)
  335.         ld      (zipc),hl       ;Last opcode location
  336.         ld      hl,(zpc+2)
  337.         ld      (zipc+2),hl
  338.         call    zpcipeek                ;Get instruction byte
  339.         ret     nc
  340.         ld      (inst),a
  341.         cp      0FAh
  342.         jp      z,v2_inst               ;8-operand VAR
  343.         cp      0ECh
  344.         jp      z,v2_inst
  345.         cp      0E0h
  346.         jp      nc,var_inst
  347.         cp      0C0h
  348.         jp      nc,op2_vainst
  349.         cp      0BEh
  350.         jp      z,ext_inst
  351.         cp      0B0h
  352.         jp      nc,op0_inst
  353.         cp      080h
  354.         jp      nc,op1_inst
  355. ;
  356. ;It's a 2OP.
  357. ;
  358.         call    parse_2op       ;This decodes the parameters.
  359.         ld      a,2
  360.         ld      (v_argc),a
  361. op2_main:
  362.         ld      a,(inst)
  363.         and     1Fh
  364.         ld      de,two_ops
  365.         jr      dispatch
  366. ;
  367. op2_vainst:
  368.         call    zpcipeek        ;Operand types
  369.         ret     nc
  370.         call    parse_var       ;2OP with VAR parameters
  371.         jr      op2_main
  372. ;
  373. op1_inst:
  374.         ld      a,1             ;<< v1.00  SET argument count correctly
  375.         ld      (v_argc),a      ;>> v1.00
  376.         call    parse_1op
  377.         ld      a,(inst)
  378.         and     0Fh
  379.         ld      de,one_ops
  380.         jr      dispatch
  381. ;
  382. op0_inst:
  383.         xor     a               ;<< v1.00 SET argument count correctly
  384.         ld      (v_argc),a      ;>> v1.00
  385.         ld      a,(inst)
  386.         and     0Fh
  387.         ld      de,zero_ops
  388.         jr      dispatch
  389. ;
  390. ext_inst:
  391.         ld      a,(zver)        ;Aren't allowed extended opcodes in v1-v4
  392.         cp      5
  393.         jp      c,fail
  394.         call    zpcipeek        ;Get real opcode
  395.         ret     nc
  396.         ld      (inst+1),a
  397.         call    zpcipeek        ;Operand types
  398.         ret     nc
  399.         call    parse_var
  400.         ld      a,(inst+1)
  401.         bit     7,a
  402.         jp      nz,ext_high
  403.         ld      de,ext_ops
  404.         cp      MAXEXT          ;IN range?
  405.         jr      c,dispatch
  406.         jr      z,dispatch
  407.         jp      fail
  408.  
  409. v2_inst:
  410.         call    zpcipeek
  411.         ret     nc
  412.         ld      b,a
  413.         call    zpcipeek
  414.         ret     nc
  415.         ld      c,a
  416.         call    parse_v2
  417.         jr      var_main
  418. ;
  419. var_inst:
  420.         call    zpcipeek        ;Operand types
  421.         ret     nc
  422.         call    parse_var       ;Count in argc, args in arg1-arg4
  423. var_main:
  424.         ld      a,(inst)
  425.         and     1Fh
  426.         ld      de,var_ops
  427. dispatch:
  428.         ld      l,a
  429.         ld      h,0
  430.         add     hl,hl
  431.         add     hl,de
  432.         ld      e,(hl)
  433.         inc     hl
  434.         ld      d,(hl)
  435.         ex      de,hl
  436.         jp      (hl)
  437. ;
  438. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  439. ;
  440. ;Utility code to read the Z-machine's memory
  441. ;
  442. ipeek:  call    ZXPEEK
  443.         push    af
  444.         inc     hl
  445.         ld      a,h
  446.         or      l
  447.         jr      nz,ipeek1
  448.         inc     e
  449. ipeek1: pop     af
  450.         ret
  451. ;
  452. zpcipeek:
  453.         push    hl
  454.         push    de
  455.         ld      hl,(zpc)
  456.         ld      de,(zpc+2)
  457.         call    ipeek
  458.         ld      (zpc),hl
  459.         ld      (zpc+2),de
  460.         pop     de
  461.         pop     hl
  462.         ret
  463. ;
  464. zpcpeek:
  465.         push    hl
  466.         push    de
  467.         ld      hl,(zpc)
  468.         ld      de,(zpc+2)
  469.         call    ZXPEEK
  470.         pop     de
  471.         pop     hl
  472.         ret
  473. ;
  474. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  475. ;
  476. ; << v0.02 Check that Z-machine memory is writable. IF not, then
  477. ;          we can't run.
  478. ;
  479. test_mem:
  480.         ld      hl,40h
  481.         call    ZXPK64
  482.         ld      d,a     ;Correct value
  483.         cpl
  484.         ld      e,a     ;Different value
  485.         call    ZXPOKE
  486.         call    ZXPK64
  487.         cp      e       ;Has the change registered?
  488.         jr      nz,tm_fail
  489.         ld      a,d     ;Change back to the correct value.
  490.         call    ZXPOKE
  491.         call    ZXPK64
  492.         cp      d       ;Has the change back registered?
  493.         jr      nz,tm_fail
  494.         scf
  495.         ret
  496. ;
  497. tm_fail:
  498.         ld      hl,memerr
  499.         xor     a
  500.         ret
  501.  
  502. ; >> v0.02
  503. ;
  504. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  505. ;
  506. ;Other source files
  507. ;
  508.         include "vmdebug.asm"     ;Debugging ops
  509.         include "vmvar.asm"       ;Access to variables & operand decoding
  510.         include "vm0ops.asm"      ;0OP: operations
  511.         include "vm1ops.asm"      ;1OP: operations
  512.         include "vm2ops.asm"      ;2OP: operations
  513.         include "vmvops.asm"      ;VAR: operations
  514.         include "vmeops.asm"      ;EXT: operations
  515.         include "vmarith.asm"     ;Arithmetic operations
  516.         include "vmobj.asm"       ;Object operations
  517.         include "vmprop.asm"      ;Property operations
  518.         include "vmzchar.asm"     ;I/O and buffering
  519.         include "vmdict.asm"      ;Dictionary oprations
  520.         include "in_wrhex.asm"    ;Output hex and decimal numbers
  521. end
  522.  
  523.         savebin "vm.bin",begin,end-begin
  524.  
  525.         ;LABELSLIST "../../us/user.l"
  526.