?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 "../_sdk/sys_h.asm"
  3.  
  4. bigmem=1
  5. atm=1
  6. p3dos=0
  7. USE_STDIO=0
  8.  
  9. STACK=0x4000
  10.  
  11. BANKN_TERMINATOR=0xff
  12.  
  13.         macro SELMEM
  14.         ld b,tpgs/256
  15.         ld c,a
  16.         ld a,(bc)
  17.         SETPGC000
  18.         endm
  19.  
  20.         org PROGSTART
  21. begin
  22.         ld sp,STACK
  23.        if USE_STDIO
  24.         call initstdio
  25.        else
  26.         OS_HIDEFROMPARENT
  27.         ld e,3+0x80 ;6912 + keep gfx pages
  28.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  29.        endif
  30.        
  31.         ;OS_GETMAINPAGES
  32. ;dehl=номера страниц в 0000,4000,8000,c000
  33.         if 1
  34.         ld hl,tpgs
  35.         ld b,64;32
  36. getpgs0
  37.         push bc
  38.         push hl
  39.         OS_NEWPAGE
  40.         pop hl
  41.         ld (hl),e
  42.         inc hl
  43.         pop bc
  44.         djnz getpgs0
  45.         endif
  46.        
  47.         ;ld de,path
  48.         ;OS_CHDIR
  49.  
  50.         ld hl,COMMANDLINE ;command line
  51. ;command line = "untr <file>"
  52.         call skipword
  53.         ld a,(hl)
  54.         or a
  55.         jr z,nofilename
  56.         call skipspaces
  57.         ld de,tfilename
  58.         call getword
  59.         ;call untr_load
  60. nofilename
  61.         ld hl,tfilename
  62.         ld de,0x705C
  63. copyfilename0
  64.         ld a,(hl)
  65.         ldi
  66.         or a
  67.         jr nz,copyfilename0
  68.         dec de
  69.         dec a ;0xff
  70.         ld (de),a
  71.         inc de
  72.         ld a,'$' ;на всякий случай
  73.         ld (de),a
  74.        
  75.         call main
  76.         ld hl,0
  77.         QUIT
  78.  
  79. path
  80.         db "zxzvm",0
  81.  
  82.         align 256
  83. tpgs
  84.         ds 256
  85.  
  86. tfilename
  87.         db "zxzvm/heroes.z5",0
  88.         ds tfilename+DIRMAXFILENAME64-$
  89.  
  90. getword
  91. ;hl=string
  92. ;de=wordbuf
  93. ;out: hl=terminator/space addr
  94. getword0
  95.         ld a,(hl)
  96.         or a
  97.         jr z,getwordq
  98.         sub ' '
  99.         jr z,getwordq
  100.         ldi
  101.         jp getword0
  102. getwordq
  103.         ;xor a
  104.         ld (de),a
  105.         ret
  106.  
  107. skipword
  108. ;hl=string
  109. ;out: hl=terminator/space addr
  110. skipword0
  111.         ld a,(hl)
  112.         or a
  113.         ret z
  114.         sub ' '
  115.         ret z
  116.         inc hl
  117.         jp skipword0
  118.  
  119. skipspaces
  120. ;hl=string
  121. ;out: hl=after last space
  122.         ld a,(hl)
  123.         cp ' '
  124.         ret nz
  125.         inc hl
  126.         jr skipspaces
  127.        
  128.        if USE_STDIO
  129.         include "../_sdk/stdio.asm"
  130.        endif
  131.  
  132.         ds #4000-$
  133.  
  134.        IF atm
  135. MAXMEM  EQU #0E ;ATM-Turbo 2+ = #E0000
  136. ;BANKIO  EQU #FFF7
  137. PGBUF=6;#7F^6
  138. pg1=1;#7F^8 ;header
  139. pg3=3;#7F^3
  140. pg6=6;#7F^6 ;buf
  141. ;pg7=#7F^7 ;scr
  142.        ELSE
  143. MAXMEM  EQU #07 ;Пентагон 512 = #70000
  144. ;BANKIO  EQU #7FFD
  145. PGBUF=#1E
  146. pg1=1
  147. pg3=3
  148. pg6=6
  149. ;pg7=7
  150.        ENDIF
  151. ;USED    EQU #38 ;число которое будет накладываться по AND
  152. ;и т.о. гасить биты
  153. ;отвечающие за страницы и не изменять другие
  154. ;GASIM   EQU #C7 ;если поступила в A не
  155. ;только информация о номере (физическом)
  156. ;страницы, то лишнюю информацию надо
  157. ;уничтожить. Уничтожаем с помощью AND GASIM
  158.  
  159. TABLE1  EQU #9E ;верхняя часть адреса
  160. ;где располагается таблица для перекл.
  161. ;нижних 64K
  162. TABLE2  EQU #9F ;верхняя часть адреса
  163. ;где располагается таблица для переключения памяти >64K
  164.  
  165.         INCLUDE "in_zxzvm.asm" ;header с EQU #4000+3*N
  166.  
  167. ONERR   EQU #5B3A ;Memory paging subroutine used in reporting
  168. ;errors
  169. BANKM   EQU #5B5C ;Memory paging latch
  170. OLDSP   EQU #5B6A ;Saved stack pointer used while BASIC is
  171. ;calling +3DOS
  172. SYNRET  EQU #5B6C ;Return address for ONERR
  173. ERRNO   EQU #5C3A ;Spectrum BASIC error number
  174. BORDCR  EQU #5C48 ;Border colour
  175. ATTR_P  EQU #5C8D ;Current screen colours set by BASIC
  176. RAMTOP  EQU #5CB2 ;Top of BASIC's memory (bottom of ZXZVM)
  177. PRAMT   EQU #5CB4 ;Top of physical memory
  178.  
  179. ;Graphics characters used by the 64-column printing system
  180. GTLC    EQU 142     ;Top left corner
  181. GTRC    EQU 130     ;Top right corner
  182. GBLC    EQU 133     ;Bottom left corner
  183. GBRC    EQU 134     ;Bottom right corner
  184. GTL     EQU 129     ;Top line
  185. GBL     EQU 135     ;Bottom line
  186. GLL     EQU 131     ;Left side
  187. GRL     EQU 132     ;Right side
  188. GLJ     EQU 136     ;Left side /internal line junction
  189. GRJ     EQU 137     ;Right side/internal line junction
  190. GIL     EQU 138     ;Internal line
  191.  
  192. ;Cursor keys
  193. LA      EQU 8       ;<-
  194. RA      EQU 9       ;->
  195. UA      EQU 11      ;^
  196. DA      EQU 10      ;DOWN ARROW
  197.  
  198. CR      EQU #0D
  199. LF      EQU #0A
  200.  
  201.         JP init1   ;Initialise, load story file
  202.         JP exit1   ;Deinitialise
  203.         JP cls1    ;Clear screen
  204.         JP peek1   ;Read byte from Z-machine memory
  205.         JP poke1   ;Write byte to Z-machine memory
  206.         JP peek64  ;Read byte from low 64k
  207.         JP peekw   ;Read word from Z-machine memory
  208.         JP ipeekw  ;Read word with auto increment
  209.         JP fdos1   ;CP/M-like I/O functions
  210.         JP ihdr1   ;Initialise the header
  211.         JP tmem1   ;Get top of available host memory
  212.         JP eraw1   ;Erase window
  213.         JP zchr1   ;Output a ZSCII letter in HL.
  214.         JP swnd1   ;Split window
  215.         JP swnd2   ;Select window
  216.         JP styl1   ;SET text style
  217.         JP scur1   ;SET cursor position
  218.         JP LINEINP ;Line input
  219.         JP RCHAR   ;Read character
  220.         JP scol1   ;SET colours
  221.         JP sfnt1   ;SET font
  222.         JP rndi1 ;Get randomish number (eg,the computer's clock)
  223.         JP getx1   ;Get cursor X position
  224.         JP gety1   ;Get cursor Y position
  225.         JP strm1   ;Open or close stream in A
  226.         JP eral1   ;Erase to EOL
  227.         JP snd1    ;MAKE a sound
  228.         JP rst1    ;Restart
  229.         JP GNAME   ;Get filename
  230.         JP p3opn   ;Open file
  231.         JP p3clse  ;Close file
  232.         JP p3read  ;Read bytes
  233.         JP p3write ;Write bytes
  234.         JP p3rmem  ;Read z-machine memory
  235.         JP p3wmem  ;Write z-machine memory
  236.         JP p3vrfy  ;Verify the game file
  237.                         ;<< v0.02
  238.         JP bfit1   ;Check if word in buffer will fit on screen.
  239.         RET
  240.         NOP
  241.         NOP             ;Relinquish the CPU, or rather don't.
  242.         JP yes_i_live
  243.         LD A,VMVER ;Return version
  244.         RET
  245.         RET             ;Update the screen. Not necessary.
  246.         NOP
  247.         NOP
  248.                         ;>> v0.02
  249.  
  250. oldHL_
  251.        DW 0
  252. ;;;
  253. init1
  254.         LD (story),DE
  255.        IF atm
  256.         ;LD A,#18
  257.         ;LD BC,#7FFD
  258.         ;OUT (C),A
  259.         ;CALL ATMON
  260.         LD HL,TABLE1*256
  261.         LD A,8;#7F^8 ;FIXME
  262. MKTAB10 LD (HL),A
  263.         inc a;DEC A
  264.         INC L
  265.         jr NZ,MKTAB10
  266.         LD HL,TABLE2*256
  267.         LD A,8;#7F^8
  268. MKTAB20 LD (HL),A
  269.         add a,4;SUB 4
  270.         INC L
  271.         jr NZ,MKTAB20
  272.        ELSE
  273.         CALL vers
  274.        ENDIF
  275.        ;EXX
  276.        ;LD (oldHL_),HL
  277.        ;EXX
  278.         JR init2
  279.         ;ld de,0100h
  280. ;0201 => +3 with Amstrad ROMs
  281. ;0100 => Sinclair 128
  282.         ;and a
  283.         ;sbc hl,de
  284.         ;jr z,init2
  285.         ;ld hl,reqp3
  286.         ;xor a
  287.         ;ret
  288.  
  289. init2
  290.         CALL ZXCLS           ;Clear the shadow screen
  291.        ld e,1
  292.        OS_SETSCREEN
  293.         LD A,1
  294.         LD (cfont),A       ;SET current font
  295.        IF atm
  296.         LD A,pg6
  297.        ELSE
  298.         LD A,(BANKM)
  299.         AND USED           ;Switch to bank 6 at the same time...
  300.         OR #0E              ;Activate the shadow screen
  301.          ;DI
  302.        ENDIF
  303.         LD (BANKM),A
  304.         call selmem
  305.         ;LD BC,BANKIO
  306.         ;OUT (C),A
  307.          ;EI
  308.         CALL dosinit    ;!
  309. ;Initialise +3DOS
  310.         RET NC
  311.         LD DE,signon
  312.         CALL PRINT           ;Sign on
  313.         ;ld de,copyright
  314.         ;call PRINT
  315.         LD HL,(story)
  316. pslp
  317.         LD E,(HL)
  318.         INC E               ;Print story name (FF-terminated)
  319.         JR Z,pslend
  320.         DEC E
  321.         CALL OPCHAR
  322.         INC HL
  323.         JR pslp
  324.  
  325. ;pslend ld de,sign1        ;Second part of sign-on message
  326.         ;call PRINT
  327. pslend
  328.         LD HL,(story)
  329.         CALL st_open ;!
  330. ;Load the story file
  331.         RET NC
  332.         CALL ZXCLS
  333.         LD A,pg6
  334.         CALL selmem
  335.         SCF
  336.         RET
  337.  
  338. ;Restart
  339. rst1
  340.         LD HL,#10  ;Flags 2 is preserved through a restart
  341.         CALL ZXPK64
  342.         LD B,A
  343.         INC HL
  344.         CALL ZXPK64
  345.         LD C,A
  346.         PUSH BC
  347.         LD DE,rest_
  348.         CALL PRINT
  349.         CALL st_reload
  350.         POP BC
  351.         RET NC
  352.         LD HL,#10
  353.         LD A,B     ;Restore Flags 2
  354.         CALL ZXPOKE
  355.         INC HL
  356.         LD A,C
  357.         CALL ZXPOKE
  358.         CALL ZXCLS
  359.         LD A,1
  360.         LD (cfont),A
  361.         SCF
  362.         RET
  363.  
  364. ;;;
  365. exit1
  366.         PUSH AF
  367.         PUSH HL
  368.       if 0
  369.        EXX
  370.        LD HL,(oldHL_)
  371.        EXX
  372.       endif
  373.         CALL st_close
  374.         CALL dosunit ;Undo anything we did to +3DOS
  375.       if 1
  376.         POP HL
  377.         POP AF
  378.         RET C               ;IF Carry was set, return (zmexit)
  379.         ld hl,(ERRNO)
  380.         ld h,0
  381.         QUIT
  382.       else
  383.          DI              ;Switch back to the conventional screen
  384.         LD A,(BANKM)
  385.         AND #F0
  386.          DI
  387.         LD (BANKM),A
  388.         LD BC,BANKIO
  389.         OUT (C),A
  390.          EI
  391.         POP HL
  392.         POP AF
  393.         RET C               ;IF Carry was set, return
  394.         EX DE,HL
  395.         LD A,(ERRNO)       ;Error number has been set elsewhere.
  396.         INC A               ;Don't try to guess it.
  397.         JP NZ,ZXERR
  398.         LD A,(DE)         ;1st byte of return string could be an
  399.                                 ;ASCII error number
  400.         CP "0"
  401.         JP C,ZXERR
  402.         CP "9"+1
  403.         JR C,setnum
  404.         CP "A"
  405.         JP C,ZXERR
  406.         CP "Z"+1
  407.         JP NC,ZXERR
  408. ;setlet
  409.         SUB 7
  410. setnum
  411.         SUB "1"
  412.         LD (ERRNO),A
  413.         JP ZXERR
  414.       endif
  415.  
  416. ;;;
  417. cls1
  418.         ;LD A,pg7
  419.         CALL selmemscr
  420.         LD HL,#C000 ;Clear the screen bitmap
  421.         LD D,H
  422.         LD E,L
  423.         INC DE
  424.         LD BC,#17FF
  425.         LD (HL),L
  426.         LDIR
  427.         INC HL
  428.         INC DE
  429.         JR clattr1
  430.  
  431. ;Clear colours only
  432. clattr
  433.         ;LD A,pg7
  434.         CALL selmemscr
  435.         LD HL,#D800
  436.         LD D,H
  437.         LD E,L
  438.         INC DE
  439. clattr1
  440.         LD BC,#2FF
  441.         LD A,7;(ATTR_P)
  442.         LD (HL),A
  443.         LDIR
  444.         LD A,0;(BORDCR)
  445.         RRCA
  446.         RRCA
  447.         RRCA
  448.         AND 7
  449.         OUT (254),A
  450.         RET
  451.  
  452. ;;;
  453. HL_     DB #00,#00 ;Дабы не мучаться со стеком (записывается в getbyte)
  454.  
  455. TEMP    DB #00 ; Надо для исп. команды RRD
  456.  
  457. ;;;
  458.         IF bigmem == 0
  459. getbyte ;128K
  460.         LD A,(BANKM) ;Запоминаем банку
  461.         LD (TEMPBANKA),A ;для последующего (в конце)
  462. ;к ней возврата
  463.         LD (HL_),HL
  464.         PUSH BC
  465.  
  466.         LD B,#06 ;Переключение на буфер
  467.         LD A,(BANKM) ;(страница 6)
  468.         AND USED
  469.         OR B
  470.         LD BC,BANKIO
  471.         OUT (C),A
  472.  
  473.         LD A,E  ;склеиваем правую поло-
  474.         LD B,H  ;винку E и левую H
  475.         LD HL,TEMP ;подробнее смотри в
  476.         LD (HL),B  ;tr-dos+.zsm
  477.         RRD
  478.         LD A,(HL)
  479.         AND #FC ;гасим два бита 0-ой 1-й
  480.         LD H,A
  481.         LD A,(BUFMEM)
  482.         SUB H ;не содержится ли требуемый адрес
  483. ;уже в буфере? Если нет, то вызов процедуры st_peek
  484.  
  485.         LD HL,(HL_)
  486.         CALL NZ,st_peek
  487. ;Вызов процедуры загрузки 16K
  488. ;буфера содержащего запрашиваемый адрес
  489.  
  490.         LD A,#C0 ;Ложим байт в A из нуж-
  491.         OR H     ;ной страницы по нужно-
  492.         LD H,A   ;му адресу
  493.         LD A,(HL)
  494.  
  495.         LD L,A
  496.         LD A,(TEMPBANKA) ;Переключаемся
  497.         LD BC,BANKIO ;обратно банку
  498.         OUT (C),A ;бывшую до getbyte
  499.         LD A,L
  500.  
  501.         POP BC
  502.         LD HL,(HL_)
  503.         SCF
  504.         EI
  505.         RET
  506.  
  507. peek1 ;128K
  508.         DI
  509.         LD A,E
  510. ;First 64k? IF not, access file on disc
  511.         AND A
  512.         JR NZ,getbyte
  513.  
  514. peek64 ;128K
  515.         DI
  516.         PUSH BC
  517.         LD (HL_),HL
  518.         LD A,(BANKM)
  519.         LD (TEMPBANKA),A
  520.  
  521.         AND USED ;Only change the memory banking settings
  522.         LD C,A
  523.         LD A,H
  524.         RLCA
  525.         RLCA
  526.         AND 3    ;A = Z-machine bank, 0-3
  527.  
  528.         LD L,A
  529.         LD H,TABLE1
  530.         LD A,(HL)
  531.         OR C
  532.         LD BC,BANKIO
  533.         OUT (C),A
  534.  
  535.         LD HL,(HL_)
  536.         LD A,#C0
  537.         OR H
  538.         LD H,A     ;HL |= #C000
  539.         LD A,(HL)
  540.  
  541.         LD L,A
  542.         LD A,(TEMPBANKA)
  543.         LD BC,BANKIO
  544.         OUT (C),A
  545.         LD A,L
  546.  
  547.         POP BC
  548.         LD HL,(HL_)
  549.         SCF
  550.         EI
  551.         RET
  552.         ENDIF ;128K
  553.  
  554.  
  555.  
  556.  
  557.         IF bigmem
  558. peek1
  559.         DI ;FIXME
  560.         LD A,E
  561.        IF atm == 0
  562. ;First 64k? IF not, access file on disc
  563.         AND A
  564.         JR Z,peek64nDI
  565.        CP MAXMEM ;addr>=#70000?
  566.        JR NC,BANKA6
  567.        ENDIF
  568.        EXX
  569.        LD L,A
  570.        EXX
  571.  
  572.        ;LD A,(BANKM) ;Запоминаем банку
  573.        ;LD (TEMPBANKA),A ;для последующего (в конце)
  574. ;к ней возврата
  575.  
  576.        ;LD (HL_),HL
  577.        ;PUSH BC
  578.  
  579.        ;LD A,E
  580.        ;CP MAXMEM ;Пентагон 512 может
  581. ;содержать в памяти адреса от #00000 до #6ffff
  582.        ;JR NC,BANKA6
  583.  
  584.         LD A,H
  585.        EXX
  586.         RLCA
  587.         RLCA
  588.         AND %00000011
  589.  
  590.         LD H,TABLE2
  591.        ;LD L,E
  592.        IF atm
  593.         XOR (HL)
  594.        ELSE
  595.         OR (HL)
  596.        ENDIF
  597.  
  598. ;Получаем банку, которую нужно включить
  599.        ;LD B,A ;Включаем банку
  600.        ;LD A,(BANKM) ;расширенной
  601.        ;AND USED      ;памяти
  602.        ;OR B
  603.         ;LD BC,BANKIO
  604.         ;OUT (C),A
  605.         SELMEM
  606.        EXX
  607.        ;LD HL,(HL_)
  608. CONT
  609.        PUSH HL
  610.         LD A,#C0 ;Ложим байт в A из нуж-
  611.         OR H     ;ной страницы по нужно-
  612.         LD H,A   ;му адресу
  613.        ;LD A,(HL)
  614.        ;LD L,A
  615.        LD L,(HL)
  616.        ;LD A,(TEMPBANKA) ;Переключаемся
  617.        LD A,(BANKM)
  618.        EXX
  619.         ;LD BC,BANKIO ;обратно банку
  620.         ;OUT (C),A ;бывшую до getbyte
  621.         SELMEM
  622.        EXX
  623.         LD A,L
  624.  
  625.        ;POP BC
  626.        ;LD HL,(HL_)
  627.        POP HL
  628.         SCF
  629.         EI
  630.         RET
  631.  
  632.        IF atm == 0
  633. BANKA6
  634. ;Переключение на буфер-страницу
  635.        PUSH HL
  636.        ;LD B,#06
  637.        ;LD A,(BANKM)
  638.        ;AND USED
  639.        ;OR B
  640.        LD A,PGBUF
  641.        EXX
  642.         ;LD BC,BANKIO
  643.         ;OUT (C),A
  644.         SELMEM
  645.        EXX
  646.  
  647.        ;LD A,E
  648.        ;LD B,H
  649.        LD A,H
  650.         LD HL,TEMP
  651.        ;LD (HL),B
  652.        LD (HL),A
  653.        LD A,E
  654.         RRD
  655.         LD A,(HL)
  656.         AND #FC ;гасим два бита 0-ой 1-й
  657.         LD H,A
  658.  
  659.         LD A,(BUFMEM)
  660.         SUB H ;не содержится ли требуемый адрес
  661. ;уже в буфере? Если нет, то вызов процедуры st_peek
  662.  
  663.        ;LD HL,(HL_)
  664.        POP HL
  665.         CALL NZ,st_peek
  666. ;Вызов процедуры загрузки 16K
  667. ;буфера содержащего запрашиваемый адрес
  668.  
  669.         JP CONT
  670.        ENDIF
  671.  
  672. peek64
  673.         DI
  674. peek64nDI ;
  675.        ;PUSH BC
  676.        ;LD (HL_),HL
  677.        ;LD A,(BANKM)
  678.        ;LD (TEMPBANKA),A
  679.        ;AND USED ;Only change the memory banking settings
  680.        ;LD C,A
  681.         LD A,H
  682.         RLCA
  683.         RLCA
  684.         AND 3  ;A = Z-machine bank, 0-3
  685.        EXX
  686.  
  687.         LD L,A
  688.         LD H,TABLE1
  689.         LD A,(HL)
  690.        ;OR C
  691.         ;LD BC,BANKIO
  692.         ;OUT (C),A
  693.         SELMEM
  694.  
  695.        EXX
  696.        ;LD HL,(HL_)
  697.         JP CONT
  698.  
  699.         ENDIF
  700.  
  701. ;
  702. btrace
  703.         CALL PUSHA
  704.         OUT (254),A
  705. yil11
  706.         CALL CON6
  707.         OR A
  708.         JR Z,yil11
  709.         JP POPA
  710. ;
  711. slowpw
  712.         CALL peek1
  713.         DI
  714.         LD B,A
  715.         INC HL
  716.         LD A,H
  717.         OR L
  718.         JR NZ,slowp1
  719.         INC E
  720. slowp1
  721.         CALL peek1
  722.         DI
  723.         INC HL
  724.         LD C,A
  725.         LD A,H
  726.         OR L
  727.         JR NZ,slowp2
  728.         INC E
  729. slowp2
  730.        ;POP AF
  731.        EX AF,AF' ;'
  732.         SCF
  733.         EI
  734.         RET
  735. ;
  736. peekw
  737.         PUSH HL
  738.         PUSH DE
  739.         CALL ipeekw
  740.         POP DE
  741.         POP HL
  742.         RET
  743. ;
  744. ipeekw
  745.         DI
  746.        ;PUSH AF
  747.        EX AF,AF' ;'
  748.         LD A,E
  749.         OR A       ;Is the word in RAM?
  750.         JR NZ,slowpw
  751.         LD A,L
  752.        ;CP #FF
  753.        INC A ;Is there a chance the word might go across 2 pgs?
  754.         JR Z,slowpw
  755.  
  756. ;Read a word from the low 64k
  757. ;we know it does not extend over a page boundary
  758.         PUSH HL
  759.        ;PUSH DE
  760.  
  761.        ;LD A,(BANKM)
  762.        ;LD (TEMPBANKA),A
  763.        ;AND USED ;Only change the memory banking settings
  764.        ;LD C,A
  765.         LD A,H
  766.         RLCA
  767.         RLCA
  768.         AND 3       ;A = Z-machine bank, 0-3
  769.  
  770.        ;PUSH HL
  771.        EXX
  772.         LD L,A
  773.         LD H,TABLE1
  774.         LD A,(HL)
  775.        ;OR C
  776.         ;LD BC,BANKIO
  777.         ;OUT (C),A
  778.         SELMEM
  779.        ;POP HL
  780.        EXX
  781.  
  782.         LD A,#C0
  783.         OR H
  784.         LD H,A     ;HL |= #C000
  785.        ;LD D,(HL)
  786.        LD B,(HL)
  787.         INC HL
  788.        ;LD E,(HL)
  789.        LD C,(HL)
  790.  
  791.        ;LD L,A
  792.        ;LD A,(TEMPBANKA)
  793.        LD A,(BANKM)
  794.        EXX
  795.         ;LD BC,BANKIO
  796.         ;OUT (C),A
  797.         SELMEM
  798.        EXX
  799.        ;LD A,L
  800.  
  801.        ;LD B,D
  802.        ;LD C,E
  803.        ;POP DE
  804.         POP HL
  805.         INC HL
  806.         INC HL
  807.         LD A,H     ;<< v1.03 Check for rollover at FFFE ->>10000
  808.         OR L
  809.        ;JR NZ,fpw1
  810.        JR Z,fpwinc
  811.        EX AF,AF' ;'
  812.        SCF
  813.        EI
  814.        RET
  815. fpwinc
  816.         INC E
  817. fpw1
  818.                                 ;>> v1.03
  819.        ;POP AF
  820.        EX AF,AF' ;'
  821.         SCF
  822.         EI
  823.         RET
  824.  
  825. ;;;
  826. poke1
  827.         DI
  828.         PUSH HL
  829.        ;PUSH DE
  830.        ;PUSH BC
  831.        ;LD D,A
  832.        EX AF,AF' ;'
  833.  
  834.        ;LD A,(BANKM)
  835.        ;LD (TEMPBANKA),A
  836.        ;AND USED
  837.        ;LD C,A
  838.         LD A,H
  839.         RLCA
  840.         RLCA
  841.         AND 3
  842.  
  843.        ;PUSH HL
  844.        EXX
  845.         LD L,A
  846.         LD H,TABLE1
  847.         LD A,(HL)
  848.        ;OR C
  849.         ;LD BC,BANKIO
  850.         ;OUT (C),A
  851.         SELMEM
  852.        ;POP HL
  853.        EXX
  854.  
  855.         LD A,#C0
  856.         OR H
  857.         LD H,A     ;HL|=#C000
  858.        ;LD (HL),D
  859.        EX AF,AF' ;'
  860.        LD (HL),A
  861.  
  862.        ;LD L,A
  863.        ;LD A,(TEMPBANKA)
  864.        LD A,(BANKM)
  865.        EXX
  866.         ;LD BC,BANKIO
  867.         ;OUT (C),A
  868.         SELMEM
  869.        EXX
  870.        ;LD A,L
  871.  
  872.        ;POP BC
  873.        ;POP DE
  874.         POP HL
  875.         SCF
  876.         EI
  877.         RET
  878.  
  879. ;;;
  880. ;SET screen colours
  881.  
  882. ;Since this I/O model does not support colour (Spectrum colour
  883. ;clash means the lines of text don't match the colours) this is
  884. ;disabled pro tem. What it would normally do is set colours for
  885. ;the whole screen...
  886.  
  887. scol1
  888.         SCF
  889.         RET
  890.  
  891. ;Colour map. ibm2zx[ibm_col] = zx_col
  892. ibm2zx
  893.         DEFB 0,2,4,6,1,3,5,7
  894. zx2ibm
  895.         DEFB 0,4,1,6,2,3,5,7
  896. def_fg
  897.         DEFB 0       ;Default FG
  898. def_bg
  899.         DEFB 0       ;Default BG
  900.  
  901. ;;;
  902. ;<< v0.02
  903. ;Work out whether a word will fit on the line. Since the +3 uses
  904. ;a fixed-pitch font, we don't need to bother with what the text
  905. ;actually says, only with its length. B=no. of letters and C=no.
  906. ;of spaces.Return 0 to print everything,1 to print letters only,
  907. ;2 to print carriage return and then everything.
  908. bfit1
  909.         DI
  910.         CALL getx1  ;H = amount of space on the line
  911.         LD D,0     ;D = value to return.
  912.         LD A,C
  913.         ADD A,B     ;A = total chars in line
  914.         CP H
  915.         LD A,D
  916.         RET C       ;The whole lot will fit.
  917.  
  918. ;See if the word will fit.
  919.         INC D
  920.         LD A,B
  921.         CP H
  922.         LD A,D
  923.         RET C       ;Letters only will fit
  924.         INC A       ;Nothing will fit, return 2.
  925.         SCF
  926.         RET
  927.  
  928. ;>> v0.02
  929. ;;;
  930. ;Get X position in L, chars left in H, total screen width in A
  931. getx1
  932.         LD HL,(uwx)        ;<< v0.04 use UWX/LWX, not XPOS.
  933.         LD A,(cwin)
  934.         OR A
  935.         JR Z,getx2
  936.         LD HL,(lwx)
  937. getx2
  938.         LD A,64            ;>> v0.04
  939.         SUB L
  940.         LD H,A
  941.         LD A,64
  942.         SCF
  943.         RET
  944.  
  945. ;Get Y position in L
  946. gety1
  947.         LD HL,(uwx)
  948.         LD A,(cwin)
  949.         OR A
  950.         JR Z,gety2
  951.         LD HL,(lwx)
  952. gety2
  953.         LD L,H
  954.         LD H,0
  955.         SCF
  956.         RET
  957.  
  958. ;;;
  959. eral1
  960.         DI
  961.         LD HL,(XPOS)
  962.         PUSH HL
  963.         LD A,(HVF)
  964.         PUSH AF
  965.         LD A,(ulf)
  966.         PUSH AF
  967.         XOR A
  968.         LD (HVF),A
  969.         LD HL,(uwx)
  970.         LD A,(cwin)
  971.         OR A
  972.         JR Z,eral2
  973.         LD HL,(lwx)
  974. eral2
  975.         LD (XPOS),HL
  976.         LD A,63
  977.         SUB L
  978.         JR Z,eral9
  979.         LD B,A
  980. eral3
  981.         LD E," "
  982.         CALL OPCHAR
  983.         DJNZ eral3
  984. eral9
  985.         POP AF
  986.         LD (ulf),A
  987.         POP AF
  988.         LD (HVF),A
  989.         POP HL
  990.         LD (XPOS),HL
  991.         SCF
  992.         EI
  993.         RET
  994.  
  995. ;;;
  996. ;SET font.
  997. ;The Spectrum uses only one font, but it serves as no.1
  998. ;or no. 4
  999. sfnt1
  1000.         CP 1               ;Font is not valid
  1001.         JR Z,sfnt2
  1002.         CP 3
  1003.         JR Z,sfnt2
  1004.         CP 4
  1005.         JR Z,sfnt2
  1006.         XOR A
  1007.         RET
  1008.  
  1009. sfnt2
  1010.         LD HL,(cfont)      ;Font is valid
  1011.         LD (cfont),A
  1012.         LD A,L
  1013.         RET
  1014.  
  1015. cfont
  1016.         DEFB 0
  1017.  
  1018. ;;;
  1019. ;SET output stream
  1020. strm1
  1021.         CP 2       ;Open a transcript
  1022.         JP Z,ts_open
  1023.         CP #FE     ;Close a transcript
  1024.         JP Z,ts_close
  1025.         SCF
  1026.         RET
  1027.  
  1028. ;;;
  1029. ;A Spectrum clone of CP/M's BDOS functions dealing with console
  1030. ;I/O
  1031. ;These functions are mainly intended for diagnostic code
  1032. fdos1
  1033.         LD A,C
  1034.         CP 1
  1035.         JR Z,ichr1
  1036.         CP 2
  1037.         JR Z,opc1
  1038.         CP 6
  1039.         JR Z,dcio1
  1040.         CP 9
  1041.         JR Z,print1
  1042.         LD A,C
  1043.         LD DE,badfun
  1044.         CALL sphex2  ;Write function number into error message
  1045.         LD HL,unimpl
  1046.         XOR A
  1047.         RET
  1048.  
  1049. ichr1
  1050.         CALL CON6    ;1. Input character with echo
  1051.         OR A
  1052.         JR Z,ichr1
  1053.         LD E,A
  1054. opc1
  1055.         CALL OPCHAR  ;2. Output character
  1056.         SCF
  1057.         RET
  1058.  
  1059. dcio1
  1060.         LD A,E     ;6. Direct console input/output
  1061.         CP #FD
  1062.         JR C,opc1
  1063.         JR Z,ichr2 ;6/FD: Input character, no echo
  1064.         CP #FE
  1065.         JR Z,pkbd1 ;6/FE: Poll keyboard,return 1 if char waiting
  1066.         CALL CON6
  1067.         SCF    ;6/FF: Poll keyboard, return char if char waiting
  1068.         RET
  1069.  
  1070. pkbd1
  1071.         CALL CON6    ;6/FE
  1072.         OR A
  1073.         SCF
  1074.         RET Z
  1075.         LD A,1
  1076.         RET
  1077.  
  1078. ichr2
  1079.         CALL CON6    ;6.FD
  1080.         OR A
  1081.         JR Z,ichr2
  1082.         SCF
  1083.         RET
  1084.  
  1085. print1
  1086.         LD A,1
  1087.         LD (WRAP),A
  1088. print2
  1089.         LD A,(DE)
  1090.         CP "$"
  1091.         JR Z,endpr
  1092.         LD L,A
  1093.         LD H,0
  1094.         PUSH DE
  1095.         CP #0A
  1096.         CALL NZ,out1
  1097.         POP DE
  1098.         INC DE
  1099.         JR print2
  1100.  
  1101. ;call print   ;9. Print $-terminated string
  1102. endpr
  1103.         XOR A
  1104.         LD (WRAP),A
  1105.         SCF
  1106.         RET
  1107.  
  1108. ;;;
  1109. ihdr1
  1110. ;The header is at 1:C000. So page it in and access it directly.
  1111.         LD A,pg1
  1112.         CALL selmem
  1113.         LD A,(#C000)      ;Z-machine version
  1114.         LD (zver),A
  1115.         LD DE,zvbuf
  1116.         LD L,A
  1117.         LD H,0             ;CREATE the "invalid version" error
  1118.         CALL spdec3
  1119.         EX DE,HL
  1120.         DEC HL
  1121.         SET 7,(HL)       ;Fatal error, so set bit 7 of last char
  1122.         LD HL,zvbad
  1123.         LD A,(zver)
  1124.         CP 3               ;<< v0.04 allow v3 games
  1125.         JR Z,okver         ;<< v0.04
  1126.         CP 4               ;<< v1.10 allow v4 games
  1127.         JR Z,okver         ;>> v1.10
  1128.         CP 8
  1129.         JR Z,okver
  1130.         CP 5
  1131.         JR NZ,ihdr8
  1132. ;Version is acceptable
  1133. ;nb: the Z-machine is big-endian, but the Spectrum is
  1134. ;little-endian. So the LSB of a word will be in H.
  1135. okver
  1136.         CP 4               ;v3 flags or v4 flags?
  1137.         LD HL,(#C001)     ;Flags 1
  1138.         LD A,L
  1139.         JR NC,v4flag
  1140.         AND #9F           ;Reset bits 5,6
  1141.         JR cflag
  1142.  
  1143. v4flag
  1144.         AND #B8            ;Reset bits 0,1,2,5
  1145.         OR #98             ;SET bits 7,3 & 4
  1146. cflag
  1147.         LD L,A
  1148.         LD (#C001),HL
  1149.         LD HL,(#C010)     ;Flags 2
  1150.         LD A,H
  1151.         AND #43        ;No pictures, no mouse, no UNDO, no sound
  1152.         LD H,A
  1153.         RES 0,L             ;"Menus" bit
  1154.         LD (#C010),HL
  1155.         LD HL,scrset5
  1156.         LD DE,#C020
  1157.         LD BC,8
  1158.         LDIR
  1159.  
  1160.         LD A,(ATTR_P)
  1161.         PUSH AF
  1162.         AND 7       ;Current ink
  1163.         LD HL,zx2ibm
  1164.         CALL xlat
  1165.         LD A,(HL)
  1166.         LD (#C02D),A
  1167.         LD (def_fg),A
  1168.         POP AF
  1169.         RRCA
  1170.         RRCA
  1171.         RRCA            ;Current paper
  1172.         AND 7
  1173.         LD HL,zx2ibm
  1174.         CALL xlat
  1175.         LD (#C02C),A
  1176.         LD (def_bg),A
  1177.  
  1178.         SCF
  1179.         DEFB #0E     ;LD C, which will swallow the AND A
  1180. ihdr8
  1181.         AND A
  1182. ihdr9
  1183.         PUSH AF
  1184.         LD A,pg6
  1185.         CALL selmem
  1186.         POP AF
  1187.         RET
  1188.  
  1189. ;Screen settings for a v5 game
  1190. scrset5
  1191.         DEFB 32,64,1,0,0,192,4,6     ;32x64 chars 192x256 pels
  1192.  
  1193. ;Translate A -> HL[A]
  1194. xlat
  1195.         PUSH HL
  1196. xlat1
  1197.         OR A
  1198.         JR Z,xlat2
  1199.         INC HL
  1200.         DEC A
  1201.         JR xlat1
  1202.  
  1203. xlat2
  1204.         LD A,(HL)
  1205.         POP HL
  1206.         RET
  1207.  
  1208. ;;;
  1209. tmem1
  1210.         LD HL,#BFFF ;Top of memory. The top16k is a
  1211.         RET         ;disk cache; we may have to shrink this.
  1212.  
  1213. ;;;
  1214. rndi1
  1215.         ;LD DE,(FRAMES)
  1216.        push af
  1217.        push bc
  1218.        push hl
  1219.        OS_GETTIMER ;hlde
  1220.        pop hl
  1221.        pop bc
  1222.        pop af
  1223.        
  1224.         RET
  1225.  
  1226. ;;;
  1227. eraw1
  1228.         CP #FF            ;Erase screen?
  1229.         JR Z,erall
  1230.         CP #FE
  1231.         JP Z,cls1
  1232.         OR A
  1233.         JR Z,erabot
  1234.         DEC A
  1235.         JR Z,eratop
  1236. erawi
  1237.         LD HL,badera
  1238.         XOR A
  1239.         RET
  1240.  
  1241. eratop
  1242.         ;LD A,pg7     ;<< v1.02
  1243.         ;CALL selmem  ;>> v1.02
  1244.         CALL selmemscr
  1245.         LD A,(lwtop)
  1246.         LD C,A
  1247.         LD B,0
  1248.         JR erablk
  1249.  
  1250. erabot
  1251.         ;LD A,pg7     ;<< v1.02
  1252.         ;CALL selmem  ;>> v1.02
  1253.         CALL selmemscr
  1254.         LD A,(lwtop)
  1255.         LD B,A
  1256.         LD C,32
  1257.         JR erablk
  1258.  
  1259. erall
  1260.         CALL ZXCLS
  1261.         LD A,pg6
  1262.         CALL selmem
  1263.         LD A,31
  1264.         LD (scrls),A
  1265.         XOR A
  1266.         LD (lwtop),A
  1267.         LD (lwx),A
  1268.         LD (lwy),A
  1269.         LD (uwx),A
  1270.         LD (uwy),A
  1271.         LD A,1
  1272.         LD (cwin),A
  1273.         LD A,(zver)
  1274.         CP 5
  1275.         JR NC,erall1
  1276.         LD A,31
  1277.         LD (lwy),A
  1278. erall1
  1279.         SCF
  1280.         RET
  1281.  
  1282. erablk
  1283.         CALL ZAPLN
  1284.         INC B
  1285.         LD A,B
  1286.         CP C
  1287.         JR C,erablk
  1288.         LD A,pg6             ;<< v1.02
  1289.         CALL selmem          ;>> v1.02
  1290.         SCF
  1291.         RET
  1292.  
  1293. ;;;
  1294. scrls
  1295.         DEFB 31      ;Number of scrolls to [MORE] prompt
  1296. lwtop
  1297.         DEFB 0       ;Top line of lower window
  1298. lwx
  1299.         DEFB 0       ;Lower window X,Y
  1300. lwy
  1301.         DEFB 0
  1302. uwx
  1303.         DEFB 0       ;Upper window X,Y
  1304. uwy
  1305.         DEFB 0
  1306. cwin
  1307.         DEFB 1       ;1 = lower
  1308.  
  1309. ;;;
  1310. zchr1
  1311.         DI
  1312.         CP 1
  1313.         JR Z,out1
  1314.         CP 2
  1315.         JP Z,ts_char       ;Output to transcript
  1316.         SCF
  1317.         EI
  1318.         RET
  1319.  
  1320. out1
  1321.         LD A,L     ;Output to stream 1 (screen)
  1322.         CP #0D
  1323.         JR NZ,zchr2
  1324.         LD A,(cwin)
  1325.         OR A
  1326.         JR Z,ulf
  1327.         JR llf
  1328.  
  1329. zchr2
  1330.         DI
  1331.         LD A,(cwin)
  1332.         OR A
  1333.         LD DE,(uwx)
  1334.         JR Z,pchr1
  1335.         LD DE,(lwx)
  1336. pchr1
  1337.         CALL PRINAT
  1338.         LD E,L
  1339.         CALL OPCHAR
  1340.         LD A,(cwin)
  1341.         OR A
  1342.         JR Z,stepcu
  1343.         LD A,(lwx)
  1344.         INC A
  1345.         LD (lwx),A
  1346.         CP 64
  1347.         RET C
  1348. llf
  1349.         XOR A
  1350.         LD (lwx),A
  1351.         LD A,(lwy)
  1352.         INC A
  1353.         LD (lwy),A
  1354.         PUSH AF
  1355.         LD A,(scrls)
  1356.         OR A
  1357.         CALL Z,MORE
  1358.         DEC A
  1359.         LD (scrls),A
  1360.         POP AF
  1361.         CP 32
  1362.         RET C
  1363.         LD A,31
  1364.         LD (lwy),A
  1365.         LD A,(lwtop)
  1366.         CALL SCRL_N
  1367.         SCF
  1368.         EI
  1369.         RET
  1370.  
  1371. stepcu
  1372.         DI
  1373.         LD A,(uwx)
  1374.         INC A
  1375.         LD (uwx),A
  1376.         CP 64
  1377.         RET C
  1378. ulf
  1379.         XOR A
  1380.         LD (uwx),A
  1381.         LD A,(uwy)
  1382.         INC A       ; <<v0.03>> LWTOP check removed
  1383.                  ;it was causing trouble in the Curses help menu
  1384.         LD (uwy),A
  1385.         SCF
  1386.         EI
  1387.         RET
  1388.  
  1389. ;;;
  1390. ;Split_window...
  1391. swnd1
  1392.         LD (lwtop),A
  1393.         LD B,A
  1394.         CALL RES_MORE
  1395.         LD A,(lwy) ;Ensure lower window y >= lwtop
  1396.         CP B
  1397.         JR NC,swnd1a
  1398.         LD A,B
  1399.         LD (lwy),A
  1400. swnd1a
  1401.         LD A,(uwy)
  1402.         CP B
  1403.         RET C       ;Ensure upper window y < lwtop
  1404.         LD HL,0
  1405.         LD (uwx),HL
  1406.         SCF
  1407.         RET
  1408.  
  1409. ;;;
  1410. ;Set_window...
  1411. swnd2
  1412.         AND 1
  1413.         XOR 1 ;set_window opcode uses 0 to mean lower window
  1414.         LD (cwin),A
  1415.         SCF
  1416.         RET NZ
  1417.         LD HL,0
  1418.         LD (uwx),HL
  1419.         SCF
  1420.         RET
  1421.  
  1422. ;;;
  1423. ;Set_text_style
  1424. styl1
  1425.         LD C,A
  1426.         AND 1       ;Reverse video?
  1427.         LD (HVF),A
  1428.         LD A,C
  1429.         AND 4       ;Italic?
  1430.         LD (ITF),A
  1431.         SCF
  1432.         RET
  1433.  
  1434. ;;;
  1435. ;set_cursor_position
  1436. scur1
  1437.         DI
  1438.         BIT 7,C             ;Negative => set cursor on/off
  1439.         JR NZ,cursw
  1440.         DEC B
  1441.         DEC C               ;0-based
  1442.         LD A,C
  1443.         CP 64
  1444.         JR C,scur1a
  1445.         LD C,63
  1446. scur1a
  1447.         LD A,(cwin)
  1448.         OR A
  1449.         JR Z,scur2
  1450.         LD A,(lwtop)
  1451.         ADD A,B
  1452.         CP 32
  1453.         JR C,scur1b
  1454.         LD A,31
  1455. scur1b
  1456.         LD B,A
  1457.         LD A,31    ;Reset the scroll counter
  1458.         SUB B
  1459.         LD (scrls),A
  1460.         LD (lwx),BC
  1461.         SCF
  1462.         EI
  1463.         RET
  1464.  
  1465. scur2
  1466.         LD A,B            ; << v0.02  Don't bother to check if
  1467.         CP 32                     ;this takes the cursor outside
  1468.         JR C,scur2b               ;the upper window.
  1469.         LD B,31
  1470. scur2b
  1471.         LD (uwx),BC        ; >> v0.02
  1472.         SCF
  1473.         EI
  1474.         RET
  1475.  
  1476. cursw
  1477.         CP #FF
  1478.         CALL Z,CUROFF
  1479.         CALL NZ,CURON
  1480.         SCF
  1481.         EI
  1482.         RET
  1483.  
  1484. ;;;
  1485. snd1
  1486.         LD E,7   ;Beep!
  1487.         CALL OPCHAR
  1488.         SCF
  1489.         RET
  1490.  
  1491. ;;;
  1492. ;Select memory bank in A
  1493. selmem
  1494.         ;DI
  1495.         PUSH AF
  1496.         PUSH BC
  1497.        if 1
  1498.         SELMEM
  1499.        else
  1500.        IF atm == 0
  1501.         AND GASIM
  1502.         LD B,A
  1503.         LD A,(BANKM)
  1504.         AND USED
  1505. ;Only change the bits we want to
  1506.         OR B
  1507.        ENDIF
  1508.         LD BC,BANKIO
  1509.         OUT (C),A
  1510.        endif
  1511.         POP BC
  1512.         POP AF
  1513.         ;EI
  1514.         RET
  1515.        
  1516. selmemscr
  1517.         push bc
  1518.         ld a,(user_scr1_high)
  1519.         SETPGC000
  1520.         pop bc
  1521.         ret
  1522.  
  1523. ;;;
  1524. TEMPBANKA   DB pg6;#00 ;Временное хранение
  1525. ;информации о банке и режимах
  1526.  
  1527. ;;;
  1528. ;Messages
  1529. badera
  1530.        ;DEFB "A Bad ERASE_WINDO"
  1531.        DB "BEW"
  1532.         DEFB "W"+#80
  1533. unimpl
  1534.        ;DEFB "A No ZXFDOS function "
  1535.        DB "NZF "
  1536. badfun
  1537.         DEFB "00"
  1538.         DEFB "h"+#80
  1539. zvbad
  1540.        ;DEFB "A Story format "
  1541.        DB "SF "
  1542. zvbuf
  1543.         DEFB "000"
  1544. reqp3
  1545.        ;DEFB "A Spectrum +3 require'
  1546.        DB "SR"
  1547.         DEFB "d"+#80
  1548.  
  1549. signon
  1550.         INCLUDE "in_ver.asm"
  1551.         DEFB CR,LF,"$"
  1552.  
  1553. ;defb CR,LF,' +3 Copyright 1998-9 by John Elliott','$'
  1554.  
  1555. ;defb CR,LF,'TR-DOS version by CATAHUCTb|, 2001'
  1556. ;defb CR,LF,LF
  1557. ;defb 'Story file: $'
  1558.  
  1559. ;sign1: defb CR,LF,'The story is loading...',CR,LF,'$'
  1560. rest_
  1561.         DEFB CR,LF,"ZXZVM is restarting...",CR,LF,"$"
  1562.  
  1563. ;;;
  1564. ;Numeric data
  1565. story
  1566.         DEFW tfilename;0  ;Address of story filename
  1567. zver
  1568.         DEFB 0  ;Z-machine version no.
  1569.  
  1570. ;;;
  1571. ;Банки для загрузки (BANKN_TERMINATOR;#02 - нет банки для такого адреса, конец списка)
  1572.  
  1573. BankN
  1574.         IF bigmem
  1575.        IF atm
  1576. _=8;#7F^8
  1577.         DUP 56
  1578.         DB _
  1579. _=_+1;-1
  1580.         EDUP
  1581. ;#E0000
  1582.        ELSE
  1583.         DB #01,#03,#04,#00
  1584.         DB #40,#41,#42,#43,#44,#45,#46,#47
  1585.         DB #80,#81,#82,#83,#84,#85,#86,#87
  1586.         DB #C0,#C1,#C2,#C3,#C4,#C5,#C6,#C7
  1587. ;#70000
  1588.        ENDIF
  1589.         ELSE ;~bigmem
  1590.         DB #01,#03,#04,#00
  1591. ;#10000
  1592.         ENDIF
  1593.         DB BANKN_TERMINATOR;#02
  1594.  
  1595. ;;;
  1596. ;Other source files
  1597.         ;INCLUDE "zxp3dos2.asm" ;+3DOS specific functions
  1598. p3vrfy
  1599.         SCF
  1600.         RET  
  1601.        
  1602.         INCLUDE "trdos.asm" ;TR-DOS специфические функции
  1603.         ;INCLUDE "zxvers.asm" ;Get Spectrum version
  1604.         INCLUDE "zxchime.asm" ;Sound a chime on the 8912 chip
  1605.         ;INCLUDE "zxerr.asm" ;Return a BASIC error
  1606.         INCLUDE "zx64_1.asm" ;64-column printing
  1607.         INCLUDE "in_wrhex.asm" ;Render numbers into hex or dec
  1608.  
  1609.        IF atm
  1610. ATMON
  1611.         LD BC,#BD77
  1612.         LD A,%10101011 ;6912,turbo
  1613.        ;LD A,%10101110 ;text,turbo
  1614.         CALL OUT_DOS
  1615.         LD A,#03 ;48K
  1616.         LD BC,#3FF7
  1617.         OUT (C),A
  1618.         RET
  1619. ATMOFF
  1620.         LD A,#83 ;48K/DOS
  1621.         LD BC,#3FF7
  1622.         OUT (C),A
  1623.         LD BC,#FF77
  1624.         LD A,%10101011 ;6912,turbo
  1625.         OUT (C),A
  1626.         RET
  1627. OUT_DOS
  1628.         LD HL,#2A53
  1629.         PUSH HL
  1630.         JP #3D2F
  1631.        ENDIF
  1632.  
  1633.         ;ENT
  1634.        
  1635.         ds 0x7000-$
  1636. main
  1637.         incbin "vm.bin"
  1638.        
  1639. end
  1640. ;GO
  1641.         ;RET
  1642.         savebin "zxzvm.com",begin,end-begin
  1643.  
  1644.         LABELSLIST "../../us/user.l",1
  1645.