?login_element?

Subversion Repositories NedoOS

Rev

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