?login_element?

Subversion Repositories NedoOS

Rev

Rev 129 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;##########################################################################
  2. ;# BSrom140 - Modified ZX Spectrum ROM - (c) Busy soft - Release 22.04.97 #
  3. ;#                   with enhancements needed for BSDOS                   #
  4. ;##########################################################################
  5. ;                         Original rom: (c) Amstrad
  6.  
  7.  
  8.  
  9.                 OUTPUT  "bsrom140mb02.bin"
  10.  
  11. VERZIA:         EQU     140
  12.  
  13. VERA:           EQU     VERZIA/100
  14. VERB:           EQU     VERA*100
  15. VERC:           EQU     VERZIA-VERB
  16. VERD:           EQU     VERC/10
  17. VERE:           EQU     VERD*10
  18. VERF:           EQU     VERC-VERE
  19.  
  20. VER1:           EQU     '0'+VERA
  21. VER2:           EQU     '0'+VERD
  22. VER3:           EQU     '0'+VERF
  23.  
  24. ; BSDOS services
  25. EM562:          EQU     #20
  26. EM4C6:          EQU     #21
  27. BASICM:         EQU     #31
  28. FUNKC:          EQU     #32
  29.  
  30.                 ORG     #0000
  31.  
  32. ; RST #00
  33. START:          DI
  34.                 XOR     A
  35.                 LD      DE,#FFFF
  36.                 JP      NMI_MENU                ; BSROM - jumps to NMI menu instead of START_NEW
  37.  
  38. ; Error restart
  39. ; RST #08
  40. ERROR_1:        LD      HL,(#5C5D)
  41.                 CALL    TOERR                   ; BSROM - cursor jumps to error
  42.                 JR      ERROR_2
  43.  
  44. ; Print a character
  45. ; RST #10
  46. PRINT_A:        JP      PRINT_A_2
  47.  
  48. ; Unused bytes
  49.                 DW      #FFFF
  50.                 DW      #FFFF
  51.                 DB      #FF
  52.  
  53. ; Collect a character
  54. ; RST #18
  55. GET_CHAR:       LD      HL,(#5C5D)
  56.                 LD      A,(HL)
  57. TEST_CHAR:      CALL    SKIP_OVER
  58.                 RET     NC
  59. NEXT_CHAR:      CALL    CH_ADD_1
  60.                 JR      TEST_CHAR
  61.  
  62. ; Unused bytes
  63.                 DW      #FFFF
  64.                 DB      #FF
  65.  
  66. ; Calculator restart
  67. ; RST #28
  68.                 JP      CALCULATE
  69.  
  70. ; Unused bytes
  71.                 DW      #FFFF
  72.                 DW      #FFFF
  73.                 DB      #FF
  74.  
  75. ; Create free locations in work space
  76. ; RST #30
  77. BC_SPACES:      PUSH    BC
  78.                 LD      HL,(#5C61)
  79.                 PUSH    HL
  80.                 JP      RESERVE
  81.  
  82. ; Maskable interrupt routine
  83. ; RST #38
  84. MASK_INT:       PUSH    AF
  85.                 PUSH    HL
  86.                 LD      HL,(#5C78)
  87.                 INC     HL
  88.                 LD      (#5C78),HL
  89.                 LD      A,H
  90.                 OR      L
  91.                 JR      NZ,KEY_INT
  92.                 INC     (IY+#40)
  93. KEY_INT:        PUSH    BC
  94.                 PUSH    DE
  95.                 CALL    KEYBOARD
  96.                 POP     DE
  97.                 POP     BC
  98.                 POP     HL
  99.                 POP     AF
  100.                 EI
  101.                 RET
  102.  
  103. ; A continuation of the code at #0008
  104. ERROR_2:        POP     HL
  105.                 LD      L,(HL)
  106. ERROR_3:        LD      (IY+#00),L
  107.                 LD      SP,(#5C3D)
  108.                 JP      SET_STK
  109.  
  110. ; Unused bytes
  111.                 DW      #FFFF
  112.                 DW      #FFFF
  113.                 DW      #FFFF
  114.                 DB      #FF
  115.  
  116. ; Non-maskable interrupt routine
  117. ; RST #66
  118. RESET:          JP      NMI_MENU                ; BSROM - jumps to NMI menu
  119.  
  120.                 DB      #B0                     ; Looks like this is unused torso
  121.                 DB      #5C                     ; of the original RESET routine.
  122.                 DB      #7C                     ;
  123.                 DB      #B5                     ;
  124.                 DB      #20, #01                ;
  125.                 DB      #E9                     ;
  126.                 DB      #E1                     ;
  127.                 DB      #F1                     ;
  128.                 DB      #ED, #45                ; End of unused bytes.
  129.  
  130. ; Fetch the next immediate character following the current valid character address
  131. ; and update the associated system variable.
  132. CH_ADD_1:       LD      HL,(#5C5D)
  133. TEMP_PTR1:      INC     HL
  134. TEMP_PTR2:      LD      (#5C5D),HL
  135.                 LD      A,(HL)
  136.                 RET
  137.  
  138. ; Skip over white-space and other characters irrelevant to the parsing of a basic line
  139. SKIP_OVER:      CP      #21
  140.                 RET     NC
  141.                 CP      #0D
  142.                 RET     Z
  143.                 CP      #10
  144.                 RET     C
  145.                 CP      #18
  146.                 CCF
  147.                 RET     C
  148.                 INC     HL
  149.                 CP      #16
  150.                 JR      C,SKIPS
  151.                 INC     HL
  152. SKIPS:          SCF
  153.                 LD      (#5C5D),HL
  154.                 RET
  155.  
  156. ; Six look-up tables for keyboard reading routine to decode the key values.
  157. ; Table for tokenized characters (134d-255d).
  158. ; Begins with function type words without a leading space.
  159. ; The last byte of a token is inverted to denote the end of the word.
  160. TKN_TABLE:      DC      "?"                            
  161.                 DC      "RND"
  162.                 DC      "INKEY$"
  163.                 DC      "PI"
  164.                 DC      "FN"
  165.                 DC      "POINT"
  166.                 DC      "SCREEN$"
  167.                 DC      "ATTR"
  168.                 DC      "AT"
  169.                 DC      "TAB"
  170.                 DC      "VAL$"
  171.                 DC      "CODE"
  172.                 DC      "VAL"
  173.                 DC      "LEN"
  174.                 DC      "SIN"
  175.                 DC      "COS"
  176.                 DC      "TAN"
  177.                 DC      "ASN"
  178.                 DC      "ACS"
  179.                 DC      "ATN"
  180.                 DC      "LN"
  181.                 DC      "EXP"
  182.                 DC      "INT"
  183.                 DC      "SQR"
  184.                 DC      "SGN"
  185.                 DC      "ABS"
  186.                 DC      "PEEK"
  187.                 DC      "IN"
  188.                 DC      "USR"
  189.                 DC      "STR$"
  190.                 DC      "CHR$"
  191.                 DC      "NOT"
  192.                 DC      "BIN"
  193.                
  194. ; Function type words with a leading space
  195. ; if they begin with a letter. 
  196.                 DC      "OR"                   
  197.                 DC      "AND"
  198.                 DC      "<="
  199.                 DC      ">="
  200.                 DC      "<>"
  201.                 DC      "LINE"
  202.                 DC      "THEN"
  203.                 DC      "TO"
  204.                 DC      "STEP"
  205.                 DC      "DEF FN"
  206.                 DC      "CAT"
  207.                 DC      "FORMAT"
  208.                 DC      "MOVE"
  209.                 DC      "ERASE"
  210.                 DC      "OPEN #"
  211.                 DC      "CLOSE #"
  212.                 DC      "MERGE"
  213.                 DC      "VERIFY"
  214.                 DC      "BEEP"
  215.                 DC      "CIRCLE"
  216.                 DC      "INK"
  217.                 DC      "PAPER"
  218.                 DC      "FLASH"
  219.                 DC      "BRIGHT"
  220.                 DC      "INVERSE"
  221.                 DC      "OVER"
  222.                 DC      "OUT"
  223.                 DC      "LPRINT"
  224.                 DC      "LLIST"
  225.                 DC      "STOP"
  226.                 DC      "READ"
  227.                 DC      "DATA"
  228.                 DC      "RESTORE"
  229.                 DC      "NEW"
  230.                 DC      "BORDER"
  231.                 DC      "CONTINUE"
  232.                 DC      "DIM"
  233.                 DC      "REM"
  234.                 DC      "FOR"
  235.                 DC      "GO TO"
  236.                 DC      "GO SUB"
  237.                 DC      "INPUT"
  238.                 DC      "LOAD"
  239.                 DC      "LIST"
  240.                 DC      "LET"
  241.                 DC      "PAUSE"
  242.                 DC      "NEXT"
  243.                 DC      "POKE"
  244.                 DC      "PRINT"
  245.                 DC      "PLOT"
  246.                 DC      "RUN"
  247.                 DC      "SAVE"
  248.                 DC      "RANDOMIZE"
  249.                 DC      "IF"
  250.                 DC      "CLS"
  251.                 DC      "DRAW"
  252.                 DC      "CLEAR"
  253.                 DC      "RETURN"
  254.                 DC      "COPY"
  255.  
  256. ; maps for the standard 40-key ZX Spectrum keyboard
  257. ; SHIFT (#27) is read directly.
  258. MAIN_KEYS:      DB      #42                     ;B
  259.                 DB      #48                     ;H
  260.                 DB      #59                     ;Y
  261.                 DB      #36                     ;6
  262.                 DB      #35                     ;5
  263.                 DB      #54                     ;T
  264.                 DB      #47                     ;G
  265.                 DB      #56                     ;V
  266.                 DB      #4E                     ;N
  267.                 DB      #4A                     ;J
  268.                 DB      #55                     ;U
  269.                 DB      #37                     ;7
  270.                 DB      #34                     ;4
  271.                 DB      #52                     ;R
  272.                 DB      #46                     ;F
  273.                 DB      #43                     ;C
  274.                 DB      #4D                     ;M
  275.                 DB      #4B                     ;K
  276.                 DB      #49                     ;I
  277.                 DB      #38                     ;8
  278.                 DB      #33                     ;3
  279.                 DB      #45                     ;E
  280.                 DB      #44                     ;D
  281.                 DB      #58                     ;X
  282.                 DB      #0E                     ;Symbol shift
  283.                 DB      #4C                     ;L
  284.                 DB      #4F                     ;O
  285.                 DB      #39                     ;9
  286.                 DB      #32                     ;2
  287.                 DB      #57                     ;W
  288.                 DB      #53                     ;S
  289.                 DB      #5A                     ;Z
  290.                 DB      #20                     ;Space
  291.                 DB      #0D                     ;Enter
  292.                 DB      #50                     ;P
  293.                 DB      #30                     ;0
  294.                 DB      #31                     ;1
  295.                 DB      #51                     ;Q
  296.                 DB      #41                     ;A
  297.  
  298. ; Unshifted extended mode keys.
  299. ; The green keywords on the original keyboard.
  300. E_UNSHIFT:      DB      #E3                     ;READ
  301.                 DB      #C4                     ;BIN
  302.                 DB      #E0                     ;LPRINT
  303.                 DB      #E4                     ;DATA
  304.                 DB      #B4                     ;TAN
  305.                 DB      #BC                     ;SGN
  306.                 DB      #BD                     ;ABS
  307.                 DB      #BB                     ;SQR
  308.                 DB      #AF                     ;CODE
  309.                 DB      #B0                     ;VAL
  310.                 DB      #B1                     ;LEN
  311.                 DB      #C0                     ;USR
  312.                 DB      #A7                     ;PI
  313.                 DB      #A6                     ;INKEY$
  314.                 DB      #BE                     ;PEEK
  315.                 DB      #AD                     ;TAB
  316.                 DB      #B2                     ;SIN
  317.                 DB      #BA                     ;INT
  318.                 DB      #E5                     ;RESTORE
  319.                 DB      #A5                     ;RND
  320.                 DB      #C2                     ;CHR$
  321.                 DB      #E1                     ;LLIST
  322.                 DB      #B3                     ;COS
  323.                 DB      #B9                     ;EXP
  324.                 DB      #C1                     ;STR$
  325.                 DB      #B8                     ;LN
  326.  
  327. ; Shifted extended mode keys.
  328. ; The red keywords below keys on the original keyboard.
  329. EXT_SHIFT:      DB      #7E                     ;~
  330.                 DB      #DC                     ;BRIGHT
  331.                 DB      #DA                     ;PAPER
  332.                 DB      #5C                     ;\
  333.                 DB      #B7                     ;ATN
  334.                 DB      #7B                     ;{
  335.                 DB      #7D                     ;}
  336.                 DB      #D8                     ;CIRCLE
  337.                 DB      #BF                     ;IN
  338.                 DB      #AE                     ;VAL$
  339.                 DB      #AA                     ;SCREEN$
  340.                 DB      #AB                     ;ATTR
  341.                 DB      #DD                     ;INVERSE
  342.                 DB      #DE                     ;OVER
  343.                 DB      #DF                     ;OUT
  344.                 DB      #7F                     ;(c)
  345.                 DB      #B5                     ;ASN
  346.                 DB      #D6                     ;VERIFY
  347.                 DB      #7C                     ;|
  348.                 DB      #D5                     ;MERGE
  349.                 DB      #5D                     ;]
  350.                 DB      #DB                     ;FLASH
  351.                 DB      #B6                     ;ACS
  352.                 DB      #D9                     ;INK
  353.                 DB      #5B                     ;[
  354.                 DB      #D7                     ;BEEP
  355.  
  356. ; Shift key control codes assigned to the digits.
  357. ; White labels above the number characters on the digits keys on the orig. keyboard.
  358. CTL_CODES:      DB      #0C                     ;DELETE
  359.                 DB      #07                     ;EDIT
  360.                 DB      #06                     ;Caps lock
  361.                 DB      #04                     ;True video
  362.                 DB      #05                     ;Inverse video
  363.                 DB      #08                     ;Cursor left
  364.                 DB      #0A                     ;Cursor down
  365.                 DB      #0B                     ;Cursor up
  366.                 DB      #09                     ;Cursor right
  367.                 DB      #0F                     ;GRAPH
  368.  
  369. ; Keys shifted with Symbol shift.
  370. ; Red symbols on the alphabetic characters on the original keyboard.
  371. SYM_CODES:      DB      #E2                     ;STOP
  372.                 DB      #2A                     ;*
  373.                 DB      #3F                     ;?
  374.                 DB      #CD                     ;STEP
  375.                 DB      #C8                     ;>=
  376.                 DB      #CC                     ;TO
  377.                 DB      #CB                     ;THEN
  378.                 DB      #5E                     ;^
  379.                 DB      #AC                     ;AT
  380.                 DB      #2D                     ;-
  381.                 DB      #2B                     ;+
  382.                 DB      #3D                     ;=
  383.                 DB      #2E                     ;.
  384.                 DB      #2C                     ;,
  385.                 DB      #3B                     ;;
  386.                 DB      #22                     ;"
  387.                 DB      #C7                     ;<=
  388.                 DB      #3C                     ;<
  389.                 DB      #C3                     ;NOT
  390.                 DB      #3E                     ;>
  391.                 DB      #C5                     ;OR
  392.                 DB      #2F                     ;/
  393.                 DB      #C9                     ;<>
  394.                 DB      #60                    
  395.                 DB      #C6                     ;AND
  396.                 DB      #3A                     ;:
  397.  
  398. ; Keywords assigned to the digits in extended mode.
  399. ; On the original keyboard those are remaining red keywords below the keys.
  400. E_DIGITS:       DB      #D0                     ;FORMAT
  401.                 DB      #CE                     ;DEF FN
  402.                 DB      #A8                     ;FN
  403.                 DB      #CA                     ;LINE
  404.                 DB      #D3                     ;OPEN #
  405.                 DB      #D4                     ;CLOSE #
  406.                 DB      #D1                     ;MOVE
  407.                 DB      #D2                     ;ERASE
  408.                 DB      #A9                     ;POINT
  409.                 DB      #CF                     ;CAT
  410.  
  411. ; Keyboard scanning
  412. ; returns 1 or 2 keys in DE
  413. KEY_SCAN:       LD      L,#2F
  414.                 LD      DE,#FFFF
  415.                 LD      BC,#FEFE
  416. KEY_LINE:       IN      A,(C)
  417.                 CPL
  418.                 AND     #1F
  419.                 JR      Z,KEY_DONE
  420.                 LD      H,A
  421.                 LD      A,L
  422. KEY_3KEYS:      INC     D
  423.                 RET     NZ
  424. KEY_BITS:       SUB     #08
  425.                 SRL     H
  426.                 JR      NC,KEY_BITS
  427.                 LD      D,E
  428.                 LD      E,A
  429.                 JR      NZ,KEY_3KEYS
  430. KEY_DONE:       DEC     L
  431.                 RLC     B
  432.                 JR      C,KEY_LINE
  433.                 LD      A,D
  434.                 INC     A
  435.                 RET     Z
  436.                 CP      #28
  437.                 RET     Z
  438.                 CP      #19
  439.                 RET     Z
  440.                 LD      A,E
  441.                 LD      E,D
  442.                 LD      D,A
  443.                 CP      #18
  444.                 RET
  445.  
  446. ; Scan keyboard and decode value
  447. KEYBOARD:       CALL    KEY_SCAN
  448.                 RET     NZ
  449.                 LD      HL,#5C00
  450. K_ST_LOOP:      BIT     7,(HL)
  451.                 JR      NZ,K_CH_SET
  452.                 INC     HL
  453.                 DEC     (HL)
  454.                 DEC     HL
  455.                 JR      NZ,K_CH_SET
  456.                 LD      (HL),#FF
  457. K_CH_SET:       LD      A,L
  458.                 LD      HL,#5C04
  459.                 CP      L
  460.                 JR      NZ,K_ST_LOOP
  461.                 CALL    K_TEST
  462.                 RET     NC
  463.                 LD      HL,#5C00
  464.                 CP      (HL)
  465.                 JR      Z,K_REPEAT
  466.                 EX      DE,HL
  467.                 LD      HL,#5C04
  468.                 CP      (HL)
  469.                 JR      Z,K_REPEAT
  470.                 BIT     7,(HL)
  471.                 JR      NZ,K_NEW
  472.                 EX      DE,HL
  473.                 BIT     7,(HL)
  474.                 RET     Z
  475. K_NEW:          LD      E,A
  476.                 LD      (HL),A
  477.                 INC     HL
  478.                 LD      (HL),#05
  479.                 INC     HL
  480.                 LD      A,(#5C09)
  481.                 LD      (HL),A
  482.                 INC     HL
  483.                 LD      C,(IY+#07)
  484.                 LD      D,(IY+#01)
  485.                 PUSH    HL
  486.                 CALL    K_DECODE
  487.                 POP     HL
  488.                 LD      (HL),A
  489. K_END:          LD      (#5C08),A
  490.                 SET     5,(IY+#01)
  491.                 RET
  492.  
  493. ; Repeat key routine
  494. K_REPEAT:       INC     HL
  495.                 LD      (HL),#05
  496.                 INC     HL
  497.                 DEC     (HL)
  498.                 RET     NZ
  499.                 LD      A,(#5C0A)
  500.                 LD      (HL),A
  501.                 INC     HL
  502.                 LD      A,(HL)
  503.                 JR      K_END
  504.  
  505. ; Test key value
  506. K_TEST:         LD      B,D
  507.                 LD      D,#00
  508.                 LD      A,E
  509.                 CP      #27
  510.                 RET     NC
  511.                 CP      #18
  512.                 JR      NZ,K_MAIN
  513.                 BIT     7,B
  514.                 RET     NZ
  515. K_MAIN:         LD      HL,MAIN_KEYS
  516.                 ADD     HL,DE
  517.                 LD      A,(HL)
  518.                 SCF
  519.                 RET
  520.  
  521. ; Keyboard decoding
  522. K_DECODE:       LD      A,E
  523.                 CP      #3A
  524.                 JR      C,K_DIGIT
  525.                 DEC     C
  526.                 JP      M,K_KLC_LET
  527.                 JR      Z,K_E_LET
  528.                 ADD     A,#4F
  529.                 RET
  530.  
  531. ; Test if B is empty (i.e. not a shift)
  532. ; forward to K_LOOK_UP if neither shift
  533. K_E_LET:        LD      HL,#01EB                ;E_UNSHIFT-#41
  534.                 INC     B
  535.                 JR      Z,K_LOOK_UP
  536.                 LD      HL,#0205                ;EXT_SHIFT-#41
  537.  
  538. ; Prepare to index
  539. K_LOOK_UP:      LD      D,#00
  540.                 ADD     HL,DE
  541.                 LD      A,(HL)
  542.                 RET
  543.  
  544. ; Prepare base of SYM_CODES
  545. K_KLC_LET:      LD      HL,#0229                ;SYM_CODES-#41
  546.                 BIT     0,B
  547.                 JR      Z,K_LOOK_UP
  548.                 BIT     3,D
  549.                 JR      Z,K_TOKENS
  550.                 BIT     3,(IY+#30)
  551.                 RET     NZ
  552.                 INC     B
  553.                 RET     NZ
  554.                 ADD     A,#20
  555.                 RET
  556. ; Add offset to main code to get tokens
  557. K_TOKENS:       ADD     A,#A5
  558.                 RET
  559.  
  560. ; Digits, space, enter and symbol shift decoding
  561. K_DIGIT:        CP      #30
  562.                 RET     C
  563.                 DEC     C
  564.                 JP      M,K_KLC_DGT
  565.                 JR      NZ,K_GRA_DGT
  566.                 LD      HL,#0254                ;E_DIGITS-#30
  567.                 BIT     5,B
  568.                 JR      Z,K_LOOK_UP
  569.                 CP      #38
  570.                 JR      NC,K_8_AND_9
  571.                 SUB     #20
  572.                 INC     B
  573.                 RET     Z
  574.                 ADD     A,#08
  575.                 RET
  576.  
  577. ; Digits 8 and 9 decoding
  578. K_8_AND_9:      SUB     #36
  579.                 INC     B
  580.                 RET     Z
  581.                 ADD     A,#FE
  582.                 RET
  583.  
  584. ; Graphics mode with digits
  585. K_GRA_DGT:      LD      HL,#0230                ;CTL_CODES-#30
  586.                 CP      #39
  587.                 JR      Z,K_LOOK_UP
  588.                 CP      #30
  589.                 JR      Z,K_LOOK_UP
  590.                 AND     #07
  591.                 ADD     A,#80
  592.                 INC     B
  593.                 RET     Z
  594.                 XOR     #0F
  595.                 RET
  596.  
  597. ; Digits in 'KLC' mode
  598. K_KLC_DGT:      INC     B
  599.                 RET     Z
  600.                 BIT     5,B
  601.                 LD      HL,#0230                ;CTL_CODES-#30
  602.                 JR      NZ,K_LOOK_UP
  603.                 SUB     #10
  604.                 CP      #22
  605.                 JR      Z,K_AT_CHAR
  606.                 CP      #20
  607.                 RET     NZ
  608.                 LD      A,#5F
  609.                 RET
  610.  
  611. ; Substitute ascii '@'
  612. K_AT_CHAR:      LD      A,#40
  613.                 RET
  614.  
  615. ; Routine to control loudspeaker
  616. BEEPER:         DI
  617.                 LD      A,L
  618.                 SRL     L
  619.                 SRL     L
  620.                 CPL
  621.                 AND     #03
  622.                 LD      C,A
  623.                 LD      B,#00
  624.                 LD      IX,BE_IX_3
  625.                 ADD     IX,BC
  626.                 LD      A,(#5C48)
  627.                 AND     #38
  628.                 RRCA
  629.                 RRCA
  630.                 RRCA
  631.                 OR      #08
  632. BE_IX_3:        NOP
  633.                 NOP
  634.                 NOP
  635.                 INC     B
  636.                 INC     C
  637. BE_HL_LP:       DEC     C
  638.                 JR      NZ,BE_HL_LP
  639.                 LD      C,#3F
  640.                 DEC     B
  641.                 JP      NZ,BE_HL_LP
  642.                 XOR     #10
  643.                 OUT     (#FE),A
  644.                 LD      B,H
  645.                 LD      C,A
  646.                 BIT     4,A
  647.                 JR      NZ,BE_AGAIN
  648.                 LD      A,D
  649.                 OR      E
  650.                 JR      Z,BE_END
  651.                 LD      A,C
  652.                 LD      C,L
  653.                 DEC     DE
  654. L_03F0:         JP      (IX)
  655. BE_AGAIN:       LD      C,L
  656.                 INC     C
  657.                 JP      (IX)
  658. BE_END:         EI
  659.                 RET
  660.  
  661. ; Handle BEEP command
  662. BEEP:           RST     #28                     ;FP_CALC
  663.                 DB      #31                     ;DUPLICATE - duplicate pitch
  664.                 DB      #27                     ;INT - convert to integer
  665.                 DB      #C0                     ;ST_MEM_0 - store integer pitch to memory 0
  666.                 DB      #03                     ;SUBTRACT - calculate fractional part of pitch = fp_pitch - int_pitch
  667.                 DB      #34                     ;STK_DATA - push constant
  668.                 DB      #EC                     ;Exponent: #7C, Bytes: 4 - constant = 0.05762265
  669.                 DB      #6C,#98,#1F,#F5         ;(#6C,#98,#1F,#F5)
  670.                 DB      #04                     ;MULTIPLY - compute:
  671.                 DB      #A1                     ;STK_ONE - 1 + 0.05762265 * fraction_part(pitch)
  672.                 DB      #0F                     ;ADDITION
  673.                 DB      #38                     ;END_CALC - leave on calc stack
  674.  
  675.                 LD      HL,#5C92
  676.                 LD      A,(HL)
  677.                 AND     A
  678.                 JR      NZ,REPORT_B
  679.                 INC     HL
  680.                 LD      C,(HL)
  681.                 INC     HL
  682.                 LD      B,(HL)
  683.                 LD      A,B
  684.                 RLA
  685.                 SBC     A,A
  686.                 CP      C
  687.                 JR      NZ,REPORT_B
  688.                 INC     HL
  689.                 CP      (HL)
  690.                 JR      NZ,REPORT_B
  691.                 LD      A,B
  692.                 ADD     A,#3C
  693.                 JP      P,BE_I_OK
  694.                 JP      PO,REPORT_B
  695. BE_I_OK:        LD      B,#FA
  696. BE_OCTAVE:      INC     B
  697.                 SUB     #0C
  698.                 JR      NC,BE_OCTAVE
  699.                 ADD     A,#0C
  700.                 PUSH    BC
  701.                 LD      HL,SEMI_TONE
  702.                 CALL    LOC_MEM
  703.                 CALL    STACK_NUM
  704.  
  705.                 RST     #28                     ;FP_CALC
  706.                 DB      #04                     ;MULTIPLY
  707.                 DB      #38                     ;END_CALC
  708.  
  709.                 POP     AF
  710.                 ADD     A,(HL)
  711.                 LD      (HL),A
  712.  
  713.                 RST     #28                     ;FP_CALC
  714.                 DB      #C0                     ;ST_MEM_0
  715.                 DB      #02                     ;DELETE
  716.                 DB      #31                     ;DUPLICATE
  717.                 DB      #38                     ;END_CALC
  718.  
  719.                 CALL    FIND_INT1
  720.                 CP      #0B
  721.                 JR      NC,REPORT_B
  722.  
  723.                 RST     #28                     ;FP_CALC
  724.                 DB      #E0                     ;GET_MEM_0
  725.                 DB      #04                     ;MULTIPLY
  726.                 DB      #E0                     ;GET_MEM_0
  727.                 DB      #34                     ;STK_DATA
  728.                 DB      #80                     ;Exponent #93, Bytes: 3
  729.                 DB      #43, #55, #9F, #80
  730.                 DB      #01                     ;EXCHANGE
  731.                 DB      #05                     ;DIVISION
  732.                 DB      #34                     ;STK_DATA
  733.                 DB      #35                     ;Exponent: #85, Bytes: 1
  734.                 DB      #71
  735.                 DB      #03                     ;SUBTRACT
  736.                 DB      #38                     ;END_CALC
  737.  
  738.                 CALL    FIND_INT2
  739.                 PUSH    BC
  740.                 CALL    FIND_INT2
  741.                 POP     HL
  742.                 LD      D,B
  743.                 LD      E,C
  744.                 LD      A,D
  745.                 OR      E
  746.                 RET     Z
  747.                 DEC     DE
  748.                 JP      BEEPER
  749.  
  750. REPORT_B:       RST     #08                     ; Error report
  751.                 DB      #0A                     ; Integer out of range
  752.  
  753. ; Semi-tone table.
  754. ; Holds frequencies corresponding to semitones in middle octave.
  755. SEMI_TONE:      DB      #89, #02, #D0, #12, #86
  756.                 DB      #89, #0A, #97, #60, #75
  757.                 DB      #89, #12, #D5, #17, #1F
  758.                 DB      #89, #1B, #90, #41, #02
  759.                 DB      #89, #24, #D0, #53, #CA
  760.                 DB      #89, #2E, #9D, #36, #B1
  761.                 DB      #89, #38, #FF, #49, #3E
  762.                 DB      #89, #43, #FF, #6A, #73
  763.                 DB      #89, #4F, #A7, #00, #54
  764.                 DB      #89, #5C, #00, #00, #00
  765.                 DB      #89, #69, #14, #F6, #24
  766.                 DB      #89, #76, #F1, #10, #05
  767.  
  768. ; BSROM for MB02+
  769. ; reserved for future patches
  770.                 DW      #0000
  771.                 DW      #0000
  772.                 DW      #0000
  773.                 DW      #0000
  774.                 DW      #0000
  775.                 DW      #0000
  776.                 DW      #0000
  777.                 DW      #0000
  778.                 DW      #0000
  779.                 DW      #0000
  780.                 DW      #0000
  781.                 DW      #0000
  782.  
  783. ; Save header and program or data
  784. SA_BYTES:       LD      HL,SA_LD_RET
  785.                 PUSH    HL
  786. SA_BYTES1:      CALL    TSTSAV                  ;BSROM for MB02+ - modified tape save (tape emulator)
  787.                 BIT     7,A
  788.                 JR      Z,SA_FLAG
  789.                 LD      HL,#0C98
  790. SA_FLAG:        EX      AF,AF'
  791.                 INC     DE
  792.                 DEC     IX
  793.                 DI
  794.                 LD      A,#02
  795.                 LD      B,A
  796. SA_LEADER:      DJNZ    SA_LEADER
  797.                 OUT     (#FE),A
  798.                 XOR     #0F
  799.                 LD      B,#A4
  800.                 DEC     L
  801.                 JR      NZ,SA_LEADER
  802.                 DEC     B
  803.                 DEC     H
  804.                 JP      P,SA_LEADER
  805.                 LD      B,#2F
  806. SA_SYNC_1:      DJNZ    SA_SYNC_1
  807.                 OUT     (#FE),A
  808.                 LD      A,#0D
  809.                 LD      B,#37
  810. SA_SYNC_2:      DJNZ    SA_SYNC_2
  811.                 OUT     (#FE),A
  812.                 LD      BC,#3B0E                ; B=#3B time; C=#0E YELLOW, MIC OFF.
  813.                 EX      AF,AF'
  814.                 LD      L,A
  815.                 JP      SA_START
  816.  
  817. SA_LOOP:        LD      A,D
  818.                 OR      E
  819.                 JR      Z,SA_PARITY
  820.                 LD      L,(IX+#00)
  821. SA_LOOP_P:      LD      A,H
  822.                 XOR     L
  823. SA_START:       LD      H,A
  824.                 LD      A,#01
  825.                 SCF
  826.                 JP      SA_8_BITS
  827.  
  828. SA_PARITY:      LD      L,H
  829.                 JR      SA_LOOP_P
  830.  
  831. SA_BIT_2:       LD      A,C
  832.                 BIT     7,B
  833. SA_BIT_1:       DJNZ    SA_BIT_1
  834.                 JR      NC,SA_OUT
  835.                 LD      B,#42
  836. SA_SET:         DJNZ    SA_SET
  837. SA_OUT:         OUT     (#FE),A
  838.                 LD      B,#3E
  839.                 JR      NZ,SA_BIT_2
  840.                 DEC     B
  841.                 XOR     A
  842.                 INC     A
  843. SA_8_BITS:      RL      L
  844.                 JP      NZ,SA_BIT_1
  845.                 DEC     DE
  846.                 INC     IX
  847.                 LD      B,#31
  848.                 LD      A,#7F
  849.                 IN      A,(#FE)
  850.                 RRA
  851.                 RET     NC
  852.                 LD      A,D
  853.                 INC     A
  854.                 JP      NZ,SA_LOOP
  855.                 LD      B,#3B
  856. SA_DELAY:       DJNZ    SA_DELAY
  857.                 RET
  858.  
  859. ; Reset border nad check BREAK for LOAD and SAVE
  860. SA_LD_RET:      PUSH    AF
  861.                 LD      A,(#5C48)
  862.                 AND     #38
  863.                 RRCA
  864.                 RRCA
  865.                 RRCA
  866.                 OUT     (#FE),A
  867.                 LD      A,#7F
  868.                 IN      A,(#FE)
  869.                 RRA
  870.                 EI
  871.                 JR      C,SA_LD_END
  872. REPORT_DA:      RST     #08                     ; Error report
  873.                 DB      #0C                     ; BREAK - CONT repeats
  874. SA_LD_END:      POP     AF
  875.                 RET
  876.  
  877. ; Load header or data
  878. LD_BYTES:       INC     D
  879.                 EX      AF,AF'
  880.                 DEC     D
  881.                 NOP                             ; BSROM for MB02+ - don't disable interrupt
  882.                 LD      A,#0F
  883.                 LD      A,#FE                   ; BSROM for MB02+ - don't change border
  884.                 LD      HL,SA_LD_RET
  885.                 PUSH    HL
  886.                 CALL    TSTLOA                  ; BSROM for MB02+ - modified tape load (tape emulator)
  887. LD_BYTES1:      AND     #20
  888.                 OR      #02
  889.                 LD      C,A
  890.                 CP      A
  891. LD_BREAK:       RET     NZ
  892. LD_START:       CALL    LD_EDGE_1
  893.                 JR      NC,LD_BREAK
  894.                 LD      HL,#0115                ; BSROM - short delay (was #0415 in orig. ROM)
  895. LD_WAIT:        DJNZ    LD_WAIT
  896.                 DEC     HL
  897.                 LD      A,H
  898.                 OR      L
  899.                 JR      NZ,LD_WAIT
  900.                 CALL    LD_EDGE_2
  901.                 JR      NC,LD_BREAK
  902. LD_LEADER:      LD      B,#9C
  903.                 CALL    LD_EDGE_2
  904.                 JR      NC,LD_BREAK
  905.                 LD      A,#C6
  906.                 CP      B
  907.                 JR      NC,LD_START
  908.                 INC     H
  909.                 JR      NZ,LD_LEADER
  910. LD_SYNC:        LD      B,#C9
  911.                 CALL    LD_EDGE_1
  912.                 JR      NC,LD_BREAK
  913.                 LD      A,B
  914.                 CP      #D4
  915.                 JR      NC,LD_SYNC
  916.                 CALL    LD_EDGE_1
  917.                 RET     NC
  918.                 LD      A,C
  919.                 XOR     #03
  920.                 LD      C,A
  921.                 LD      H,#00
  922.                 LD      B,#B0
  923.                 JR      LD_MARKER
  924.  
  925. LD_LOOP:        EX      AF,AF'
  926.                 JR      NZ,LD_FLAG
  927.                 JR      NC,LD_VERIFY
  928.                 LD      (IX+#00),L
  929.                 JR      LD_NEXT
  930.  
  931. LD_FLAG:        RL      C
  932.                 XOR     L
  933.                 RET     NZ
  934.                 LD      A,C
  935.                 RRA
  936.                 LD      C,A
  937.                 INC     DE
  938.                 JR      LD_DEC
  939.  
  940. LD_VERIFY:      LD      A,(IX+#00)
  941.                 XOR     L
  942.                 RET     NZ
  943. LD_NEXT:        INC     IX
  944. LD_DEC:         DEC     DE
  945.                 EX      AF,AF'
  946.                 LD      B,#B2
  947. LD_MARKER:      LD      L,#01
  948. LD_8_BITS:      CALL    LD_EDGE_2
  949.                 RET     NC
  950.                 LD      A,#CB
  951.                 CP      B
  952.                 RL      L
  953.                 LD      B,#B0
  954.                 JP      NC,LD_8_BITS
  955.                 LD      A,H
  956.                 XOR     L
  957.                 LD      H,A
  958.                 LD      A,D
  959.                 OR      E
  960.                 JR      NZ,LD_LOOP
  961.                 LD      A,H
  962.                 CP      #01
  963.                 RET
  964.  
  965. ; Check signal being loaded
  966. LD_EDGE_2:      CALL    LD_EDGE_1
  967.                 RET     NC
  968. LD_EDGE_1:      LD      A,#16
  969. LD_DELAY:       DEC     A
  970.                 JR      NZ,LD_DELAY
  971.                 AND     A
  972. LD_SAMPLE:      INC     B
  973.                 RET     Z
  974.                 LD      A,#7F
  975.                 IN      A,(#FE)
  976.                 RRA
  977.                 RET     NC
  978.                 XOR     C
  979.                 AND     #20
  980.                 JR      Z,LD_SAMPLE
  981.                 LD      A,C
  982.                 CPL
  983.                 LD      C,A
  984.                 AND     #07
  985.                 OR      #08
  986.                 OUT     (#FE),A
  987.                 SCF
  988.                 RET
  989.  
  990. ; Entry point for tape commands
  991. SAVE_ETC:       POP     AF
  992.                 LD      A,(#5C74)
  993.                 SUB     #E0
  994.                 LD      (#5C74),A
  995.                 NOP                     ; BSROM for MB02+ - filename handling provided by BSDOS
  996.                 NOP
  997.                 NOP
  998.                 CALL    SYNTAX_Z
  999.                 JR      Z,SA_DATA
  1000.                 LD      BC,#0011
  1001.                 LD      A,(#5C74)
  1002.                 AND     A
  1003.                 JR      Z,SA_SPACE
  1004.                 LD      C,#22
  1005. SA_SPACE:       RST     #30
  1006.                 PUSH    DE
  1007.                 POP     IX
  1008.                 LD      B,#0B
  1009.                 LD      A,#20
  1010. SA_BLANK:       LD      (DE),A
  1011.                 INC     DE
  1012.                 DJNZ    SA_BLANK
  1013.                 LD      (IX+#01),#FF
  1014.                 CALL    STK_FETCH
  1015.                 LD      HL,#FFF6
  1016.                 DEC     BC
  1017.                 ADD     HL,BC
  1018.                 INC     BC
  1019.                 JR      NC,SA_NAME
  1020.                 LD      A,(#5C74)
  1021.                 AND     A
  1022.                 JR      NZ,SA_NULL
  1023. REPORT_FA:      RST     #08                     ; Error report
  1024.                 DB      #0E                     ; Invalid file name
  1025. SA_NULL:        LD      A,B
  1026.                 OR      C
  1027.                 JR      Z,SA_DATA
  1028.                 LD      BC,#000A
  1029. SA_NAME:        PUSH    IX
  1030.                 POP     HL
  1031.                 INC     HL
  1032.                 EX      DE,HL
  1033.                 LDIR
  1034. SA_DATA:        RST     #18
  1035.                 CP      #E4
  1036.                 JR      NZ,SA_SCR
  1037.                 LD      A,(#5C74)
  1038.                 CP      #03
  1039.                 JP      Z,REPORT_C
  1040.                 RST     #20
  1041.                 CALL    LOOK_VARS
  1042.                 SET     7,C
  1043.                 JR      NC,SA_V_OLD
  1044.                 LD      HL,#0000
  1045.                 LD      A,(#5C74)
  1046.                 DEC     A
  1047.                 JR      Z,SA_V_NEW
  1048. REPORT_2A:      RST     #08                     ; Error report
  1049.                 DB      #01                     ; Variable not found
  1050. SA_V_OLD:       JP      NZ,REPORT_C
  1051.                 CALL    SYNTAX_Z
  1052.                 JR      Z,SA_DATA_1
  1053.                 INC     HL
  1054.                 LD      A,(HL)
  1055.                 LD      (IX+#0B),A
  1056.                 INC     HL
  1057.                 LD      A,(HL)
  1058.                 LD      (IX+#0C),A
  1059.                 INC     HL
  1060. SA_V_NEW:       LD      (IX+#0E),C
  1061.                 LD      A,#01
  1062.                 BIT     6,C
  1063.                 JR      Z,SA_V_TYPE
  1064.                 INC     A
  1065. SA_V_TYPE:      LD      (IX+#00),A
  1066. SA_DATA_1:      EX      DE,HL
  1067.                 RST     #20
  1068.                 CP      #29
  1069.                 JR      NZ,SA_V_OLD
  1070.                 RST     #20
  1071.                 CALL    CHECK_END
  1072.                 EX      DE,HL
  1073.                 JP      SA_ALL
  1074.  
  1075. SA_SCR:         CP      #AA
  1076.                 JR      NZ,SA_CODE
  1077.                 LD      A,(#5C74)
  1078.                 CP      #03
  1079.                 JP      Z,REPORT_C
  1080.                 RST     #20
  1081.                 CALL    CHECK_END
  1082.                 LD      (IX+#0B),#00
  1083.                 LD      (IX+#0C),#1B
  1084.                 LD      HL,#4000
  1085.                 LD      (IX+#0D),L
  1086.                 LD      (IX+#0E),H
  1087.                 JR      SA_TYPE_3
  1088.  
  1089. SA_CODE:        CP      #AF
  1090.                 JR      NZ,SA_LINE
  1091.                 LD      A,(#5C74)
  1092.                 CP      #03
  1093.                 JP      Z,REPORT_C
  1094.                 RST     #20
  1095.                 CALL    PR_ST_END
  1096.                 JR      NZ,SA_CODE_1
  1097.                 LD      A,(#5C74)
  1098.                 AND     A
  1099.                 JP      Z,REPORT_C
  1100.                 CALL    USE_ZERO
  1101.                 JR      SA_CODE_2
  1102.  
  1103. SA_CODE_1:      CALL    EXPT_1NUM
  1104.                 RST     #18
  1105.                 CP      #2C
  1106.                 JR      Z,SA_CODE_3
  1107.                 LD      A,(#5C74)
  1108.                 AND     A
  1109.                 JP      Z,REPORT_C
  1110. SA_CODE_2:      CALL    USE_ZERO
  1111.                 JR      SA_CODE_4
  1112.  
  1113. SA_CODE_3:      RST     #20
  1114.                 CALL    EXPT_1NUM
  1115. SA_CODE_4:      CALL    CHECK_END
  1116.                 CALL    FIND_INT2
  1117.                 LD      (IX+#0B),C
  1118.                 LD      (IX+#0C),B
  1119.                 CALL    FIND_INT2
  1120.                 LD      (IX+#0D),C
  1121.                 LD      (IX+#0E),B
  1122.                 LD      H,B
  1123.                 LD      L,C
  1124. SA_TYPE_3:      LD      (IX+#00),#03
  1125.                 JR      SA_ALL
  1126.  
  1127. SA_LINE:        CP      #CA
  1128.                 JR      Z,SA_LINE_1
  1129.                 CALL    CHECK_END
  1130.                 LD      (IX+#0E),#80
  1131.                 JR      SA_TYPE_0
  1132.  
  1133. SA_LINE_1:      LD      A,(#5C74)
  1134.                 AND     A
  1135.                 JP      NZ,REPORT_C
  1136.                 RST     #20
  1137.                 CALL    EXPT_1NUM
  1138.                 CALL    CHECK_END
  1139.                 CALL    FIND_INT2
  1140.                 LD      (IX+#0D),C
  1141.                 LD      (IX+#0E),B
  1142. SA_TYPE_0:      LD      (IX+#00),#00
  1143.                 LD      HL,(#5C59)
  1144.                 LD      DE,(#5C53)
  1145.                 SCF
  1146.                 SBC     HL,DE
  1147.                 LD      (IX+#0B),L
  1148.                 LD      (IX+#0C),H
  1149.                 LD      HL,(#5C4B)
  1150.                 SBC     HL,DE
  1151.                 LD      (IX+#0F),L
  1152.                 LD      (IX+#10),H
  1153.                 EX      DE,HL
  1154. SA_ALL:         LD      A,(#5C74)
  1155.                 AND     A
  1156.                 JP      Z,SA_CONTRL
  1157.                 PUSH    HL
  1158.                 LD      BC,#0011
  1159.                 ADD     IX,BC
  1160. LD_LOOK_H:      PUSH    IX
  1161.                 LD      DE,#0011
  1162.                 XOR     A
  1163.                 SCF
  1164.                 CALL    LD_BYTES
  1165.                 POP     IX
  1166.                 JR      NC,LD_LOOK_H
  1167.                 LD      A,#FE
  1168.                 CALL    CHAN_OPEN
  1169.                 LD      (IY+#52),#FF            ; BSROM - fixed "scroll?" troubles when tape header is shown, was LD (IY+$52),$03
  1170.                 LD      C,#80
  1171.                 LD      A,(IX+#00)
  1172.                 CP      (IX-#11)
  1173.                 JR      NZ,LD_TYPE
  1174.                 LD      C,#F6
  1175. LD_TYPE:        CP      #04
  1176.                 JR      NC,LD_LOOK_H
  1177.                 LD      DE,TAPE_MSGS2
  1178.                 PUSH    BC
  1179.                 CALL    PO_MSG
  1180.                 POP     BC
  1181.                 PUSH    IX
  1182.                 POP     DE
  1183.                 LD      HL,#FFF0
  1184.                 ADD     HL,DE
  1185.                 LD      B,#0A
  1186.                 LD      A,(HL)
  1187.                 INC     A
  1188.                 JR      NZ,LD_NAME
  1189.                 LD      A,C
  1190.                 ADD     A,B
  1191.                 LD      C,A
  1192. LD_NAME:        INC     DE
  1193.                 LD      A,(DE)
  1194.                 CP      (HL)
  1195.                 INC     HL
  1196.                 JR      NZ,LD_CH_PR
  1197.                 INC     C
  1198. LD_CH_PR:       RST     #10
  1199.                 DJNZ    LD_NAME
  1200.                 BIT     7,C
  1201.                 JR      NZ,LD_LOOK_H
  1202.                 LD      A,#0D
  1203.                 RST     #10
  1204.                 POP     HL
  1205.                 LD      A,(IX+#00)
  1206.                 CP      #03
  1207.                 JR      Z,VR_CONTROL
  1208.                 LD      A,(#5C74)
  1209.                 DEC     A
  1210.                 JP      Z,LD_CONTRL
  1211.                 CP      #02
  1212.                 JP      Z,ME_CONTRL
  1213. VR_CONTROL:     PUSH    HL                      ; Handle VERIFY control
  1214.                 LD      L,(IX-#06)
  1215.                 LD      H,(IX-#05)
  1216.                 LD      E,(IX+#0B)
  1217.                 LD      D,(IX+#0C)
  1218.                 LD      A,H
  1219.                 OR      L
  1220.                 JR      Z,VR_CONT_1
  1221.                 SBC     HL,DE
  1222.                 JR      C,REPORT_R
  1223.                 JR      Z,VR_CONT_1
  1224.                 LD      A,(IX+#00)
  1225.                 CP      #03
  1226.                 JR      NZ,REPORT_R
  1227. VR_CONT_1:      POP     HL
  1228.                 LD      A,H
  1229.                 OR      L
  1230.                 JR      NZ,VR_CONT_2
  1231.                 LD      L,(IX+#0D)
  1232.                 LD      H,(IX+#0E)
  1233. VR_CONT_2:      PUSH    HL
  1234.                 POP     IX
  1235.                 LD      A,(#5C74)
  1236.                 CP      #02
  1237.                 SCF
  1238.                 JR      NZ,VR_CONT_3
  1239.                 AND     A
  1240. VR_CONT_3:      LD      A,#FF
  1241. LD_BLOCK:       CALL    LD_BYTES                ; Load a block of data
  1242.                 RET     C
  1243. REPORT_R:       RST     #08                     ; Error report
  1244.                 DB      #1A                     ; Tape loading error
  1245. LD_CONTRL:      LD      E,(IX+#0B)              ; Handle LOAD control
  1246.                 LD      D,(IX+#0C)
  1247.                 PUSH    HL
  1248.                 LD      A,H
  1249.                 OR      L
  1250.                 JR      NZ,LD_CONT_1
  1251.                 INC     DE
  1252.                 INC     DE
  1253.                 INC     DE
  1254.                 EX      DE,HL
  1255.                 JR      LD_CONT_2
  1256.  
  1257. LD_CONT_1:      LD      L,(IX-#06)
  1258.                 LD      H,(IX-#05)
  1259.                 EX      DE,HL
  1260.                 SCF
  1261.                 SBC     HL,DE
  1262.                 JR      C,LD_DATA
  1263. LD_CONT_2:      LD      DE,#0005
  1264.                 ADD     HL,DE
  1265.                 LD      B,H
  1266.                 LD      C,L
  1267.                 CALL    TEST_ROOM
  1268. LD_DATA:        POP     HL
  1269.                 LD      A,(IX+#00)
  1270.                 AND     A
  1271.                 JR      Z,LD_PROG
  1272.                 LD      A,H
  1273.                 OR      L
  1274.                 JR      Z,LD_DATA_1
  1275.                 DEC     HL
  1276.                 LD      B,(HL)
  1277.                 DEC     HL
  1278.                 LD      C,(HL)
  1279.                 DEC     HL
  1280.                 INC     BC
  1281.                 INC     BC
  1282.                 INC     BC
  1283.                 LD      (#5C5F),IX
  1284.                 CALL    RECLAIM_2
  1285.                 LD      IX,(#5C5F)
  1286. LD_DATA_1:      LD      HL,(#5C59)
  1287.                 DEC     HL
  1288.                 LD      C,(IX+#0B)
  1289.                 LD      B,(IX+#0C)
  1290.                 PUSH    BC
  1291.                 INC     BC
  1292.                 INC     BC
  1293.                 INC     BC
  1294.                 LD      A,(IX-#03)
  1295.                 PUSH    AF
  1296.                 CALL    MAKE_ROOM
  1297.                 INC     HL
  1298.                 POP     AF
  1299.                 LD      (HL),A
  1300.                 POP     DE
  1301.                 INC     HL
  1302.                 LD      (HL),E
  1303.                 INC     HL
  1304.                 LD      (HL),D
  1305.                 INC     HL
  1306.                 PUSH    HL
  1307.                 POP     IX
  1308.                 SCF
  1309.                 LD      A,#FF
  1310.                 JP      LD_BLOCK
  1311.  
  1312. LD_PROG:        EX      DE,HL
  1313.                 LD      HL,(#5C59)
  1314.                 DEC     HL
  1315.                 LD      (#5C5F),IX
  1316.                 LD      C,(IX+#0B)
  1317.                 LD      B,(IX+#0C)
  1318.                 PUSH    BC
  1319.                 CALL    RECLAIM_1
  1320.                 POP     BC
  1321.                 PUSH    HL
  1322.                 PUSH    BC
  1323.                 CALL    MAKE_ROOM
  1324.                 LD      IX,(#5C5F)
  1325.                 INC     HL
  1326.                 LD      C,(IX+#0F)
  1327.                 LD      B,(IX+#10)
  1328.                 ADD     HL,BC
  1329.                 LD      (#5C4B),HL
  1330.                 LD      H,(IX+#0E)
  1331.                 LD      A,H
  1332.                 AND     #C0
  1333.                 JR      NZ,LD_PROG_1
  1334.                 LD      L,(IX+#0D)
  1335.                 LD      (#5C42),HL
  1336.                 LD      (IY+#0A),#00
  1337. LD_PROG_1:      POP     DE
  1338.                 POP     IX
  1339.                 SCF
  1340.                 LD      A,#FF
  1341.                 JP      LD_BLOCK
  1342.  
  1343. ; Handle MERGE control
  1344. ME_CONTRL:      LD      C,(IX+#0B)
  1345.                 LD      B,(IX+#0C)
  1346.                 PUSH    BC
  1347.                 INC     BC
  1348.                 RST     #30
  1349.                 LD      (HL),#80
  1350.                 EX      DE,HL
  1351.                 POP     DE
  1352.                 PUSH    HL
  1353.                 PUSH    HL
  1354.                 POP     IX
  1355.                 SCF
  1356.                 LD      A,#FF
  1357.                 CALL    LD_BLOCK
  1358.                 POP     HL
  1359.                 LD      DE,(#5C53)
  1360. ME_NEW_LP:      LD      A,(HL)
  1361.                 AND     #C0
  1362.                 JR      NZ,ME_VAR_LP
  1363. ME_OLD_LP:      LD      A,(DE)
  1364.                 INC     DE
  1365.                 CP      (HL)
  1366.                 INC     HL
  1367.                 JR      NZ,ME_OLD_L1
  1368.                 LD      A,(DE)
  1369.                 CP      (HL)
  1370. ME_OLD_L1:      DEC     DE
  1371.                 DEC     HL
  1372.                 JR      NC,ME_NEW_L2
  1373.                 PUSH    HL
  1374.                 EX      DE,HL
  1375.                 CALL    NEXT_ONE
  1376.                 POP     HL
  1377.                 JR      ME_OLD_LP
  1378.  
  1379. ME_NEW_L2:      CALL    ME_ENTER
  1380.                 JR      ME_NEW_LP
  1381.  
  1382. ME_VAR_LP:      LD      A,(HL)
  1383.                 LD      C,A
  1384.                 CP      #80
  1385.                 RET     Z
  1386.                 PUSH    HL
  1387.                 LD      HL,(#5C4B)
  1388. ME_OLD_VP:      LD      A,(HL)
  1389.                 CP      #80
  1390.                 JR      Z,ME_VAR_L2
  1391.                 CP      C
  1392.                 JR      Z,ME_OLD_V2
  1393. ME_OLD_V1:      PUSH    BC
  1394.                 CALL    NEXT_ONE
  1395.                 POP     BC
  1396.                 EX      DE,HL
  1397.                 JR      ME_OLD_VP
  1398.  
  1399. ME_OLD_V2:      AND     #E0
  1400.                 CP      #A0
  1401.                 JR      NZ,ME_VAR_L1
  1402.                 POP     DE
  1403.                 PUSH    DE
  1404.                 PUSH    HL
  1405. ME_OLD_V3:      INC     HL
  1406.                 INC     DE
  1407.                 LD      A,(DE)
  1408.                 CP      (HL)
  1409.                 JR      NZ,ME_OLD_V4
  1410.                 RLA
  1411.                 JR      NC,ME_OLD_V3
  1412.                 POP     HL
  1413.                 JR      ME_VAR_L1
  1414.  
  1415. ME_OLD_V4:      POP     HL
  1416.                 JR      ME_OLD_V1
  1417.  
  1418. ME_VAR_L1:      LD      A,#FF
  1419. ME_VAR_L2:      POP     DE
  1420.                 EX      DE,HL
  1421.                 INC     A
  1422.                 SCF
  1423.                 CALL    ME_ENTER
  1424.                 JR      ME_VAR_LP
  1425.  
  1426. ; Merge a line or variable
  1427. ME_ENTER:       JR      NZ,ME_ENT_1
  1428.                 EX      AF,AF'
  1429.                 LD      (#5C5F),HL
  1430.                 EX      DE,HL
  1431.                 CALL    NEXT_ONE
  1432.                 CALL    RECLAIM_2
  1433.                 EX      DE,HL
  1434.                 LD      HL,(#5C5F)
  1435.                 EX      AF,AF'
  1436. ME_ENT_1:       EX      AF,AF'
  1437.                 PUSH    DE
  1438.                 CALL    NEXT_ONE
  1439.                 LD      (#5C5F),HL
  1440.                 LD      HL,(#5C53)
  1441.                 EX      (SP),HL
  1442.                 PUSH    BC
  1443.                 EX      AF,AF'
  1444.                 JR      C,ME_ENT_2
  1445.                 DEC     HL
  1446.                 CALL    MAKE_ROOM
  1447.                 INC     HL
  1448.                 JR      ME_ENT_3
  1449.  
  1450. ME_ENT_2:       CALL    MAKE_ROOM
  1451. ME_ENT_3:       INC     HL
  1452.                 POP     BC
  1453.                 POP     DE
  1454.                 LD      (#5C53),DE
  1455.                 LD      DE,(#5C5F)
  1456.                 PUSH    BC
  1457.                 PUSH    DE
  1458.                 EX      DE,HL
  1459.                 LDIR
  1460.                 POP     HL
  1461.                 POP     BC
  1462.                 PUSH    DE
  1463.                 CALL    RECLAIM_2
  1464.                 POP     DE
  1465.                 RET
  1466.  
  1467. ; Handle SAVE control
  1468. SA_CONTRL:      PUSH    HL
  1469.                 LD      A,#FD
  1470.                 CALL    CHAN_OPEN
  1471.                 XOR     A
  1472.                 LD      DE,TAPE_MSGS
  1473.                 CALL    PO_MSG
  1474.                 SET     5,(IY+#02)
  1475.                 CALL    WAIT_KEY
  1476.                 PUSH    IX
  1477.                 LD      DE,#0011
  1478.                 XOR     A
  1479.                 CALL    SA_BYTES
  1480.                 POP     IX
  1481.                 LD      B,#02                   ; BSROM for MB02+ - wait only 2/50 sec
  1482. SA_1_SEC:       HALT
  1483.                 DJNZ    SA_1_SEC
  1484.                 LD      E,(IX+#0B)
  1485.                 LD      D,(IX+#0C)
  1486.                 POP     IX                      ; BSROM - LD A,#FF and POP IX swapped
  1487.                 LD      A,#FF
  1488.                 JP      SA_BYTES
  1489.  
  1490. ; Tape mesages
  1491. TAPE_MSGS:      DB      #80
  1492.                 DC      "Press REC & PLAY, then any key."
  1493. TAPE_MSGS2:     EQU     $-1
  1494.                 DB      #0D
  1495.                 DC      "Program: "
  1496.                 DB      #0D
  1497.                 DC      "Number array: "
  1498.                 DB      #0D
  1499.                 DC      "Character array: "
  1500.                 DB      #0D
  1501.                 DC      "Bytes: "
  1502.  
  1503. ; Genereal PRINT routine
  1504. PRINT_OUT:      CALL    DISPL                   ; BSROM - disabled autolist of control codes
  1505.                 CP      #1E
  1506.                 JP      NC,PO_ABLE
  1507.                 CP      #06
  1508.                 JR      C,PO_QUEST
  1509.                 CP      #18
  1510.                 JR      NC,PO_QUEST
  1511.                 LD      HL,CTLCHRTAB-6
  1512.                 LD      E,A
  1513.                 LD      D,#00
  1514.                 ADD     HL,DE
  1515.                 LD      E,(HL)
  1516.                 ADD     HL,DE
  1517.                 PUSH    HL
  1518.                 JP      PO_FETCH
  1519.  
  1520. ;Control character table
  1521. CTLCHRTAB:      DB      #4E                     ; PO_COMMA
  1522.                 DB      #57                     ; PO_QUEST
  1523.                 DB      #10                     ; PO_BACK_1
  1524.                 DB      #29                     ; PO_RIGHT
  1525.                 DB      #54                     ; PO_QUEST
  1526.                 DB      #53                     ; PO_QUEST
  1527.                 DB      #52                     ; PO_QUEST
  1528.                 DB      #37                     ; PO_ENTER
  1529.                 DB      #50                     ; PO_QUEST
  1530.                 DB      #4F                     ; PO_QUEST
  1531.                 DB      #5F                     ; PO_1_OPER
  1532.                 DB      #5E                     ; PO_1_OPER
  1533.                 DB      #5D                     ; PO_1_OPER
  1534.                 DB      #5C                     ; PO_1_OPER
  1535.                 DB      #5B                     ; PO_1_OPER
  1536.                 DB      #5A                     ; PO_1_OPER
  1537.                 DB      #54                     ; PO_2_OPER
  1538.                 DB      #53                     ; PO_2_OPER
  1539.  
  1540. ; Cursor left routine
  1541. PO_BACK_1:      INC     C
  1542.                 LD      A,#22
  1543.                 CP      C
  1544.                 JR      NZ,PO_BACK_3
  1545.                 BIT     1,(IY+#01)
  1546.                 JR      NZ,PO_BACK_2
  1547.                 INC     B
  1548.                 LD      C,#02
  1549.                 LD      A,#19                   ; BSROM - bugfix - was LD A,#18
  1550.                 CP      B
  1551.                 JR      NZ,PO_BACK_3
  1552.                 DEC     B
  1553. PO_BACK_2:      LD      C,#21
  1554. PO_BACK_3:      JP      CL_SET
  1555.  
  1556. ; Cursor right routine
  1557. PO_RIGHT:       LD      A,(#5C91)
  1558.                 PUSH    AF
  1559.                 LD      (IY+#57),#01
  1560.                 LD      A,#20
  1561.                 CALL    PO_ABLE                 ; BSROM - bugfix - was CALL PO_BACK
  1562.                 POP     AF
  1563.                 LD      (#5C91),A
  1564.                 RET
  1565.  
  1566. ; Carriage return / Enter
  1567. PO_ENTER:       BIT     1,(IY+#01)
  1568.                 RET     NZ                      ; BSROM for MB02+ - don't use ZX Printer
  1569.                 NOP
  1570.                 NOP
  1571.                 LD      C,#21
  1572.                 CALL    PO_SCR
  1573.                 DEC     B
  1574.                 JP      CL_SET
  1575.  
  1576. ; Print comma
  1577. PO_COMMA:       CALL    PO_FETCH
  1578.                 LD      A,C
  1579.                 DEC     A
  1580.                 DEC     A
  1581.                 AND     #10
  1582.                 JR      PO_FILL
  1583.  
  1584. ; Print question mark
  1585. PO_QUEST:       LD      A,#3F
  1586.                 JR      PO_ABLE
  1587.  
  1588. ; Control characters with operands
  1589. PO_TV_2:        LD      DE,PO_CONT
  1590.                 LD      (#5C0F),A
  1591.                 JR      PO_CHANGE
  1592.  
  1593. PO_2_OPER:      LD      DE,PO_TV_2
  1594.                 JR      PO_TV_1
  1595.  
  1596. PO_1_OPER:      LD      DE,PO_CONT
  1597. PO_TV_1:        LD      (#5C0E),A
  1598. PO_CHANGE:      LD      HL,(#5C51)
  1599.                 LD      (HL),E
  1600.                 INC     HL
  1601.                 LD      (HL),D
  1602.                 RET
  1603.  
  1604. PO_CONT:        LD      DE,PRINT_OUT
  1605.                 CALL    PO_CHANGE
  1606.                 LD      HL,(#5C0E)
  1607.                 LD      D,A
  1608.                 LD      A,L
  1609.                 CP      #16
  1610.                 JP      C,CO_TEMP_5
  1611.                 JR      NZ,PO_TAB
  1612.                 LD      B,H
  1613.                 LD      C,D
  1614.                 LD      A,#1F
  1615.                 SUB     C
  1616.                 JR      C,PO_AT_ERR
  1617.                 ADD     A,#02
  1618.                 LD      C,A
  1619.                 BIT     1,(IY+#01)
  1620.                 JR      NZ,PO_AT_SET
  1621.                 LD      A,#16
  1622.                 SUB     B
  1623. PO_AT_ERR:      JP      C,REPORT_BB
  1624.                 INC     A
  1625.                 LD      B,A
  1626.                 INC     B
  1627.                 BIT     0,(IY+#02)
  1628.                 JP      NZ,PO_SCR
  1629.                 CP      (IY+#31)
  1630.                 JP      C,REPORT_5
  1631. PO_AT_SET:      JP      CL_SET
  1632.  
  1633. PO_TAB:         LD      A,H
  1634. PO_FILL:        CALL    PO_FETCH
  1635.                 ADD     A,C
  1636.                 DEC     A
  1637.                 AND     #1F
  1638.                 RET     Z
  1639.                 LD      D,A
  1640.                 SET     0,(IY+#01)
  1641. PO_SPACE:       LD      A,#20
  1642.                 CALL    PO_SAVE
  1643.                 DEC     D
  1644.                 JR      NZ,PO_SPACE
  1645.                 RET
  1646.  
  1647. ; Print printable character(s)
  1648. PO_ABLE:        CALL    PO_ANY
  1649.  
  1650. ; Store line, column and pixel address
  1651. PO_STORE:       BIT     1,(IY+#01)
  1652.                 JR      NZ,PO_ST_PR
  1653.                 BIT     0,(IY+#02)
  1654.                 JR      NZ,PO_ST_E
  1655.                 LD      (#5C88),BC
  1656.                 LD      (#5C84),HL
  1657.                 RET
  1658.  
  1659. PO_ST_E:        LD      (#5C8A),BC
  1660.                 LD      (#5C82),BC
  1661.                 LD      (#5C86),HL
  1662.                 RET
  1663.  
  1664. PO_ST_PR:       LD      (IY+#45),C
  1665.                 LD      (#5C80),HL
  1666.                 RET
  1667.  
  1668. ; Fetch position parameters
  1669. PO_FETCH:       BIT     1,(IY+#01)
  1670.                 JR      NZ,PO_F_FR
  1671.                 LD      BC,(#5C88)
  1672.                 LD      HL,(#5C84)
  1673.                 BIT     0,(IY+#02)
  1674.                 RET     Z
  1675.                 LD      BC,(#5C8A)
  1676.                 LD      HL,(#5C86)
  1677.                 RET
  1678.  
  1679. PO_F_FR:        LD      C,(IY+#45)
  1680.                 LD      HL,(#5C80)
  1681.                 RET
  1682.  
  1683. ; Print any character
  1684. PO_ANY:         CP      #80
  1685.                 JR      C,PO_CHAR
  1686.                 CP      #90
  1687.                 JR      NC,PO_T_UDG
  1688.                 LD      B,A
  1689.                 CALL    PO_GR_1
  1690.                 CALL    PO_FETCH
  1691.                 LD      DE,#5C92
  1692.                 JR      PR_ALL
  1693.  
  1694. PO_GR_1:        LD      HL,#5C92
  1695.                 CALL    PO_GR_2
  1696. PO_GR_2:        RR      B
  1697.                 SBC     A,A
  1698.                 AND     #0F
  1699.                 LD      C,A
  1700.                 RR      B
  1701.                 SBC     A,A
  1702.                 AND     #F0
  1703.                 OR      C
  1704.                 LD      C,#04
  1705. PO_GR_3:        LD      (HL),A
  1706.                 INC     HL
  1707.                 DEC     C
  1708.                 JR      NZ,PO_GR_3
  1709.                 RET
  1710.  
  1711. PO_T_UDG:       SUB     #A5
  1712.                 JR      NC,PO_T
  1713.                 ADD     A,#15
  1714.                 PUSH    BC
  1715.                 LD      BC,(#5C7B)
  1716.                 JR      PO_CHAR_2
  1717.  
  1718. PO_T:           CALL    PO_TOKENS
  1719.                 JP      PO_FETCH
  1720.  
  1721. PO_CHAR:        PUSH    BC
  1722.                 LD      BC,(#5C36)
  1723. PO_CHAR_2:      EX      DE,HL
  1724.                 LD      HL,#5C3B
  1725.                 RES     0,(HL)
  1726.                 CP      #20
  1727.                 JR      NZ,PO_CHAR_3
  1728.                 SET     0,(HL)
  1729. PO_CHAR_3:      LD      H,#00
  1730.                 LD      L,A
  1731.                 ADD     HL,HL
  1732.                 ADD     HL,HL
  1733.                 ADD     HL,HL
  1734.                 ADD     HL,BC
  1735.                 POP     BC
  1736.                 EX      DE,HL
  1737. PR_ALL:         LD      A,C                     ; Print all characters
  1738.                 DEC     A
  1739.                 LD      A,#21
  1740.                 JR      NZ,PR_ALL_1
  1741.                 DEC     B
  1742.                 LD      C,A
  1743.                 BIT     1,(IY+#01)
  1744.                 JR      Z,PR_ALL_1
  1745.                 PUSH    DE
  1746.                 LD      DE,#0ECD                ; BSROM for MB02+ - don't use ZX Printer
  1747.                 POP     DE
  1748.                 LD      A,C
  1749. PR_ALL_1:       CP      C
  1750.                 PUSH    DE
  1751.                 CALL    Z,PO_SCR
  1752.                 POP     DE
  1753.                 PUSH    BC
  1754.                 PUSH    HL
  1755.                 LD      A,(#5C91)
  1756.                 LD      B,#FF
  1757.                 RRA
  1758.                 JR      C,PR_ALL_2
  1759.                 INC     B
  1760. PR_ALL_2:       RRA
  1761.                 RRA
  1762.                 SBC     A,A
  1763.                 LD      C,A
  1764.                 LD      A,#08
  1765.                 AND     A
  1766.                 BIT     1,(IY+#01)
  1767.                 JR      Z,PR_ALL_3
  1768.                 SET     1,(IY+#30)
  1769.                 SCF
  1770. PR_ALL_3:       EX      DE,HL
  1771. PR_ALL_4:       EX      AF,AF'
  1772.                 LD      A,(DE)
  1773.                 AND     B
  1774.                 XOR     (HL)
  1775.                 XOR     C
  1776.                 LD      (DE),A
  1777.                 EX      AF,AF'
  1778.                 JR      C,PR_ALL_6
  1779.                 INC     D
  1780. PR_ALL_5:       INC     HL
  1781.                 DEC     A
  1782.                 JR      NZ,PR_ALL_4
  1783.                 EX      DE,HL
  1784.                 DEC     H
  1785.                 BIT     1,(IY+#01)
  1786.                 CALL    Z,PO_ATTR
  1787.                 POP     HL
  1788.                 POP     BC
  1789.                 DEC     C
  1790.                 INC     HL
  1791.                 RET
  1792.  
  1793. PR_ALL_6:       EX      AF,AF'
  1794.                 LD      A,#20
  1795.                 ADD     A,E
  1796.                 LD      E,A
  1797.                 EX      AF,AF'
  1798.                 JR      PR_ALL_5
  1799.  
  1800. ; Set attribute
  1801. PO_ATTR:        LD      A,H
  1802.                 RRCA
  1803.                 RRCA
  1804.                 RRCA
  1805.                 AND     #03
  1806.                 OR      #58
  1807.                 LD      H,A
  1808.                 LD      DE,(#5C8F)
  1809.                 LD      A,(HL)
  1810.                 XOR     E
  1811.                 AND     D
  1812.                 XOR     E
  1813.                 BIT     6,(IY+#57)
  1814.                 JR      Z,PO_ATTR_1
  1815.                 AND     #C7
  1816.                 BIT     2,A
  1817.                 JR      NZ,PO_ATTR_1
  1818.                 XOR     #38
  1819. PO_ATTR_1:      BIT     4,(IY+#57)
  1820.                 JR      Z,PO_ATTR_2
  1821.                 AND     #F8
  1822.                 BIT     5,A
  1823.                 JR      NZ,PO_ATTR_2
  1824.                 XOR     #07
  1825. PO_ATTR_2:      LD      (HL),A
  1826.                 RET
  1827.  
  1828. ; Message printing (boot-up, tape, scroll, error reports)
  1829. PO_MSG:         PUSH    HL
  1830.                 LD      H,#00
  1831.                 EX      (SP),HL
  1832.                 JR      PO_TABLE
  1833.  
  1834. PO_TOKENS:      LD      DE,TKN_TABLE
  1835. PO_TOKENS1:     PUSH    AF
  1836. PO_TABLE:       CALL    PO_SEARCH
  1837.                 JR      C,PO_EACH
  1838.                 LD      A,#20
  1839.                 BIT     0,(IY+#01)
  1840.                 CALL    Z,PO_SAVE
  1841. PO_EACH:        LD      A,(DE)
  1842.                 AND     #7F
  1843.                 CALL    PO_SAVE
  1844.                 LD      A,(DE)
  1845.                 INC     DE
  1846.                 ADD     A,A
  1847.                 JR      NC,PO_EACH
  1848.                 POP     DE
  1849.                 CP      #48
  1850.                 JR      Z,PO_TR_SP
  1851.                 CP      #82
  1852.                 RET     C
  1853. PO_TR_SP:       LD      A,D
  1854.                 CP      #03
  1855.                 RET     C
  1856.                 LD      A,#20
  1857. PO_SAVE:        PUSH    DE                      ; Handle recursive printing
  1858.                 EXX
  1859.                 RST     #10
  1860.                 EXX
  1861.                 POP     DE
  1862.                 RET
  1863.  
  1864. ; Token table search
  1865. PO_SEARCH:      PUSH    AF
  1866.                 EX      DE,HL
  1867.                 INC     A
  1868. PO_STEP:        BIT     7,(HL)
  1869.                 INC     HL
  1870.                 JR      Z,PO_STEP
  1871.                 DEC     A
  1872.                 JR      NZ,PO_STEP
  1873.                 EX      DE,HL
  1874.                 POP     AF
  1875.                 CP      #20
  1876.                 RET     C
  1877.                 LD      A,(DE)
  1878.                 SUB     #41
  1879.                 RET
  1880.  
  1881. ; Test for scroll
  1882. PO_SCR:         BIT     1,(IY+#01)
  1883.                 RET     NZ
  1884.                 LD      DE,CL_SET
  1885.                 PUSH    DE
  1886.                 LD      A,B
  1887.                 BIT     0,(IY+#02)
  1888.                 JP      NZ,PO_SCR_4
  1889.                 CP      (IY+#31)
  1890.                 JR      C,REPORT_5
  1891.                 RET     NZ
  1892.                 BIT     4,(IY+#02)
  1893.                 JR      Z,PO_SCR_2
  1894.                 LD      E,(IY+#2D)
  1895.                 DEC     E
  1896.                 JR      Z,PO_SCR_3
  1897.                 LD      A,#00
  1898.                 CALL    CHAN_OPEN
  1899.                 LD      SP,(#5C3F)
  1900.                 RES     4,(IY+#02)
  1901.                 RET
  1902.  
  1903. REPORT_5:       RST     #08                     ; Error report
  1904.                 DB      #04                     ; Out of screen
  1905. PO_SCR_2:       DEC     (IY+#52)
  1906.                 JR      NZ,PO_SCR_3
  1907.                 LD      A,#18
  1908.                 SUB     B
  1909.                 LD      (#5C8C),A
  1910.                 LD      HL,(#5C8F)
  1911.                 PUSH    HL
  1912.                 LD      A,(#5C91)
  1913.                 PUSH    AF
  1914.                 LD      A,#FD
  1915.                 CALL    CHAN_OPEN
  1916.                 XOR     A
  1917.                 LD      DE,SCRL_MSG
  1918.                 CALL    PO_MSG
  1919.                 SET     5,(IY+#02)
  1920.                 LD      HL,#5C3B
  1921.                 SET     3,(HL)
  1922.                 RES     5,(HL)
  1923.                 EXX
  1924.                 CALL    WAIT_KEY
  1925.                 EXX
  1926.                 CP      #20
  1927.                 JR      Z,REPORT_D
  1928.                 CP      #E2
  1929.                 JR      Z,REPORT_D
  1930.                 OR      #20
  1931.                 CP      #6E
  1932.                 JR      Z,REPORT_D
  1933.                 LD      A,#FE
  1934.                 CALL    CHAN_OPEN
  1935.                 POP     AF
  1936.                 LD      (#5C91),A
  1937.                 POP     HL
  1938.                 LD      (#5C8F),HL
  1939. PO_SCR_3:       CALL    CL_SC_ALL
  1940.                 LD      B,(IY+#31)
  1941.                 INC     B
  1942.                 LD      C,#21
  1943.                 PUSH    BC
  1944.                 CALL    CL_ADDR
  1945.                 LD      A,H
  1946.                 RRCA
  1947.                 RRCA
  1948.                 RRCA
  1949.                 AND     #03
  1950.                 OR      #58
  1951.                 LD      H,A
  1952.                 LD      DE,#5AE0
  1953.                 LD      A,(DE)
  1954.                 LD      C,(HL)
  1955.                 LD      B,#20
  1956.                 EX      DE,HL
  1957. PO_SCR_3A:      LD      (DE),A
  1958.                 LD      (HL),C
  1959.                 INC     DE
  1960.                 INC     HL
  1961.                 DJNZ    PO_SCR_3A
  1962.                 POP     BC
  1963.                 RET
  1964.  
  1965. SCRL_MSG:       DB      #80
  1966.                 DC      "scroll?"
  1967.  
  1968. REPORT_D:       RST     #08                     ; Error report
  1969.                 DB      #0C                     ; BREAK - CONT repeats
  1970. PO_SCR_4:       CP      #02
  1971.                 JR      C,REPORT_5
  1972.                 ADD     A,(IY+#31)
  1973.                 SUB     #19
  1974.                 RET     NC
  1975.                 NEG
  1976.                 PUSH    BC
  1977.                 LD      B,A
  1978.                 LD      HL,(#5C8F)
  1979.                 PUSH    HL
  1980.                 LD      HL,(#5C91)
  1981.                 PUSH    HL
  1982.                 CALL    TEMPS
  1983.                 LD      A,B
  1984. PO_SCR_4A:      PUSH    AF
  1985.                 LD      HL,#5C6B
  1986.                 LD      B,(HL)
  1987.                 LD      A,B
  1988.                 INC     A
  1989.                 LD      (HL),A
  1990.                 LD      HL,#5C89
  1991.                 CP      (HL)
  1992.                 JR      C,PO_SCR_4B
  1993.                 INC     (HL)
  1994.                 LD      B,#18
  1995. PO_SCR_4B:      CALL    CL_SCROLL
  1996.                 POP     AF
  1997.                 DEC     A
  1998.                 JR      NZ,PO_SCR_4A
  1999.                 POP     HL
  2000.                 LD      (IY+#57),L
  2001.                 POP     HL
  2002.                 LD      (#5C8F),HL
  2003.                 LD      BC,(#5C88)
  2004.                 RES     0,(IY+#02)
  2005.                 CALL    CL_SET
  2006.                 SET     0,(IY+#02)
  2007.                 POP     BC
  2008.                 RET
  2009.  
  2010. ; Copy temporary items
  2011. TEMPS:          XOR     A
  2012.                 LD      HL,(#5C8D)
  2013.                 BIT     0,(IY+#02)
  2014.                 JR      Z,TEMPS_1
  2015.                 LD      H,A
  2016.                 LD      L,(IY+#0E)
  2017. TEMPS_1:        LD      (#5C8F),HL
  2018.                 LD      HL,#5C91
  2019.                 JR      NZ,TEMPS_2
  2020.                 LD      A,(HL)
  2021.                 RRCA
  2022. TEMPS_2:        XOR     (HL)
  2023.                 AND     #55
  2024.                 XOR     (HL)
  2025.                 LD      (HL),A
  2026.                 RET
  2027.  
  2028. ; Handle CLS command
  2029. CLS:            CALL    CL_ALL
  2030. CLS_LOWER:      LD      HL,#5C3C
  2031.                 RES     5,(HL)
  2032.                 SET     0,(HL)
  2033.                 CALL    TEMPS
  2034.                 LD      B,(IY+#31)
  2035.                 CALL    CL_LINE
  2036.                 LD      HL,#5AC0
  2037.                 LD      A,(#5C8D)
  2038.                 DEC     B
  2039.                 JR      CLS_3
  2040.  
  2041. CLS_1:          LD      C,#20
  2042. CLS_2:          DEC     HL
  2043.                 LD      (HL),A
  2044.                 DEC     C
  2045.                 JR      NZ,CLS_2
  2046. CLS_3:          DJNZ    CLS_1
  2047.                 LD      (IY+#31),#02
  2048. CL_CHAN:        LD      A,#FD
  2049.                 CALL    CHAN_OPEN
  2050.                 LD      HL,(#5C51)
  2051.                 LD      DE,PRINT_OUT
  2052.                 AND     A
  2053. CL_CHAN_A:      LD      (HL),E
  2054.                 INC     HL
  2055.                 LD      (HL),D
  2056.                 INC     HL
  2057.                 LD      DE,KEY_INPUT
  2058.                 CCF
  2059.                 JR      C,CL_CHAN_A
  2060.                 LD      BC,#1721
  2061.                 JR      CL_SET
  2062.  
  2063. ; Clear display area
  2064. CL_ALL:         LD      HL,#0000
  2065.                 LD      (#5C7D),HL
  2066.                 RES     0,(IY+#30)
  2067.                 CALL    CL_CHAN
  2068.                 LD      A,#FE
  2069.                 CALL    CHAN_OPEN
  2070.                 CALL    TEMPS
  2071.                 LD      B,#18
  2072.                 CALL    CL_LINE
  2073.                 LD      HL,(#5C51)
  2074.                 LD      DE,PRINT_OUT
  2075.                 LD      (HL),E
  2076.                 INC     HL
  2077.                 LD      (HL),D
  2078.                 LD      (IY+#52),#01
  2079.                 LD      BC,#1821
  2080. CL_SET:         LD      HL,#5B00                ; Set line and column numbers
  2081.                 BIT     1,(IY+#01)
  2082.                 JR      NZ,CL_SET_2
  2083.                 LD      A,B
  2084.                 BIT     0,(IY+#02)
  2085.                 JR      Z,CL_SET_1
  2086.                 ADD     A,(IY+#31)
  2087.                 SUB     #18
  2088. CL_SET_1:       PUSH    BC
  2089.                 LD      B,A
  2090.                 CALL    CL_ADDR
  2091.                 POP     BC
  2092. CL_SET_2:       LD      A,#21
  2093.                 SUB     C
  2094.                 LD      E,A
  2095.                 LD      D,#00
  2096.                 ADD     HL,DE
  2097.                 JP      PO_STORE
  2098.  
  2099. ; Scroll part or whole display
  2100. CL_SC_ALL:      LD      B,#17
  2101. CL_SCROLL:      CALL    CL_ADDR
  2102.                 LD      C,#08
  2103. CL_SCR_1:       PUSH    BC
  2104.                 PUSH    HL
  2105.                 LD      A,B
  2106.                 AND     #07
  2107.                 LD      A,B
  2108.                 JR      NZ,CL_SCR_3
  2109. CL_SCR_2:       EX      DE,HL
  2110.                 LD      HL,#F8E0
  2111.                 ADD     HL,DE
  2112.                 EX      DE,HL
  2113.                 LD      BC,#0020
  2114.                 DEC     A
  2115.                 LDIR
  2116. CL_SCR_3:       EX      DE,HL
  2117.                 LD      HL,#FFE0
  2118.                 ADD     HL,DE
  2119.                 EX      DE,HL
  2120.                 LD      B,A
  2121.                 AND     #07
  2122.                 RRCA
  2123.                 RRCA
  2124.                 RRCA
  2125.                 LD      C,A
  2126.                 LD      A,B
  2127.                 LD      B,#00
  2128.                 LDIR
  2129.                 LD      B,#07
  2130.                 ADD     HL,BC
  2131.                 AND     #F8
  2132.                 JR      NZ,CL_SCR_2
  2133.                 POP     HL
  2134.                 INC     H
  2135.                 POP     BC
  2136.                 DEC     C
  2137.                 JR      NZ,CL_SCR_1
  2138.                 CALL    CL_ATTR
  2139.                 LD      HL,#FFE0
  2140.                 ADD     HL,DE
  2141.                 EX      DE,HL
  2142.                 LDIR
  2143.                 LD      B,#01
  2144. CL_LINE:        PUSH    BC                      ; Clear text lines at the bottom of display
  2145.                 CALL    CL_ADDR
  2146.                 LD      C,#08
  2147. CL_LINE_1:      PUSH    BC
  2148.                 PUSH    HL
  2149.                 LD      A,B
  2150. CL_LINE_2:      AND     #07
  2151.                 RRCA
  2152.                 RRCA
  2153.                 RRCA
  2154.                 LD      C,A
  2155.                 LD      A,B
  2156.                 LD      B,#00
  2157.                 DEC     C
  2158.                 LD      D,H
  2159.                 LD      E,L
  2160.                 LD      (HL),#00
  2161.                 INC     DE
  2162.                 LDIR
  2163.                 LD      DE,#0701
  2164.                 ADD     HL,DE
  2165.                 DEC     A
  2166.                 AND     #F8
  2167.                 LD      B,A
  2168.                 JR      NZ,CL_LINE_2
  2169.                 POP     HL
  2170.                 INC     H
  2171.                 POP     BC
  2172.                 DEC     C
  2173.                 JR      NZ,CL_LINE_1
  2174.                 CALL    CL_ATTR
  2175.                 LD      H,D
  2176.                 LD      L,E
  2177.                 INC     DE
  2178.                 LD      A,(#5C8D)
  2179.                 BIT     0,(IY+#02)
  2180.                 JR      Z,CL_LINE_3
  2181.                 LD      A,(#5C48)
  2182. CL_LINE_3:      LD      (HL),A
  2183.                 DEC     BC
  2184.                 LDIR
  2185.                 POP     BC
  2186.                 LD      C,#21
  2187.                 RET
  2188.  
  2189. ; Attribute handling
  2190. CL_ATTR:        LD      A,H
  2191.                 RRCA
  2192.                 RRCA
  2193.                 RRCA
  2194.                 DEC     A
  2195.                 OR      #50
  2196.                 LD      H,A
  2197.                 EX      DE,HL
  2198.                 LD      H,C
  2199.                 LD      L,B
  2200.                 ADD     HL,HL
  2201.                 ADD     HL,HL
  2202.                 ADD     HL,HL
  2203.                 ADD     HL,HL
  2204.                 ADD     HL,HL
  2205.                 LD      B,H
  2206.                 LD      C,L
  2207.                 RET
  2208.  
  2209. ; Handle display with line number
  2210. CL_ADDR:        LD      A,#18
  2211.                 SUB     B
  2212.                 LD      D,A
  2213.                 RRCA
  2214.                 RRCA
  2215.                 RRCA
  2216.                 AND     #E0
  2217.                 LD      L,A
  2218.                 LD      A,D
  2219.                 AND     #18
  2220.                 OR      #40
  2221.                 LD      H,A
  2222.                 RET
  2223.  
  2224. ; BSROM for MB02+ - here was ZX Printer handling.
  2225. ; Replaced with BSDOS patches
  2226. COPY:           RET
  2227.  
  2228. STKDUP:         RST     #28                     ;FP_CALC
  2229.                 DB      #31                     ;DUPLICATE
  2230.                 DB      #38                     ;END_CALC
  2231.                 RET
  2232.  
  2233. ZNKCMD:         DB      '.', '@', '$', '`'      ; new commands
  2234.  
  2235. NEWCMD:         LD      HL,ZNKCMD               ; extended BASIC interpreter
  2236.                 LD      BC,#0004
  2237.                 CPIR
  2238.                 JP      NZ,COMM
  2239.                 LD      (#5C74),A
  2240.                 DB      #3E
  2241. CMDMGF:         POP     AF
  2242. CMDEXE:         LD      (#5C3F),SP
  2243.                 LD      A,BASICM
  2244.                 JR      DOSCAL
  2245.  
  2246. TSTSAV:         LD      HL,TAPDSK
  2247.                 BIT     0,(HL)
  2248.                 LD      HL,#1F80
  2249.                 RET     Z
  2250.                 LD      L,A
  2251.                 LD      A,EM4C6
  2252.                 JR      LOASAV
  2253.  
  2254. TSTLOA:         LD      A,(TAPDSK)
  2255.                 RRCA
  2256.                 JR      C,LOADOS
  2257.                 DI
  2258.                 LD      A,#0E
  2259.                 OUT     (#FE),A
  2260.                 IN      A,(#FE)
  2261.                 RRA
  2262.                 RET
  2263.  
  2264. LOADOS:         LD      A,EM562
  2265. LOASAV:         POP     BC
  2266. DOSCAL:         CALL    BNKCAL
  2267.                 DW      #0020
  2268.                 RET
  2269.  
  2270. NEWFNC:         LD      A,FUNKC
  2271.                 CALL    DOSCAL
  2272.                 JP      Z,S_CONT_2
  2273.                 RST     #18
  2274.                 CALL    SYNTAX_Z
  2275.                 JP      Z,S_FN_SBRN1
  2276.                 JP      SF_RUN1
  2277.  
  2278. ; BSROM for MB02+
  2279. ; Reserved for future BSDOS patches
  2280.  
  2281.                 DW      #0000
  2282.                 DW      #0000
  2283.                 DW      #0000
  2284.                 DW      #0000
  2285.                 DW      #0000
  2286.                 DW      #0000
  2287.                 DW      #0000
  2288.                 DW      #0000
  2289.                 DW      #0000
  2290.                 DW      #0000
  2291.                 DW      #0000
  2292.                 DW      #0000
  2293.                 DW      #0000
  2294.                 DW      #0000
  2295.                 DW      #0000
  2296.                 DW      #0000
  2297.                 DW      #0000
  2298.                 DW      #0000
  2299.                 DW      #0000
  2300.  
  2301.                 RET
  2302.  
  2303. ; The editor routine - prepare or edit BASIC line, or handle INPUT expression
  2304. EDITOR:         LD      HL,(#5C3D)
  2305.                 PUSH    HL
  2306. ED_AGAIN:       LD      HL,ED_ERROR
  2307.                 PUSH    HL
  2308.                 LD      (#5C3D),SP
  2309. ED_LOOP:        CALL    WAIT_KEY
  2310.                 PUSH    AF
  2311.                 LD      D,#00
  2312.                 LD      E,(IY-#01)
  2313.                 LD      HL,#00C8
  2314.                 CALL    BEEPER
  2315.                 POP     AF
  2316.                 LD      HL,ED_LOOP
  2317.                 PUSH    HL
  2318.                 CP      #18
  2319.                 JR      NC,ADD_CHAR
  2320.                 CP      #07
  2321.                 JR      C,ADD_CHAR
  2322.                 CP      #10
  2323.                 JR      C,ED_KEYS
  2324.                 LD      BC,#0002
  2325.                 LD      D,A
  2326.                 CP      #16
  2327.                 JR      C,ED_CONTR
  2328.                 INC     BC
  2329.                 BIT     7,(IY+#37)
  2330.                 JP      Z,ED_IGNORE
  2331.                 CALL    WAIT_KEY
  2332.                 LD      E,A
  2333. ED_CONTR:       CALL    WAIT_KEY
  2334.                 PUSH    DE
  2335.                 LD      HL,(#5C5B)
  2336.                 RES     0,(IY+#07)
  2337.                 CALL    MAKE_ROOM
  2338.                 POP     BC
  2339.                 INC     HL
  2340.                 LD      (HL),B
  2341.                 INC     HL
  2342.                 LD      (HL),C
  2343.                 JR      ADD_CH_1
  2344.  
  2345. ; Add code to current line
  2346. ADD_CHAR:       RES     0,(IY+#07)
  2347.                 LD      HL,(#5C5B)
  2348.                 CALL    ONE_SPACE
  2349. ADD_CH_1:       LD      (DE),A
  2350.                 INC     DE
  2351.                 LD      (#5C5B),DE
  2352.                 RET
  2353.  
  2354. ED_KEYS:        LD      E,A
  2355.                 LD      D,#00
  2356.                 LD      HL,ED_KEYS_T-7
  2357.                 ADD     HL,DE
  2358.                 LD      E,(HL)
  2359.                 ADD     HL,DE
  2360.                 PUSH    HL
  2361.                 LD      HL,(#5C5B)
  2362.                 RET
  2363.  
  2364. ; Editing keys table
  2365. ED_KEYS_T:      DB      #09                     ; ED_EDIT
  2366.                 DB      #66                     ; ED_LEFT
  2367.                 DB      #6A                     ; ED_RIGHT
  2368.                 DB      #50                     ; ED_DOWN
  2369.                 DB      #B5                     ; ED_UP
  2370.                 DB      #70                     ; ED_DELETE
  2371.                 DB      #7E                     ; ED_ENTER
  2372.                 DB      #CF                     ; ED_SYMBOL
  2373.                 DB      #D4                     ; ED_GRAPH
  2374.  
  2375. ; Handle EDIT key
  2376. ED_EDIT:        LD      HL,(#5C49)
  2377.                 BIT     5,(IY+#37)
  2378.                 JP      NZ,CLEAR_SP
  2379.                 CALL    LINE_ADDR
  2380.                 CALL    LIN2                    ; BSROM - modified BASIC program presence test
  2381.                 AND     #C0
  2382.                 JP      NZ,CLEAR_SP
  2383.                 PUSH    HL
  2384.                 INC     HL
  2385.                 LD      C,(HL)
  2386.                 INC     HL
  2387.                 LD      B,(HL)
  2388.                 LD      HL,#000A
  2389.                 ADD     HL,BC
  2390.                 LD      B,H
  2391.                 LD      C,L
  2392.                 CALL    TEST_ROOM
  2393.                 CALL    CLEAR_SP
  2394.                 LD      HL,(#5C51)
  2395.                 EX      (SP),HL
  2396.                 PUSH    HL
  2397.                 LD      A,#FF
  2398.                 CALL    CHAN_OPEN
  2399.                 POP     HL
  2400.                 DEC     HL
  2401.                 CALL    OUT_LINE                ;BSROM - cursor placement after EDIT
  2402.                 LD      DE,#0005
  2403.                 LD      HL,(#5C59)
  2404.                 ADD     HL,DE
  2405.                 LD      (#5C5B),HL
  2406.                 POP     HL
  2407.                 JP      CHAN_FLAG
  2408.  
  2409. TOERR:          LD      (#5C5F),HL              ; BSROM - cursor jumps to error
  2410.                 LD      (#5C5B),HL
  2411.                 RET
  2412.  
  2413. ; Cursor down editing
  2414. ED_DOWN:        CALL    DOLE                    ; BSROM - free cursor moving
  2415.                 BIT     5,(IY+#37)
  2416.                 RET     NZ
  2417.                 NOP
  2418.                 CALL    LN_FETCH
  2419.                 JR      ED_LIST
  2420.  
  2421. ED_STOP:        LD      (IY+#00),#10
  2422.                 JR      ED_ENTER
  2423.  
  2424. ; Cursor left editing
  2425. ED_LEFT:        CALL    ED_EDGE
  2426.                 JR      ED_CUR
  2427.  
  2428. ; Cursor right editing
  2429. ED_RIGHT:       LD      A,(HL)
  2430.                 CP      #0D
  2431.                 RET     Z
  2432.                 INC     HL
  2433. ED_CUR:         LD      (#5C5B),HL
  2434.                 RET
  2435.  
  2436. ; Handling DELETE
  2437. ED_DELETE:      CALL    ED_EDGE
  2438.                 LD      BC,#0001
  2439.                 JP      RECLAIM_2
  2440.  
  2441. ; Ignore next two codes from KEY_INPUT routine
  2442. ED_IGNORE:      CALL    WAIT_KEY
  2443.                 CALL    WAIT_KEY
  2444. ED_ENTER:       POP     HL                      ; Handle ENTER
  2445.                 POP     HL
  2446. ED_END:         POP     HL
  2447.                 LD      (#5C3D),HL
  2448.                 BIT     7,(IY+#00)
  2449.                 RET     NZ
  2450.                 LD      SP,HL
  2451.                 RET
  2452.  
  2453. ; Move cursor left when editing
  2454. ED_EDGE:        SCF
  2455.                 CALL    SET_DE
  2456.                 SBC     HL,DE
  2457.                 ADD     HL,DE
  2458.                 INC     HL
  2459.                 POP     BC
  2460.                 RET     C
  2461.                 PUSH    BC
  2462.                 LD      B,H
  2463.                 LD      C,L
  2464. ED_EDGE_1:      LD      H,D
  2465.                 LD      L,E
  2466.                 INC     HL
  2467.                 LD      A,(DE)
  2468.                 AND     #F0
  2469.                 CP      #10
  2470.                 JR      NZ,ED_EDGE_2
  2471.                 INC     HL
  2472.                 LD      A,(DE)
  2473.                 SUB     #17
  2474.                 ADC     A,#00
  2475.                 JR      NZ,ED_EDGE_2
  2476.                 INC     HL
  2477. ED_EDGE_2:      AND     A
  2478.                 SBC     HL,BC
  2479.                 ADD     HL,BC
  2480.                 EX      DE,HL
  2481.                 JR      C,ED_EDGE_1
  2482.                 RET
  2483.  
  2484. ; Cursor up editing
  2485. ED_UP:          CALL    HORE                    ; BSROM - free cursor moving
  2486.                 BIT     5,(IY+#37)
  2487.                 RET     NZ
  2488.                 CALL    LINE_ADDR
  2489.                 EX      DE,HL
  2490.                 CALL    LINE_NO
  2491.                 LD      HL,#5C4A
  2492.                 CALL    LN_STORE
  2493. ED_LIST:        CALL    AUTO_LIST
  2494. ED_LIST_1:      LD      A,#00
  2495.                 JP      CHAN_OPEN
  2496.  
  2497. ; Use of symbol and graphic codes
  2498. ED_SYMBOL:      BIT     7,(IY+#37)
  2499.                 JR      Z,ED_ENTER
  2500. ED_GRAPH:       JP      ADD_CHAR
  2501.  
  2502. ; Editor error handling
  2503. ED_ERROR:       BIT     4,(IY+#30)
  2504.                 JR      Z,ED_END
  2505.                 LD      (IY+#00),#FF
  2506.                 LD      D,#00
  2507.                 LD      E,(IY-#02)
  2508.                 LD      HL,#0190                ; BSROM - higher tone of error beep, was LD HL,#1A90
  2509.                 CALL    BEEPER
  2510.                 JP      ED_AGAIN
  2511.  
  2512. ; Clear workspace
  2513. CLEAR_SP:       PUSH    HL
  2514.                 CALL    SET_HL
  2515.                 DEC     HL
  2516.                 CALL    RECLAIM_1
  2517.                 LD      (#5C5B),HL
  2518.                 LD      (IY+#07),#00
  2519.                 POP     HL
  2520.                 RET
  2521.  
  2522. ; Handle keyboard input
  2523. KEY_INPUT:      BIT     3,(IY+#02)
  2524.                 CALL    NZ,ED_COPY
  2525.                 AND     A
  2526.                 BIT     5,(IY+#01)
  2527.                 RET     Z
  2528.                 LD      A,(#5C08)
  2529.                 RES     5,(IY+#01)
  2530.                 PUSH    AF
  2531.                 BIT     5,(IY+#02)
  2532.                 CALL    NZ,CLS_LOWER
  2533.                 POP     AF
  2534.                 CP      #20
  2535.                 JR      NC,KEY_DONE2
  2536.                 CP      #10
  2537.                 JR      NC,KEY_CONTR
  2538.                 CP      #06
  2539.                 JR      NC,KEY_M_CL
  2540.                 LD      B,A
  2541.                 AND     #01
  2542.                 LD      C,A
  2543.                 LD      A,B
  2544.                 RRA
  2545.                 ADD     A,#12
  2546.                 JR      KEY_DATA
  2547.  
  2548. ; Separate caps lock
  2549. KEY_M_CL:       JR      NZ,KEY_MODE
  2550.                 LD      HL,#5C6A
  2551.                 LD      A,#08
  2552.                 XOR     (HL)
  2553.                 LD      (HL),A
  2554.                 JR      KEY_FLAG
  2555.  
  2556. ; Mode handling
  2557. KEY_MODE:       CP      #0E
  2558.                 RET     C
  2559.                 SUB     #0D
  2560.                 LD      HL,#5C41
  2561.                 CP      (HL)
  2562.                 LD      (HL),A
  2563.                 JR      NZ,KEY_FLAG
  2564.                 LD      (HL),#00
  2565. KEY_FLAG:       SET     3,(IY+#02)
  2566.                 CP      A
  2567.                 RET
  2568.  
  2569. ; Handle colour controls
  2570. KEY_CONTR:      LD      B,A
  2571.                 AND     #07
  2572.                 LD      C,A
  2573.                 LD      A,#10
  2574.                 BIT     3,B
  2575.                 JR      NZ,KEY_DATA
  2576.                 INC     A
  2577. KEY_DATA:       LD      (IY-#2D),C
  2578.                 LD      DE,KEY_NEXT
  2579.                 JR      KEY_CHAN
  2580.  
  2581. KEY_NEXT:       LD      A,(#5C0D)
  2582.                 LD      DE,KEY_INPUT
  2583. KEY_CHAN:       LD      HL,(#5C4F)
  2584.                 INC     HL
  2585.                 INC     HL
  2586.                 LD      (HL),E
  2587.                 INC     HL
  2588.                 LD      (HL),D
  2589. KEY_DONE2:      SCF
  2590.                 RET
  2591.  
  2592. ; Print lower screen workspace
  2593. ED_COPY:        CALL    TEMPS
  2594.                 RES     3,(IY+#02)
  2595.                 RES     5,(IY+#02)
  2596.                 LD      HL,(#5C8A)
  2597.                 PUSH    HL
  2598.                 LD      HL,(#5C3D)
  2599.                 PUSH    HL
  2600.                 LD      HL,ED_FULL
  2601.                 PUSH    HL
  2602.                 LD      (#5C3D),SP
  2603.                 LD      HL,(#5C82)
  2604.                 PUSH    HL
  2605.                 SCF
  2606.                 CALL    SET_DE
  2607.                 EX      DE,HL
  2608.                 CALL    OUT_LINE2
  2609.                 EX      DE,HL
  2610.                 CALL    OUT_CURS
  2611.                 LD      HL,(#5C8A)
  2612.                 EX      (SP),HL
  2613.                 EX      DE,HL
  2614.                 CALL    TEMPS
  2615. ED_BLANK:       LD      A,(#5C8B)
  2616.                 SUB     D
  2617.                 JR      C,ED_C_DONE
  2618.                 JR      NZ,ED_SPACES
  2619.                 LD      A,E
  2620.                 SUB     (IY+#50)
  2621.                 JR      NC,ED_C_DONE
  2622. ED_SPACES:      LD      A,#20
  2623.                 PUSH    DE
  2624.                 CALL    PRINT_OUT
  2625.                 POP     DE
  2626.                 JR      ED_BLANK
  2627.  
  2628. ; Error handling
  2629. ED_FULL:        LD      D,#00
  2630.                 LD      E,(IY-#02)
  2631.                 LD      HL,#0190                ; BSROM - higher tone of error beep, was LD HL,#1A90
  2632.                 CALL    BEEPER
  2633.                 LD      (IY+#00),#FF
  2634.                 LD      DE,(#5C8A)
  2635.                 JR      ED_C_END
  2636.  
  2637. ED_C_DONE:      POP     DE
  2638.                 POP     HL
  2639. ED_C_END:       POP     HL
  2640.                 LD      (#5C3D),HL
  2641.                 POP     BC
  2642.                 PUSH    DE
  2643.                 CALL    CL_SET
  2644.                 POP     HL
  2645.                 LD      (#5C82),HL
  2646.                 LD      (IY+#26),#00
  2647.                 RET
  2648.  
  2649. ; Ensure that the proper pointers are selected for workspace
  2650. SET_HL:         LD      HL,(#5C61)
  2651.                 DEC     HL
  2652.                 AND     A
  2653. SET_DE:         LD      DE,(#5C59)
  2654.                 BIT     5,(IY+#37)
  2655.                 RET     Z
  2656.                 LD      DE,(#5C61)
  2657.                 RET     C
  2658.                 LD      HL,(#5C63)
  2659.                 RET
  2660.  
  2661. ; Remove floating point from line
  2662. REMOVE_FP:      LD      A,(HL)
  2663.                 CP      #0E
  2664.                 LD      BC,#0006
  2665.                 CALL    Z,RECLAIM_2
  2666.                 LD      A,(HL)
  2667.                 INC     HL
  2668.                 CP      #0D
  2669.                 JR      NZ,REMOVE_FP
  2670.                 RET
  2671.  
  2672. ; Handle NEW command
  2673. NEW:            DI
  2674.                 LD      A,#FF
  2675.                 LD      DE,(#5CB2)
  2676. NEW_1:          EXX
  2677.                 LD      BC,(#5CB4)
  2678.                 LD      DE,(#5C38)
  2679.                 LD      HL,(#5C7B)
  2680.                 EXX
  2681. START_NEW:      LD      B,A
  2682.                 XOR     A                       ; BSROM - faster RAM clear, RAM is not tested for errors
  2683.                 LD      I,A
  2684.                 LD      C,A
  2685.                 LD      H,D
  2686.                 LD      L,E
  2687.                 LD      A,B
  2688.                 LD      B,C
  2689.                 LD      SP,HL
  2690. CLSUJ:          PUSH    BC
  2691.                 PUSH    BC
  2692.                 PUSH    BC
  2693.                 PUSH    BC
  2694.                 PUSH    BC
  2695.                 PUSH    BC
  2696.                 PUSH    BC
  2697.                 PUSH    BC
  2698.                 LD      HL,#A7FF
  2699.                 ADD     HL,SP
  2700.                 JR      C,CLSUJ
  2701.                 EX      DE,HL
  2702.                 JR      RAM_DONE1
  2703.  
  2704. ; Modified CONTINUE command
  2705. NEW_CONT:       CALL    FIND_INT2
  2706.                 LD      A,B
  2707.                 OR      C
  2708.                 JP      Z,CONTINUE
  2709.                 PUSH    BC
  2710.                 RET
  2711. ; Remains of original RAM_DONE routine
  2712. RAM_DONE1:      EXX
  2713.                 LD      (#5CB4),BC
  2714.                 LD      (#5C38),DE
  2715.                 LD      (#5C7B),HL
  2716.                 EXX    
  2717.                 INC     A                       ; BSROM - changed for new NEW command, was INC B
  2718.                 JR      Z,RAM_SET
  2719. RAM_DONE2:      LD      (#5CB4),HL
  2720.                 LD      DE,#3EAF
  2721.                 LD      BC,#00A8
  2722.                 EX      DE,HL
  2723.                 LDDR
  2724.                 EX      DE,HL
  2725.                 INC     HL
  2726.                 LD      (#5C7B),HL
  2727.                 DEC     HL
  2728.                 LD      BC,#0040
  2729.                 LD      (#5C38),BC
  2730. RAM_SET:        LD      (#5CB2),HL
  2731.                 LD      HL,#3C00
  2732.                 LD      (#5C36),HL
  2733.                 LD      HL,(#5CB2)
  2734.                 LD      (HL),#3E
  2735.                 DEC     HL
  2736.                 LD      SP,HL
  2737.                 DEC     HL
  2738.                 DEC     HL
  2739.                 LD      (#5C3D),HL
  2740.                 IM      1
  2741.                 LD      IY,#5C3A
  2742.                 EI
  2743.                 LD      HL,#5CB6
  2744.                 LD      (#5C4F),HL
  2745.                 LD      DE,INIT_CHAN
  2746.                 LD      BC,#0015
  2747.                 EX      DE,HL
  2748.                 LDIR
  2749.                 EX      DE,HL
  2750.                 DEC     HL
  2751.                 LD      (#5C57),HL
  2752.                 INC     HL
  2753.                 LD      (#5C53),HL
  2754.                 LD      (#5C4B),HL
  2755.                 LD      (HL),#80
  2756.                 INC     HL
  2757.                 LD      (#5C59),HL
  2758. WARM_ST:        LD      (HL),#0D
  2759.                 INC     HL
  2760.                 LD      (HL),#80
  2761.                 INC     HL
  2762.                 LD      (#5C61),HL
  2763.                 LD      (#5C63),HL
  2764.                 LD      (#5C65),HL
  2765.                 LD      A,#07                   ; BSROM - changed colors, blue border, black paper, white ink
  2766.                 LD      (#5C8D),A
  2767.                 LD      (#5C8F),A
  2768.                 LD      (#5C48),A
  2769.                 LD      HL,#0114                ; BSROM - REPDEL and REPPER were changed, was #0523
  2770.                 LD      (#5C09),HL
  2771.                 DEC     (IY-#3A)
  2772.                 DEC     (IY-#36)
  2773.                 LD      HL,INIT_STRM
  2774.                 LD      DE,#5C10
  2775.                 LD      BC,#000E
  2776.                 LDIR
  2777.                 LD      (IY+#31),#02            ; BSROM - printer vars initialization removed
  2778.                 LD      (IY+#0E),#0F
  2779.                 CALL    HARD                    ; reset AY, DMA, FDC
  2780.                 CALL    SET_MIN
  2781.                 LD      (IY+#00),#FF
  2782.                 CALL    INFO                    ; copyright message replaced with status info
  2783.                 CALL    SA_LD_RET
  2784.                 JP      MAIN_4
  2785.  
  2786. ; Main execution loop
  2787. MAIN_EXEC:      LD      (IY+#31),#02
  2788.                 CALL    AUTO_LIST
  2789. MAIN_1:         CALL    SET_MIN
  2790. MAIN_2:         LD      A,#00
  2791.                 CALL    CHAN_OPEN
  2792.                 CALL    EDITOR
  2793.                 CALL    LINE_SCAN
  2794.                 BIT     7,(IY+#00)
  2795.                 JR      NZ,MAIN_3
  2796.                 BIT     4,(IY+#30)
  2797.                 JR      Z,MAIN_4
  2798.                 LD      HL,(#5C59)
  2799.                 CALL    REMOVE_FP
  2800.                 LD      (IY+#00),#FF
  2801.                 JR      MAIN_2
  2802.  
  2803. MAIN_3:         LD      HL,(#5C59)
  2804.                 LD      (#5C5D),HL
  2805.                 CALL    LIN3                    ; BSROM - modified test of number at the begin of BASIC line
  2806.                 NOP
  2807.                 NOP
  2808.                 JP      NC,MAIN_ADD             ; BSROM - don't test zero, so line 0 can be used and/or edited
  2809.                 RST     #18
  2810.                 CP      #0D
  2811.                 JR      Z,MAIN_EXEC
  2812.                 BIT     0,(IY+#30)
  2813.                 CALL    NZ,CL_ALL
  2814.                 CALL    CLS_LOWER
  2815.                 LD      A,#19
  2816.                 SUB     (IY+#4F)
  2817.                 LD      (#5C8C),A
  2818.                 SET     7,(IY+#01)
  2819.                 LD      (IY+#00),#FF
  2820.                 LD      (IY+#0A),#01
  2821.                 CALL    LINE_RUN
  2822. MAIN_4:         RST     #38                     ; BSROM - bugfix - was HALT
  2823.                 HALT                            ; BSROM for MB02+ - wait for beam
  2824.                 NOP                             ; BSROM for MB02+ - ZX Printer not used anymore hence six NOPs
  2825.                 NOP
  2826.                 NOP
  2827.                 RES     5,(IY+#01)
  2828.                 NOP
  2829.                 NOP
  2830.                 NOP
  2831.                 LD      A,(#5C3A)
  2832.                 INC     A
  2833. MAIN_G:         PUSH    AF
  2834.                 LD      HL,#0000
  2835.                 LD      (IY+#37),H
  2836.                 LD      (IY+#26),H
  2837.                 LD      (#5C0B),HL
  2838.                 LD      HL,#0001
  2839.                 LD      (#5C16),HL
  2840.                 CALL    SET_MIN
  2841.                 RES     5,(IY+#37)
  2842.                 CALL    CLS_LOWER
  2843.                 SET     5,(IY+#02)
  2844.                 POP     AF
  2845.                 LD      B,A
  2846.                 CP      #0A
  2847.                 JR      C,MAIN_5
  2848.                 ADD     A,#07
  2849. MAIN_5:         CALL    OUT_CODE
  2850.                 LD      A,#20
  2851.                 RST     #10
  2852.                 LD      A,B
  2853.                 LD      DE,RPT_MESGS
  2854.                 CALL    PO_MSG
  2855.                 XOR     A
  2856.                 LD      DE,COMMA_SP-1
  2857.                 CALL    PO_MSG
  2858.                 LD      BC,(#5C45)
  2859.                 CALL    OUT_NUM_1
  2860.                 LD      A,#3A
  2861.                 RST     #10
  2862.                 LD      C,(IY+#0D)
  2863.                 LD      B,#00
  2864.                 CALL    OUT_NUM_1
  2865.                 CALL    CLEAR_SP
  2866.                 LD      A,(#5C3A)
  2867.                 INC     A
  2868.                 JR      Z,MAIN_9
  2869.                 CP      #09
  2870.                 JR      Z,MAIN_6
  2871.                 CP      #15
  2872.                 JR      NZ,MAIN_7
  2873. MAIN_6:         INC     (IY+#0D)
  2874. MAIN_7:         LD      BC,#0003
  2875.                 LD      DE,#5C70
  2876.                 LD      HL,#5C44
  2877.                 BIT     7,(HL)
  2878.                 JR      Z,MAIN_8
  2879.                 ADD     HL,BC
  2880. MAIN_8:         LDDR
  2881. MAIN_9:         LD      (IY+#0A),#FF
  2882.                 RES     3,(IY+#01)
  2883.                 JP      MAIN_2
  2884.  
  2885. ;The error mesages, with last byte inverted.
  2886. ;The first #80 entry is dummy entry.
  2887. RPT_MESGS:      DB      #80
  2888.                 DC      "OK"
  2889.                 DC      "NEXT without FOR"
  2890.                 DC      "Variable not found"
  2891.                 DC      "Subscript wrong"
  2892.                 DC      "Out of memory"
  2893.                 DC      "Out of screen"
  2894.                 DC      "Number too big"
  2895.                 DC      "RETURN without GOSUB"
  2896.                 DC      "End of file"
  2897.                 DC      "STOP statement"
  2898.                 DC      "Invalid argument"
  2899.                 DC      "Integer out of range"
  2900.                 DC      "Nonsense in BASIC"
  2901.                 DC      "BREAK - CONT repeats"
  2902.                 DC      "Out of DATA"
  2903.                 DC      "Invalid file name"
  2904.                 DC      "No room for line"
  2905.                 DC      "STOP in INPUT"
  2906.                 DC      "FOR without NEXT"
  2907.                 DC      "Invalid I/O device"
  2908.                 DC      "Invalid colour"
  2909.                 DC      "BREAK into program"
  2910.                 DC      "RAMTOP no good"
  2911.                 DC      "Statement lost"
  2912.                 DC      "Invalid stream"
  2913.                 DC      "FN without DEF"
  2914.                 DC      "Parameter error"
  2915.                 DC      "Tape loading error"
  2916. COMMA_SP:       DC      ", "
  2917.  
  2918. ; BSROM - here was the copyright message in the original ZX Spectrum ROM.
  2919. COPYRIGHT:      DC      "Rom 140"
  2920.                 DC      "Prog:"
  2921.                 DB      #16
  2922.                 DB      #00
  2923.                 DB      #0B
  2924.  
  2925.                 DC      "Vars:"
  2926.                 DB      #16
  2927.                 DB      #00
  2928.                 DB      #16
  2929.  
  2930.                 DC      "Free:"
  2931.  
  2932. ; Out of memory handling
  2933. REPORT_G:       LD      A,#10
  2934.                 LD      BC,#0000
  2935.                 JP      MAIN_G
  2936.  
  2937. ; Handle additon of BASIC line
  2938. MAIN_ADD:       LD      (#5C49),BC
  2939.                 LD      HL,(#5C5D)
  2940.                 EX      DE,HL
  2941.                 LD      HL,REPORT_G
  2942.                 PUSH    HL
  2943.                 LD      HL,(#5C61)
  2944.                 SCF
  2945.                 SBC     HL,DE
  2946.                 PUSH    HL
  2947.                 LD      H,B
  2948.                 LD      L,C
  2949.                 CALL    LINE_ADDR
  2950.                 JR      NZ,MAIN_ADD1
  2951.                 CALL    NEXT_ONE
  2952.                 CALL    RECLAIM_2
  2953. MAIN_ADD1:      POP     BC
  2954.                 LD      A,C
  2955.                 DEC     A
  2956.                 OR      B
  2957.                 JR      Z,MAIN_ADD2
  2958.                 PUSH    BC
  2959.                 INC     BC
  2960.                 INC     BC
  2961.                 INC     BC
  2962.                 INC     BC
  2963.                 DEC     HL
  2964.                 LD      DE,(#5C53)
  2965.                 PUSH    DE
  2966.                 CALL    MAKE_ROOM
  2967.                 POP     HL
  2968.                 LD      (#5C53),HL
  2969.                 POP     BC
  2970.                 PUSH    BC
  2971.                 INC     DE
  2972.                 LD      HL,(#5C61)
  2973.                 DEC     HL
  2974.                 DEC     HL
  2975.                 LDDR
  2976.                 LD      HL,(#5C49)
  2977.                 EX      DE,HL
  2978.                 POP     BC
  2979.                 LD      (HL),B
  2980.                 DEC     HL
  2981.                 LD      (HL),C
  2982.                 DEC     HL
  2983.                 LD      (HL),E
  2984.                 DEC     HL
  2985.                 LD      (HL),D
  2986. MAIN_ADD2:      POP     AF
  2987.                 JP      MAIN_EXEC
  2988.  
  2989. ; Initial channel information
  2990. INIT_CHAN:      DW      PRINT_OUT
  2991.                 DW      KEY_INPUT
  2992.                 DB      "K"
  2993.                 DW      PRINT_OUT
  2994.                 DW      REPORT_J
  2995.                 DB      "S"
  2996.                 DW      ADD_CHAR
  2997.                 DW      REPORT_J
  2998.                 DB      "R"
  2999.                 DW      PRINT_OUT
  3000.                 DW      REPORT_J
  3001.                 DB      "P"
  3002.                 DB      #80                     ; End marker
  3003.  
  3004. REPORT_J:       RST     #08                     ; Error report
  3005.                 DB      #12                     ; Invalid I/O device
  3006.  
  3007. ; Initial stream data
  3008. INIT_STRM:      DB      #01, #00                ; stream #FD offset to channel 'K'
  3009.                 DB      #06, #00                ; stream #FE offset to channel 'S'
  3010.                 DB      #0B, #00                ; stream #FF offset to channel 'R'
  3011.                 DB      #01, #00                ; stream #00 offset to channel 'K'
  3012.                 DB      #01, #00                ; stream #01 offset to channel 'K'
  3013.                 DB      #06, #00                ; stream #02 offset to channel 'S'
  3014.                 DB      #10, #00                ; stream #03 offset to channel 'P'
  3015.  
  3016. ; Control for input subroutine
  3017. WAIT_KEY:       BIT     5,(IY+#02)
  3018.                 JR      NZ,WAIT_KEY1
  3019.                 SET     3,(IY+#02)
  3020. WAIT_KEY1:      CALL    INPUT_AD
  3021.                 RET     C
  3022.                 JR      Z,WAIT_KEY1
  3023. REPORT_8:       RST     #08                     ; Error report
  3024.                 DB      #07                     ; End of file
  3025. INPUT_AD:       EXX
  3026.                 PUSH    HL
  3027.                 LD      HL,(#5C51)
  3028.                 INC     HL
  3029.                 INC     HL
  3030.                 JR      CALL_SUB
  3031.  
  3032. ; Print ascii equivalent of a value 0-9
  3033. OUT_CODE:       LD      E,#30
  3034.                 ADD     A,E
  3035. PRINT_A_2:      EXX
  3036.                 PUSH    HL
  3037.                 LD      HL,(#5C51)
  3038. CALL_SUB:       LD      E,(HL)
  3039.                 INC     HL
  3040.                 LD      D,(HL)
  3041.                 EX      DE,HL
  3042.                 CALL    CALL_JUMP
  3043.                 POP     HL
  3044.                 EXX
  3045.                 RET
  3046.  
  3047. ; Open a channel 'K', 'S', 'R' or 'P'
  3048. CHAN_OPEN:      ADD     A,A
  3049.                 ADD     A,#16
  3050.                 LD      L,A
  3051.                 LD      H,#5C
  3052.                 LD      E,(HL)
  3053.                 INC     HL
  3054.                 LD      D,(HL)
  3055.                 LD      A,D
  3056.                 OR      E
  3057.                 JR      NZ,CHAN_OP_1
  3058. REPORT_OA:      RST     #08                     ; Error report
  3059.                 DB      #17                     ; Invalid stream
  3060. CHAN_OP_1:      DEC     DE
  3061.                 LD      HL,(#5C4F)
  3062.                 ADD     HL,DE
  3063. CHAN_FLAG:      LD      (#5C51),HL              ; Set channel flags
  3064.                 RES     4,(IY+#30)
  3065.                 INC     HL
  3066.                 INC     HL
  3067.                 INC     HL
  3068.                 INC     HL
  3069.                 LD      C,(HL)
  3070.                 LD      HL,CH_CD_LU
  3071.                 CALL    INDEXER
  3072.                 RET     NC
  3073.                 LD      D,#00
  3074.                 LD      E,(HL)
  3075.                 ADD     HL,DE
  3076. CALL_JUMP:      JP      (HL)
  3077.  
  3078. ; Channel code lookup table
  3079. CH_CD_LU:       DB      "K", #06                ; CHAN_K
  3080.                 DB      "S", #12                ; CHAN_S
  3081.                 DB      "P", #1B                ; CHAN_P
  3082.                 DB      #00                     ; End marker
  3083.  
  3084. ; Channel K flag
  3085. CHAN_K:         SET     0,(IY+#02)
  3086.                 RES     5,(IY+#01)
  3087.                 SET     4,(IY+#30)
  3088.                 JR      CHAN_S_1
  3089.  
  3090. ; Channel S flag
  3091. CHAN_S:         RES     0,(IY+#02)
  3092. CHAN_S_1:       RES     1,(IY+#01)
  3093.                 JP      TEMPS
  3094.  
  3095. ; Channel P flag
  3096. CHAN_P:         SET     1,(IY+#01)
  3097.                 RET
  3098.  
  3099. ; Create a single space in workspace by ADD_CHAR
  3100. ONE_SPACE:      LD      BC,#0001
  3101. MAKE_ROOM:      PUSH    HL              ; Create BC spaces in various areas
  3102.                 CALL    TEST_ROOM
  3103.                 POP     HL
  3104.                 CALL    POINTERS
  3105.                 LD      HL,(#5C65)
  3106.                 EX      DE,HL
  3107.                 LDDR
  3108.                 RET
  3109.  
  3110. ; Adjust pointers before making or reclaiming room
  3111. POINTERS:       PUSH    AF
  3112.                 PUSH    HL
  3113.                 LD      HL,#5C4B
  3114.                 LD      A,#0E
  3115. PTR_NEXT:       LD      E,(HL)
  3116.                 INC     HL
  3117.                 LD      D,(HL)
  3118.                 EX      (SP),HL
  3119.                 AND     A
  3120.                 SBC     HL,DE
  3121.                 ADD     HL,DE
  3122.                 EX      (SP),HL
  3123.                 JR      NC,PTR_DONE
  3124.                 PUSH    DE
  3125.                 EX      DE,HL
  3126.                 ADD     HL,BC
  3127.                 EX      DE,HL
  3128.                 LD      (HL),D
  3129.                 DEC     HL
  3130.                 LD      (HL),E
  3131.                 INC     HL
  3132.                 POP     DE
  3133. PTR_DONE:       INC     HL
  3134.                 DEC     A
  3135.                 JR      NZ,PTR_NEXT
  3136.                 EX      DE,HL
  3137.                 POP     DE
  3138.                 POP     AF
  3139.                 AND     A
  3140.                 SBC     HL,DE
  3141.                 LD      B,H
  3142.                 LD      C,L
  3143.                 INC     BC
  3144.                 ADD     HL,DE
  3145.                 EX      DE,HL
  3146.                 RET
  3147.  
  3148. ; Collect line number
  3149. LINE_ZERO:      DB      #00, #00                ; Dummy line number for direct commands
  3150.  
  3151. LINE_NO_A:      EX      DE,HL
  3152.                 LD      DE,LINE_ZERO
  3153. LINE_NO:        LD      A,(HL)
  3154.                 AND     #C0
  3155.                 JR      NZ,LINE_NO_A
  3156.                 LD      D,(HL)
  3157.                 INC     HL
  3158.                 LD      E,(HL)
  3159.                 RET
  3160.  
  3161. ; Handle reserve room, continuation of the restart BC_SPACES
  3162. RESERVE:        LD      HL,(#5C63)
  3163.                 DEC     HL
  3164.                 CALL    MAKE_ROOM
  3165.                 INC     HL
  3166.                 INC     HL
  3167.                 POP     BC
  3168.                 LD      (#5C61),BC
  3169.                 POP     BC
  3170.                 EX      DE,HL
  3171.                 INC     HL
  3172.                 RET
  3173.  
  3174. ; Clear editing areas
  3175. SET_MIN:        LD      HL,(#5C59)
  3176.                 LD      (HL),#0D
  3177.                 LD      (#5C5B),HL
  3178.                 INC     HL
  3179.                 LD      (HL),#80
  3180.                 INC     HL
  3181.                 LD      (#5C61),HL
  3182. SET_WORK:       LD      HL,(#5C61)
  3183.                 LD      (#5C63),HL
  3184. SET_STK:        LD      HL,(#5C63)
  3185.                 LD      (#5C65),HL
  3186.                 PUSH    HL
  3187.                 LD      HL,#5C92
  3188.                 LD      (#5C68),HL
  3189.                 POP     HL
  3190.                 RET
  3191.  
  3192. ; Not used code, remains of ZX80/ZX81 legacy code
  3193. REC_EDIT:       LD      DE,(#5C59)
  3194.                 JP      RECLAIM_1
  3195.  
  3196. ; Table indexing routine
  3197. INDEXER_1:      INC     HL
  3198. INDEXER:        LD      A,(HL)
  3199.                 AND     A
  3200.                 RET     Z
  3201.                 CP      C
  3202.                 INC     HL
  3203.                 JR      NZ,INDEXER_1
  3204.                 SCF
  3205.                 RET
  3206.  
  3207. ; Handle CLOSE# command
  3208. CLOSE:          CALL    STR_DATA
  3209.                 CALL    CLOSE_2
  3210.                 LD      BC,#0000
  3211.                 LD      DE,#A3E2
  3212.                 EX      DE,HL
  3213.                 ADD     HL,DE
  3214.                 JR      C,CLOSE_1
  3215.                 LD      BC,INIT_STRM+14
  3216.                 ADD     HL,BC
  3217.                 LD      C,(HL)
  3218.                 INC     HL
  3219.                 LD      B,(HL)
  3220. CLOSE_1:        EX      DE,HL
  3221.                 LD      (HL),C
  3222.                 INC     HL
  3223.                 LD      (HL),B
  3224.                 RET
  3225.  
  3226. CLOSE_2:        PUSH    HL
  3227.                 LD      HL,(#5C4F)
  3228.                 ADD     HL,BC
  3229.                 INC     HL
  3230.                 INC     HL
  3231.                 INC     HL
  3232.                 LD      C,(HL)
  3233.                 EX      DE,HL
  3234.                 LD      HL,CL_STR_LU
  3235.                 CALL    INDEXER
  3236.                 LD      C,(HL)
  3237.                 LD      B,#00
  3238.                 ADD     HL,BC
  3239.                 JP      (HL)
  3240.  
  3241. ; Close stream lookup table
  3242. CL_STR_LU:      DB      "K", #05
  3243.                 DB      "S", #03
  3244.                 DB      "P", #01
  3245.  
  3246. CLOSE_STR:      POP     HL
  3247.                 RET
  3248.  
  3249. ; Stream data
  3250. STR_DATA:       CALL    FIND_INT1
  3251.                 CP      #10
  3252.                 JR      C,STR_DATA1
  3253. REPORT_OB:      RST     #08                     ; Error report
  3254.                 DB      #17                     ; Invalid stream
  3255. STR_DATA1:      ADD     A,#03
  3256.                 RLCA
  3257.                 LD      HL,#5C10
  3258.                 LD      C,A
  3259.                 LD      B,#00
  3260.                 ADD     HL,BC
  3261.                 LD      C,(HL)
  3262.                 INC     HL
  3263.                 LD      B,(HL)
  3264.                 DEC     HL
  3265.                 RET
  3266.  
  3267. ; Handle OPEN# command
  3268. OPEN:           RST     #28                     ;FP_CALC
  3269.                 DB      #01                     ;EXCHANGE
  3270.                 DB      #38                     ;END_CALC
  3271.                 CALL    STR_DATA
  3272.                 LD      A,B
  3273.                 OR      C
  3274.                 JR      Z,OPEN_1
  3275.                 EX      DE,HL
  3276.                 LD      HL,(#5C4F)
  3277.                 ADD     HL,BC
  3278.                 INC     HL
  3279.                 INC     HL
  3280.                 INC     HL
  3281.                 LD      A,(HL)
  3282.                 EX      DE,HL
  3283.                 CP      #4B
  3284.                 JR      Z,OPEN_1
  3285.                 CP      #53
  3286.                 JR      Z,OPEN_1
  3287.                 CP      #50
  3288.                 JR      NZ,REPORT_OB
  3289. OPEN_1:         CALL    OPEN_2
  3290.                 LD      (HL),E
  3291.                 INC     HL
  3292.                 LD      (HL),D
  3293.                 RET
  3294.  
  3295. OPEN_2:         PUSH    HL
  3296.                 CALL    STK_FETCH
  3297.                 LD      A,B
  3298.                 OR      C
  3299.                 JR      NZ,OPEN_3
  3300. REPORT_F:       RST     #08                     ; Error report
  3301.                 DB      #0E                     ; Invalid file name
  3302. OPEN_3:         PUSH    BC
  3303.                 LD      A,(DE)
  3304.                 AND     #DF
  3305.                 LD      C,A
  3306.                 LD      HL,OP_STR_LU
  3307.                 CALL    INDEXER
  3308.                 JR      NC,REPORT_F
  3309.                 LD      C,(HL)
  3310.                 LD      B,#00
  3311.                 ADD     HL,BC
  3312.                 POP     BC
  3313.                 JP      (HL)
  3314.  
  3315. ; Open stream lookup table
  3316. OP_STR_LU:      DB      "K", #06                ; OPEN_K
  3317.                 DB      "S", #08                ; OPEN_S
  3318.                 DB      "P", #0A                ; OPEN_P
  3319.                 DB      #00                     ; End marker
  3320.  
  3321. ; Open keyboard stream
  3322. OPEN_K:         LD      E,#01
  3323.                 JR      OPEN_END
  3324.  
  3325. ; Open Screen stream
  3326. OPEN_S:         LD      E,#06
  3327.                 JR      OPEN_END
  3328.  
  3329. ; Open printer stream
  3330. OPEN_P:         LD      E,#10
  3331. OPEN_END:       DEC     BC
  3332.                 LD      A,B
  3333.                 OR      C
  3334.                 JR      NZ,REPORT_F
  3335.                 LD      D,A
  3336.                 POP     HL
  3337.                 RET
  3338.  
  3339. ; Handle CAT, ERASE, FORMAT and MOVE commands
  3340. CAT_ETC:        JR      REPORT_OB
  3341.  
  3342. ; Automatic listing in the upper screen
  3343. AUTO_LIST:      LD      (#5C3F),SP
  3344.                 LD      (IY+#02),#10
  3345.                 CALL    CL_ALL
  3346.                 SET     0,(IY+#02)
  3347.                 LD      B,(IY+#31)
  3348.                 CALL    CL_LINE
  3349.                 RES     0,(IY+#02)
  3350.                 SET     0,(IY+#30)
  3351.                 LD      HL,(#5C49)
  3352.                 LD      DE,(#5C6C)
  3353.                 AND     A
  3354.                 SBC     HL,DE
  3355.                 ADD     HL,DE
  3356.                 JR      C,AUTO_L_2
  3357.                 PUSH    DE
  3358.                 CALL    LINE_ADDR
  3359.                 LD      DE,#02C0
  3360.                 EX      DE,HL
  3361.                 SBC     HL,DE
  3362.                 EX      (SP),HL
  3363.                 CALL    LINE_ADDR
  3364.                 POP     BC
  3365. AUTO_L_1:       PUSH    BC
  3366.                 CALL    NEXT_ONE
  3367.                 POP     BC
  3368.                 ADD     HL,BC
  3369.                 JR      C,AUTO_L_3
  3370.                 EX      DE,HL
  3371.                 LD      D,(HL)
  3372.                 INC     HL
  3373.                 LD      E,(HL)
  3374.                 DEC     HL
  3375.                 LD      (#5C6C),DE
  3376.                 JR      AUTO_L_1
  3377.  
  3378. AUTO_L_2:       LD      (#5C6C),HL
  3379. AUTO_L_3:       LD      HL,(#5C6C)
  3380.                 CALL    LINE_ADDR
  3381.                 JR      Z,AUTO_L_4
  3382.                 EX      DE,HL
  3383. AUTO_L_4:       CALL    LIST_ALL
  3384.                 RES     4,(IY+#02)
  3385.                 RET
  3386.  
  3387. ; Handle LLIST command
  3388. LLIST:          LD      A,#03
  3389.                 JR      LIST_1
  3390.  
  3391. ; Handle LIST command
  3392. LIST:           LD      A,#02
  3393. LIST_1:         LD      (IY+#02),#00
  3394.                 CALL    SYNTAX_Z
  3395.                 CALL    NZ,CHAN_OPEN
  3396.                 RST     #18
  3397.                 CALL    STR_ALTER
  3398.                 JR      C,LIST_4
  3399.                 RST     #18
  3400.                 CP      #3B
  3401.                 JR      Z,LIST_2
  3402.                 CP      #2C
  3403.                 JR      NZ,LIST_3
  3404. LIST_2:         RST     #20
  3405.                 CALL    EXPT_1NUM
  3406.                 JR      LIST_5
  3407.  
  3408. LIST_3:         CALL    USE_ZERO
  3409.                 JR      LIST_5
  3410.  
  3411. LIST_4:         CALL    FETCH_NUM
  3412. LIST_5:         CALL    CHECK_END
  3413.                 CALL    FIND_INT2
  3414.                 LD      A,B
  3415.                 AND     #3F
  3416.                 LD      H,A
  3417.                 LD      L,C
  3418.                 LD      (#5C49),HL
  3419.                 CALL    LINE_ADDR
  3420. LIST_ALL:       LD      E,#01
  3421. LIST_ALL_2:     CALL    OUT_LINE
  3422.                 RST     #10
  3423.                 BIT     4,(IY+#02)
  3424.                 JR      Z,LIST_ALL_2
  3425.                 LD      A,(#5C6B)
  3426.                 SUB     (IY+#4F)
  3427.                 JR      NZ,LIST_ALL_2
  3428.                 XOR     E
  3429.                 RET     Z
  3430.                 PUSH    HL
  3431.                 PUSH    DE
  3432.                 LD      HL,#5C6C
  3433.                 CALL    LN_FETCH
  3434.                 POP     DE
  3435.                 POP     HL
  3436.                 JR      LIST_ALL_2
  3437.  
  3438. ; Print a whole BASIC line
  3439. OUT_LINE:       LD      BC,(#5C49)
  3440.                 CALL    CP_LINES
  3441.                 LD      D,#2A                   ; BSROM - line cursor is "*" instead of ">"
  3442.                 JR      Z,OUT_LINE1
  3443.                 LD      DE,#2000                ; BSROM - " " instead of suppressing line cursor
  3444.                 RL      E
  3445. OUT_LINE1:      LD      (IY+#2D),E
  3446.                 LD      A,(HL)
  3447.                 CP      #40
  3448.                 POP     BC
  3449.                 RET     NC
  3450.                 PUSH    BC
  3451.                 CALL    LIN4                    ; BSROM - no cursor
  3452.                 INC     HL
  3453.                 INC     HL
  3454.                 INC     HL
  3455.                 XOR     A
  3456.                 XOR     D
  3457.                 JR      Z,OUT_LINE1A
  3458.                 RST     #10
  3459. OUT_LINE1A:     NOP                             ; remains of old code are replaced with NOPs
  3460.                 NOP
  3461.                 NOP
  3462.                 NOP
  3463. OUT_LINE2:      SET     0,(IY+#01)
  3464. OUT_LINE3:      PUSH    DE
  3465.                 EX      DE,HL
  3466.                 RES     2,(IY+#30)
  3467.                 LD      HL,#5C3B
  3468.                 RES     2,(HL)
  3469.                 BIT     5,(IY+#37)
  3470.                 JR      Z,OUT_LINE4
  3471.                 SET     2,(HL)
  3472. OUT_LINE4:      LD      HL,(#5C5F)
  3473.                 AND     A
  3474.                 SBC     HL,DE
  3475.                 JR      NZ,OUT_LINE5
  3476.                 LD      A,#3F
  3477.                 CALL    OUT_FLASH
  3478. OUT_LINE5:      CALL    OUT_CURS
  3479.                 EX      DE,HL
  3480.                 LD      A,(HL)
  3481.                 CALL    NUMBER
  3482.                 INC     HL
  3483.                 CP      #0D
  3484.                 JR      Z,OUT_LINE6
  3485.                 EX      DE,HL
  3486.                 CALL    OUT_CHAR
  3487.                 JR      OUT_LINE4
  3488.  
  3489. OUT_LINE6:      POP     DE
  3490.                 RET
  3491.  
  3492. ; Check for a number marker
  3493. NUMBER:         CP      #0E
  3494.                 RET     NZ
  3495.                 INC     HL
  3496.                 INC     HL
  3497.                 INC     HL
  3498.                 INC     HL
  3499.                 INC     HL
  3500.                 INC     HL
  3501.                 LD      A,(HL)
  3502.                 RET
  3503.  
  3504. ; Print a flashing character
  3505. OUT_FLASH:      EXX
  3506.                 LD      HL,(#5C8F)
  3507.                 PUSH    HL
  3508.                 RES     7,H
  3509.                 SET     7,L
  3510.                 LD      (#5C8F),HL
  3511.                 LD      HL,#5C91
  3512.                 LD      D,(HL)
  3513.                 PUSH    DE
  3514.                 LD      (HL),#00
  3515.                 CALL    PRINT_OUT
  3516.                 POP     HL
  3517.                 LD      (IY+#57),H
  3518.                 POP     HL
  3519.                 LD      (#5C8F),HL
  3520.                 EXX
  3521.                 RET
  3522.  
  3523. ; Print the cursor
  3524. OUT_CURS:       LD      HL,(#5C5B)
  3525.                 AND     A
  3526.                 SBC     HL,DE
  3527.                 RET     NZ
  3528.                 LD      A,(#5C41)
  3529.                 RLC     A
  3530.                 JR      Z,OUT_C_1
  3531.                 ADD     A,#43
  3532.                 JR      OUT_C_2
  3533.  
  3534. OUT_C_1:        LD      HL,#5C3B
  3535.                 RES     3,(HL)
  3536.                 LD      A,#4B
  3537.                 BIT     2,(HL)
  3538.                 JR      Z,OUT_C_2
  3539.                 SET     3,(HL)
  3540.                 INC     A
  3541.                 BIT     3,(IY+#30)
  3542.                 JR      Z,OUT_C_2
  3543.                 LD      A,#43
  3544. OUT_C_2:        PUSH    DE
  3545.                 CALL    OUT_FLASH
  3546.                 POP     DE
  3547.                 RET
  3548.  
  3549. ; Get line number of the next line
  3550. LN_FETCH:       LD      E,(HL)
  3551.                 INC     HL
  3552.                 LD      D,(HL)
  3553.                 PUSH    HL
  3554.                 EX      DE,HL
  3555.                 INC     HL
  3556.                 CALL    LINE_ADDR
  3557.                 CALL    LINE_NO
  3558.                 POP     HL
  3559. LN_STORE:       BIT     5,(IY+#37)
  3560.                 RET     NZ
  3561.                 LD      (HL),D
  3562.                 DEC     HL
  3563.                 LD      (HL),E
  3564.                 RET
  3565.  
  3566. ; Outputting numbers at start of BASIC line
  3567. OUT_SP_2:       LD      A,E
  3568.                 AND     A
  3569.                 RET     M
  3570.                 JR      OUT_CHAR
  3571.  
  3572. OUT_SP_NO:      XOR     A
  3573. OUT_SP_1:       ADD     HL,BC
  3574.                 INC     A
  3575.                 JR      C,OUT_SP_1
  3576.                 SBC     HL,BC
  3577.                 DEC     A
  3578.                 JR      Z,OUT_SP_2
  3579.                 JP      OUT_CODE
  3580.  
  3581. ; Outputting characters in a BASIC line
  3582. OUT_CHAR:       CALL    NUMERIC
  3583.                 JR      NC,OUT_CH_3
  3584.                 CP      #21
  3585.                 JR      C,OUT_CH_3
  3586.                 RES     2,(IY+#01)
  3587.                 CP      #CB
  3588.                 JR      Z,OUT_CH_3
  3589.                 CP      #3A
  3590.                 JR      NZ,OUT_CH_1
  3591.                 BIT     5,(IY+#37)
  3592.                 JR      NZ,OUT_CH_2
  3593.                 BIT     2,(IY+#30)
  3594.                 JR      Z,OUT_CH_3
  3595.                 JR      OUT_CH_2
  3596.  
  3597. OUT_CH_1:       CP      #22
  3598.                 JR      NZ,OUT_CH_2
  3599.                 PUSH    AF
  3600.                 LD      A,(#5C6A)
  3601.                 XOR     #04
  3602.                 LD      (#5C6A),A
  3603.                 POP     AF
  3604. OUT_CH_2:       SET     2,(IY+#01)
  3605. OUT_CH_3:       RST     #10
  3606.                 RET
  3607.  
  3608. ; Get starting address of line (or line after)
  3609. LINE_ADDR:      PUSH    HL
  3610.                 LD      HL,(#5C53)
  3611.                 LD      D,H
  3612.                 LD      E,L
  3613. LINE_AD_1:      POP     BC
  3614.                 CALL    LIN1                    ; BSROM - modified line number test
  3615.                 RET     NC
  3616.                 PUSH    BC
  3617.                 CALL    NEXT_ONE
  3618.                 EX      DE,HL
  3619.                 JR      LINE_AD_1
  3620.  
  3621. ; Compare line numbers
  3622. CP_LINES:       LD      A,(HL)
  3623.                 CP      B
  3624.                 RET     NZ
  3625.                 INC     HL
  3626.                 LD      A,(HL)
  3627.                 DEC     HL
  3628.                 CP      C
  3629.                 RET
  3630.  
  3631. ; Find each statement
  3632.                 INC     HL                      ; 3x INC HL not used in this ROM
  3633.                 INC     HL
  3634.                 INC     HL
  3635. EACH_STMT:      LD      (#5C5D),HL
  3636.                 LD      C,#00
  3637. EACH_S_1:       DEC     D
  3638.                 RET     Z
  3639.                 RST     #20
  3640.                 CP      E
  3641.                 JR      NZ,EACH_S_3
  3642.                 AND     A
  3643.                 RET
  3644.  
  3645. EACH_S_2:       INC     HL
  3646.                 LD      A,(HL)
  3647. EACH_S_3:       CALL    NUMBER
  3648.                 LD      (#5C5D),HL
  3649.                 CP      #22
  3650.                 JR      NZ,EACH_S_4
  3651.                 DEC     C
  3652. EACH_S_4:       CP      #3A
  3653.                 JR      Z,EACH_S_5
  3654.                 CP      #CB
  3655.                 JR      NZ,EACH_S_6
  3656. EACH_S_5:       BIT     0,C
  3657.                 JR      Z,EACH_S_1
  3658. EACH_S_6:       CP      #0D
  3659.                 JR      NZ,EACH_S_2
  3660.                 DEC     D
  3661.                 SCF
  3662.                 RET
  3663.  
  3664. ; Find the address of the next line in the program area,
  3665. ; or the next variable in the variables area
  3666. NEXT_ONE:       PUSH    HL
  3667.                 LD      A,(HL)
  3668.                 CP      #40
  3669.                 JR      C,NEXT_O_3
  3670.                 BIT     5,A
  3671.                 JR      Z,NEXT_O_4
  3672.                 ADD     A,A
  3673.                 JP      M,NEXT_O_1
  3674.                 CCF
  3675. NEXT_O_1:       LD      BC,#0005
  3676.                 JR      NC,NEXT_O_2
  3677.                 LD      C,#12
  3678. NEXT_O_2:       RLA
  3679.                 INC     HL
  3680.                 LD      A,(HL)
  3681.                 JR      NC,NEXT_O_2
  3682.                 JR      NEXT_O_5
  3683.  
  3684. NEXT_O_3:       INC     HL
  3685. NEXT_O_4:       INC     HL
  3686.                 LD      C,(HL)
  3687.                 INC     HL
  3688.                 LD      B,(HL)
  3689.                 INC     HL
  3690. NEXT_O_5:       ADD     HL,BC
  3691.                 POP     DE
  3692. DIFFER:         AND     A
  3693.                 SBC     HL,DE
  3694.                 LD      B,H
  3695.                 LD      C,L
  3696.                 ADD     HL,DE
  3697.                 EX      DE,HL
  3698.                 RET
  3699.  
  3700. ; Handle reclaiming space
  3701. RECLAIM_1:      CALL    DIFFER
  3702. RECLAIM_2:      PUSH    BC
  3703.                 LD      A,B
  3704.                 CPL
  3705.                 LD      B,A
  3706.                 LD      A,C
  3707.                 CPL
  3708.                 LD      C,A
  3709.                 INC     BC
  3710.                 CALL    POINTERS
  3711.                 EX      DE,HL
  3712.                 POP     HL
  3713.                 ADD     HL,DE
  3714.                 PUSH    DE
  3715.                 LDIR
  3716.                 POP     HL
  3717.                 RET
  3718.                
  3719. ; Read line number of line editing area
  3720. E_LINE_NO:      LD      HL,(#5C59)
  3721.                 DEC     HL
  3722.                 LD      (#5C5D),HL
  3723.                 RST     #20
  3724.                 LD      HL,#5C92
  3725.                 LD      (#5C65),HL
  3726.                 CALL    INT_TO_FP
  3727.                 CALL    FP_TO_BC
  3728.                 JR      C,E_L_1
  3729.                 LD      HL,#C000                ; BSROM - line number can be 0..16383 now, was LD HL,$D8F0 (max 9999 lines)
  3730.                 ADD     HL,BC
  3731. E_L_1:          JP      C,REPORT_C
  3732.                 JP      SET_STK
  3733.  
  3734. ; Report and line number outputting
  3735. OUT_NUM_1:      PUSH    DE
  3736.                 PUSH    HL
  3737.                 XOR     A
  3738.                 BIT     7,B
  3739.                 JR      NZ,OUT_NUM_4
  3740.                 LD      H,B
  3741.                 LD      E,#FF                   ;BSROM - lines 0..16383
  3742.                 JP      NUMCOM
  3743.  
  3744. OUT_NUM_2:      PUSH    DE
  3745.                 LD      D,(HL)
  3746.                 INC     HL
  3747.                 LD      E,(HL)
  3748.                 PUSH    HL
  3749.                 EX      DE,HL
  3750.                 LD      E,#20
  3751. OUT_NUM_3:      LD      BC,#FC18
  3752.                 CALL    OUT_SP_NO
  3753.                 LD      BC,#FF9C
  3754.                 CALL    OUT_SP_NO
  3755.                 LD      C,#F6
  3756.                 CALL    OUT_SP_NO
  3757.                 LD      A,L
  3758. OUT_NUM_4:      CALL    OUT_CODE
  3759.                 POP     HL
  3760.                 POP     DE
  3761.                 RET
  3762.  
  3763. ; The offset table for command interpretation
  3764. OFFST_TBL:      DB      #B1                     ; P_DEF_FN
  3765.                 DB      #CB                     ; P_CAT
  3766.                 DB      #BC                     ; P_FORMAT
  3767.                 DB      #BF                     ; P_MOVE
  3768.                 DB      #C4                     ; P_ERASE
  3769.                 DB      #AF                     ; P_OPEN
  3770.                 DB      #B4                     ; P_CLOSE
  3771.                 DB      #93                     ; P_MERGE
  3772.                 DB      #91                     ; P_VERIFY
  3773.                 DB      #92                     ; P_BEEP
  3774.                 DB      #95                     ; P_CIRCLE
  3775.                 DB      #98                     ; P_INK
  3776.                 DB      #98                     ; P_PAPER
  3777.                 DB      #98                     ; P_FLASH
  3778.                 DB      #98                     ; P_BRIGHT
  3779.                 DB      #98                     ; P_INVERSE
  3780.                 DB      #98                     ; P_OVER
  3781.                 DB      #98                     ; P_OUT
  3782.                 DB      #7F                     ; P_LPRINT
  3783.                 DB      #81                     ; P_LLIST
  3784.                 DB      #2E                     ; P_STOP
  3785.                 DB      #6C                     ; P_READ
  3786.                 DB      #6E                     ; P_DATA
  3787.                 DB      #70                     ; P_RESTORE
  3788.                 DB      #48                     ; P_NEW
  3789.                 DB      #94                     ; P_BORDER
  3790.                 DB      #56                     ; P_CONT
  3791.                 DB      #3F                     ; P_DIM
  3792.                 DB      #41                     ; P_REM
  3793.                 DB      #2B                     ; P_FOR
  3794.                 DB      #17                     ; P_GO_TO
  3795.                 DB      #1F                     ; P_GO_SUB
  3796.                 DB      #37                     ; P_INPUT
  3797.                 DB      #77                     ; P_LOAD
  3798.                 DB      #44                     ; P_LIST
  3799.                 DB      #0F                     ; P_LET
  3800.                 DB      #59                     ; P_PAUSE
  3801.                 DB      #2B                     ; P_NEXT
  3802.                 DB      #43                     ; P_POKE
  3803.                 DB      #2D                     ; P_PRINT
  3804.                 DB      #51                     ; P_PLOT
  3805.                 DB      #3A                     ; P_RUN
  3806.                 DB      #6D                     ; P_SAVE
  3807.                 DB      #42                     ; P_RANDOM
  3808.                 DB      #0D                     ; P_IF
  3809.                 DB      #49                     ; P_CLS
  3810.                 DB      #5C                     ; P_DRAW
  3811.                 DB      #44                     ; P_CLEAR
  3812.                 DB      #15                     ; P_RETURN
  3813.                 DB      #5D                     ; P_COPY
  3814.  
  3815. ; The parameter table. List of parameters for commands.        
  3816. P_LET:          DB      #01
  3817.                 DB      "="
  3818.                 DB      #02
  3819.  
  3820. P_GO_TO:        DB      #03                     ; BSROM - enhanced GOTO command, parameter is optional
  3821.                 DW      GO_TO
  3822.                 DB      #00
  3823.  
  3824. P_IF:           DB      #06
  3825.                 DB      #CB
  3826.                 DB      #05
  3827.                 DW      IF_CMD
  3828.  
  3829. P_GO_SUB:       DB      #03                     ; BSROM - enhanced GOSUB command, parameter is optional
  3830.                 DW      GO_SUB
  3831.                 DB      #00
  3832.        
  3833. P_STOP:         DB      #00
  3834.                 DW      STOP
  3835.  
  3836. P_RETURN:       DB      #00
  3837.                 DW      RETURN
  3838.  
  3839. P_FOR:          DB      #04
  3840.                 DB      "="
  3841.                 DB      #06
  3842.                 DB      #CC
  3843.                 DB      #06
  3844.                 DB      #05
  3845.                 DW      FOR
  3846.  
  3847. P_NEXT:         DB      #04
  3848.                 DB      #00
  3849.                 DW      NEXT
  3850.  
  3851. P_PRINT:        DB      #05
  3852.                 DW      PRINT
  3853.  
  3854. P_INPUT:        DB      #05
  3855.                 DW      INPUT
  3856.  
  3857. P_DIM:          DB      #05
  3858.                 DW      DIM
  3859.  
  3860. P_REM:          DB      #05
  3861.                 DW      REM
  3862.  
  3863. P_NEW:          DB      #05                     ; BSROM for MB02+ - enhanced NEW command, added numeric parameter
  3864.                 DW      CMDEXE
  3865.  
  3866. P_RUN:          DB      #03
  3867.                 DW      RUN
  3868.  
  3869. P_LIST:         DB      #05
  3870.                 DW      LIST
  3871.  
  3872. P_POKE:         DB      #06                     ; BSROM - enhanced POKE comand, added more items
  3873.                 DB      #05
  3874.                 DW      NEW_POKE
  3875.  
  3876. P_RANDOM:       DB      #03
  3877.                 DW      RANDOMIZE
  3878.  
  3879. P_CONT:         DB      #03                     ; BSROM - enhanced CONTINUE command, added numeric parameter
  3880.                 DW      NEW_CONT
  3881.        
  3882. P_CLEAR:        DB      #03
  3883.                 DW      CLEAR
  3884.  
  3885. P_CLS:          DB      #03                     ; BSROM - enhanced CLS command, added numeric parameter
  3886.                 DW      NEW_CLS
  3887.  
  3888. P_PLOT:         DB      #09
  3889.                 DB      #00
  3890.                 DW      PLOT
  3891.  
  3892. P_PAUSE:        DB      #03                     ; BSROM - enhanced PAUSE command, parameter is optional
  3893.                 DW      PAUSE
  3894.                 DB      #00
  3895.  
  3896. P_READ:         DB      #05
  3897.                 DW      READ
  3898.  
  3899. P_DATA:         DB      #05
  3900.                 DW      DATA
  3901.  
  3902. P_RESTORE:      DB      #03
  3903.                 DW      RESTORE
  3904.  
  3905. P_DRAW:         DB      #09
  3906.                 DB      #05
  3907.                 DW      DRAW
  3908.  
  3909. P_COPY:         DB      #05                     ; BSROM for MB02+ - enhanced COPY command, added numeric parameter
  3910.                 DW      CMDEXE
  3911.  
  3912. P_LPRINT:       DB      #05
  3913.                 DW      LPRINT
  3914.  
  3915. P_LLIST:        DB      #05
  3916.                 DW      LLIST
  3917.  
  3918. P_SAVE:         DB      #0B
  3919. P_LOAD:         DB      #0B
  3920. P_VERIFY:       DB      #0B
  3921. P_MERGE:        DB      #0B
  3922.  
  3923. P_BEEP:         DB      #08
  3924.                 DB      #00
  3925.                 DW      BEEP
  3926.  
  3927. P_CIRCLE:       DB      #09
  3928.                 DB      #05
  3929.                 DW      CIRCLE
  3930.  
  3931. P_INK:          DB      #07
  3932. P_PAPER:        DB      #07
  3933. P_FLASH:        DB      #07
  3934. P_BRIGHT:       DB      #07
  3935. P_INVERSE:      DB      #07
  3936. P_OVER:         DB      #07
  3937.  
  3938. P_OUT:          DB      #08
  3939.                 DB      #00
  3940.                 DW      OUT_CMD
  3941.  
  3942. P_BORDER:       DB      #03                     ; BSROM - enhanced BORDER command, parameter s optional
  3943.                 DW      BORDER
  3944.                 DB      #00
  3945.        
  3946. P_DEF_FN:       DB      #05
  3947.                 DW      DEF_FN
  3948.  
  3949. P_OPEN:         DB      #06
  3950.                 DB      ","
  3951.                 DB      #0A
  3952.                 DB      #00
  3953.                 DW      OPEN
  3954.  
  3955. P_CLOSE:        DB      #06
  3956.                 DB      #00
  3957.                 DW      CLOSE
  3958.  
  3959. P_FORMAT:       DB      #0A
  3960.                 DB      #00
  3961.                 DW      CAT_ETC
  3962.  
  3963. P_MOVE:         DB      #0A
  3964.                 DB      ","
  3965.                 DB      #0A
  3966.                 DB      #00
  3967.                 DW      CAT_ETC
  3968.  
  3969. P_ERASE:        DB      #0A
  3970.                 DB      #00
  3971.                 DW      CAT_ETC
  3972.  
  3973. P_CAT:          DB      #05                     ; BSROM for MB02+ - enhanced CAT command, added numeric parameter
  3974.                 DW      CMDEXE
  3975.  
  3976. ; Main parser of BASIC interpreter
  3977. LINE_SCAN:      RES     7,(IY+#01)
  3978.                 CALL    E_LINE_NO
  3979.                 XOR     A
  3980.                 LD      (#5C47),A
  3981.                 DEC     A
  3982.                 LD      (#5C3A),A
  3983.                 JR      STMT_L_1
  3984.  
  3985. ; Statement loop
  3986. STMT_LOOP:      RST     #20
  3987. STMT_L_1:       CALL    SET_WORK
  3988.                 INC     (IY+#0D)
  3989.                 JP      M,REPORT_C
  3990.                 RST     #18
  3991.                 LD      B,#00
  3992.                 CP      #0D
  3993.                 JR      Z,LINE_END
  3994.                 CP      #3A
  3995.                 JR      Z,STMT_LOOP
  3996.                 LD      HL,STMT_RET
  3997.                 PUSH    HL
  3998.                 CP      #CE
  3999.                 JP      C,NEWCMD                ; BSROM for MB02+ - new BASIC commands
  4000.                 SUB     #CE
  4001.                 LD      C,A
  4002.                 RST     #20
  4003.                 LD      HL,OFFST_TBL
  4004.                 ADD     HL,BC
  4005.                 LD      C,(HL)
  4006.                 ADD     HL,BC
  4007.                 JR      GET_PARAM
  4008.  
  4009. ; The main scanning loop
  4010. SCAN_LOOP:      LD      HL,(#5C74)
  4011. GET_PARAM:      LD      A,(HL)
  4012.                 INC     HL
  4013.                 LD      (#5C74),HL
  4014.                 LD      BC,SCAN_LOOP
  4015.                 PUSH    BC
  4016.                 LD      C,A
  4017.                 CP      #20
  4018.                 JR      NC,SEPARATOR
  4019.                 LD      HL,CLASS_TBL
  4020.                 LD      B,#00
  4021.                 ADD     HL,BC
  4022.                 LD      C,(HL)
  4023.                 ADD     HL,BC
  4024.                 PUSH    HL
  4025.                 RST     #18
  4026.                 DEC     B
  4027.                 RET
  4028.  
  4029. ; Verify that the mandatory separator is present in correct location
  4030. SEPARATOR:      RST     #18
  4031.                 CP      C
  4032.                 JP      NZ,REPORT_C
  4033.                 RST     #20
  4034.                 RET
  4035.  
  4036. ; Handle BREAK, return, and direct commands
  4037. STMT_RET:       CALL    BREAK_KEY
  4038.                 JR      C,STMT_R_1
  4039. REPORT_L:       RST     #08                     ; Error report
  4040.                 DB      #14                     ; BREAK into program
  4041. STMT_R_1:       BIT     7,(IY+#0A)
  4042.                 JR      NZ,STMT_NEXT
  4043.                 LD      HL,(#5C42)
  4044.                 BIT     7,H
  4045.                 JR      Z,LINE_NEW
  4046. LINE_RUN:       LD      HL,#FFFE
  4047.                 LD      (#5C45),HL
  4048.                 LD      HL,(#5C61)
  4049.                 DEC     HL
  4050.                 LD      DE,(#5C59)
  4051.                 DEC     DE
  4052.                 LD      A,(#5C44)
  4053.                 JR      NEXT_LINE
  4054.  
  4055. ; Find start address of a new line
  4056. LINE_NEW:       CALL    LINE_ADDR
  4057.                 LD      A,(#5C44)
  4058.                 JR      Z,LINE_USE
  4059.                 AND     A
  4060.                 JR      NZ,REPORT_N
  4061.                 LD      B,A
  4062.                 LD      A,(HL)
  4063.                 AND     #C0
  4064.                 LD      A,B
  4065.                 JR      Z,LINE_USE
  4066. REPORT_0:       RST     #08                     ; Error report
  4067.                 DB      #FF                     ; OK
  4068.  
  4069. ; REM command
  4070. REM:            POP     BC
  4071.  
  4072. ; End of line test
  4073. LINE_END:       CALL    SYNTAX_Z
  4074.                 RET     Z
  4075.                 LD      HL,(#5C55)
  4076.                 LD      A,#C0
  4077.                 AND     (HL)
  4078.                 RET     NZ
  4079.                 XOR     A
  4080. LINE_USE:       CP      #01                     ; General line checking
  4081.                 ADC     A,#00
  4082.                 LD      D,(HL)
  4083.                 INC     HL
  4084.                 LD      E,(HL)
  4085.                 LD      (#5C45),DE
  4086.                 INC     HL
  4087.                 LD      E,(HL)
  4088.                 INC     HL
  4089.                 LD      D,(HL)
  4090.                 EX      DE,HL
  4091.                 ADD     HL,DE
  4092.                 INC     HL
  4093. NEXT_LINE:      LD      (#5C55),HL
  4094.                 EX      DE,HL
  4095.                 LD      (#5C5D),HL
  4096.                 LD      D,A
  4097.                 LD      E,#00
  4098.                 LD      (IY+#0A),#FF
  4099.                 DEC     D
  4100.                 LD      (IY+#0D),D
  4101.                 JP      Z,STMT_LOOP
  4102.                 INC     D
  4103.                 CALL    EACH_STMT
  4104.                 JR      Z,STMT_NEXT
  4105. REPORT_N:       RST     #08                     ; Error report
  4106.                 DB      #16                     ; Statement lost
  4107.  
  4108. ; End of statements
  4109. CHECK_END:      CALL    SYNTAX_Z
  4110.                 RET     NZ
  4111.                 POP     BC
  4112.                 POP     BC
  4113. STMT_NEXT:      RST     #18                     ; Go to next statement
  4114.                 CP      #0D
  4115.                 JR      Z,LINE_END
  4116.                 CP      #3A
  4117.                 JP      Z,STMT_LOOP
  4118.                 JP      REPORT_C
  4119.  
  4120. ; Command class table
  4121. CLASS_TBL:      DB      #0F                     ; CLASS_00
  4122.                 DB      #1D                     ; CLASS_01
  4123.                 DB      #4B                     ; CLASS_02
  4124.                 DB      #09                     ; CLASS_03
  4125.                 DB      #67                     ; CLASS_04
  4126.                 DB      #0B                     ; CLASS_05
  4127.                 DB      #7B                     ; CLASS_06
  4128.                 DB      #8E                     ; CLASS_07
  4129.                 DB      #71                     ; CLASS_08
  4130.                 DB      #B4                     ; CLASS_09
  4131.                 DB      #81                     ; CLASS_0A
  4132.                 DB      #CF                     ; CLASS_0B
  4133.  
  4134. ; Command classes 00 - no operand, 03 - optional operand, 05 - variable syntax checked by routine
  4135. CLASS_03:       CALL    FETCH_NUM
  4136. CLASS_00:       CP      A
  4137. CLASS_05:       POP     BC
  4138.                 CALL    Z,CHECK_END
  4139.                 EX      DE,HL
  4140.                 LD      HL,(#5C74)
  4141.                 LD      C,(HL)
  4142.                 INC     HL
  4143.                 LD      B,(HL)
  4144.                 EX      DE,HL
  4145.                 PUSH    BC
  4146.                 RET
  4147.  
  4148. ; Command classes
  4149. ; 01 - variable is required
  4150. ; 02 - expression is required
  4151. ; 04 - single character variable is required
  4152. CLASS_01:       CALL    LOOK_VARS
  4153. VAR_A_1:        LD      (IY+#37),#00
  4154.                 JR      NC,VAR_A_2
  4155.                 SET     1,(IY+#37)
  4156.                 JR      NZ,VAR_A_3
  4157. REPORT_2:       RST     #08                     ; Error report
  4158.                 DB      #01                     ; Variable not found;
  4159. VAR_A_2:        CALL    Z,STK_VAR
  4160.                 BIT     6,(IY+#01)
  4161.                 JR      NZ,VAR_A_3
  4162.                 XOR     A
  4163.                 CALL    SYNTAX_Z
  4164.                 CALL    NZ,STK_FETCH
  4165.                 LD      HL,#5C71
  4166.                 OR      (HL)
  4167.                 LD      (HL),A
  4168.                 EX      DE,HL
  4169. VAR_A_3:        LD      (#5C72),BC
  4170.                 LD      (#5C4D),HL
  4171.                 RET
  4172.  
  4173. CLASS_02:       POP     BC
  4174.                 CALL    VAL_FET_1
  4175.                 CALL    CHECK_END
  4176.                 RET
  4177.  
  4178. ; Fetch a value
  4179. VAL_FET_1:      LD      A,(#5C3B)
  4180. VAL_FET_2:      PUSH    AF
  4181.                 CALL    SCANNING
  4182.                 POP     AF
  4183.                 LD      D,(IY+#01)
  4184.                 XOR     D
  4185.                 AND     #40
  4186.                 JR      NZ,REPORT_C
  4187.                 BIT     7,D
  4188.                 JP      NZ,LET
  4189.                 RET
  4190.  
  4191. CLASS_04:       CALL    LOOK_VARS
  4192.                 PUSH    AF
  4193.                 LD      A,C
  4194.                 OR      #9F
  4195.                 INC     A
  4196.                 JR      NZ,REPORT_C
  4197.                 POP     AF
  4198.                 JR      VAR_A_1
  4199.  
  4200. ; Command classes
  4201. ; 06 - numeric expression is expected
  4202. ; 08 - two numeric expressions separated by comma are expected
  4203. ; 0A - string expression is expected
  4204. NEXT_2NUM:      RST     #20
  4205. EXPT_2NUM:      CALL    EXPT_1NUM               ; CLASS_08
  4206.                 CP      #2C
  4207.                 JR      NZ,REPORT_C
  4208.                 RST     #20
  4209. EXPT_1NUM:      CALL    SCANNING                ; CLASS_06
  4210.                 BIT     6,(IY+#01)
  4211.                 RET     NZ
  4212. REPORT_C:       RST     #08                     ; Error report
  4213.                 DB      #0B                     ; Nonsense in BASIC
  4214. EXPT_EXP:       CALL    SCANNING                ; CLASS_0A
  4215.                 BIT     6,(IY+#01)
  4216.                 RET     Z
  4217.                 JR      REPORT_C
  4218.  
  4219. ; Command class 07 - set permanent colors
  4220. CLASS_07:       BIT     7,(IY+#01)
  4221.                 RES     0,(IY+#02)
  4222.                 CALL    NZ,TEMPS
  4223.                 POP     AF
  4224.                 LD      A,(#5C74)
  4225.                 SUB     #13
  4226.                 CALL    CO_TEMP_4
  4227.                 CALL    CHECK_END
  4228.                 LD      HL,(#5C8F)
  4229.                 LD      (#5C8D),HL
  4230.                 LD      HL,#5C91
  4231.                 LD      A,(HL)
  4232.                 RLCA
  4233.                 XOR     (HL)
  4234.                 AND     #AA
  4235.                 XOR     (HL)
  4236.                 LD      (HL),A
  4237.                 RET
  4238.  
  4239. ; Command class 09 - two coordinates, could be preceded by embedded color commands
  4240. CLASS_09:       CALL    SYNTAX_Z
  4241.                 JR      Z,CL_09_1
  4242.                 RES     0,(IY+#02)
  4243.                 CALL    TEMPS
  4244.                 LD      HL,#5C90
  4245.                 LD      A,(HL)
  4246.                 OR      #F8
  4247.                 LD      (HL),A
  4248.                 RES     6,(IY+#57)
  4249.                 RST     #18
  4250. CL_09_1:        CALL    CO_TEMP_2
  4251.                 JR      EXPT_2NUM
  4252.  
  4253. ; Command class 09 - four commands handling
  4254.                 JP      CMDMGF                  ; BSROM for MB02+ - modified tape commands
  4255.  
  4256. ; Fetch a number
  4257. FETCH_NUM:      CP      #0D
  4258.                 JR      Z,USE_ZERO
  4259.                 CP      #3A
  4260.                 JR      NZ,EXPT_1NUM           
  4261. USE_ZERO:       CALL    SYNTAX_Z                ; Place 0 on the calculator stack
  4262.                 RET     Z
  4263.                 RST     #28                     ;FP_CALC
  4264.                 DB      #A0                     ;STK_ZERO
  4265.                 DB      #38                     ;END_CALC
  4266.                 RET
  4267.  
  4268. ; Handle STOP command
  4269. STOP:           RST     #08                     ; Error report
  4270.                 DB      #08                     ; STOP statement
  4271.  
  4272. ; Handle IF command
  4273. IF_CMD:         POP     BC
  4274.                 CALL    SYNTAX_Z
  4275.                 JR      Z,IF_1
  4276.                 RST     #28                     ;FP_CALC
  4277.                 DB      #02                     ;DELETE
  4278.                 DB      #38                     ;END_CALC
  4279.                 EX      DE,HL
  4280.                 CALL    TEST_ZERO
  4281.                 JP      C,LINE_END
  4282. IF_1:           JP      STMT_L_1
  4283.  
  4284. ; Handle FOR command
  4285. FOR:            CP      #CD
  4286.                 JR      NZ,F_USE_1
  4287.                 RST     #20
  4288.                 CALL    EXPT_1NUM
  4289.                 CALL    CHECK_END
  4290.                 JR      F_REORDER
  4291.  
  4292. F_USE_1:        CALL    CHECK_END
  4293.                 RST     #28                     ;FP_CALC
  4294.                 DB      #A1                     ;STK_ONE
  4295.                 DB      #38                     ;END_CALC
  4296. F_REORDER:      RST     #28                     ;FP_CALC
  4297.                 DB      #C0                     ;ST_MEM_0
  4298.                 DB      #02                     ;DELETE
  4299.                 DB      #01                     ;EXCHANGE
  4300.                 DB      #E0                     ;GET_MEM_0
  4301.                 DB      #01                     ;EXCHANGE
  4302.                 DB      #38                     ;END_CALC
  4303.                 CALL    LET
  4304.                 LD      (#5C68),HL
  4305.                 DEC     HL
  4306.                 LD      A,(HL)
  4307.                 SET     7,(HL)
  4308.                 LD      BC,#0006
  4309.                 ADD     HL,BC
  4310.                 RLCA
  4311.                 JR      C,F_L_S
  4312.                 LD      C,#0D
  4313.                 CALL    MAKE_ROOM
  4314.                 INC     HL
  4315. F_L_S:          PUSH    HL
  4316.                 RST     #28                     ;FP_CALC
  4317.                 DB      #02                     ;DELETE
  4318.                 DB      #02                     ;DELETE
  4319.                 DB      #38                     ;END_CALC
  4320.                 POP     HL
  4321.                 EX      DE,HL
  4322.                 LD      C,#0A
  4323.                 LDIR
  4324.                 LD      HL,(#5C45)
  4325.                 EX      DE,HL
  4326.                 LD      (HL),E
  4327.                 INC     HL
  4328.                 LD      (HL),D
  4329.                 LD      D,(IY+#0D)
  4330.                 INC     D
  4331.                 INC     HL
  4332.                 LD      (HL),D
  4333.                 CALL    NEXT_LOOP
  4334.                 RET     NC
  4335.                 LD      B,(IY+#38)
  4336.                 LD      HL,(#5C45)
  4337.                 LD      (#5C42),HL
  4338.                 LD      A,(#5C47)
  4339.                 NEG
  4340.                 LD      D,A
  4341.                 LD      HL,(#5C5D)
  4342.                 LD      E,#F3
  4343. F_LOOP:         PUSH    BC
  4344.                 LD      BC,(#5C55)
  4345.                 CALL    LOOK_PROG
  4346.                 LD      (#5C55),BC
  4347.                 POP     BC
  4348.                 JR      C,REPORT_I
  4349.                 RST     #20
  4350.                 OR      #20
  4351.                 CP      B
  4352.                 JR      Z,F_FOUND
  4353.                 RST     #20
  4354.                 JR      F_LOOP
  4355.  
  4356. F_FOUND:        RST     #20
  4357.                 LD      A,#01
  4358.                 SUB     D
  4359.                 LD      (#5C44),A
  4360.                 RET
  4361.  
  4362. REPORT_I:       RST     #08                     ; Error report
  4363.                 DB      #11                     ; FOR without NEXT
  4364.  
  4365. ; Search the program area for DATA, DEF FN or NEXT keywords
  4366. LOOK_PROG:      LD      A,(HL)
  4367.                 CP      #3A
  4368.                 JR      Z,LOOK_P_2
  4369. LOOK_P_1:       INC     HL
  4370.                 LD      A,(HL)
  4371.                 AND     #C0
  4372.                 SCF
  4373.                 RET     NZ
  4374.                 LD      B,(HL)
  4375.                 INC     HL
  4376.                 LD      C,(HL)
  4377.                 LD      (#5C42),BC
  4378.                 INC     HL
  4379.                 LD      C,(HL)
  4380.                 INC     HL
  4381.                 LD      B,(HL)
  4382.                 PUSH    HL
  4383.                 ADD     HL,BC
  4384.                 LD      B,H
  4385.                 LD      C,L
  4386.                 POP     HL
  4387.                 LD      D,#00
  4388. LOOK_P_2:       PUSH    BC
  4389.                 CALL    EACH_STMT
  4390.                 POP     BC
  4391.                 RET     NC
  4392.                 JR      LOOK_P_1
  4393.  
  4394. ; Handle NEXT command
  4395. NEXT:           BIT     1,(IY+#37)
  4396.                 JP      NZ,REPORT_2
  4397.                 LD      HL,(#5C4D)
  4398.                 BIT     7,(HL)
  4399.                 JR      Z,REPORT_1
  4400.                 INC     HL
  4401.                 LD      (#5C68),HL
  4402.                 RST     #28                     ;FP_CALC
  4403.                 DB      #E0                     ;GET_MEM_0
  4404.                 DB      #E2                     ;GET_MEM_2
  4405.                 DB      #0F                     ;ADDITION
  4406.                 DB      #C0                     ;ST_MEM_0
  4407.                 DB      #02                     ;DELETE
  4408.                 DB      #38                     ;END_CALC
  4409.                 CALL    NEXT_LOOP
  4410.                 RET     C
  4411.                 LD      HL,(#5C68)
  4412.                 LD      DE,#000F
  4413.                 ADD     HL,DE
  4414.                 LD      E,(HL)
  4415.                 INC     HL
  4416.                 LD      D,(HL)
  4417.                 INC     HL
  4418.                 LD      H,(HL)
  4419.                 EX      DE,HL
  4420.                 JP      GO_TO_2
  4421.  
  4422. REPORT_1:       RST     #08                     ; Error report
  4423.                 DB      #00                     ; NEXT withou FOR
  4424.  
  4425. ; Test iterations for FOR command
  4426. NEXT_LOOP:      RST     #28                     ;FP_CALC
  4427.                 DB      #E1                     ;GET_MEM_1
  4428.                 DB      #E0                     ;GET_MEM_0
  4429.                 DB      #E2                     ;GET_MEM_2
  4430.                 DB      #36                     ;LESS_0
  4431.                 DB      #00                     ;JUMP_TRUE
  4432.                 DB      #02                     ;NEXT_1 if step negative
  4433.                 DB      #01                     ;EXCHANGE
  4434. NEXT_1:         DB      #03                     ;SUBTRACT
  4435.                 DB      #37                     ;GREATER_0
  4436.                 DB      #00                     ;JUMP_TRUE
  4437.                 DB      #04                     ;NEXT_2 if finished
  4438.                 DB      #38                     ;END_CALC
  4439.                 AND     A
  4440.                 RET
  4441.        
  4442. NEXT_2:         DB      #38                     ;END_CALC
  4443.                 SCF
  4444.                 RET
  4445.  
  4446. ; Handle READ command
  4447. READ_3:         RST     #20
  4448. READ:           CALL    CLASS_01
  4449.                 CALL    SYNTAX_Z
  4450.                 JR      Z,READ_2
  4451.                 RST     #18
  4452.                 LD      (#5C5F),HL
  4453.                 LD      HL,(#5C57)
  4454.                 LD      A,(HL)
  4455.                 CP      #2C
  4456.                 JR      Z,READ_1
  4457.                 LD      E,#E4
  4458.                 CALL    LOOK_PROG
  4459.                 JR      NC,READ_1
  4460. REPORT_E:       RST     #08                     ; Error report
  4461.                 DB      #0D                     ; Out of data
  4462. READ_1:         CALL    TEMP_PTR1
  4463.                 CALL    VAL_FET_1
  4464.                 RST     #18
  4465.                 LD      (#5C57),HL
  4466.                 LD      HL,(#5C5F)
  4467.                 LD      (IY+#26),#00
  4468.                 CALL    TEMP_PTR2
  4469. READ_2:         RST     #18
  4470.                 CP      #2C
  4471.                 JR      Z,READ_3
  4472.                 CALL    CHECK_END
  4473.                 RET
  4474.  
  4475. ; Handle DATA command
  4476. DATA:           CALL    SYNTAX_Z
  4477.                 JR      NZ,DATA_2
  4478. DATA_1:         CALL    SCANNING
  4479.                 CP      #2C
  4480.                 CALL    NZ,CHECK_END
  4481.                 RST     #20
  4482.                 JR      DATA_1
  4483.  
  4484. DATA_2:         LD      A,#E4
  4485. PASS_BY:        LD      B,A
  4486.                 CPDR
  4487.                 LD      DE,#0200
  4488.                 JP      EACH_STMT
  4489.  
  4490. ; Handle RESTORE command
  4491. RESTORE:        CALL    FIND_INT2
  4492. REST_RUN:       LD      H,B
  4493.                 LD      L,C
  4494.                 CALL    LINE_ADDR
  4495.                 DEC     HL
  4496.                 LD      (#5C57),HL
  4497.                 RET
  4498.  
  4499. ; Handle RANDOMIZE command
  4500. RANDOMIZE:      CALL    FIND_INT2
  4501.                 LD      A,B
  4502.                 OR      C
  4503.                 JR      NZ,RAND_1
  4504.                 LD      BC,(#5C78)
  4505. RAND_1:         LD      (#5C76),BC
  4506.                 RET
  4507.  
  4508. ; Handle CONTINUE command
  4509. CONTINUE:       LD      HL,(#5C6E)
  4510.                 LD      D,(IY+#36)
  4511.                 JR      GO_TO_2
  4512.  
  4513. ; Handle GOTO command
  4514. GO_TO:          CALL    FIND_INT2
  4515.                 LD      H,B
  4516.                 LD      L,C
  4517.                 LD      D,#00
  4518.                 LD      A,H
  4519.                 CP      #F0
  4520.                 JR      NC,REPORT_BB
  4521. GO_TO_2:        LD      (#5C42),HL
  4522.                 LD      (IY+#0A),D
  4523.                 RET
  4524.  
  4525. ; Handle OUT command
  4526. OUT_CMD:        CALL    TWO_PARAM
  4527.                 OUT     (C),A
  4528.                 RET
  4529.  
  4530. ; BSROM - fix for rewriting first bytes of ROM
  4531. ; was POKE command handling here originally
  4532. NO_RW_AT0:      LD      DE,(#5C65)
  4533.                 RET
  4534.  
  4535. ; BSROM - extended command parameters
  4536. TWO_PARAM:      CALL    FP_TO_A
  4537.                 PUSH    AF
  4538.                 CALL    FIND_INT2
  4539.                 POP     AF
  4540. ROZPAR:         JR      C,REPORT_BB
  4541.                 JR      Z,ROZPAR_1
  4542.                 NEG
  4543. ROZPAR_1:       RET
  4544.  
  4545. ; Find integers
  4546. FIND_INT1:      CALL    FP_TO_A
  4547.                 JR      ROZPAR
  4548.  
  4549. FIND_INT2:      CALL    FP_TO_BC
  4550.                 JR      C,REPORT_BB
  4551.                 RET     Z
  4552.  
  4553. REPORT_BB:      RST     #08                     ; Error report
  4554.                 DB      #0A                     ; Integer out of range
  4555.  
  4556. ; Handle RUN command
  4557. RUN:            CALL    GO_TO
  4558.                 LD      BC,#0000
  4559.                 CALL    REST_RUN
  4560.                 JR      CLEAR_RUN
  4561.  
  4562. ; Handle CLEAR command
  4563. CLEAR:          CALL    FIND_INT2
  4564. CLEAR_RUN:      LD      A,B
  4565.                 OR      C
  4566.                 JR      NZ,CLEAR_1
  4567.                 LD      BC,(#5CB2)
  4568. CLEAR_1:        PUSH    BC
  4569.                 LD      DE,(#5C4B)
  4570.                 LD      HL,(#5C59)
  4571.                 DEC     HL
  4572.                 CALL    RECLAIM_1
  4573.                 CALL    CLS
  4574.                 LD      HL,(#5C65)
  4575.                 LD      DE,#0032
  4576.                 ADD     HL,DE
  4577.                 POP     DE
  4578.                 SBC     HL,DE
  4579.                 JR      NC,REPORT_M
  4580.                 LD      HL,(#5CB4)
  4581.                 AND     A
  4582.                 SBC     HL,DE
  4583.                 JR      NC,CLEAR_2
  4584. REPORT_M:       RST     #08                     ; Error report
  4585.                 DB      #15                     ; RAMTOP no good
  4586. CLEAR_2:        EX      DE,HL
  4587.                 LD      (#5CB2),HL
  4588.                 POP     DE
  4589.                 POP     BC
  4590.                 LD      (HL),#3E
  4591.                 DEC     HL
  4592.                 LD      SP,HL
  4593.                 PUSH    BC
  4594.                 LD      (#5C3D),SP
  4595.                 EX      DE,HL
  4596.                 JP      (HL)
  4597.  
  4598. ; Handle GO SUB command
  4599. GO_SUB:         POP     DE
  4600.                 LD      H,(IY+#0D)
  4601.                 INC     H
  4602.                 EX      (SP),HL
  4603.                 INC     SP
  4604.                 LD      BC,(#5C45)
  4605.                 PUSH    BC
  4606.                 PUSH    HL
  4607.                 LD      (#5C3D),SP
  4608.                 PUSH    DE
  4609.                 CALL    GO_TO
  4610.                 LD      BC,#0014
  4611. TEST_ROOM:      LD      HL,(#5C65)              ; Check available memory
  4612.                 ADD     HL,BC
  4613.                 JR      C,REPORT_4
  4614.                 EX      DE,HL
  4615.                 LD      HL,#0050
  4616.                 ADD     HL,DE
  4617.                 JR      C,REPORT_4
  4618.                 SBC     HL,SP
  4619.                 RET     C
  4620. REPORT_4:       LD      L,#03
  4621.                 JP      ERROR_3
  4622.  
  4623. ; Get free memory. Not used in ROM, but can be used by user
  4624. FREE_MEM:       LD      BC,#0000
  4625.                 CALL    TEST_ROOM
  4626.                 LD      B,H
  4627.                 LD      C,L
  4628.                 RET
  4629.  
  4630. ; Handle RETURN command
  4631. RETURN:         POP     BC
  4632.                 POP     HL
  4633.                 POP     DE
  4634.                 LD      A,D
  4635.                 CP      #3E
  4636.                 JR      Z,REPORT_7
  4637.                 DEC     SP
  4638.                 EX      (SP),HL
  4639.                 EX      DE,HL
  4640.                 LD      (#5C3D),SP
  4641.                 PUSH    BC
  4642.                 JP      GO_TO_2
  4643. REPORT_7:       PUSH    DE
  4644.                 PUSH    HL
  4645.                 RST     #08                     ; Error report
  4646.                 DB      #06                     ; RETURN without GOSUB
  4647.  
  4648. ; Handle PAUSE command
  4649. PAUSE:          CALL    FIND_INT2
  4650. PAUSE_1:        HALT
  4651.                 DEC     BC
  4652.                 LD      A,B
  4653.                 OR      C
  4654.                 JR      Z,PAUSE_END
  4655.                 LD      A,B
  4656.                 AND     C
  4657.                 INC     A
  4658.                 JR      NZ,PAUSE_2
  4659.                 INC     BC
  4660. PAUSE_2:        BIT     5,(IY+#01)
  4661.                 JR      Z,PAUSE_1
  4662. PAUSE_END:      RES     5,(IY+#01)
  4663.                 RET
  4664.  
  4665. ; Check for BREAK key
  4666. BREAK_KEY:      LD      A,#7F
  4667.                 IN      A,(#FE)
  4668.                 RRA
  4669.                 RET     C
  4670.                 LD      A,#FE
  4671.                 IN      A,(#FE)
  4672.                 RRA
  4673.                 RET
  4674.  
  4675. ; Handle DEF FN command
  4676. DEF_FN:         CALL    SYNTAX_Z
  4677.                 JR      Z,DEF_FN_1
  4678.                 LD      A,#CE
  4679.                 JP      PASS_BY
  4680.  
  4681. DEF_FN_1:       SET     6,(IY+#01)
  4682.                 CALL    ALPHA
  4683.                 JR      NC,DEF_FN_4
  4684.                 RST     #20
  4685.                 CP      #24
  4686.                 JR      NZ,DEF_FN_2
  4687.                 RES     6,(IY+#01)
  4688.                 RST     #20
  4689. DEF_FN_2:       CP      #28
  4690.                 JR      NZ,DEF_FN_7
  4691.                 RST     #20
  4692.                 CP      #29
  4693.                 JR      Z,DEF_FN_6
  4694. DEF_FN_3:       CALL    ALPHA
  4695. DEF_FN_4:       JP      NC,REPORT_C
  4696.                 EX      DE,HL
  4697.                 RST     #20
  4698.                 CP      #24
  4699.                 JR      NZ,DEF_FN_5
  4700.                 EX      DE,HL
  4701.                 RST     #20
  4702. DEF_FN_5:       EX      DE,HL
  4703.                 LD      BC,#0006
  4704.                 CALL    MAKE_ROOM
  4705.                 INC     HL
  4706.                 INC     HL
  4707.                 LD      (HL),#0E
  4708.                 CP      #2C
  4709.                 JR      NZ,DEF_FN_6
  4710.                 RST     #20
  4711.                 JR      DEF_FN_3
  4712.  
  4713. DEF_FN_6:       CP      #29
  4714.                 JR      NZ,DEF_FN_7
  4715.                 RST     #20
  4716.                 CP      #3D
  4717.                 JR      NZ,DEF_FN_7
  4718.                 RST     #20
  4719.                 LD      A,(#5C3B)
  4720.                 PUSH    AF
  4721.                 CALL    SCANNING
  4722.                 POP     AF
  4723.                 XOR     (IY+#01)
  4724.                 AND     #40
  4725. DEF_FN_7:       JP      NZ,REPORT_C
  4726.                 CALL    CHECK_END
  4727. UNSTACK_Z:      CALL    SYNTAX_Z
  4728.                 POP     HL
  4729.                 RET     Z
  4730.                 JP      (HL)
  4731.  
  4732. ; Handle LPRINT command
  4733. LPRINT:         LD      A,#03
  4734.                 JR      PRINT_1
  4735.  
  4736. ; Handle PRINT command
  4737. PRINT:          LD      A,#02
  4738. PRINT_1:        CALL    SYNTAX_Z
  4739.                 CALL    NZ,CHAN_OPEN
  4740.                 CALL    TEMPS
  4741.                 CALL    PRINT_2
  4742.                 CALL    CHECK_END
  4743.                 RET
  4744.  
  4745. PRINT_2:        RST     #18
  4746.                 CALL    PR_END_Z
  4747.                 JR      Z,PRINT_4
  4748. PRINT_3:        CALL    PR_POSN_1
  4749.                 JR      Z,PRINT_3
  4750.                 CALL    PR_ITEM_1
  4751.                 CALL    PR_POSN_1
  4752.                 JR      Z,PRINT_3
  4753. PRINT_4:        CP      #29
  4754.                 RET     Z
  4755. PRINT_CR:       CALL    UNSTACK_Z
  4756. PRINT_5:        LD      A,#0D
  4757.                 RST     #10
  4758.                 RET
  4759.  
  4760. ; Print items
  4761. PR_ITEM_1:      RST     #18
  4762.                 CP      #AC
  4763.                 JR      NZ,PR_ITEM_2
  4764.                 CALL    NEXT_2NUM
  4765.                 CALL    UNSTACK_Z
  4766.                 CALL    STK_TO_BC
  4767.                 LD      A,#16
  4768.                 JR      PR_AT_TAB
  4769.  
  4770. PR_ITEM_2:      CP      #AD
  4771.                 JR      NZ,PR_ITEM_3
  4772.                 RST     #20
  4773.                 CALL    EXPT_1NUM
  4774.                 CALL    UNSTACK_Z
  4775.                 CALL    FIND_INT2
  4776.                 LD      A,#17
  4777. PR_AT_TAB:      RST     #10
  4778.                 LD      A,C
  4779.                 RST     #10
  4780.                 LD      A,B
  4781.                 RST     #10
  4782.                 RET
  4783.  
  4784. PR_ITEM_3:      CALL    CO_TEMP_3
  4785.                 RET     NC
  4786.                 CALL    STR_ALTER
  4787.                 RET     NC
  4788.                 CALL    SCANNING
  4789.                 CALL    UNSTACK_Z
  4790.                 BIT     6,(IY+#01)
  4791.                 CALL    Z,STK_FETCH
  4792.                 JP      NZ,PRINT_FP
  4793. PR_STRING:      LD      A,B
  4794.                 OR      C
  4795.                 DEC     BC
  4796.                 RET     Z
  4797.                 LD      A,(DE)
  4798.                 INC     DE
  4799.                 RST     #10
  4800.                 JR      PR_STRING
  4801.  
  4802. ; End of printing
  4803. PR_END_Z:       CP      #29                     ; ')'
  4804.                 RET     Z
  4805. PR_ST_END:      CP      #0D                     ; carriage return
  4806.                 RET     Z
  4807.                 CP      #3A                     ; ':'
  4808.                 RET
  4809.  
  4810. ; Consider print position by ';' or ',' or '''
  4811. PR_POSN_1:      RST     #18
  4812.                 CP      #3B
  4813.                 JR      Z,PR_POSN_3
  4814.                 CP      #2C
  4815.                 JR      NZ,PR_POSN_2
  4816.                 CALL    SYNTAX_Z
  4817.                 JR      Z,PR_POSN_3
  4818.                 LD      A,#06
  4819.                 RST     #10
  4820.                 JR      PR_POSN_3
  4821.  
  4822. PR_POSN_2:      CP      #27
  4823.                 RET     NZ
  4824.                 CALL    PRINT_CR
  4825. PR_POSN_3:      RST     #20
  4826.                 CALL    PR_END_Z
  4827.                 JR      NZ,PR_POSN_4
  4828.                 POP     BC
  4829. PR_POSN_4:      CP      A
  4830.                 RET
  4831.  
  4832. ; Alter stream
  4833. STR_ALTER:      CP      #23
  4834.                 SCF
  4835.                 RET     NZ
  4836.                 RST     #20
  4837.                 CALL    EXPT_1NUM
  4838.                 AND     A
  4839.                 CALL    UNSTACK_Z
  4840.                 CALL    FIND_INT1
  4841.                 CP      #10
  4842.                 JP      NC,REPORT_OA
  4843.                 CALL    CHAN_OPEN
  4844.                 AND     A
  4845.                 RET
  4846.  
  4847. ; Handle INPUT command
  4848. INPUT:          CALL    SYNTAX_Z
  4849.                 JR      Z,INPUT_1
  4850.                 LD      A,#01
  4851.                 CALL    CHAN_OPEN
  4852.                 CALL    CLS_LOWER
  4853. INPUT_1:        LD      (IY+#02),#01
  4854.                 CALL    IN_ITEM_1
  4855.                 CALL    CHECK_END
  4856.                 LD      BC,(#5C88)
  4857.                 LD      A,(#5C6B)
  4858.                 CP      B
  4859.                 JR      C,INPUT_2
  4860.                 LD      C,#21
  4861.                 LD      B,A
  4862. INPUT_2:        LD      (#5C88),BC
  4863.                 LD      A,#19
  4864.                 SUB     B
  4865.                 LD      (#5C8C),A
  4866.                 RES     0,(IY+#02)
  4867.                 CALL    CL_SET
  4868.                 JP      CLS_LOWER
  4869.  
  4870. ; Handle input items from the current input channel
  4871. IN_ITEM_1:      CALL    PR_POSN_1
  4872.                 JR      Z,IN_ITEM_1
  4873.                 CP      #28
  4874.                 JR      NZ,IN_ITEM_2
  4875.                 RST     #20
  4876.                 CALL    PRINT_2
  4877.                 RST     #18
  4878.                 CP      #29
  4879.                 JP      NZ,REPORT_C
  4880.                 RST     #20
  4881.                 JP      IN_NEXT_2
  4882.  
  4883. IN_ITEM_2:      CP      #CA
  4884.                 JR      NZ,IN_ITEM_3
  4885.                 RST     #20
  4886.                 CALL    CLASS_01
  4887.                 SET     7,(IY+#37)
  4888.                 BIT     6,(IY+#01)
  4889.                 JP      NZ,REPORT_C
  4890.                 JR      IN_PROMPT
  4891.  
  4892. IN_ITEM_3:      CALL    ALPHA
  4893.                 JP      NC,IN_NEXT_1
  4894.                 CALL    CLASS_01
  4895.                 RES     7,(IY+#37)
  4896. IN_PROMPT:      CALL    SYNTAX_Z
  4897.                 JP      Z,IN_NEXT_2
  4898.                 CALL    SET_WORK
  4899.                 LD      HL,#5C71
  4900.                 RES     6,(HL)
  4901.                 SET     5,(HL)
  4902.                 LD      BC,#0001
  4903.                 BIT     7,(HL)
  4904.                 JR      NZ,IN_PR_2
  4905.                 LD      A,(#5C3B)
  4906.                 AND     #40
  4907.                 JR      NZ,IN_PR_1
  4908.                 LD      C,#03
  4909. IN_PR_1:        OR      (HL)
  4910.                 LD      (HL),A
  4911. IN_PR_2:        RST     #30
  4912.                 LD      (HL),#0D
  4913.                 LD      A,C
  4914.                 RRCA
  4915.                 RRCA
  4916.                 JR      NC,IN_PR_3
  4917.                 LD      A,#22
  4918.                 LD      (DE),A
  4919.                 DEC     HL
  4920.                 LD      (HL),A
  4921. IN_PR_3:        LD      (#5C5B),HL
  4922.                 BIT     7,(IY+#37)
  4923.                 JR      NZ,IN_VAR_3
  4924.                 LD      HL,(#5C5D)
  4925.                 PUSH    HL
  4926.                 LD      HL,(#5C3D)
  4927.                 PUSH    HL
  4928. IN_VAR_1:       LD      HL,IN_VAR_1
  4929.                 PUSH    HL
  4930.                 BIT     4,(IY+#30)
  4931.                 JR      Z,IN_VAR_2
  4932.                 LD      (#5C3D),SP
  4933. IN_VAR_2:       LD      HL,(#5C61)
  4934.                 CALL    REMOVE_FP
  4935.                 LD      (IY+#00),#FF
  4936.                 CALL    EDITOR
  4937.                 RES     7,(IY+#01)
  4938.                 CALL    IN_ASSIGN
  4939.                 JR      IN_VAR_4
  4940.  
  4941. IN_VAR_3:       CALL    EDITOR
  4942. IN_VAR_4:       LD      (IY+#22),#00
  4943.                 CALL    IN_CHAN_K
  4944.                 JR      NZ,IN_VAR_5
  4945.                 CALL    ED_COPY
  4946.                 LD      BC,(#5C82)
  4947.                 CALL    CL_SET
  4948. IN_VAR_5:       LD      HL,#5C71
  4949.                 RES     5,(HL)
  4950.                 BIT     7,(HL)
  4951.                 RES     7,(HL)
  4952.                 JR      NZ,IN_VAR_6
  4953.                 POP     HL
  4954.                 POP     HL
  4955.                 LD      (#5C3D),HL
  4956.                 POP     HL
  4957.                 LD      (#5C5F),HL
  4958.                 SET     7,(IY+#01)
  4959.                 CALL    IN_ASSIGN
  4960.                 LD      HL,(#5C5F)
  4961.                 LD      (IY+#26),#00
  4962.                 LD      (#5C5D),HL
  4963.                 JR      IN_NEXT_2
  4964.  
  4965. IN_VAR_6:       LD      HL,(#5C63)
  4966.                 LD      DE,(#5C61)
  4967.                 SCF
  4968.                 SBC     HL,DE
  4969.                 LD      B,H
  4970.                 LD      C,L
  4971.                 CALL    STK_STO_D
  4972.                 CALL    LET
  4973.                 JR      IN_NEXT_2
  4974.  
  4975. IN_NEXT_1:      CALL    PR_ITEM_1
  4976. IN_NEXT_2:      CALL    PR_POSN_1
  4977.                 JP      Z,IN_ITEM_1
  4978.                 RET
  4979.  
  4980. ; INPUT sytax check and assignment
  4981. IN_ASSIGN:      LD      HL,(#5C61)
  4982.                 LD      (#5C5D),HL
  4983.                 RST     #18
  4984.                 CP      #E2                     ; STOP
  4985.                 JR      Z,IN_STOP
  4986.                 LD      A,(#5C71)
  4987.                 CALL    VAL_FET_2
  4988.                 RST     #18
  4989.                 CP      #0D                     ; carriage return
  4990.                 RET     Z
  4991. REPORT_CB:      RST     #08                     ; Error report
  4992.                 DB      #0B                     ; Nonsense in BASIC
  4993. IN_STOP:        CALL    SYNTAX_Z
  4994.                 RET     Z
  4995. REPORT_H:       RST     #08                     ; Error report
  4996.                 DB      #10                     ; STOP in INPUT
  4997. IN_CHAN_K:      LD      HL,(#5C51)              ; Test for K channel
  4998.                 INC     HL
  4999.                 INC     HL
  5000.                 INC     HL
  5001.                 INC     HL
  5002.                 LD      A,(HL)
  5003.                 CP      #4B
  5004.                 RET
  5005.  
  5006. ; Color item routines
  5007. CO_TEMP_1:      RST     #20
  5008. CO_TEMP_2:      CALL    CO_TEMP_3
  5009.                 RET     C
  5010.                 RST     #18
  5011.                 CP      #2C
  5012.                 JR      Z,CO_TEMP_1
  5013.                 CP      #3B
  5014.                 JR      Z,CO_TEMP_1
  5015.                 JP      REPORT_C
  5016.  
  5017. CO_TEMP_3:      CP      #D9
  5018.                 RET     C
  5019.                 CP      #DF
  5020.                 CCF
  5021.                 RET     C
  5022.                 PUSH    AF
  5023.                 RST     #20
  5024.                 POP     AF
  5025. CO_TEMP_4:      SUB     #C9
  5026.                 PUSH    AF
  5027.                 CALL    EXPT_1NUM
  5028.                 POP     AF
  5029.                 AND     A
  5030.                 CALL    UNSTACK_Z
  5031.                 PUSH    AF
  5032.                 CALL    FIND_INT1
  5033.                 LD      D,A
  5034.                 POP     AF
  5035.                 RST     #10
  5036.                 LD      A,D
  5037.                 RST     #10
  5038.                 RET
  5039.  
  5040. ; The color system variable handler
  5041. CO_TEMP_5:      SUB     #11
  5042.                 ADC     A,#00
  5043.                 JR      Z,CO_TEMP_7
  5044.                 SUB     #02
  5045.                 ADC     A,#00
  5046.                 JR      Z,CO_TEMP_C
  5047.                 CP      #01
  5048.                 LD      A,D
  5049.                 LD      B,#01
  5050.                 JR      NZ,CO_TEMP_6
  5051.                 RLCA
  5052.                 RLCA
  5053.                 LD      B,#04
  5054. CO_TEMP_6:      LD      C,A
  5055.                 LD      A,D
  5056.                 CP      #02
  5057.                 JR      NC,REPORT_K
  5058.                 LD      A,C
  5059.                 LD      HL,#5C91
  5060.                 JR      CO_CHANGE
  5061. CO_TEMP_7:      LD      A,D
  5062.                 LD      B,#07
  5063.                 JR      C,CO_TEMP_8
  5064.                 RLCA
  5065.                 RLCA
  5066.                 RLCA
  5067.                 LD      B,#38
  5068. CO_TEMP_8:      LD      C,A
  5069.                 LD      A,D
  5070.                 CP      #0A
  5071.                 JR      C,CO_TEMP_9
  5072. REPORT_K:       RST     #08                     ; Error report
  5073.                 DB      #13                     ; Invalid colour
  5074. CO_TEMP_9:      LD      HL,#5C8F
  5075.                 CP      #08
  5076.                 JR      C,CO_TEMP_B
  5077.                 LD      A,(HL)
  5078.                 JR      Z,CO_TEMP_A
  5079.                 OR      B
  5080.                 CPL
  5081.                 AND     #24
  5082.                 JR      Z,CO_TEMP_A
  5083.                 LD      A,B
  5084. CO_TEMP_A:      LD      C,A
  5085. CO_TEMP_B:      LD      A,C
  5086.                 CALL    CO_CHANGE
  5087.                 LD      A,#07
  5088.                 CP      D
  5089.                 SBC     A,A
  5090.                 CALL    CO_CHANGE
  5091.                 RLCA
  5092.                 RLCA
  5093.                 AND     #50
  5094.                 LD      B,A
  5095.                 LD      A,#08
  5096.                 CP      D
  5097.                 SBC     A,A
  5098.  
  5099. ; Handle change of color
  5100. CO_CHANGE:      XOR     (HL)
  5101.                 AND     B
  5102.                 XOR     (HL)
  5103.                 LD      (HL),A
  5104.                 INC     HL
  5105.                 LD      A,B
  5106.                 RET
  5107.  
  5108. CO_TEMP_C:      SBC     A,A
  5109.                 LD      A,D
  5110.                 RRCA
  5111.                 LD      B,#80
  5112.                 JR      NZ,CO_TEMP_D
  5113.                 RRCA
  5114.                 LD      B,#40
  5115. CO_TEMP_D:      LD      C,A
  5116.                 LD      A,D
  5117.                 CP      #08
  5118.                 JR      Z,CO_TEMP_E
  5119.                 CP      #02
  5120.                 JR      NC,REPORT_K
  5121. CO_TEMP_E:      LD      A,C
  5122.                 LD      HL,#5C8F
  5123.                 CALL    CO_CHANGE
  5124.                 LD      A,C
  5125.                 RRCA
  5126.                 RRCA
  5127.                 RRCA
  5128.                 JR      CO_CHANGE
  5129.  
  5130. ; Handle BORDER command
  5131. BORDER:         CALL    FIND_INT1
  5132.                 CP      #08
  5133.                 JR      NC,REPORT_K
  5134.                 OUT     (#FE),A
  5135.                 RLCA
  5136.                 RLCA
  5137.                 RLCA
  5138.                 BIT     5,A
  5139.                 JR      NZ,BORDER_1
  5140.                 XOR     #07
  5141. BORDER_1:       LD      (#5C48),A
  5142.                 RET
  5143.  
  5144. ; Get pixel address
  5145. PIXEL_ADD:      LD      A,#AF
  5146.                 SUB     B
  5147.                 JP      C,REPORT_BC
  5148.                 LD      B,A
  5149.                 AND     A
  5150.                 RRA
  5151.                 SCF
  5152.                 RRA
  5153.                 AND     A
  5154.                 RRA
  5155.                 XOR     B
  5156.                 AND     #F8
  5157.                 XOR     B
  5158.                 LD      H,A
  5159.                 LD      A,C
  5160.                 RLCA
  5161.                 RLCA
  5162.                 RLCA
  5163.                 XOR     B
  5164.                 AND     #C7
  5165.                 XOR     B
  5166.                 RLCA
  5167.                 RLCA
  5168.                 LD      L,A
  5169.                 LD      A,C
  5170.                 AND     #07
  5171.                 RET
  5172.  
  5173. ; Point subroutine
  5174. POINT_SUB:      CALL    STK_TO_BC
  5175.                 CALL    PIXEL_ADD
  5176.                 LD      B,A
  5177.                 INC     B
  5178.                 LD      A,(HL)
  5179. POINT_LP:       RLCA
  5180.                 DJNZ    POINT_LP
  5181.                 AND     #01
  5182.                 JP      STACK_A
  5183.  
  5184. ; Handle PLOT command
  5185. PLOT:           CALL    STK_TO_BC
  5186.                 CALL    PLOT_SUB
  5187.                 JP      TEMPS
  5188.  
  5189. PLOT_SUB:       LD      (#5C7D),BC
  5190.                 CALL    PIXEL_ADD
  5191.                 LD      B,A
  5192.                 INC     B
  5193.                 LD      A,#FE
  5194. PLOT_LOOP:      RRCA
  5195.                 DJNZ    PLOT_LOOP
  5196.                 LD      B,A
  5197.                 LD      A,(HL)
  5198.                 LD      C,(IY+#57)
  5199.                 BIT     0,C
  5200.                 JR      NZ,PL_TST_IN
  5201.                 AND     B
  5202. PL_TST_IN:      BIT     2,C
  5203.                 JR      NZ,PLOT_END
  5204.                 XOR     B
  5205.                 CPL
  5206. PLOT_END:       LD      (HL),A
  5207.                 JP      PO_ATTR
  5208.  
  5209. ; Put two numbers in BC register
  5210. STK_TO_BC:      CALL    STK_TO_A
  5211.                 LD      B,A
  5212.                 PUSH    BC
  5213.                 CALL    STK_TO_A
  5214.                 LD      E,C
  5215.                 POP     BC
  5216.                 LD      D,C
  5217.                 LD      C,A
  5218.                 RET
  5219.  
  5220. ; Put the last value on the calc stack into the accumulator
  5221. STK_TO_A:       CALL    FP_TO_A
  5222.                 JP      C,REPORT_BC
  5223.                 LD      C,#01
  5224.                 RET     Z
  5225.                 LD      C,#FF
  5226.                 RET
  5227.  
  5228. ; Handle CIRCLE command
  5229. CIRCLE:         RST     #18
  5230.                 CP      #2C
  5231.                 JP      NZ,REPORT_C
  5232.                 RST     #20
  5233.                 CALL    EXPT_1NUM
  5234.                 CALL    CHECK_END
  5235.                 RST     #28                     ;FP_CALC
  5236.                 DB      #2A                     ;ABS
  5237.                 DB      #3D                     ;RE_STACK
  5238.                 DB      #38                     ;END_CALC
  5239.                 LD      A,(HL)
  5240.                 CP      #81
  5241.                 JR      NC,C_R_GRE_1
  5242.                 RST     #28                     ;FP_CALC
  5243.                 DB      #02                     ;DELETE
  5244.                 DB      #38                     ;END_CALC
  5245.                 JR      PLOT
  5246.  
  5247. C_R_GRE_1:      RST     #28                     ;FP_CALC
  5248.                 DB      #A3                     ;STK_PI_2
  5249.                 DB      #38                     ;END_CALC
  5250.                 LD      (HL),#83
  5251.                 RST     #28                     ;FP_CALC
  5252.                 DB      #C5                     ;ST_MEM_5
  5253.                 DB      #02                     ;DELETE
  5254.                 DB      #38                     ;END_CALC
  5255.                 CALL    CD_PRMS1
  5256.                 PUSH    BC
  5257.                 RST     #28                     ;FP_CALC
  5258.                 DB      #31                     ;DUPLICATE
  5259.                 DB      #E1                     ;GET_MEM_1
  5260.                 DB      #04                     ;MULTIPLY
  5261.                 DB      #38                     ;END_CALC
  5262.                 LD      A,(HL)
  5263.                 CP      #80
  5264.                 JR      NC,C_ARC_GE1
  5265.                 RST     #28                     ;FP_CALC
  5266.                 DB      #02                     ;DELETE
  5267.                 DB      #02                     ;DELETE
  5268.                 DB      #38                     ;END_CALC
  5269.                 POP     BC
  5270.                 JP      PLOT
  5271.  
  5272. C_ARC_GE1:      RST     #28                     ;FP_CALC
  5273.                 DB      #C2                     ;ST_MEM_2
  5274.                 DB      #01                     ;EXCHANGE
  5275.                 DB      #C0                     ;ST_MEM_0
  5276.                 DB      #02                     ;DELETE
  5277.                 DB      #03                     ;SUBTRACT
  5278.                 DB      #01                     ;EXCHANGE
  5279.                 DB      #E0                     ;GET_MEM_0
  5280.                 DB      #0F                     ;ADDITION
  5281.                 DB      #C0                     ;ST_MEM_0
  5282.                 DB      #01                     ;EXCHANGE
  5283.                 DB      #31                     ;DUPLICATE
  5284.                 DB      #E0                     ;GET_MEM_0
  5285.                 DB      #01                     ;EXCHANGE
  5286.                 DB      #31                     ;DUPLICATE
  5287.                 DB      #E0                     ;GET_MEM_0
  5288.                 DB      #A0                     ;STK_ZERO
  5289.                 DB      #C1                     ;ST_MEM_1
  5290.                 DB      #02                     ;DELETE
  5291.                 DB      #38                     ;END_CALC
  5292.                 INC     (IY+#62)
  5293.                 CALL    FIND_INT1
  5294.                 LD      L,A
  5295.                 PUSH    HL
  5296.                 CALL    FIND_INT1
  5297.                 POP     HL
  5298.                 LD      H,A
  5299.                 LD      (#5C7D),HL
  5300.                 POP     BC
  5301.                 JP      DRW_STEPS
  5302.  
  5303. ; Handle DRAW command
  5304. DRAW:           RST     #18
  5305.                 CP      #2C
  5306.                 JR      Z,DR_3_PRMS
  5307.                 CALL    CHECK_END
  5308.                 JP      LINE_DRAW
  5309.  
  5310. DR_3_PRMS:      RST     #20
  5311.                 CALL    EXPT_1NUM
  5312.                 CALL    CHECK_END
  5313.                 RST     #28                     ;FP_CALC
  5314.                 DB      #C5                     ;ST_MEM_5
  5315.                 DB      #A2                     ;STK_HALF
  5316.                 DB      #04                     ;MULTIPLY
  5317.                 DB      #1F                     ;SIN
  5318.                 DB      #31                     ;DUPLICATE
  5319.                 DB      #30                     ;NOT
  5320.                 DB      #30                     ;NOT
  5321.                 DB      #00                     ;JUMP_TRUE
  5322.                 DB      #06                     ;to DR_SIN_NZ
  5323.                 DB      #02                     ;DELETE
  5324.                 DB      #38                     ;END_CALC
  5325.                 JP      LINE_DRAW
  5326.  
  5327. DR_SIN_NZ:      DB      #C0                     ;ST_MEM_0
  5328.                 DB      #02                     ;DELETE
  5329.                 DB      #C1                     ;ST_MEM_1
  5330.                 DB      #02                     ;DELETE
  5331.                 DB      #31                     ;DUPLICATE
  5332.                 DB      #2A                     ;ABS
  5333.                 DB      #E1                     ;GET_MEM_1
  5334.                 DB      #01                     ;EXCHANGE
  5335.                 DB      #E1                     ;GET_MEM_1
  5336.                 DB      #2A                     ;ABS
  5337.                 DB      #0F                     ;ADDITION
  5338.                 DB      #E0                     ;GET_MEM_0
  5339.                 DB      #05                     ;DIVISION
  5340.                 DB      #2A                     ;ABS
  5341.                 DB      #E0                     ;GET_MEM_0
  5342.                 DB      #01                     ;EXCHANGE
  5343.                 DB      #3D                     ;RE_STACK
  5344.                 DB      #38                     ;END_CALC
  5345.                 LD      A,(HL)
  5346.                 CP      #81
  5347.                 JR      NC,DR_PRMS
  5348.                 RST     #28                     ;FP_CALC
  5349.                 DB      #02                     ;DELETE
  5350.                 DB      #02                     ;DELETE
  5351.                 DB      #38                     ;END_CALC
  5352.                 JP      LINE_DRAW
  5353.  
  5354. DR_PRMS:        CALL    CD_PRMS1
  5355.                 PUSH    BC
  5356.                 RST     #28                     ;FP_CALC
  5357.                 DB      #02                     ;DELETE
  5358.                 DB      #E1                     ;GET_MEM_1
  5359.                 DB      #01                     ;EXCHANGE
  5360.                 DB      #05                     ;DIVISION
  5361.                 DB      #C1                     ;ST_MEM_1
  5362.                 DB      #02                     ;DELETE
  5363.                 DB      #01                     ;EXCHANGE
  5364.                 DB      #31                     ;DUPLICATE
  5365.                 DB      #E1                     ;GET_MEM_1
  5366.                 DB      #04                     ;MULTIPLY
  5367.                 DB      #C2                     ;ST_MEM_2
  5368.                 DB      #02                     ;DELETE
  5369.                 DB      #01                     ;EXCHANGE
  5370.                 DB      #31                     ;DUPLICATE
  5371.                 DB      #E1                     ;GET_MEM_1
  5372.                 DB      #04                     ;MULTIPLY
  5373.                 DB      #E2                     ;GET_MEM_2
  5374.                 DB      #E5                     ;GET_MEM_5
  5375.                 DB      #E0                     ;GET_MEM_0
  5376.                 DB      #03                     ;SUBTRACT
  5377.                 DB      #A2                     ;STK_HALF
  5378.                 DB      #04                     ;MULTIPLY
  5379.                 DB      #31                     ;DUPLICATE
  5380.                 DB      #1F                     ;SIN
  5381.                 DB      #C5                     ;ST_MEM_5
  5382.                 DB      #02                     ;DELETE
  5383.                 DB      #20                     ;COS
  5384.                 DB      #C0                     ;ST_MEM_0
  5385.                 DB      #02                     ;DELETE
  5386.                 DB      #C2                     ;ST_MEM_2
  5387.                 DB      #02                     ;DELETE
  5388.                 DB      #C1                     ;ST_MEM_1
  5389.                 DB      #E5                     ;GET_MEM_5
  5390.                 DB      #04                     ;MULTIPLY
  5391.                 DB      #E0                     ;GET_MEM_0
  5392.                 DB      #E2                     ;GET_MEM_2
  5393.                 DB      #04                     ;MULTIPLY
  5394.                 DB      #0F                     ;ADDITION
  5395.                 DB      #E1                     ;GET_MEM_1
  5396.                 DB      #01                     ;EXCHANGE
  5397.                 DB      #C1                     ;ST_MEM_1
  5398.                 DB      #02                     ;DELETE
  5399.                 DB      #E0                     ;GET_MEM_0
  5400.                 DB      #04                     ;MULTIPLY
  5401.                 DB      #E2                     ;GET_MEM_2
  5402.                 DB      #E5                     ;GET_MEM_5
  5403.                 DB      #04                     ;MULTIPLY
  5404.                 DB      #03                     ;SUBTRACT
  5405.                 DB      #C2                     ;ST_MEM_2
  5406.                 DB      #2A                     ;ABS
  5407.                 DB      #E1                     ;GET_MEM_1
  5408.                 DB      #2A                     ;ABS
  5409.                 DB      #0F                     ;ADDITION
  5410.                 DB      #02                     ;DELETE
  5411.                 DB      #38                     ;END_CALC
  5412.                 LD      A,(DE)
  5413.                 CP      #81
  5414.                 POP     BC
  5415.                 JP      C,LINE_DRAW
  5416.                 PUSH    BC
  5417.                 RST     #28                     ;FP_CALC
  5418.                 DB      #01                     ;EXCHANGE
  5419.                 DB      #38                     ;END_CALC
  5420.                 LD      A,(#5C7D)
  5421.                 CALL    STACK_A
  5422.                 RST     #28                     ;FP_CALC
  5423.                 DB      #C0                     ;ST_MEM_0
  5424.                 DB      #0F                     ;ADDITION
  5425.                 DB      #01                     ;EXCHANGE
  5426.                 DB      #38                     ;END_CALC
  5427.                 LD      A,(#5C7E)
  5428.                 CALL    STACK_A
  5429.                 RST     #28                     ;FP_CALC
  5430.                 DB      #C5                     ;ST_MEM_5
  5431.                 DB      #0F                     ;ADDITION
  5432.                 DB      #E0                     ;GET_MEM_0
  5433.                 DB      #E5                     ;GET_MEM_5
  5434.                 DB      #38                     ;END_CALC
  5435.                 POP     BC
  5436. DRW_STEPS:      DEC     B
  5437.                 JR      Z,ARC_END
  5438.                 JR      ARC_START
  5439.  
  5440. ARC_LOOP:       RST     #28                     ;FP_CALC
  5441.                 DB      #E1                     ;GET_MEM_1
  5442.                 DB      #31                     ;DUPLICATE
  5443.                 DB      #E3                     ;GET_MEM_3
  5444.                 DB      #04                     ;MULTIPLY
  5445.                 DB      #E2                     ;GET_MEM_2
  5446.                 DB      #E4                     ;GET_MEM_4
  5447.                 DB      #04                     ;MULTIPLY
  5448.                 DB      #03                     ;SUBTRACT
  5449.                 DB      #C1                     ;ST_MEM_1
  5450.                 DB      #02                     ;DELETE
  5451.                 DB      #E4                     ;GET_MEM_4
  5452.                 DB      #04                     ;MULTIPLY
  5453.                 DB      #E2                     ;GET_MEM_2
  5454.                 DB      #E3                     ;GET_MEM_3
  5455.                 DB      #04                     ;MULTIPLY
  5456.                 DB      #0F                     ;ADDITION
  5457.                 DB      #C2                     ;ST_MEM_2
  5458.                 DB      #02                     ;DELETE
  5459.                 DB      #38                     ;END_CALC
  5460. ARC_START:      PUSH    BC
  5461.                 RST     #28                     ;FP_CALC
  5462.                 DB      #C0                     ;ST_MEM_0
  5463.                 DB      #02                     ;DELETE
  5464.                 DB      #E1                     ;GET_MEM_1
  5465.                 DB      #0F                     ;ADDITION
  5466.                 DB      #31                     ;DUPLICATE
  5467.                 DB      #38                     ;END_CALC
  5468.                 LD      A,(#5C7D)
  5469.                 CALL    STACK_A
  5470.                 RST     #28                     ;FP_CALC
  5471.                 DB      #03                     ;SUBTRACT
  5472.                 DB      #E0                     ;GET_MEM_0
  5473.                 DB      #E2                     ;GET_MEM_2
  5474.                 DB      #0F                     ;ADDITION
  5475.                 DB      #C0                     ;ST_MEM_0
  5476.                 DB      #01                     ;EXCHANGE
  5477.                 DB      #E0                     ;GET_MEM_0
  5478.                 DB      #38                     ;END_CALC
  5479.                 LD      A,(#5C7E)
  5480.                 CALL    STACK_A
  5481.                 RST     #28                     ;FP_CALC
  5482.                 DB      #03                     ;SUBTRACT
  5483.                 DB      #38                     ;END_CALC
  5484.                 CALL    DRAW_LINE
  5485.                 POP     BC
  5486.                 DJNZ    ARC_LOOP
  5487. ARC_END:        RST     #28                     ;FP_CALC
  5488.                 DB      #02                     ;DELETE
  5489.                 DB      #02                     ;DELETE
  5490.                 DB      #01                     ;EXCHANGE
  5491.                 DB      #38                     ;END_CALC
  5492.                 LD      A,(#5C7D)
  5493.                 CALL    STACK_A
  5494.                 RST     #28                     ;FP_CALC
  5495.                 DB      #03                     ;SUBTRACT
  5496.                 DB      #01                     ;EXCHANGE
  5497.                 DB      #38                     ;END_CALC
  5498.                 LD      A,(#5C7E)
  5499.                 CALL    STACK_A
  5500.                 RST     #28                     ;FP_CALC
  5501.                 DB      #03                     ;SUBTRACT
  5502.                 DB      #38                     ;END_CALC
  5503. LINE_DRAW:      CALL    DRAW_LINE
  5504.                 JP      TEMPS
  5505.  
  5506. ; Initial parameters
  5507. CD_PRMS1:       RST     #28                     ;FP_CALC
  5508.                 DB      #31                     ;DUPLICATE
  5509.                 DB      #28                     ;SQR
  5510.                 DB      #34                     ;STK_DATA
  5511.                 DB      #32                     ;EXPONENT
  5512.                 DB      #00                     ;
  5513.                 DB      #01                     ;EXCHANGE
  5514.                 DB      #05                     ;DIVISION
  5515.                 DB      #E5                     ;GET_MEM_5
  5516.                 DB      #01                     ;EXCHANGE
  5517.                 DB      #05                     ;DIVISION
  5518.                 DB      #2A                     ;ABS
  5519.                 DB      #38                     ;END_CALC
  5520.                 CALL    FP_TO_A
  5521.                 JR      C,USE_252
  5522.                 AND     #FC
  5523.                 ADD     A,#04
  5524.                 JR      NC,DRAW_SAVE
  5525. USE_252:        LD      A,#FC
  5526. DRAW_SAVE:      PUSH    AF
  5527.                 CALL    STACK_A
  5528.                 RST     #28                     ;FP_CALC
  5529.                 DB      #E5                     ;GET_MEM_5
  5530.                 DB      #01                     ;EXCHANGE
  5531.                 DB      #05                     ;DIVISION
  5532.                 DB      #31                     ;DUPLICATE
  5533.                 DB      #1F                     ;SIN
  5534.                 DB      #C4                     ;ST_MEM_4
  5535.                 DB      #02                     ;DELETE
  5536.                 DB      #31                     ;DUPLICATE
  5537.                 DB      #A2                     ;STK_HALF
  5538.                 DB      #04                     ;MULTIPLY
  5539.                 DB      #1F                     ;SIN
  5540.                 DB      #C1                     ;ST_MEM_1
  5541.                 DB      #01                     ;EXCHANGE
  5542.                 DB      #C0                     ;ST_MEM_0
  5543.                 DB      #02                     ;DELETE
  5544.                 DB      #31                     ;DUPLICATE
  5545.                 DB      #04                     ;MULTIPLY
  5546.                 DB      #31                     ;DUPLICATE
  5547.                 DB      #0F                     ;ADDITION
  5548.                 DB      #A1                     ;STK_ONE
  5549.                 DB      #03                     ;SUBTRACT
  5550.                 DB      #1B                     ;NEGATE
  5551.                 DB      #C3                     ;ST_MEM_3
  5552.                 DB      #02                     ;DELETE
  5553.                 DB      #38                     ;END_CALC
  5554.                 POP     BC
  5555.                 RET
  5556.  
  5557. ; Line drawing
  5558. DRAW_LINE:      CALL    STK_TO_BC
  5559.                 LD      A,C
  5560.                 CP      B
  5561.                 JR      NC,DL_X_GE_Y
  5562.                 LD      L,C
  5563.                 PUSH    DE
  5564.                 XOR     A
  5565.                 LD      E,A
  5566.                 JR      DL_LARGER
  5567.  
  5568. DL_X_GE_Y:      OR      C
  5569.                 RET     Z
  5570.                 LD      L,B
  5571.                 LD      B,C
  5572.                 PUSH    DE
  5573.                 LD      D,#00
  5574. DL_LARGER:      LD      H,B
  5575.                 LD      A,B
  5576.                 RRA
  5577. D_L_LOOP:       ADD     A,L
  5578.                 JR      C,D_L_DIAG
  5579.                 CP      H
  5580.                 JR      C,D_L_HR_VT
  5581. D_L_DIAG:       SUB     H
  5582.                 LD      C,A
  5583.                 EXX
  5584.                 POP     BC
  5585.                 PUSH    BC
  5586.                 JR      D_L_STEP
  5587.  
  5588. D_L_HR_VT:      LD      C,A
  5589.                 PUSH    DE
  5590.                 EXX
  5591.                 POP     BC
  5592. D_L_STEP:       LD      HL,(#5C7D)
  5593.                 LD      A,B
  5594.                 ADD     A,H
  5595.                 LD      B,A
  5596.                 LD      A,C
  5597.                 INC     A
  5598.                 ADD     A,L
  5599.                 JR      C,D_L_RANGE
  5600.                 JR      Z,REPORT_BC
  5601. D_L_PLOT:       DEC     A
  5602.                 LD      C,A
  5603.                 CALL    PLOT_SUB
  5604.                 EXX
  5605.                 LD      A,C
  5606.                 DJNZ    D_L_LOOP
  5607.                 POP     DE
  5608.                 RET
  5609.  
  5610. D_L_RANGE:      JR      Z,D_L_PLOT
  5611. REPORT_BC:      RST     #08                     ; Error report
  5612.                 DB      #0A                     ; Integer out of range
  5613.  
  5614. ; Scan expression or sub expression
  5615. SCANNING:       RST     #18
  5616.                 LD      B,#00
  5617.                 PUSH    BC
  5618. S_LOOP_1:       LD      C,A
  5619.                 CALL    HEXA                    ; BSROM - hexadecimal numbers handling
  5620.                 CALL    INDEXER
  5621.                 LD      A,C
  5622.                 JP      NC,S_ALPHNUM
  5623.                 LD      B,#00
  5624.                 LD      C,(HL)
  5625.                 ADD     HL,BC
  5626.                 JP      (HL)
  5627.  
  5628. S_QUOTE_S:      CALL    CH_ADD_1
  5629.                 INC     BC
  5630.                 CP      #0D
  5631.                 JP      Z,REPORT_C
  5632.                 CP      #22
  5633.                 JR      NZ,S_QUOTE_S
  5634.                 CALL    CH_ADD_1
  5635.                 CP      #22
  5636.                 RET
  5637.  
  5638. S_2_COORD:      RST     #20
  5639.                 CP      #28
  5640.                 JR      NZ,S_RPORT_C
  5641.                 CALL    NEXT_2NUM
  5642.                 RST     #18
  5643.                 CP      #29
  5644. S_RPORT_C:      JP      NZ,REPORT_C
  5645.  
  5646. ; Check syntax
  5647. SYNTAX_Z:       BIT     7,(IY+#01)
  5648.                 RET
  5649.  
  5650. ; Scanning SCREEN$
  5651. S_SCRN_S:       CALL    STK_TO_BC
  5652.                 LD      HL,(#5C36)
  5653.                 LD      DE,#0100
  5654.                 ADD     HL,DE
  5655.                 LD      A,C
  5656.                 RRCA
  5657.                 RRCA
  5658.                 RRCA
  5659.                 AND     #E0
  5660.                 XOR     B
  5661.                 LD      E,A
  5662.                 LD      A,C
  5663.                 AND     #18
  5664.                 XOR     #40
  5665.                 LD      D,A
  5666.                 LD      B,#60
  5667. S_SCRN_LP:      PUSH    BC
  5668.                 PUSH    DE
  5669.                 PUSH    HL
  5670.                 LD      A,(DE)
  5671.                 XOR     (HL)
  5672.                 JR      Z,S_SC_MTCH
  5673.                 INC     A
  5674.                 JR      NZ,S_SCR_NXT
  5675.                 DEC     A
  5676. S_SC_MTCH:      LD      C,A
  5677.                 LD      B,#07
  5678. S_SC_ROWS:      INC     D
  5679.                 INC     HL
  5680.                 LD      A,(DE)
  5681.                 XOR     (HL)
  5682.                 XOR     C
  5683.                 JR      NZ,S_SCR_NXT
  5684.                 DJNZ    S_SC_ROWS
  5685.                 POP     BC
  5686.                 POP     BC
  5687.                 POP     BC
  5688.                 LD      A,#80
  5689.                 SUB     B
  5690.                 LD      BC,#0001
  5691.                 RST     #30
  5692.                 LD      (DE),A
  5693.                 JR      S_SCR_STO
  5694.  
  5695. S_SCR_NXT:      POP     HL
  5696.                 LD      DE,#0008
  5697.                 ADD     HL,DE
  5698.                 POP     DE
  5699.                 POP     BC
  5700.                 DJNZ    S_SCRN_LP
  5701.                 LD      C,B
  5702. S_SCR_STO:      RET                             ; BSROM - bugfix - don't store string after SCREEN$
  5703.                 DB      #B2,#2A                 ; remains of JP STK_STO_D (#2AB2)
  5704.  
  5705. ; Scanning attributes
  5706. S_ATTR_S:       CALL    STK_TO_BC
  5707.                 LD      A,C
  5708.                 RRCA
  5709.                 RRCA
  5710.                 RRCA
  5711.                 LD      C,A
  5712.                 AND     #E0
  5713.                 XOR     B
  5714.                 LD      L,A
  5715.                 LD      A,C
  5716.                 AND     #03
  5717.                 XOR     #58
  5718.                 LD      H,A
  5719.                 LD      A,(HL)
  5720.                 JP      STACK_A
  5721.  
  5722. ; Scanning function table
  5723. SCAN_FUNC:      DB      #22, #1C                ; S_QUOTE
  5724.                 DB      #28, #4F                ; S_BRACKET
  5725.                 DB      #2E, #F2                ; S_DECIMAL
  5726.                 DB      #2B, #12                ; S_U_PLUS
  5727.                 DB      #A8, #56                ; S_FN
  5728.                 DB      #A5, #57                ; S_RND
  5729.                 DB      #A7, #84                ; S_PI
  5730.                 DB      #A6, #8F                ; S_INKEY
  5731.                 DB      #C4, #E6                ; S_BIN
  5732.                 DB      #AA, #BF                ; S_SCREEN
  5733.                 DB      #AB, #C7                ; S_ATTR
  5734.                 DB      #A9, #CE                ; S_POINT
  5735.                 DB      #00                     ; End marker
  5736.  
  5737. ; Scanning function routines
  5738. S_U_PLUS:       RST     #20
  5739.                 JP      S_LOOP_1
  5740.  
  5741. S_QUOTE:        RST     #18
  5742.                 INC     HL
  5743.                 PUSH    HL
  5744.                 LD      BC,#0000
  5745.                 CALL    S_QUOTE_S
  5746.                 JR      NZ,S_Q_PRMS
  5747. S_Q_AGAIN:      CALL    S_QUOTE_S
  5748.                 JR      Z,S_Q_AGAIN
  5749.                 CALL    SYNTAX_Z
  5750.                 JR      Z,S_Q_PRMS
  5751.                 RST     #30
  5752.                 POP     HL
  5753.                 PUSH    DE
  5754. S_Q_COPY:       LD      A,(HL)
  5755.                 INC     HL
  5756.                 LD      (DE),A
  5757.                 INC     DE
  5758.                 CP      #22
  5759.                 JR      NZ,S_Q_COPY
  5760.                 LD      A,(HL)
  5761.                 INC     HL
  5762.                 CP      #22
  5763.                 JR      Z,S_Q_COPY
  5764. S_Q_PRMS:       DEC     BC
  5765.                 POP     DE
  5766. S_STRING:       LD      HL,#5C3B
  5767.                 RES     6,(HL)
  5768.                 BIT     7,(HL)
  5769.                 CALL    NZ,STK_STO_D
  5770.                 JP      S_CONT_2
  5771.  
  5772. S_BRACKET:      RST     #20
  5773.                 CALL    SCANNING
  5774.                 CP      #29
  5775.                 JP      NZ,REPORT_C
  5776.                 RST     #20
  5777.                 JP      S_CONT_2
  5778.  
  5779. S_FN:           JP      NEWFNC                  ; BSROM for MB02+ - new functions
  5780.  
  5781. S_RND:          CALL    SYNTAX_Z
  5782.                 JR      Z,S_RND_END
  5783.                 LD      BC,(#5C76)
  5784.                 CALL    STACK_BC
  5785.                 RST     #28                     ;FP_CALC
  5786.                 DB      #A1                     ;STK_ONE
  5787.                 DB      #0F                     ;ADDITION
  5788.                 DB      #34                     ;STK_DATA
  5789.                 DB      #37                     ;Exponent
  5790.                 DB      #16                     ;
  5791.                 DB      #04                     ;MULTIPLY
  5792.                 DB      #34                     ;STK_DATA
  5793.                 DB      #80                     ;
  5794.                 DB      #41                     ;Exponent
  5795.                 DB      #00                     ;
  5796.                 DB      #00                     ;
  5797.                 DB      #80                     ;
  5798.                 DB      #32                     ;N_MOD_M
  5799.                 DB      #02                     ;DELETE
  5800.                 DB      #A1                     ;STK_ONE
  5801.                 DB      #03                     ;SUBTRACT
  5802.                 DB      #31                     ;DUPLICATE
  5803.                 DB      #38                     ;END_CALC
  5804.                 CALL    FP_TO_BC
  5805.                 LD      (#5C76),BC
  5806.                 LD      A,(HL)
  5807.                 AND     A
  5808.                 JR      Z,S_RND_END
  5809.                 SUB     #10
  5810.                 LD      (HL),A
  5811. S_RND_END:      JR      S_PI_END
  5812.  
  5813. S_PI:           CALL    SYNTAX_Z
  5814.                 JR      Z,S_PI_END
  5815.                 RST     #28                     ;FP_CALC
  5816.                 DB      #A3                     ;STK_PI_2
  5817.                 DB      #38                     ;END_CALC
  5818.                 INC     (HL)
  5819. S_PI_END:       RST     #20
  5820.                 JP      S_NUMERIC
  5821.  
  5822. S_INKEY:        LD      BC,#105A
  5823.                 RST     #20
  5824.                 CP      #23
  5825.                 JP      Z,S_PUSH_PO
  5826.                 LD      HL,#5C3B
  5827.                 RES     6,(HL)
  5828.                 BIT     7,(HL)
  5829.                 JR      Z,S_INK_EN
  5830.                 CALL    KEY_SCAN
  5831.                 LD      C,#00
  5832.                 JR      NZ,S_IK_STK
  5833.                 CALL    K_TEST
  5834.                 JR      NC,S_IK_STK
  5835.                 DEC     D
  5836.                 LD      E,A
  5837.                 CALL    K_DECODE
  5838.                 PUSH    AF
  5839.                 LD      BC,#0001
  5840.                 RST     #30
  5841.                 POP     AF
  5842.                 LD      (DE),A
  5843.                 LD      C,#01
  5844. S_IK_STK:       LD      B,#00
  5845.                 CALL    STK_STO_D
  5846. S_INK_EN:       JP      S_CONT_2
  5847.  
  5848. S_SCREEN:       CALL    S_2_COORD
  5849.                 CALL    NZ,S_SCRN_S
  5850.                 RST     #20
  5851.                 JP      S_STRING
  5852.  
  5853. S_ATTR:         CALL    S_2_COORD
  5854.                 CALL    NZ,S_ATTR_S
  5855.                 RST     #20
  5856.                 JR      S_NUMERIC
  5857.  
  5858. S_POINT:        CALL    S_2_COORD
  5859.                 CALL    NZ,POINT_SUB
  5860.                 RST     #20
  5861.                 JR      S_NUMERIC
  5862.  
  5863. S_ALPHNUM:      CALL    ALPHANUM
  5864.                 JR      NC,S_NEGATE
  5865.                 CP      #41
  5866.                 JR      NC,S_LETTER
  5867. S_DECIMAL:             
  5868. S_BIN:          CALL    SYNTAX_Z
  5869.                 JR      NZ,S_STK_DEC
  5870.                 CALL    DEC_TO_FP
  5871. S_BIN_1:        RST     #18
  5872.                 LD      BC,#0006
  5873.                 CALL    MAKE_ROOM
  5874.                 INC     HL
  5875.                 LD      (HL),#0E
  5876.                 INC     HL
  5877.                 EX      DE,HL
  5878.                 LD      HL,(#5C65)
  5879.                 LD      C,#05
  5880.                 AND     A
  5881.                 SBC     HL,BC
  5882.                 LD      (#5C65),HL
  5883.                 LDIR
  5884.                 EX      DE,HL
  5885.                 DEC     HL
  5886.                 CALL    TEMP_PTR1
  5887.                 JR      S_NUMERIC
  5888.  
  5889. S_STK_DEC:      RST     #18
  5890. S_SD_SKIP:      INC     HL
  5891.                 LD      A,(HL)
  5892.                 CP      #0E
  5893.                 JR      NZ,S_SD_SKIP
  5894.                 INC     HL
  5895.                 CALL    STACK_NUM
  5896.                 LD      (#5C5D),HL
  5897. S_NUMERIC:      SET     6,(IY+#01)
  5898.                 JR      S_CONT_1
  5899.  
  5900. ; Scanning variable routines
  5901. S_LETTER:       CALL    LOOK_VARS
  5902.                 JP      C,REPORT_2
  5903.                 CALL    Z,STK_VAR
  5904.                 LD      A,(#5C3B)
  5905.                 CP      #C0
  5906.                 JR      C,S_CONT_1
  5907.                 INC     HL
  5908.                 CALL    STACK_NUM
  5909. S_CONT_1:       JR      S_CONT_2
  5910.  
  5911. S_NEGATE:       LD      BC,#09DB
  5912.                 CP      #2D
  5913.                 JR      Z,S_PUSH_PO
  5914.                 LD      BC,#1018
  5915.                 CP      #AE
  5916.                 JR      Z,S_PUSH_PO
  5917.                 SUB     #AF
  5918.                 JP      C,REPORT_C
  5919.                 LD      BC,#04F0
  5920.                 CP      #14
  5921.                 JR      Z,S_PUSH_PO
  5922.                 JP      NC,REPORT_C
  5923.                 LD      B,#10
  5924.                 ADD     A,#DC
  5925.                 LD      C,A
  5926.                 CP      #DF
  5927.                 JR      NC,S_NO_TO
  5928.                 RES     6,C
  5929. S_NO_TO:        CP      #EE
  5930.                 JR      C,S_PUSH_PO
  5931.                 RES     7,C
  5932. S_PUSH_PO:      PUSH    BC
  5933.                 RST     #20
  5934.                 JP      S_LOOP_1
  5935.  
  5936. S_CONT_2:       RST     #18
  5937. S_CONT_3:       CP      #28
  5938.                 JR      NZ,S_OPERTR
  5939.                 BIT     6,(IY+#01)
  5940.                 JR      NZ,S_LOOP
  5941.                 CALL    SLICING
  5942.                 RST     #20
  5943.                 JR      S_CONT_3
  5944.  
  5945. S_OPERTR:       LD      B,#00
  5946.                 LD      C,A
  5947.                 LD      HL,TBL_OF_OPS
  5948.                 CALL    INDEXER
  5949.                 JR      NC,S_LOOP
  5950.                 LD      C,(HL)
  5951.                 LD      HL,#26ED
  5952.                 ADD     HL,BC
  5953.                 LD      B,(HL)
  5954.  
  5955. ; Scanning main loop
  5956. S_LOOP:         POP     DE
  5957.                 LD      A,D
  5958.                 CP      B
  5959.                 JR      C,S_TIGHTER
  5960.                 AND     A
  5961.                 JP      Z,GET_CHAR
  5962.                 PUSH    BC
  5963.                 LD      HL,#5C3B
  5964.                 LD      A,E
  5965.                 CP      #ED
  5966.                 JR      NZ,S_STK_LST
  5967.                 BIT     6,(HL)
  5968.                 JR      NZ,S_STK_LST
  5969.                 LD      E,#99
  5970. S_STK_LST:      PUSH    DE
  5971.                 CALL    SYNTAX_Z
  5972.                 JR      Z,S_SYNTEST
  5973.                 LD      A,E
  5974.                 AND     #3F
  5975.                 LD      B,A
  5976.                 RST     #28                     ;FP_CALC
  5977.                 DB      #3B                     ;FP_CALC_2
  5978.                 DB      #38                     ;END_CALC
  5979.                 JR      S_RUNTEST
  5980.  
  5981. S_SYNTEST:      LD      A,E
  5982.                 CALL    VAL1                    ; BSROM - enhanced VAL & VAL$
  5983.                 AND     #40
  5984. S_RPORT_C2:     JP      NZ,REPORT_C
  5985. S_RUNTEST:      POP     DE
  5986.                 LD      HL,#5C3B
  5987.                 SET     6,(HL)
  5988.                 BIT     7,E
  5989.                 JR      NZ,S_LOOPEND
  5990.                 RES     6,(HL)
  5991. S_LOOPEND:      POP     BC
  5992.                 JR      S_LOOP
  5993.  
  5994. S_TIGHTER:      PUSH    DE
  5995.                 LD      A,C
  5996.                 BIT     6,(IY+#01)
  5997.                 JR      NZ,S_NEXT
  5998.                 AND     #3F
  5999.                 ADD     A,#08
  6000.                 LD      C,A
  6001.                 CP      #10
  6002.                 JR      NZ,S_NOT_AND
  6003.                 SET     6,C
  6004.                 JR      S_NEXT
  6005.  
  6006. S_NOT_AND:      JR      C,S_RPORT_C2
  6007.                 CP      #17
  6008.                 JR      Z,S_NEXT
  6009.                 SET     7,C
  6010. S_NEXT:         PUSH    BC
  6011.                 RST     #20
  6012.                 JP      S_LOOP_1
  6013.  
  6014. ; Table of operators
  6015. TBL_OF_OPS:     DB      "+", #CF                ; ADDITION
  6016.                 DB      "-", #C3                ; SUBTRACT
  6017.                 DB      "*", #C4                ; MULTIPLY
  6018.                 DB      "/", #C5                ; DIVISION
  6019.                 DB      "^", #C6                ; TO_POWER
  6020.                 DB      "=", #CE                ; NOS_EQL
  6021.                 DB      ">", #CC                ; NO_GRTR
  6022.                 DB      "<", #CD                ; NO_LESS
  6023.                 DB      #C7, #C9                ; NO_L_EQL '<='
  6024.                 DB      #C8, #CA                ; NO_GR_EQL '>='
  6025.                 DB      #C9, #CB                ; NOS_NEQL '<>'
  6026.                 DB      #C5, #C7                ; OR
  6027.                 DB      #C6, #C8                ; AND
  6028.                 DB      #00                     ; End marker
  6029.  
  6030. ; Table of priorities
  6031. TBL_PRIORS:     DB      #06                     ; '-'
  6032.                 DB      #08                     ; '*'
  6033.                 DB      #08                     ; '/'
  6034.                 DB      #0A                     ; '^'
  6035.                 DB      #02                     ; OR
  6036.                 DB      #03                     ; AND
  6037.                 DB      #05                     ; '<='
  6038.                 DB      #05                     ; '>='
  6039.                 DB      #05                     ; '<>'
  6040.                 DB      #05                     ; '>'
  6041.                 DB      #05                     ; '<'
  6042.                 DB      #05                     ; '='
  6043.                 DB      #06                     ; '+'
  6044.  
  6045. ; User defined functions handling
  6046. S_FN_SBRN:      CALL    SYNTAX_Z
  6047.                 JR      NZ,SF_RUN
  6048.                 RST     #20
  6049. S_FN_SBRN1:     CALL    ALPHA
  6050.                 JP      NC,REPORT_C
  6051.                 RST     #20
  6052.                 CP      #24
  6053.                 PUSH    AF
  6054.                 JR      NZ,SF_BRKT_1
  6055.                 RST     #20
  6056. SF_BRKT_1:      CP      #28
  6057.                 JR      NZ,SF_RPRT_C
  6058.                 RST     #20
  6059.                 CP      #29
  6060.                 JR      Z,SF_FLAG_6
  6061. SF_ARGMTS:      CALL    SCANNING
  6062.                 RST     #18
  6063.                 CP      #2C
  6064.                 JR      NZ,SF_BRKT_2
  6065.                 RST     #20
  6066.                 JR      SF_ARGMTS
  6067.  
  6068. SF_BRKT_2:      CP      #29
  6069. SF_RPRT_C:      JP      NZ,REPORT_C
  6070. SF_FLAG_6:      RST     #20
  6071.                 LD      HL,#5C3B
  6072.                 RES     6,(HL)
  6073.                 POP     AF
  6074.                 JR      Z,SF_SYN_EN
  6075.                 SET     6,(HL)
  6076. SF_SYN_EN       JP      S_CONT_2
  6077.  
  6078. SF_RUN:         RST     #20
  6079. SF_RUN1:        AND     #DF
  6080.                 LD      B,A
  6081.                 RST     #20
  6082.                 SUB     #24
  6083.                 LD      C,A
  6084.                 JR      NZ,SF_ARGMT1
  6085.                 RST     #20
  6086. SF_ARGMT1:      RST     #20
  6087.                 PUSH    HL
  6088.                 LD      HL,(#5C53)
  6089.                 DEC     HL
  6090. SF_FND_DF:      LD      DE,#00CE
  6091.                 PUSH    BC
  6092.                 CALL    LOOK_PROG
  6093.                 POP     BC
  6094.                 JR      NC,SF_CP_DEF
  6095. REPORT_P:       RST     #08                     ; Error report
  6096.                 DB      #18                     ; FN without DEF
  6097. SF_CP_DEF:      PUSH    HL
  6098.                 CALL    FN_SKPOVR
  6099.                 AND     #DF
  6100.                 CP      B
  6101.                 JR      NZ,SF_NOT_FD
  6102.                 CALL    FN_SKPOVR
  6103.                 SUB     #24
  6104.                 CP      C
  6105.                 JR      Z,SF_VALUES
  6106. SF_NOT_FD:      POP     HL
  6107.                 DEC     HL
  6108.                 LD      DE,#0200
  6109.                 PUSH    BC
  6110.                 CALL    EACH_STMT
  6111.                 POP     BC
  6112.                 JR      SF_FND_DF
  6113.  
  6114. SF_VALUES:      AND     A
  6115.                 CALL    Z,FN_SKPOVR
  6116.                 POP     DE
  6117.                 POP     DE
  6118.                 LD      (#5C5D),DE
  6119.                 CALL    FN_SKPOVR
  6120.                 PUSH    HL
  6121.                 CP      #29
  6122.                 JR      Z,SF_R_BR_2
  6123. SF_ARG_LP:      INC     HL
  6124.                 LD      A,(HL)
  6125.                 CP      #0E
  6126.                 LD      D,#40
  6127.                 JR      Z,SF_ARG_VR
  6128.                 DEC     HL
  6129.                 CALL    FN_SKPOVR
  6130.                 INC     HL
  6131.                 LD      D,#00
  6132. SF_ARG_VR:      INC     HL
  6133.                 PUSH    HL
  6134.                 PUSH    DE
  6135.                 CALL    SCANNING
  6136.                 POP     AF
  6137.                 XOR     (IY+#01)
  6138.                 AND     #40
  6139.                 JR      NZ,REPORT_Q
  6140.                 POP     HL
  6141.                 EX      DE,HL
  6142.                 LD      HL,(#5C65)
  6143.                 LD      BC,#0005
  6144.                 SBC     HL,BC
  6145.                 LD      (#5C65),HL
  6146.                 LDIR
  6147.                 EX      DE,HL
  6148.                 DEC     HL
  6149.                 CALL    FN_SKPOVR
  6150.                 CP      #29
  6151.                 JR      Z,SF_R_BR_2
  6152.                 PUSH    HL
  6153.                 RST     #18
  6154.                 CP      #2C
  6155.                 JR      NZ,REPORT_Q
  6156.                 RST     #20
  6157.                 POP     HL
  6158.                 CALL    FN_SKPOVR
  6159.                 JR      SF_ARG_LP
  6160.  
  6161. SF_R_BR_2:      PUSH    HL
  6162.                 RST     #18
  6163.                 CP      #29
  6164.                 JR      Z,SF_VALUE
  6165. REPORT_Q:       RST     #08                     ; Error report
  6166.                 DB      #19                     ; Parameter error
  6167. SF_VALUE:       POP     DE
  6168.                 EX      DE,HL
  6169.                 LD      (#5C5D),HL
  6170.                 LD      HL,(#5C0B)
  6171.                 EX      (SP),HL
  6172.                 LD      (#5C0B),HL
  6173.                 PUSH    DE
  6174.                 RST     #20
  6175.                 RST     #20
  6176.                 CALL    SCANNING
  6177.                 POP     HL
  6178.                 LD      (#5C5D),HL
  6179.                 POP     HL
  6180.                 LD      (#5C0B),HL
  6181.                 RST     #20
  6182.                 JP      S_CONT_2
  6183.  
  6184. ; Skip spaces and color control codes in DEF FN
  6185. FN_SKPOVR:      INC     HL
  6186.                 LD      A,(HL)
  6187.                 CP      #21
  6188.                 JR      C,FN_SKPOVR
  6189.                 RET
  6190.  
  6191. ; Variables lookup
  6192. LOOK_VARS:      SET     6,(IY+#01)
  6193.                 RST     #18
  6194.                 CALL    ALPHA
  6195.                 JP      NC,REPORT_C
  6196.                 PUSH    HL
  6197.                 AND     #1F
  6198.                 LD      C,A
  6199.                 RST     #20
  6200.                 PUSH    HL
  6201.                 CP      #28
  6202.                 JR      Z,V_RUN_SYN
  6203.                 SET     6,C
  6204.                 CP      #24
  6205.                 JR      Z,V_STR_VAR
  6206.                 SET     5,C
  6207.                 CALL    ALPHANUM
  6208.                 JR      NC,V_TEST_FN
  6209. V_CHAR:         CALL    ALPHANUM
  6210.                 JR      NC,V_RUN_SYN
  6211.                 RES     6,C
  6212.                 RST     #20
  6213.                 JR      V_CHAR
  6214.  
  6215. V_STR_VAR:      RST     #20
  6216.                 RES     6,(IY+#01)
  6217. V_TEST_FN:      LD      A,(#5C0C)
  6218.                 AND     A
  6219.                 JR      Z,V_RUN_SYN
  6220.                 CALL    SYNTAX_Z
  6221.                 JP      NZ,STK_F_ARG
  6222. V_RUN_SYN:      LD      B,C
  6223.                 CALL    SYNTAX_Z
  6224.                 JR      NZ,V_RUN
  6225.                 LD      A,C
  6226.                 AND     #E0
  6227.                 SET     7,A
  6228.                 LD      C,A
  6229.                 JR      V_SYNTAX
  6230.  
  6231. V_RUN:          LD      HL,(#5C4B)
  6232. V_EACH:         LD      A,(HL)
  6233.                 AND     #7F
  6234.                 JR      Z,V_80_BYTE
  6235.                 CP      C
  6236.                 JR      NZ,V_NEXT
  6237.                 RLA
  6238.                 ADD     A,A
  6239.                 JP      P,V_FOUND_2
  6240.                 JR      C,V_FOUND_2
  6241.                 POP     DE
  6242.                 PUSH    DE
  6243.                 PUSH    HL
  6244. V_MATCHES:      INC     HL
  6245. V_SPACES:       LD      A,(DE)
  6246.                 INC     DE
  6247.                 CP      #20
  6248.                 JR      Z,V_SPACES
  6249.                 OR      #20
  6250.                 CP      (HL)
  6251.                 JR      Z,V_MATCHES
  6252.                 OR      #80
  6253.                 CP      (HL)
  6254.                 JR      NZ,V_GET_PTR
  6255.                 LD      A,(DE)
  6256.                 CALL    ALPHANUM
  6257.                 JR      NC,V_FOUND_1
  6258. V_GET_PTR:      POP     HL
  6259. V_NEXT:         PUSH    BC
  6260.                 CALL    NEXT_ONE
  6261.                 EX      DE,HL
  6262.                 POP     BC
  6263.                 JR      V_EACH
  6264.  
  6265. V_80_BYTE:      SET     7,B
  6266. V_SYNTAX:       POP     DE
  6267.                 RST     #18
  6268.                 CP      #28
  6269.                 JR      Z,V_PASS
  6270.                 SET     5,B
  6271.                 JR      V_END
  6272.  
  6273. V_FOUND_1:      POP     DE
  6274. V_FOUND_2:      POP     DE
  6275.                 POP     DE
  6276.                 PUSH    HL
  6277.                 RST     #18
  6278. V_PASS:         CALL    ALPHANUM
  6279.                 JR      NC,V_END
  6280.                 RST     #20
  6281.                 JR      V_PASS
  6282.  
  6283. V_END:          POP     HL
  6284.                 RL      B
  6285.                 BIT     6,B
  6286.                 RET
  6287.  
  6288. ; Stack function argument
  6289. STK_F_ARG:      LD      HL,(#5C0B)
  6290.                 LD      A,(HL)
  6291.                 CP      #29
  6292.                 JP      Z,V_RUN_SYN
  6293. SFA_LOOP:       LD      A,(HL)
  6294.                 OR      #60
  6295.                 LD      B,A
  6296.                 INC     HL
  6297.                 LD      A,(HL)
  6298.                 CP      #0E
  6299.                 JR      Z,SFA_CP_VR
  6300.                 DEC     HL
  6301.                 CALL    FN_SKPOVR
  6302.                 INC     HL
  6303.                 RES     5,B
  6304. SFA_CP_VR:      LD      A,B
  6305.                 CP      C
  6306.                 JR      Z,SFA_MATCH
  6307.                 INC     HL
  6308.                 INC     HL
  6309.                 INC     HL
  6310.                 INC     HL
  6311.                 INC     HL
  6312.                 CALL    FN_SKPOVR
  6313.                 CP      #29
  6314.                 JP      Z,V_RUN_SYN
  6315.                 CALL    FN_SKPOVR
  6316.                 JR      SFA_LOOP
  6317.  
  6318. SFA_MATCH:      BIT     5,C
  6319.                 JR      NZ,SFA_END
  6320.                 INC     HL
  6321.                 LD      DE,(#5C65)
  6322.                 CALL    MOVE_FP
  6323.                 EX      DE,HL
  6324.                 LD      (#5C65),HL
  6325. SFA_END:        POP     DE
  6326.                 POP     DE
  6327.                 XOR     A
  6328.                 INC     A
  6329.                 RET
  6330.  
  6331. ; Stack variable component
  6332. STK_VAR:        XOR     A
  6333.                 LD      B,A
  6334.                 BIT     7,C
  6335.                 JR      NZ,SV_COUNT
  6336.                 BIT     7,(HL)
  6337.                 JR      NZ,SV_ARRAYS
  6338.                 INC     A
  6339. SV_SIMPLE:      INC     HL
  6340.                 LD      C,(HL)
  6341.                 INC     HL
  6342.                 LD      B,(HL)
  6343.                 INC     HL
  6344.                 EX      DE,HL
  6345.                 CALL    STK_STO_D
  6346.                 RST     #18
  6347.                 JP      SV_SLICE_EX
  6348.  
  6349. SV_ARRAYS:      INC     HL
  6350.                 INC     HL
  6351.                 INC     HL
  6352.                 LD      B,(HL)
  6353.                 BIT     6,C
  6354.                 JR      Z,SV_PTR
  6355.                 DEC     B
  6356.                 JR      Z,SV_SIMPLE
  6357.                 EX      DE,HL
  6358.                 RST     #18
  6359.                 CP      #28
  6360.                 JR      NZ,REPORT_3
  6361.                 EX      DE,HL
  6362. SV_PTR:         EX      DE,HL
  6363.                 JR      SV_COUNT
  6364.  
  6365. SV_COMMA:       PUSH    HL
  6366.                 RST     #18
  6367.                 POP     HL
  6368.                 CP      #2C
  6369.                 JR      Z,SV_LOOP
  6370.                 BIT     7,C
  6371.                 JR      Z,REPORT_3
  6372.                 BIT     6,C
  6373.                 JR      NZ,SV_CLOSE
  6374.                 CP      #29
  6375.                 JR      NZ,SV_RPT_C
  6376.                 RST     #20
  6377.                 RET
  6378.  
  6379. SV_CLOSE:       CP      #29
  6380.                 JR      Z,SV_DIM
  6381.                 CP      #CC
  6382.                 JR      NZ,SV_RPT_C
  6383. SV_CH_ADD:      RST     #18
  6384.                 DEC     HL
  6385.                 LD      (#5C5D),HL
  6386.                 JR      SV_SLICE
  6387.  
  6388. SV_COUNT:       LD      HL,#0000
  6389. SV_LOOP:        PUSH    HL
  6390.                 RST     #20
  6391.                 POP     HL
  6392.                 LD      A,C
  6393.                 CP      #C0
  6394.                 JR      NZ,SV_MULT
  6395.                 RST     #18
  6396.                 CP      #29
  6397.                 JR      Z,SV_DIM
  6398.                 CP      #CC
  6399.                 JR      Z,SV_CH_ADD
  6400. SV_MULT:        PUSH    BC
  6401.                 PUSH    HL
  6402.                 CALL    DE_DE_1
  6403.                 EX      (SP),HL
  6404.                 EX      DE,HL
  6405.                 CALL    INT_EXP1
  6406.                 JR      C,REPORT_3
  6407.                 DEC     BC
  6408.                 CALL    GET_HL_DE
  6409.                 ADD     HL,BC
  6410.                 POP     DE
  6411.                 POP     BC
  6412.                 DJNZ    SV_COMMA
  6413.                 BIT     7,C
  6414. SV_RPT_C:       JR      NZ,SL_RPT_C
  6415.                 PUSH    HL
  6416.                 BIT     6,C
  6417.                 JR      NZ,SV_ELEM
  6418.                 LD      B,D
  6419.                 LD      C,E
  6420.                 RST     #18
  6421.                 CP      #29
  6422.                 JR      Z,SV_NUMBER
  6423. REPORT_3:       RST     #08                     ; Error report
  6424.                 DB      #02                     ; Subscript wrong
  6425. SV_NUMBER:      RST     #20
  6426.                 POP     HL
  6427.                 LD      DE,#0005
  6428.                 CALL    GET_HL_DE
  6429.                 ADD     HL,BC
  6430.                 RET
  6431.  
  6432. SV_ELEM:        CALL    DE_DE_1
  6433.                 EX      (SP),HL
  6434.                 CALL    GET_HL_DE
  6435.                 POP     BC
  6436.                 ADD     HL,BC
  6437.                 INC     HL
  6438.                 LD      B,D
  6439.                 LD      C,E
  6440.                 EX      DE,HL
  6441.                 CALL    STK_ST_0
  6442.                 RST     #18
  6443.                 CP      #29
  6444.                 JR      Z,SV_DIM
  6445.                 CP      #2C
  6446.                 JR      NZ,REPORT_3
  6447. SV_SLICE:       CALL    SLICING
  6448. SV_DIM:         RST     #20
  6449. SV_SLICE_EX:    CP      #28
  6450.                 JR      Z,SV_SLICE
  6451.                 RES     6,(IY+#01)
  6452.                 RET
  6453.  
  6454. ; Handle slicing of strings
  6455. SLICING:        CALL    SYNTAX_Z
  6456.                 CALL    NZ,STK_FETCH
  6457.                 RST     #20
  6458.                 CP      #29
  6459.                 JR      Z,SL_STORE
  6460.                 PUSH    DE
  6461.                 XOR     A
  6462.                 PUSH    AF
  6463.                 PUSH    BC
  6464.                 LD      DE,#0001
  6465.                 RST     #18
  6466.                 POP     HL
  6467.                 CP      #CC
  6468.                 JR      Z,SL_SECOND
  6469.                 POP     AF
  6470.                 CALL    INT_EXP2
  6471.                 PUSH    AF
  6472.                 LD      D,B
  6473.                 LD      E,C
  6474.                 PUSH    HL
  6475.                 RST     #18
  6476.                 POP     HL
  6477.                 CP      #CC
  6478.                 JR      Z,SL_SECOND
  6479.                 CP      #29
  6480. SL_RPT_C:       JP      NZ,REPORT_C
  6481.                 LD      H,D
  6482.                 LD      L,E
  6483.                 JR      SL_DEFINE
  6484.  
  6485. SL_SECOND:      PUSH    HL
  6486.                 RST     #20
  6487.                 POP     HL
  6488.                 CP      #29
  6489.                 JR      Z,SL_DEFINE
  6490.                 POP     AF
  6491.                 CALL    INT_EXP2
  6492.                 PUSH    AF
  6493.                 RST     #18
  6494.                 LD      H,B
  6495.                 LD      L,C
  6496.                 CP      #29
  6497.                 JR      NZ,SL_RPT_C
  6498. SL_DEFINE:      POP     AF
  6499.                 EX      (SP),HL
  6500.                 ADD     HL,DE
  6501.                 DEC     HL
  6502.                 EX      (SP),HL
  6503.                 AND     A
  6504.                 SBC     HL,DE
  6505.                 LD      BC,#0000
  6506.                 JR      C,SL_OVER
  6507.                 INC     HL
  6508.                 AND     A
  6509.                 JP      M,REPORT_3
  6510.                 LD      B,H
  6511.                 LD      C,L
  6512. SL_OVER:        POP     DE
  6513. SL_OVER1:       RES     6,(IY+#01)
  6514. SL_STORE:       CALL    SYNTAX_Z
  6515.                 RET     Z
  6516. STK_ST_0:       XOR     A
  6517. STK_STO_D:      RES     6,(IY+#01)
  6518. STK_STORE:      PUSH    BC                      ; Put five registers on the calc stack
  6519.                 CALL    TEST_5_SP
  6520.                 POP     BC
  6521.                 LD      HL,(#5C65)
  6522.                 LD      (HL),A
  6523.                 INC     HL
  6524.                 LD      (HL),E
  6525.                 INC     HL
  6526.                 LD      (HL),D
  6527.                 INC     HL
  6528.                 LD      (HL),C
  6529.                 INC     HL
  6530.                 LD      (HL),B
  6531.                 INC     HL
  6532.                 LD      (#5C65),HL
  6533.                 RET
  6534.  
  6535. ; Check and evaluate an integer expression
  6536. INT_EXP1:       XOR     A
  6537. INT_EXP2:       PUSH    DE
  6538.                 PUSH    HL
  6539.                 PUSH    AF
  6540.                 CALL    EXPT_1NUM
  6541.                 POP     AF
  6542.                 CALL    SYNTAX_Z
  6543.                 JR      Z,I_RESTORE
  6544.                 PUSH    AF
  6545.                 CALL    FIND_INT2
  6546.                 POP     DE
  6547.                 LD      A,B
  6548.                 OR      C
  6549.                 SCF
  6550.                 JR      Z,I_CARRY
  6551.                 POP     HL
  6552.                 PUSH    HL
  6553.                 AND     A
  6554.                 SBC     HL,BC
  6555. I_CARRY:        LD      A,D
  6556.                 SBC     A,#00
  6557. I_RESTORE:      POP     HL
  6558.                 POP     DE
  6559.                 RET
  6560.  
  6561. ; Load DE+1 into DE
  6562. DE_DE_1:        EX      DE,HL
  6563.                 INC     HL
  6564.                 LD      E,(HL)
  6565.                 INC     HL
  6566.                 LD      D,(HL)
  6567.                 RET
  6568.  
  6569. ; Multiply HL by DE
  6570. GET_HL_DE:      CALL    SYNTAX_Z
  6571.                 RET     Z
  6572.                 CALL    HL_HL_DE
  6573.                 JP      C,REPORT_4
  6574.                 RET
  6575.  
  6576. ; Handle LET command
  6577. LET:            LD      HL,(#5C4D)
  6578.                 BIT     1,(IY+#37)
  6579.                 JR      Z,L_EXISTS
  6580.                 LD      BC,#0005
  6581. L_EACH_CH:      INC     BC
  6582. L_NO_SP:        INC     HL
  6583.                 LD      A,(HL)
  6584.                 CP      #20
  6585.                 JR      Z,L_NO_SP
  6586.                 JR      NC,L_TEST_CH
  6587.                 CP      #10
  6588.                 JR      C,L_SPACES
  6589.                 CP      #16
  6590.                 JR      NC,L_SPACES
  6591.                 INC     HL
  6592.                 JR      L_NO_SP
  6593.  
  6594. L_TEST_CH:      CALL    ALPHANUM
  6595.                 JR      C,L_EACH_CH
  6596.                 CP      #24
  6597.                 JP      Z,L_NEW
  6598. L_SPACES:       LD      A,C
  6599.                 LD      HL,(#5C59)
  6600.                 DEC     HL
  6601.                 CALL    MAKE_ROOM
  6602.                 INC     HL
  6603.                 INC     HL
  6604.                 EX      DE,HL
  6605.                 PUSH    DE
  6606.                 LD      HL,(#5C4D)
  6607.                 DEC     DE
  6608.                 SUB     #06
  6609.                 LD      B,A
  6610.                 JR      Z,L_SINGLE
  6611. L_CHAR:         INC     HL
  6612.                 LD      A,(HL)
  6613.                 CP      #21
  6614.                 JR      C,L_CHAR
  6615.                 OR      #20
  6616.                 INC     DE
  6617.                 LD      (DE),A
  6618.                 DJNZ    L_CHAR
  6619.                 OR      #80
  6620.                 LD      (DE),A
  6621.                 LD      A,#C0
  6622. L_SINGLE:       LD      HL,(#5C4D)
  6623.                 XOR     (HL)
  6624.                 OR      #20
  6625.                 POP     HL
  6626.                 CALL    L_FIRST
  6627. L_NUMERIC:      PUSH    HL
  6628.                 RST     #28                     ;FP_CALC
  6629.                 DB      #02                     ;DELETE
  6630.                 DB      #38                     ;END_CALC
  6631.                 POP     HL
  6632.                 LD      BC,#0005
  6633.                 AND     A
  6634.                 SBC     HL,BC
  6635.                 JR      L_ENTER
  6636.  
  6637. L_EXISTS:       BIT     6,(IY+#01)
  6638.                 JR      Z,L_DELETE
  6639.                 LD      DE,#0006
  6640.                 ADD     HL,DE
  6641.                 JR      L_NUMERIC
  6642.  
  6643. L_DELETE:       LD      HL,(#5C4D)
  6644.                 LD      BC,(#5C72)
  6645.                 BIT     0,(IY+#37)
  6646.                 JR      NZ,L_ADD
  6647.                 LD      A,B
  6648.                 OR      C
  6649.                 RET     Z
  6650.                 PUSH    HL
  6651.                 RST     #30
  6652.                 PUSH    DE
  6653.                 PUSH    BC
  6654.                 LD      D,H
  6655.                 LD      E,L
  6656.                 INC     HL
  6657.                 LD      (HL),#20
  6658.                 LDDR
  6659.                 PUSH    HL
  6660.                 CALL    STK_FETCH
  6661.                 POP     HL
  6662.                 EX      (SP),HL
  6663.                 AND     A
  6664.                 SBC     HL,BC
  6665.                 ADD     HL,BC
  6666.                 JR      NC,L_LENGTH
  6667.                 LD      B,H
  6668.                 LD      C,L
  6669. L_LENGTH:       EX      (SP),HL
  6670.                 EX      DE,HL
  6671.                 LD      A,B
  6672.                 OR      C
  6673.                 JR      Z,L_IN_W_S
  6674.                 LDIR
  6675. L_IN_W_S:       POP     BC
  6676.                 POP     DE
  6677.                 POP     HL
  6678. L_ENTER:        EX      DE,HL
  6679.                 LD      A,B
  6680.                 OR      C
  6681.                 RET     Z
  6682.                 PUSH    DE
  6683.                 LDIR
  6684.                 POP     HL
  6685.                 RET
  6686.  
  6687. L_ADD:          DEC     HL
  6688.                 DEC     HL
  6689.                 DEC     HL
  6690.                 LD      A,(HL)
  6691.                 PUSH    HL
  6692.                 PUSH    BC
  6693.                 CALL    L_STRING
  6694.                 POP     BC
  6695.                 POP     HL
  6696.                 INC     BC
  6697.                 INC     BC
  6698.                 INC     BC
  6699.                 JP      RECLAIM_2
  6700.  
  6701. L_NEW:          LD      A,#DF
  6702.                 LD      HL,(#5C4D)
  6703.                 AND     (HL)
  6704. L_STRING:       PUSH    AF
  6705.                 CALL    STK_FETCH
  6706.                 EX      DE,HL
  6707.                 ADD     HL,BC
  6708.                 PUSH    BC
  6709.                 DEC     HL
  6710.                 LD      (#5C4D),HL
  6711.                 INC     BC
  6712.                 INC     BC
  6713.                 INC     BC
  6714.                 LD      HL,(#5C59)
  6715.                 DEC     HL
  6716.                 CALL    MAKE_ROOM
  6717.                 LD      HL,(#5C4D)
  6718.                 POP     BC
  6719.                 PUSH    BC
  6720.                 INC     BC
  6721.                 LDDR
  6722.                 EX      DE,HL
  6723.                 INC     HL
  6724.                 POP     BC
  6725.                 LD      (HL),B
  6726.                 DEC     HL
  6727.                 LD      (HL),C
  6728.                 POP     AF
  6729. L_FIRST:        DEC     HL
  6730.                 LD      (HL),A
  6731.                 LD      HL,(#5C59)
  6732.                 DEC     HL
  6733.                 RET
  6734.  
  6735. ; Get last value from the calc stack
  6736. STK_FETCH:      LD      HL,(#5C65)
  6737.                 DEC     HL
  6738.                 LD      B,(HL)
  6739.                 DEC     HL
  6740.                 LD      C,(HL)
  6741.                 DEC     HL
  6742.                 LD      D,(HL)
  6743.                 DEC     HL
  6744.                 LD      E,(HL)
  6745.                 DEC     HL
  6746.                 LD      A,(HL)
  6747.                 LD      (#5C65),HL
  6748.                 RET
  6749.  
  6750. ; Handle DIM command
  6751. DIM:            CALL    LOOK_VARS
  6752. D_RPORT_C:      JP      NZ,REPORT_C
  6753.                 CALL    SYNTAX_Z
  6754.                 JR      NZ,D_RUN
  6755.                 RES     6,C
  6756.                 CALL    STK_VAR
  6757.                 CALL    CHECK_END
  6758. D_RUN:          JR      C,D_LETTER
  6759.                 PUSH    BC
  6760.                 CALL    NEXT_ONE
  6761.                 CALL    RECLAIM_2
  6762.                 POP     BC
  6763. D_LETTER:       SET     7,C
  6764.                 LD      B,#00
  6765.                 PUSH    BC
  6766.                 LD      HL,#0001
  6767.                 BIT     6,C
  6768.                 JR      NZ,D_SIZE
  6769.                 LD      L,#05
  6770. D_SIZE:         EX      DE,HL
  6771. D_NO_LOOP:      RST     #20
  6772.                 LD      H,#FF
  6773.                 CALL    INT_EXP1
  6774.                 JP      C,REPORT_3
  6775.                 POP     HL
  6776.                 PUSH    BC
  6777.                 INC     H
  6778.                 PUSH    HL
  6779.                 LD      H,B
  6780.                 LD      L,C
  6781.                 CALL    GET_HL_DE
  6782.                 EX      DE,HL
  6783.                 RST     #18
  6784.                 CP      #2C
  6785.                 JR      Z,D_NO_LOOP
  6786.                 CP      #29
  6787.                 JR      NZ,D_RPORT_C
  6788.                 RST     #20
  6789.                 POP     BC
  6790.                 LD      A,C
  6791.                 LD      L,B
  6792.                 LD      H,#00
  6793.                 INC     HL
  6794.                 INC     HL
  6795.                 ADD     HL,HL
  6796.                 ADD     HL,DE
  6797.                 JP      C,REPORT_4
  6798.                 PUSH    DE
  6799.                 PUSH    BC
  6800.                 PUSH    HL
  6801.                 LD      B,H
  6802.                 LD      C,L
  6803.                 LD      HL,(#5C59)
  6804.                 DEC     HL
  6805.                 CALL    MAKE_ROOM
  6806.                 INC     HL
  6807.                 LD      (HL),A
  6808.                 POP     BC
  6809.                 DEC     BC
  6810.                 DEC     BC
  6811.                 DEC     BC
  6812.                 INC     HL
  6813.                 LD      (HL),C
  6814.                 INC     HL
  6815.                 LD      (HL),B
  6816.                 POP     BC
  6817.                 LD      A,B
  6818.                 INC     HL
  6819.                 LD      (HL),A
  6820.                 LD      H,D
  6821.                 LD      L,E
  6822.                 DEC     DE
  6823.                 LD      (HL),#00
  6824.                 BIT     6,C
  6825.                 JR      Z,DIM_CLEAR
  6826.                 LD      (HL),#20
  6827. DIM_CLEAR:      POP     BC
  6828.                 LDDR
  6829. DIM_SIZES:      POP     BC
  6830.                 LD      (HL),B
  6831.                 DEC     HL
  6832.                 LD      (HL),C
  6833.                 DEC     HL
  6834.                 DEC     A
  6835.                 JR      NZ,DIM_SIZES
  6836.                 RET
  6837.  
  6838. ; Check that the character in A is alphanumeric
  6839. ALPHANUM:       CALL    NUMERIC
  6840.                 CCF
  6841.                 RET     C
  6842. ALPHA:          CP      #41
  6843.                 CCF
  6844.                 RET     NC
  6845.                 CP      #5B
  6846.                 RET     C
  6847.                 CP      #61
  6848.                 CCF
  6849.                 RET     NC
  6850.                 CP      #7B
  6851.                 RET
  6852.  
  6853. ; Decimal to floating point
  6854. DEC_TO_FP:      CP      #C4
  6855.                 JR      NZ,NOT_BIN
  6856.                 LD      DE,#0000
  6857. BIN_DIGIT:      RST     #20
  6858.                 SUB     #31
  6859.                 ADC     A,#00
  6860.                 JR      NZ,BIN_END
  6861.                 EX      DE,HL
  6862.                 CCF
  6863.                 ADC     HL,HL
  6864.                 JP      C,REPORT_6
  6865.                 EX      DE,HL
  6866.                 JR      BIN_DIGIT
  6867.  
  6868. BIN_END:        LD      B,D
  6869.                 LD      C,E
  6870.                 JP      STACK_BC
  6871.  
  6872. NOT_BIN:        CP      #2E
  6873.                 JR      Z,DECIMAL
  6874.                 CALL    INT_TO_FP
  6875.                 CP      #2E
  6876.                 JR      NZ,E_FORMAT
  6877.                 RST     #20
  6878.                 CALL    NUMERIC
  6879.                 JR      C,E_FORMAT
  6880.                 JR      DEC_STO_1
  6881.  
  6882. DECIMAL:        RST     #20
  6883.                 CALL    NUMERIC
  6884. DEC_RPT_C:      JP      C,REPORT_C
  6885.                 RST     #28                     ;FP_CALC
  6886.                 DB      #A0                     ;STK_ZERO
  6887.                 DB      #38                     ;END_CALC
  6888.  
  6889. DEC_STO_1:      RST     #28                     ;FP_CALC
  6890.                 DB      #A1                     ;STK_ONE
  6891.                 DB      #C0                     ;ST_MEM_0
  6892.                 DB      #02                     ;DELETE
  6893.                 DB      #38                     ;END_CALC
  6894.  
  6895. NXT_DGT_1:      RST     #18
  6896.                 CALL    STK_DIGIT
  6897.                 JR      C,E_FORMAT
  6898.                 RST     #28                     ;FP_CALC
  6899.                 DB      #E0                     ;GET_MEM_0
  6900.                 DB      #A4                     ;STK_TEN
  6901.                 DB      #05                     ;DIVISION
  6902.                 DB      #C0                     ;ST_MEM_0
  6903.                 DB      #04                     ;MULTIPLY
  6904.                 DB      #0F                     ;ADDITION
  6905.                 DB      #38                     ;END_CALC
  6906.                 RST     #20
  6907.                 JR      NXT_DGT_1
  6908.  
  6909. E_FORMAT:       CP      #45
  6910.                 JR      Z,SIGN_FLAG
  6911.                 CP      #65
  6912.                 RET     NZ
  6913. SIGN_FLAG:      LD      B,#FF
  6914.                 RST     #20
  6915.                 CP      #2B
  6916.                 JR      Z,SIGN_DONE
  6917.                 CP      #2D
  6918.                 JR      NZ,ST_E_PART
  6919.                 INC     B
  6920. SIGN_DONE:      RST     #20
  6921. ST_E_PART:      CALL    NUMERIC
  6922.                 JR      C,DEC_RPT_C
  6923.                 PUSH    BC
  6924.                 CALL    INT_TO_FP
  6925.                 CALL    FP_TO_A
  6926.                 POP     BC
  6927.                 JP      C,REPORT_6
  6928.                 AND     A
  6929.                 JP      M,REPORT_6
  6930.                 INC     B
  6931.                 JR      Z,E_FP_JUMP
  6932.                 NEG
  6933. E_FP_JUMP:      JP      E_TO_FP
  6934.  
  6935. ; Check for valid digit
  6936. NUMERIC:        CP      #30
  6937.                 RET     C
  6938.                 CP      #3A
  6939.                 CCF
  6940.                 RET
  6941.  
  6942. ; Stack digit
  6943. STK_DIGIT:      CALL    NUMERIC
  6944.                 RET     C
  6945.                 SUB     #30
  6946. STACK_A:        LD      C,A                     ;Stack accumulator
  6947.                 LD      B,#00
  6948. STACK_BC:       LD      IY,#5C3A                ;Stack BC register pair
  6949.                 XOR     A
  6950.                 LD      E,A
  6951.                 LD      D,C
  6952.                 LD      C,B
  6953.                 LD      B,A
  6954.                 CALL    STK_STORE
  6955.                 RST     #28                     ;FP_CALC
  6956.                 DB      #38                     ;END_CALC
  6957.                 AND     A
  6958.                 RET
  6959.  
  6960. ; Integer to floating point
  6961. INT_TO_FP:      PUSH    AF
  6962.                 RST     #28                     ;FP_CALC
  6963.                 DB      #A0                     ;STK_ZERO
  6964.                 DB      #38                     ;END_CALC
  6965.                 POP     AF
  6966. NXT_DGT_2:      CALL    STK_DIGIT
  6967.                 RET     C
  6968.                 RST     #28                     ;FP_CALC
  6969.                 DB      #01                     ;EXCHANGE
  6970.                 DB      #A4                     ;STK_TEN
  6971.                 DB      #04                     ;MULTIPLY
  6972.                 DB      #0F                     ;ADDITION
  6973.                 DB      #38                     ;END_CALC
  6974.                 CALL    CH_ADD_1
  6975.                 JR      NXT_DGT_2
  6976.  
  6977. ; E-format to floating point
  6978. E_TO_FP:        RLCA
  6979.                 RRCA
  6980.                 JR      NC,E_SAVE
  6981.                 CPL
  6982.                 INC     A
  6983. E_SAVE:         PUSH    AF
  6984.                 LD      HL,#5C92
  6985.                 CALL    FP_0_1
  6986.                 RST     #28                     ;FP_CALC
  6987.                 DB      #A4                     ;STK_TEN
  6988.                 DB      #38                     ;END_CALC
  6989.                 POP     AF
  6990. E_LOOP:         SRL     A
  6991.                 JR      NC,E_TST_END
  6992.                 PUSH    AF
  6993.                 RST     #28                     ;FP_CALC
  6994.                 DB      #C1                     ;ST_MEM_1
  6995.                 DB      #E0                     ;GET_MEM_0
  6996.                 DB      #00                     ;JUMP_TRUE
  6997.                 DB      #04                     ;to E_DIVSN
  6998.                 DB      #04                     ;MULTIPLY
  6999.                 DB      #33                     ;JUMP
  7000.                 DB      #02                     ;to E_FETCH
  7001. E_DIVSN:        DB      #05                     ;DIVISION
  7002. E_FETCH:        DB      #E1                     ;GET_MEM_1
  7003.                 DB      #38                     ;END_CALC
  7004.                 POP     AF
  7005. E_TST_END:      JR      Z,E_END
  7006.                 PUSH    AF
  7007.                 RST     #28                     ;FP_CALC
  7008.                 DB      #31                     ;DUPLICATE
  7009.                 DB      #04                     ;MULTIPLY
  7010.                 DB      #38                     ;END_CALC
  7011.                 POP     AF
  7012.                 JR      E_LOOP
  7013.  
  7014. E_END:          RST     #28                     ;FP_CALC
  7015.                 DB      #02                     ;DELETE
  7016.                 DB      #38                     ;END_CALC
  7017.                 RET
  7018.  
  7019. ; Fetch integer
  7020. INT_FETCH:      INC     HL
  7021.                 LD      C,(HL)
  7022.                 INC     HL
  7023.                 LD      A,(HL)
  7024.                 XOR     C
  7025.                 SUB     C
  7026.                 LD      E,A
  7027.                 INC     HL
  7028.                 LD      A,(HL)
  7029.                 ADC     A,C
  7030.                 XOR     C
  7031.                 LD      D,A
  7032.                 RET
  7033.  
  7034. ; Store a positive integer. Not used in ROM.
  7035. P_INT_STO:      LD      C,#00
  7036.  
  7037. ; Store an integer
  7038. INT_STORE:      PUSH    HL
  7039.                 LD      (HL),#00
  7040.                 INC     HL
  7041.                 LD      (HL),C
  7042.                 INC     HL
  7043.                 LD      A,E
  7044.                 XOR     C
  7045.                 SUB     C
  7046.                 LD      (HL),A
  7047.                 INC     HL
  7048.                 LD      A,D
  7049.                 ADC     A,C
  7050.                 XOR     C
  7051.                 LD      (HL),A
  7052.                 INC     HL
  7053.                 LD      (HL),#00
  7054.                 POP     HL
  7055.                 RET
  7056.  
  7057. ; Get floating point number from the calc stack to the BC
  7058. FP_TO_BC:       RST     #28                     ;FP_CALC
  7059.                 DB      #38                     ;END_CALCS
  7060.                 LD      A,(HL)
  7061.                 AND     A
  7062.                 JR      Z,FP_DELETE
  7063.                 RST     #28                     ;FP_CALC
  7064.                 DB      #A2                     ;STK_HALF
  7065.                 DB      #0F                     ;ADDITION
  7066.                 DB      #27                     ;INT
  7067.                 DB      #38                     ;END_CALC
  7068.  
  7069. FP_DELETE:      RST     #28                     ;FP_CALC
  7070.                 DB      #02                     ;DELETE
  7071.                 DB      #38                     ;END_CALC
  7072.                 PUSH    HL
  7073.                 PUSH    DE
  7074.                 EX      DE,HL
  7075.                 LD      B,(HL)
  7076.                 CALL    INT_FETCH
  7077.                 XOR     A
  7078.                 SUB     B
  7079.                 BIT     7,C
  7080.                 LD      B,D
  7081.                 LD      C,E
  7082.                 LD      A,E
  7083.                 POP     DE
  7084.                 POP     HL
  7085.                 RET
  7086.  
  7087. LOG_2_A:        LD      D,A
  7088.                 RLA
  7089.                 SBC     A,A
  7090.                 LD      E,A
  7091.                 LD      C,A
  7092.                 XOR     A
  7093.                 LD      B,A
  7094.                 CALL    STK_STORE
  7095.                 RST     #28                     ;FP_CALC
  7096.                 DB      #34                     ;STK_DATA
  7097.                 DB      #EF                     ;Exponent
  7098.                 DB      #1A                     ;
  7099.                 DB      #20                     ;
  7100.                 DB      #9A                     ;
  7101.                 DB      #85                     ;
  7102.                 DB      #04                     ;MULTIPLY
  7103.                 DB      #27                     ;INT
  7104.                 DB      #38                     ;END_CALC
  7105.  
  7106. ; Floating point to A
  7107. FP_TO_A:        CALL    FP_TO_BC
  7108.                 RET     C
  7109.                 PUSH    AF
  7110.                 DEC     B
  7111.                 INC     B
  7112.                 JR      Z,FP_A_END
  7113.                 POP     AF
  7114.                 SCF
  7115.                 RET
  7116.  
  7117. FP_A_END:       POP     AF
  7118.                 RET
  7119.  
  7120. ; Print a floating point number
  7121. PRINT_FP:       RST     #28             ;FP_CALC
  7122.                 DB      #31             ;DUPLICATE
  7123.                 DB      #36             ;LESS_0
  7124.                 DB      #00             ;JUMP_TRUE
  7125.                 DB      #0B             ;to PF_NEGTVE
  7126.                 DB      #31             ;DUPLICATE
  7127.                 DB      #37             ;GREATER_0
  7128.                 DB      #00             ;JUMP_TRUE
  7129.                 DB      #0D             ;to PS_POSTVE
  7130.                 DB      #02             ;DELETE
  7131.                 DB      #38             ;END_CALC
  7132.                 LD      A,#30
  7133.                 RST     #10
  7134.                 RET
  7135.  
  7136. PF_NEGTVE:      DB      #2A             ;ABS
  7137.                 DB      #38             ;END_CALC
  7138.                 LD      A,#2D
  7139.                 RST     #10
  7140.                 RST     #28             ;FP_CALC
  7141. PF_POSTVE:      DB      #A0             ;STK_ZERO
  7142.                 DB      #C3             ;ST_MEM_3
  7143.                 DB      #C4             ;ST_MEM_4
  7144.                 DB      #C5             ;ST_MEM_5
  7145.                 DB      #02             ;DELETE
  7146.                 DB      #38             ;END_CALC
  7147.                 EXX
  7148.                 PUSH    HL
  7149.                 EXX
  7150. PF_LOOP:        RST     #28             ;FP_CALC
  7151.                 DB      #31             ;DUPLICATE
  7152.                 DB      #27             ;INT
  7153.                 DB      #C2             ;ST_MEM_2
  7154.                 DB      #03             ;SUBTRACT
  7155.                 DB      #E2             ;GET_MEM_2
  7156.                 DB      #01             ;EXCHANGE
  7157.                 DB      #C2             ;ST_MEM_2
  7158.                 DB      #02             ;DELETE
  7159.                 DB      #38             ;END_CALC
  7160.                 LD      A,(HL)
  7161.                 AND     A
  7162.                 JR      NZ,PF_LARGE
  7163.                 CALL    INT_FETCH
  7164.                 LD      B,#10
  7165.                 LD      A,D
  7166.                 AND     A
  7167.                 JR      NZ,PF_SAVE
  7168.                 OR      E
  7169.                 JR      Z,PF_SMALL
  7170.                 LD      D,E
  7171.                 LD      B,#08
  7172. PF_SAVE:        PUSH    DE
  7173.                 EXX
  7174.                 POP     DE
  7175.                 EXX
  7176.                 JR      PF_BITS
  7177.  
  7178. PF_SMALL:       RST     #28             ;FP_CALC
  7179.                 DB      #E2             ;GET_MEM_2
  7180.                 DB      #38             ;END_CALC
  7181.                 LD      A,(HL)
  7182.                 SUB     #7E
  7183.                 CALL    LOG_2_A
  7184.                 LD      D,A
  7185.                 LD      A,(#5CAC)
  7186.                 SUB     D
  7187.                 LD      (#5CAC),A
  7188.                 LD      A,D
  7189.                 CALL    E_TO_FP
  7190.                 RST     #28             ;FP_CALC
  7191.                 DB      #31             ;DUPLICATE
  7192.                 DB      #27             ;21
  7193.                 DB      #C1             ;ST_MEM_1
  7194.                 DB      #03             ;SUBTRACT
  7195.                 DB      #E1             ;GET_MEM_1
  7196.                 DB      #38             ;END_CALC
  7197.                 CALL    FP_TO_A
  7198.                 PUSH    HL
  7199.                 LD      (#5CA1),A
  7200.                 DEC     A
  7201.                 RLA
  7202.                 SBC     A,A
  7203.                 INC     A
  7204.                 LD      HL,#5CAB
  7205.                 LD      (HL),A
  7206.                 INC     HL
  7207.                 ADD     A,(HL)
  7208.                 LD      (HL),A
  7209.                 POP     HL
  7210.                 JP      PF_FRACTN
  7211.  
  7212. PF_LARGE:       SUB     #80
  7213.                 CP      #1C
  7214.                 JR      C,PF_MEDIUM
  7215.                 CALL    LOG_2_A
  7216.                 SUB     #07
  7217.                 LD      B,A
  7218.                 LD      HL,#5CAC
  7219.                 ADD     A,(HL)
  7220.                 LD      (HL),A
  7221.                 LD      A,B
  7222.                 NEG
  7223.                 CALL    E_TO_FP
  7224.                 JR      PF_LOOP
  7225.  
  7226. PF_MEDIUM:      EX      DE,HL
  7227.                 CALL    FETCH_TWO
  7228.                 EXX
  7229.                 SET     7,D
  7230.                 LD      A,L
  7231.                 EXX
  7232.                 SUB     #80
  7233.                 LD      B,A
  7234. PF_BITS:        SLA     E
  7235.                 RL      D
  7236.                 EXX
  7237.                 RL      E
  7238.                 RL      D
  7239.                 EXX
  7240.                 LD      HL,#5CAA
  7241.                 LD      C,#05
  7242. PF_BYTES:       LD      A,(HL)
  7243.                 ADC     A,A
  7244.                 DAA
  7245.                 LD      (HL),A
  7246.                 DEC     HL
  7247.                 DEC     C
  7248.                 JR      NZ,PF_BYTES
  7249.                 DJNZ    PF_BITS
  7250.                 XOR     A
  7251.                 LD      HL,#5CA6
  7252.                 LD      DE,#5CA1
  7253.                 LD      B,#09
  7254.                 RLD
  7255.                 LD      C,#FF
  7256. PF_DIGITS:      RLD
  7257.                 JR      NZ,PF_INSERT
  7258.                 DEC     C
  7259.                 INC     C
  7260.                 JR      NZ,PF_TEST_2
  7261. PF_INSERT:      LD      (DE),A
  7262.                 INC     DE
  7263.                 INC     (IY+#71)
  7264.                 INC     (IY+#72)
  7265.                 LD      C,#00
  7266. PF_TEST_2:      BIT     0,B
  7267.                 JR      Z,PF_ALL_9
  7268.                 INC     HL
  7269. PF_ALL_9:       DJNZ    PF_DIGITS
  7270.                 LD      A,(#5CAB)
  7271.                 SUB     #09
  7272.                 JR      C,PF_MORE
  7273.                 DEC     (IY+#71)
  7274.                 LD      A,#04
  7275.                 CP      (IY+#6F)
  7276.                 JR      PF_ROUND
  7277.  
  7278. PF_MORE:        RST     #28                     ;FP_CALC
  7279.                 DB      #02                     ;DELETE
  7280.                 DB      #E2                     ;GET_MEM_2
  7281.                 DB      #38                     ;END_CALC
  7282.  
  7283. PF_FRACTN:      EX      DE,HL
  7284.                 CALL    FETCH_TWO
  7285.                 EXX
  7286.                 LD      A,#80
  7287.                 SUB     L
  7288.                 LD      L,#00
  7289.                 SET     7,D
  7290.                 EXX
  7291.                 CALL    SHIFT_FP
  7292. PF_FRN_LP:      LD      A,(IY+#71)
  7293.                 CP      #08
  7294.                 JR      C,PF_FR_DGT
  7295.                 EXX
  7296.                 RL      D
  7297.                 EXX
  7298.                 JR      PF_ROUND
  7299.  
  7300. PF_FR_DGT:      LD      BC,#0200
  7301. PF_FR_EXX:      LD      A,E
  7302.                 CALL    CA_10_A_C
  7303.                 LD      E,A
  7304.                 LD      A,D
  7305.                 CALL    CA_10_A_C
  7306.                 LD      D,A
  7307.                 PUSH    BC
  7308.                 EXX
  7309.                 POP     BC
  7310.                 DJNZ    PF_FR_EXX
  7311.                 LD      HL,#5CA1
  7312.                 LD      A,C
  7313.                 LD      C,(IY+#71)
  7314.                 ADD     HL,BC
  7315.                 LD      (HL),A
  7316.                 INC     (IY+#71)
  7317.                 JR      PF_FRN_LP
  7318.  
  7319. PF_ROUND:       PUSH    AF
  7320.                 LD      HL,#5CA1
  7321.                 LD      C,(IY+#71)
  7322.                 LD      B,#00
  7323.                 ADD     HL,BC
  7324.                 LD      B,C
  7325.                 POP     AF
  7326. PF_RND_LP:      DEC     HL
  7327.                 LD      A,(HL)
  7328.                 ADC     A,#00
  7329.                 LD      (HL),A
  7330.                 AND     A
  7331.                 JR      Z,PF_R_BACK
  7332.                 CP      #0A
  7333.                 CCF
  7334.                 JR      NC,PF_COUNT
  7335. PF_R_BACK:      DJNZ    PF_RND_LP
  7336.                 LD      (HL),#01
  7337.                 INC     B
  7338.                 INC     (IY+#72)
  7339. PF_COUNT:       LD      (IY+#71),B
  7340.                 RST     #28                     ;FP_CALC
  7341.                 DB      #02                     ;DELETE
  7342.                 DB      #38                     ;END_CALC
  7343.                 EXX
  7344.                 POP     HL
  7345.                 EXX
  7346.                 LD      BC,(#5CAB)
  7347.                 LD      HL,#5CA1
  7348.                 LD      A,B
  7349.                 CP      #09
  7350.                 JR      C,PF_NOT_E
  7351.                 CP      #FC
  7352.                 JR      C,PF_E_FRMT
  7353. PF_NOT_E:       AND     A
  7354.                 CALL    Z,OUT_CODE
  7355. PF_E_SBRN:      XOR     A
  7356.                 SUB     B
  7357.                 JP      M,PF_OUT_LP
  7358.                 LD      B,A
  7359.                 JR      PF_DC_OUT
  7360.  
  7361. PF_OUT_LP:      LD      A,C
  7362.                 AND     A
  7363.                 JR      Z,PF_OUT_DT
  7364.                 LD      A,(HL)
  7365.                 INC     HL
  7366.                 DEC     C
  7367. PF_OUT_DT:      CALL    OUT_CODE
  7368.                 DJNZ    PF_OUT_LP
  7369. PF_DC_OUT:      LD      A,C
  7370.                 AND     A
  7371.                 RET     Z
  7372.                 INC     B
  7373.                 LD      A,#2E
  7374. PF_DEC_0:       RST     #10
  7375.                 LD      A,#30
  7376.                 DJNZ    PF_DEC_0
  7377.                 LD      B,C
  7378.                 JR      PF_OUT_LP
  7379.  
  7380. PF_E_FRMT:      LD      D,B
  7381.                 DEC     D
  7382.                 LD      B,#01
  7383.                 CALL    PF_E_SBRN
  7384.                 LD      A,#45
  7385.                 RST     #10
  7386.                 LD      C,D
  7387.                 LD      A,C
  7388.                 AND     A
  7389.                 JP      P,PF_E_POS
  7390.                 NEG
  7391.                 LD      C,A
  7392.                 LD      A,#2D
  7393.                 JR      PF_E_SIGN
  7394.  
  7395. PF_E_POS:       LD      A,#2B
  7396. PF_E_SIGN:      RST     #10
  7397.                 LD      B,#00
  7398.                 JP      OUT_NUM_1
  7399.  
  7400. ; Handle printing of floating point
  7401. CA_10_A_C:      PUSH    DE
  7402.                 LD      L,A
  7403.                 LD      H,#00
  7404.                 LD      E,L
  7405.                 LD      D,H
  7406.                 ADD     HL,HL
  7407.                 ADD     HL,HL
  7408.                 ADD     HL,DE
  7409.                 ADD     HL,HL
  7410.                 LD      E,C
  7411.                 ADD     HL,DE
  7412.                 LD      C,H
  7413.                 LD      A,L
  7414.                 POP     DE
  7415.                 RET
  7416.  
  7417. ; Prepare the two numbers for addition
  7418. PREP_ADD:       LD      A,(HL)
  7419.                 LD      (HL),#00
  7420.                 AND     A
  7421.                 RET     Z
  7422.                 INC     HL
  7423.                 BIT     7,(HL)
  7424.                 SET     7,(HL)
  7425.                 DEC     HL
  7426.                 RET     Z
  7427.                 PUSH    BC
  7428.                 LD      BC,#0005
  7429.                 ADD     HL,BC
  7430.                 LD      B,C
  7431.                 LD      C,A
  7432.                 SCF
  7433. NEG_BYTE:       DEC     HL
  7434.                 LD      A,(HL)
  7435.                 CPL
  7436.                 ADC     A,#00
  7437.                 LD      (HL),A
  7438.                 DJNZ    NEG_BYTE
  7439.                 LD      A,C
  7440.                 POP     BC
  7441.                 RET
  7442.  
  7443. ; Fetch two numbers
  7444. FETCH_TWO:      PUSH    HL
  7445.                 PUSH    AF
  7446.                 LD      C,(HL)
  7447.                 INC     HL
  7448.                 LD      B,(HL)
  7449.                 LD      (HL),A
  7450.                 INC     HL
  7451.                 LD      A,C
  7452.                 LD      C,(HL)
  7453.                 PUSH    BC
  7454.                 INC     HL
  7455.                 LD      C,(HL)
  7456.                 INC     HL
  7457.                 LD      B,(HL)
  7458.                 EX      DE,HL
  7459.                 LD      D,A
  7460.                 LD      E,(HL)
  7461.                 PUSH    DE
  7462.                 INC     HL
  7463.                 LD      D,(HL)
  7464.                 INC     HL
  7465.                 LD      E,(HL)
  7466.                 PUSH    DE
  7467.                 EXX
  7468.                 POP     DE
  7469.                 POP     HL
  7470.                 POP     BC
  7471.                 EXX
  7472.                 INC     HL
  7473.                 LD      D,(HL)
  7474.                 INC     HL
  7475.                 LD      E,(HL)
  7476.                 POP     AF
  7477.                 POP     HL
  7478.                 RET
  7479.  
  7480. ; Shift floating point numer to right
  7481. SHIFT_FP:       AND     A
  7482.                 RET     Z
  7483.                 CP      #21
  7484.                 JR      NC,ADDEND_0
  7485.                 PUSH    BC
  7486.                 LD      B,A
  7487. ONE_SHIFT:      EXX
  7488.                 SRA     L
  7489.                 RR      D
  7490.                 RR      E
  7491.                 EXX
  7492.                 RR      D
  7493.                 RR      E
  7494.                 DJNZ    ONE_SHIFT
  7495.                 POP     BC
  7496.                 RET     NC
  7497.                 CALL    ADD_BACK
  7498.                 RET     NZ
  7499. ADDEND_0:       EXX
  7500.                 XOR     A
  7501. ZEROS_4_5:      LD      L,#00
  7502.                 LD      D,A
  7503.                 LD      E,L
  7504.                 EXX
  7505.                 LD      DE,#0000
  7506.                 RET
  7507.  
  7508. ; Add back any carry
  7509. ADD_BACK:       INC     E
  7510.                 RET     NZ
  7511.                 INC     D
  7512.                 RET     NZ
  7513.                 EXX
  7514.                 INC     E
  7515.                 JR      NZ,ALL_ADDED
  7516.                 INC     D
  7517. ALL_ADDED:      EXX
  7518.                 RET
  7519.  
  7520. ; Handle subtraction
  7521. SUBTRACT:       EX      DE,HL
  7522.                 CALL    NEGATE
  7523.                 EX      DE,HL
  7524.  
  7525. ; Handle Addition
  7526. ADDITION:       LD      A,(DE)
  7527.                 OR      (HL)
  7528.                 JR      NZ,FULL_ADDN
  7529.                 PUSH    DE
  7530.                 INC     HL
  7531.                 PUSH    HL
  7532.                 INC     HL
  7533.                 LD      E,(HL)
  7534.                 INC     HL
  7535.                 LD      D,(HL)
  7536.                 INC     HL
  7537.                 INC     HL
  7538.                 INC     HL
  7539.                 LD      A,(HL)
  7540.                 INC     HL
  7541.                 LD      C,(HL)
  7542.                 INC     HL
  7543.                 LD      B,(HL)
  7544.                 POP     HL
  7545.                 EX      DE,HL
  7546.                 ADD     HL,BC
  7547.                 EX      DE,HL
  7548.                 ADC     A,(HL)
  7549.                 RRCA
  7550.                 ADC     A,#00
  7551.                 CALL    E65536
  7552.                 LD      (HL),A
  7553.                 INC     HL
  7554.                 LD      (HL),E
  7555.                 INC     HL
  7556.                 LD      (HL),D
  7557.                 DEC     HL
  7558.                 DEC     HL
  7559.                 DEC     HL
  7560.                 POP     DE
  7561.                 RET
  7562.  
  7563. ADDN_OFLW:      DEC     HL
  7564.                 POP     DE
  7565. FULL_ADDN:      CALL    RE_ST_TWO
  7566.                 EXX
  7567.                 PUSH    HL
  7568.                 EXX
  7569.                 PUSH    DE
  7570.                 PUSH    HL
  7571.                 CALL    PREP_ADD
  7572.                 LD      B,A
  7573.                 EX      DE,HL
  7574.                 CALL    PREP_ADD
  7575.                 LD      C,A
  7576.                 CP      B
  7577.                 JR      NC,SHIFT_LEN
  7578.                 LD      A,B
  7579.                 LD      B,C
  7580.                 EX      DE,HL
  7581. SHIFT_LEN:      PUSH    AF
  7582.                 SUB     B
  7583.                 CALL    FETCH_TWO
  7584.                 CALL    SHIFT_FP
  7585.                 POP     AF
  7586.                 POP     HL
  7587.                 LD      (HL),A
  7588.                 PUSH    HL
  7589.                 LD      L,B
  7590.                 LD      H,C
  7591.                 ADD     HL,DE
  7592.                 EXX
  7593.                 EX      DE,HL
  7594.                 ADC     HL,BC
  7595.                 EX      DE,HL
  7596.                 LD      A,H
  7597.                 ADC     A,L
  7598.                 LD      L,A
  7599.                 RRA
  7600.                 XOR     L
  7601.                 EXX
  7602.                 EX      DE,HL
  7603.                 POP     HL
  7604.                 RRA
  7605.                 JR      NC,TEST_NEG
  7606.                 LD      A,#01
  7607.                 CALL    SHIFT_FP
  7608.                 INC     (HL)
  7609.                 JR      Z,ADD_REP_6
  7610. TEST_NEG:       EXX
  7611.                 LD      A,L
  7612.                 AND     #80
  7613.                 EXX
  7614.                 INC     HL
  7615.                 LD      (HL),A
  7616.                 DEC     HL
  7617.                 JR      Z,GO_NC_MLT
  7618.                 LD      A,E
  7619.                 NEG
  7620.                 CCF
  7621.                 LD      E,A
  7622.                 LD      A,D
  7623.                 CPL
  7624.                 ADC     A,#00
  7625.                 LD      D,A
  7626.                 EXX
  7627.                 LD      A,E
  7628.                 CPL
  7629.                 ADC     A,#00
  7630.                 LD      E,A
  7631.                 LD      A,D
  7632.                 CPL
  7633.                 ADC     A,#00
  7634.                 JR      NC,END_COMPL
  7635.                 RRA
  7636.                 EXX
  7637.                 INC     (HL)
  7638. ADD_REP_6:      JP      Z,REPORT_6
  7639.                 EXX
  7640. END_COMPL:      LD      D,A
  7641.                 EXX
  7642. GO_NC_MLT:      XOR     A
  7643.                 JP      TEST_NORM
  7644.  
  7645. ; HL - HL * DE
  7646. HL_HL_DE:       PUSH    BC
  7647.                 LD      B,#10
  7648.                 LD      A,H
  7649.                 LD      C,L
  7650.                 LD      HL,#0000
  7651. HL_LOOP:        ADD     HL,HL
  7652.                 JR      C,HL_END
  7653.                 RL      C
  7654.                 RLA
  7655.                 JR      NC,HL_AGAIN
  7656.                 ADD     HL,DE
  7657.                 JR      C,HL_END
  7658. HL_AGAIN:       DJNZ    HL_LOOP
  7659. HL_END:         POP     BC
  7660.                 RET
  7661.  
  7662. ; Prepare to multiply or divide
  7663. PREP_M_D:       CALL    TEST_ZERO
  7664.                 RET     C
  7665.                 INC     HL
  7666.                 XOR     (HL)
  7667.                 SET     7,(HL)
  7668.                 DEC     HL
  7669.                 RET
  7670.  
  7671. ; Handle multiplication
  7672. MULTIPLY:       LD      A,(DE)
  7673.                 OR      (HL)
  7674.                 JR      NZ,MULT_LONG
  7675.                 PUSH    DE
  7676.                 PUSH    HL
  7677.                 PUSH    DE
  7678.                 CALL    INT_FETCH
  7679.                 EX      DE,HL
  7680.                 EX      (SP),HL
  7681.                 LD      B,C
  7682.                 CALL    INT_FETCH
  7683.                 LD      A,B
  7684.                 XOR     C
  7685.                 LD      C,A
  7686.                 POP     HL
  7687.                 CALL    HL_HL_DE
  7688.                 EX      DE,HL
  7689.                 POP     HL
  7690.                 JR      C,MULT_OFLW
  7691.                 LD      A,D
  7692.                 OR      E
  7693.                 JR      NZ,MULT_RSLT
  7694.                 LD      C,A
  7695. MULT_RSLT:      CALL    INT_STORE
  7696.                 POP     DE
  7697.                 RET
  7698.  
  7699. MULT_OFLW:      POP     DE
  7700. MULT_LONG:      CALL    RE_ST_TWO
  7701.                 XOR     A
  7702.                 CALL    PREP_M_D
  7703.                 RET     C
  7704.                 EXX
  7705.                 PUSH    HL
  7706.                 EXX
  7707.                 PUSH    DE
  7708.                 EX      DE,HL
  7709.                 CALL    PREP_M_D
  7710.                 EX      DE,HL
  7711.                 JR      C,ZERO_RSLT
  7712.                 PUSH    HL
  7713.                 CALL    FETCH_TWO
  7714.                 LD      A,B
  7715.                 AND     A
  7716.                 SBC     HL,HL
  7717.                 EXX
  7718.                 PUSH    HL
  7719.                 SBC     HL,HL
  7720.                 EXX
  7721.                 LD      B,#21
  7722.                 JR      STRT_MLT
  7723.  
  7724. MLT_LOOP:       JR      NC,NO_ADD
  7725.                 ADD     HL,DE
  7726.                 EXX
  7727.                 ADC     HL,DE
  7728.                 EXX
  7729. NO_ADD:         EXX
  7730.                 RR      H
  7731.                 RR      L
  7732.                 EXX
  7733.                 RR      H
  7734.                 RR      L
  7735. STRT_MLT:       EXX
  7736.                 RR      B
  7737.                 RR      C
  7738.                 EXX
  7739.                 RR      C
  7740.                 RRA
  7741.                 DJNZ    MLT_LOOP
  7742.                 EX      DE,HL
  7743.                 EXX
  7744.                 EX      DE,HL
  7745.                 EXX
  7746.                 POP     BC
  7747.                 POP     HL
  7748.                 LD      A,B
  7749.                 ADD     A,C
  7750.                 JR      NZ,MAKE_EXPT
  7751.                 AND     A
  7752. MAKE_EXPT:      DEC     A
  7753.                 CCF
  7754. DIVN_EXPT:      RLA
  7755.                 CCF
  7756.                 RRA
  7757.                 JP      P,OFLW1_CLR
  7758.                 JR      NC,REPORT_6
  7759.                 AND     A
  7760. OFLW1_CLR:      INC     A
  7761.                 JR      NZ,OFLW2_CLR
  7762.                 JR      C,OFLW2_CLR
  7763.                 EXX
  7764.                 BIT     7,D
  7765.                 EXX
  7766.                 JR      NZ,REPORT_6
  7767. OFLW2_CLR       LD      (HL),A
  7768.                 EXX
  7769.                 LD      A,B
  7770.                 EXX
  7771. TEST_NORM:      JR      NC,NORMALISE
  7772.                 LD      A,(HL)
  7773.                 AND     A
  7774. NEAR_ZERO:      LD      A,#80
  7775.                 JR      Z,SKIP_ZERO
  7776. ZERO_RSLT:      XOR     A
  7777. SKIP_ZERO:      EXX
  7778.                 AND     D
  7779.                 CALL    ZEROS_4_5
  7780.                 RLCA
  7781.                 LD      (HL),A
  7782.                 JR      C,OFLOW_CLR
  7783.                 INC     HL
  7784.                 LD      (HL),A
  7785.                 DEC     HL
  7786.                 JR      OFLOW_CLR
  7787.  
  7788. NORMALISE:      LD      B,#20
  7789. SHIFT_ONE:      EXX
  7790.                 BIT     7,D
  7791.                 EXX
  7792.                 JR      NZ,NORML_NOW
  7793.                 RLCA
  7794.                 RL      E
  7795.                 RL      D
  7796.                 EXX
  7797.                 RL      E
  7798.                 RL      D
  7799.                 EXX
  7800.                 DEC     (HL)
  7801.                 JR      Z,NEAR_ZERO
  7802.                 DJNZ    SHIFT_ONE
  7803.                 JR      ZERO_RSLT
  7804.  
  7805. NORML_NOW:      RLA
  7806.                 JR      NC,OFLOW_CLR
  7807.                 CALL    ADD_BACK
  7808.                 JR      NZ,OFLOW_CLR
  7809.                 EXX
  7810.                 LD      D,#80
  7811.                 EXX
  7812.                 INC     (HL)
  7813.                 JR      Z,REPORT_6
  7814. OFLOW_CLR:      PUSH    HL
  7815.                 INC     HL
  7816.                 EXX
  7817.                 PUSH    DE
  7818.                 EXX
  7819.                 POP     BC
  7820.                 LD      A,B
  7821.                 RLA
  7822.                 RL      (HL)
  7823.                 RRA
  7824.                 LD      (HL),A
  7825.                 INC     HL
  7826.                 LD      (HL),C
  7827.                 INC     HL
  7828.                 LD      (HL),D
  7829.                 INC     HL
  7830.                 LD      (HL),E
  7831.                 POP     HL
  7832.                 POP     DE
  7833.                 EXX
  7834.                 POP     HL
  7835.                 EXX
  7836.                 RET
  7837.  
  7838. REPORT_6:       RST     #08                     ; Error report
  7839.                 DB      #05                     ; Number too big
  7840.  
  7841. ; Handle division
  7842. DIVISION:       CALL    RE_ST_TWO
  7843.                 EX      DE,HL
  7844.                 XOR     A
  7845.                 CALL    PREP_M_D
  7846.                 JR      C,REPORT_6
  7847.                 EX      DE,HL
  7848.                 CALL    PREP_M_D
  7849.                 RET     C
  7850.                 EXX
  7851.                 PUSH    HL
  7852.                 EXX
  7853.                 PUSH    DE
  7854.                 PUSH    HL
  7855.                 CALL    FETCH_TWO
  7856.                 EXX
  7857.                 PUSH    HL
  7858.                 LD      H,B
  7859.                 LD      L,C
  7860.                 EXX
  7861.                 LD      H,C
  7862.                 LD      L,B
  7863.                 XOR     A
  7864.                 LD      B,#DF
  7865.                 JR      DIV_START
  7866.  
  7867. DIV_LOOP:       RLA
  7868.                 RL      C
  7869.                 EXX
  7870.                 RL      C
  7871.                 RL      B
  7872.                 EXX
  7873. DIV_34TH:       ADD     HL,HL
  7874.                 EXX
  7875.                 ADC     HL,HL
  7876.                 EXX
  7877.                 JR      C,SUBN_ONLY
  7878. DIV_START:      SBC     HL,DE
  7879.                 EXX
  7880.                 SBC     HL,DE
  7881.                 EXX
  7882.                 JR      NC,NO_RSTORE
  7883.                 ADD     HL,DE
  7884.                 EXX
  7885.                 ADC     HL,DE
  7886.                 EXX
  7887.                 AND     A
  7888.                 JR      COUNT_ONE
  7889.  
  7890. SUBN_ONLY:      AND     A
  7891.                 SBC     HL,DE
  7892.                 EXX
  7893.                 SBC     HL,DE
  7894.                 EXX
  7895. NO_RSTORE:      SCF
  7896. COUNT_ONE:      INC     B
  7897.                 JP      M,DIV_LOOP
  7898.                 PUSH    AF
  7899.                 JR      Z,DIV_34TH              ; BSROM - bugfix - was DIV_START
  7900.                 LD      E,A
  7901.                 LD      D,C
  7902.                 EXX
  7903.                 LD      E,C
  7904.                 LD      D,B
  7905.                 POP     AF
  7906.                 RR      B
  7907.                 POP     AF
  7908.                 RR      B
  7909.                 EXX
  7910.                 POP     BC
  7911.                 POP     HL
  7912.                 LD      A,B
  7913.                 SUB     C
  7914.                 JP      DIVN_EXPT
  7915.  
  7916. ; Integer truncation towards zero
  7917. TRUNCATE:       LD      A,(HL)
  7918.                 AND     A
  7919.                 RET     Z
  7920.                 CP      #81
  7921.                 JR      NC,T_GR_ZERO            ; BSROM - bugfixed INT
  7922.                 LD      (HL),#00
  7923.                 LD      A,#20
  7924.                 JR      NIL_BYTES
  7925.  
  7926. E65536:         JR      NZ,S65536
  7927.                 SBC     A,A
  7928.                 LD      C,A
  7929.                 INC     A
  7930.                 OR      D
  7931.                 OR      E
  7932.                 LD      A,C
  7933.                 RET     NZ
  7934. S65536:         POP     AF
  7935.                 JP      ADDN_OFLW
  7936.  
  7937. NEW_CHR:        CALL    FP_TO_A                 ; BSROM - bugfixed CHR$
  7938.                 RET     C
  7939.                 RET     Z
  7940.                 POP     AF
  7941.                 LD      DE,#0001
  7942.                 LD      BC,#FFFF
  7943.                 JP      CHR_DLR1
  7944.  
  7945. T_GR_ZERO:      CP      #91                     ; BSROM - modified INT
  7946. T_SMALL:        JR      NC,X_LARGE
  7947.                 PUSH    DE
  7948.                 CPL
  7949.                 ADD     A,#91
  7950.                 INC     HL
  7951.                 LD      D,(HL)
  7952.                 INC     HL
  7953.                 LD      E,(HL)
  7954.                 DEC     HL
  7955.                 DEC     HL
  7956.                 LD      C,#00
  7957.                 BIT     7,D
  7958.                 JR      Z,T_NUMERIC
  7959.                 DEC     C
  7960. T_NUMERIC:      SET     7,D
  7961.                 LD      B,#08
  7962.                 SUB     B
  7963.                 ADD     A,B
  7964.                 JR      C,T_TEST
  7965.                 LD      E,D
  7966.                 LD      D,#00
  7967.                 SUB     B
  7968. T_TEST:         JR      Z,T_STORE
  7969.                 LD      B,A
  7970. T_SHIFT:        SRL     D
  7971.                 RR      E
  7972.                 DJNZ    T_SHIFT
  7973. T_STORE:        CALL    INT_STORE
  7974.                 POP     DE
  7975.                 RET
  7976.  
  7977. T_EXPNENT:      LD      A,(HL)
  7978. X_LARGE:        SUB     #A0
  7979.                 RET     P
  7980.                 NEG
  7981. NIL_BYTES:      PUSH    DE
  7982.                 EX      DE,HL
  7983.                 DEC     HL
  7984.                 LD      B,A
  7985.                 SRL     B
  7986.                 SRL     B
  7987.                 SRL     B
  7988.                 JR      Z,BITS_ZERO
  7989. BYTE_ZERO:      LD      (HL),#00
  7990.                 DEC     HL
  7991.                 DJNZ    BYTE_ZERO
  7992. BITS_ZERO:      AND     #07
  7993.                 JR      Z,IX_END
  7994.                 LD      B,A
  7995.                 LD      A,#FF
  7996. LESS_MASK:      SLA     A
  7997.                 DJNZ    LESS_MASK
  7998.                 AND     (HL)
  7999.                 LD      (HL),A
  8000. IX_END:         EX      DE,HL
  8001.                 POP     DE
  8002.                 RET
  8003.  
  8004. ; Re-stack two numbers in full floating point
  8005. RE_ST_TWO:      CALL    RESTK_SUB
  8006. RESTK_SUB:      EX      DE,HL
  8007.  
  8008. ; Re-stack number in full form
  8009. RE_STACK:       LD      A,(HL)
  8010.                 AND     A
  8011.                 RET     NZ
  8012.                 PUSH    DE
  8013.                 CALL    INT_FETCH
  8014.                 XOR     A
  8015.                 INC     HL
  8016.                 LD      (HL),A
  8017.                 DEC     HL
  8018.                 LD      (HL),A
  8019.                 LD      B,#91
  8020.                 LD      A,D
  8021.                 AND     A
  8022.                 JR      NZ,RS_NRMLSE
  8023.                 OR      E
  8024.                 LD      B,D
  8025.                 JR      Z,RS_STORE
  8026.                 LD      D,E
  8027.                 LD      E,B
  8028.                 LD      B,#89
  8029. RS_NRMLSE:      EX      DE,HL
  8030. RSTK_LOOP:      DEC     B
  8031.                 ADD     HL,HL
  8032.                 JR      NC,RSTK_LOOP
  8033.                 RRC     C
  8034.                 RR      H
  8035.                 RR      L
  8036.                 EX      DE,HL
  8037. RS_STORE:       DEC     HL
  8038.                 LD      (HL),E
  8039.                 DEC     HL
  8040.                 LD      (HL),D
  8041.                 DEC     HL
  8042.                 LD      (HL),B
  8043.                 POP     DE
  8044.                 RET
  8045.  
  8046. ; Floating point calculator
  8047. ; Table of constants
  8048. STK_ZERO:       DB      #00
  8049.                 DB      #B0
  8050.                 DB      #00
  8051.  
  8052. STK_ONE:        DB      #40
  8053.                 DB      #B0
  8054.                 DB      #00
  8055.                 DB      #01
  8056.  
  8057. STK_HALF:       DB      #30
  8058.                 DB      #00
  8059.        
  8060. STK_PI_2:       DB      #F1
  8061.                 DB      #49
  8062.                 DB      #0F
  8063.                 DB      #DA
  8064.                 DB      #A2
  8065.        
  8066. STK_TEN:        DB      #40
  8067.                 DB      #B0
  8068.                 DB      #00
  8069.                 DB      #0A
  8070.  
  8071. ; Floating point calculator
  8072. ; Table of addresses
  8073. TBL_ADDRS:      DW      JUMP_TRUE
  8074.                 DW      EXCHANGE
  8075.                 DW      DELETE
  8076.                 DW      SUBTRACT
  8077.                 DW      MULTIPLY
  8078.                 DW      DIVISION
  8079.                 DW      TO_POWER
  8080.                 DW      OR_FUNC
  8081.                 DW      NO_AND_NO
  8082.                 DW      NO_L_EQL
  8083.                 DW      NO_GR_EQL
  8084.                 DW      NOS_NEQL
  8085.                 DW      NO_GRTR
  8086.                 DW      NO_LESS
  8087.                 DW      NOS_EQL
  8088.                 DW      ADDITION
  8089.                 DW      STR_AND_NO
  8090.                 DW      STR_L_EQL
  8091.                 DW      STR_GR_EQL
  8092.                 DW      STRS_NEQL
  8093.                 DW      STR_GRTR
  8094.                 DW      STR_LESS
  8095.                 DW      STRS_EQL
  8096.                 DW      STRS_ADD
  8097.                 DW      VAL_DLR
  8098.                 DW      USR_STR
  8099.                 DW      READ_IN
  8100.                 DW      NEGATE
  8101.                 DW      CODE
  8102.                 DW      VAL
  8103.                 DW      LEN
  8104.                 DW      SIN_FUNC
  8105.                 DW      COS_FUNC
  8106.                 DW      TAN_FUNC
  8107.                 DW      ASN_FUNC
  8108.                 DW      ACS_FUNC
  8109.                 DW      ATN_FUNC
  8110.                 DW      LN
  8111.                 DW      EXP
  8112.                 DW      INT
  8113.                 DW      SQR_FUNC
  8114.                 DW      SGN
  8115.                 DW      @ABS
  8116.                 DW      PEEK
  8117.                 DW      IN_FUNC
  8118.                 DW      USR_NO
  8119.                 DW      STR_DLR
  8120.                 DW      CHR_DLR
  8121.                 DW      NOT_FUNC
  8122.                 DW      DUPLICATE
  8123.                 DW      N_MOD_M
  8124.                 DW      JUMP
  8125.                 DW      STK_DATA
  8126.                 DW      DEC_JR_NZ
  8127.                 DW      LESS_0
  8128.                 DW      GREATER_0
  8129.                 DW      END_CALC
  8130.                 DW      GET_ARGT
  8131.                 DW      TRUNCATE
  8132.                 DW      FP_CALC_2
  8133.                 DW      E_TO_FP
  8134.                 DW      RE_STACK
  8135.                 DW      SERIES_XX
  8136.                 DW      STK_CONST_XX
  8137.                 DW      ST_MEM_XX
  8138.                 DW      GET_MEM_XX
  8139.  
  8140. ; The Calculator
  8141. CALCULATE:      CALL    STK_PNTRS
  8142. GEN_ENT_1:      LD      A,B
  8143.                 LD      (#5C67),A
  8144. GEN_ENT_2:      EXX
  8145.                 EX      (SP),HL
  8146.                 EXX
  8147. RE_ENTRY:       LD      (#5C65),DE
  8148.                 EXX
  8149.                 LD      A,(HL)
  8150.                 INC     HL
  8151. SCAN_ENT:       PUSH    HL
  8152.                 AND     A
  8153.                 JP      P,FIRST_3D
  8154.                 LD      D,A
  8155.                 AND     #60
  8156.                 RRCA
  8157.                 RRCA
  8158.                 RRCA
  8159.                 RRCA
  8160.                 ADD     A,#7C
  8161.                 LD      L,A
  8162.                 LD      A,D
  8163.                 AND     #1F
  8164.                 JR      ENT_TABLE
  8165.  
  8166. FIRST_3D:       CP      #18
  8167.                 JR      NC,DOUBLE_A
  8168.                 EXX
  8169.                 LD      BC,#FFFB
  8170.                 LD      D,H
  8171.                 LD      E,L
  8172.                 ADD     HL,BC
  8173.                 EXX
  8174. DOUBLE_A:       RLCA
  8175.                 LD      L,A
  8176. ENT_TABLE:      LD      DE,TBL_ADDRS
  8177.                 LD      H,#00
  8178.                 ADD     HL,DE
  8179.                 LD      E,(HL)
  8180.                 INC     HL
  8181.                 LD      D,(HL)
  8182.                 LD      HL,RE_ENTRY
  8183.                 EX      (SP),HL
  8184.                 PUSH    DE
  8185.                 EXX
  8186.                 LD      BC,(#5C66)
  8187.  
  8188. ; Handle DELETE        
  8189. DELETE:         RET
  8190.  
  8191. ; Single operation
  8192. FP_CALC_2:      POP     AF
  8193.                 LD      A,(#5C67)
  8194.                 EXX
  8195.                 JR      SCAN_ENT
  8196.  
  8197. ; Test that there is enough space between the calc stack and the machine stack
  8198. TEST_5_SP:      PUSH    DE
  8199.                 PUSH    HL
  8200.                 LD      BC,#0005
  8201.                 CALL    TEST_ROOM
  8202.                 POP     HL
  8203.                 POP     DE
  8204.                 RET
  8205.  
  8206. ; Stack floating point number, numeric variable value or an entry in the BEEP's semi-tone table
  8207. STACK_NUM:      LD      DE,(#5C65)
  8208.                 CALL    MOVE_FP
  8209.                 LD      (#5C65),DE
  8210.                 RET
  8211.  
  8212. ; Move a floating point number
  8213. DUPLICATE:
  8214. MOVE_FP:        CALL    TEST_5_SP
  8215.                 LDIR
  8216.                 RET
  8217.  
  8218. ; Stack literals
  8219. STK_DATA:       LD      H,D
  8220.                 LD      L,E
  8221. STK_CONST:      CALL    TEST_5_SP
  8222.                 EXX
  8223.                 PUSH    HL
  8224.                 EXX
  8225.                 EX      (SP),HL
  8226.                 PUSH    BC
  8227.                 LD      A,(HL)
  8228.                 AND     #C0
  8229.                 RLCA
  8230.                 RLCA
  8231.                 LD      C,A
  8232.                 INC     C
  8233.                 LD      A,(HL)
  8234.                 AND     #3F
  8235.                 JR      NZ,FORM_EXP
  8236.                 INC     HL
  8237.                 LD      A,(HL)
  8238. FORM_EXP:       ADD     A,#50
  8239.                 LD      (DE),A
  8240.                 LD      A,#05
  8241.                 SUB     C
  8242.                 INC     HL
  8243.                 INC     DE
  8244.                 LD      B,#00
  8245.                 LDIR
  8246.                 POP     BC
  8247.                 EX      (SP),HL
  8248.                 EXX
  8249.                 POP     HL
  8250.                 EXX
  8251.                 LD      B,A
  8252.                 XOR     A
  8253. STK_ZEROS:      DEC     B
  8254.                 RET     Z
  8255.                 LD      (DE),A
  8256.                 INC     DE
  8257.                 JR      STK_ZEROS
  8258.  
  8259. ; Skip constants
  8260. SKIP_CONS:      AND     A
  8261. SKIP_NEXT:      RET     Z
  8262.                 PUSH    AF
  8263.                 PUSH    DE
  8264.                 CALL    NO_RW_AT0               ; BSROM - fix for rewriting first bytes of ROM
  8265.                 CALL    STK_CONST
  8266.                 POP     DE
  8267.                 POP     AF
  8268.                 DEC     A
  8269.                 JR      SKIP_NEXT
  8270.  
  8271. ; Calculate memory location
  8272. LOC_MEM:        LD      C,A
  8273.                 RLCA
  8274.                 RLCA
  8275.                 ADD     A,C
  8276.                 LD      C,A
  8277.                 LD      B,#00
  8278.                 ADD     HL,BC
  8279.                 RET
  8280.  
  8281. ; Get from memory area
  8282. GET_MEM_XX:     PUSH    DE
  8283.                 LD      HL,(#5C68)
  8284.                 CALL    LOC_MEM
  8285.                 CALL    MOVE_FP
  8286.                 POP     HL
  8287.                 RET
  8288.  
  8289. ; Stack a constant
  8290. STK_CONST_XX:   LD      H,D
  8291.                 LD      L,E
  8292.                 EXX
  8293.                 PUSH    HL
  8294.                 LD      HL,STK_ZERO
  8295.                 EXX
  8296.                 CALL    SKIP_CONS
  8297.                 CALL    STK_CONST
  8298.                 EXX
  8299.                 POP     HL
  8300.                 EXX
  8301.                 RET
  8302.  
  8303. ; Store in a memory area
  8304. ST_MEM_XX:      PUSH    HL
  8305.                 EX      DE,HL
  8306.                 LD      HL,(#5C68)
  8307.                 CALL    LOC_MEM
  8308.                 EX      DE,HL
  8309.                 CALL    MOVE_FP
  8310.                 EX      DE,HL
  8311.                 POP     HL
  8312.                 RET
  8313.  
  8314. ; Swap first number with second number
  8315. EXCHANGE:       LD      B,#05
  8316. SWAP_BYTE:      LD      A,(DE)
  8317.                 LD      C,(HL)
  8318.                 EX      DE,HL
  8319.                 LD      (DE),A
  8320.                 LD      (HL),C
  8321.                 INC     HL
  8322.                 INC     DE
  8323.                 DJNZ    SWAP_BYTE
  8324.                 EX      DE,HL
  8325.                 RET
  8326.  
  8327. ; Series generator
  8328. SERIES_XX:      LD      B,A
  8329.                 CALL    GEN_ENT_1
  8330.                 DB      #31                     ;DUPLICATE
  8331.                 DB      #0F                     ;ADDITION
  8332.                 DB      #C0                     ;ST_MEM_0
  8333.                 DB      #02                     ;DELETE
  8334.                 DB      #A0                     ;STK_ZERO
  8335.                 DB      #C2                     ;ST_MEM_2
  8336. G_LOOP:         DB      #31                     ;DUPLICATE
  8337.                 DB      #E0                     ;GET_MEM_0
  8338.                 DB      #04                     ;MULTIPLY
  8339.                 DB      #E2                     ;GET_MEM_2
  8340.                 DB      #C1                     ;ST_MEM_1
  8341.                 DB      #03                     ;SUBTRACT
  8342.                 DB      #38                     ;END_CALC
  8343.                 CALL    STK_DATA
  8344.                 CALL    GEN_ENT_2
  8345.                 DB      #0F                     ;ADDITION
  8346.                 DB      #01                     ;EXCHANGE
  8347.                 DB      #C2                     ;ST_MEM_2
  8348.                 DB      #02                     ;DELETE
  8349.                 DB      #35                     ;DEC_JR_NZ
  8350.                 DB      #EE                     ;back to G_LOOP
  8351.                 DB      #E1                     ;GET_MEM_1
  8352.                 DB      #03                     ;SUBTRACT
  8353.                 DB      #38                     ;END_CALC
  8354.                 RET
  8355.  
  8356. ; Find the absolute value of the last value, integer or floating point on the calc stack
  8357. ABS:            LD      B,#FF
  8358.                 JR      NEG_TEST
  8359.  
  8360. ; Handle unary minus
  8361. NEGATE:         CALL    TEST_ZERO
  8362.                 RET     C
  8363.                 LD      B,#00
  8364. NEG_TEST:       LD      A,(HL)
  8365.                 AND     A
  8366.                 JR      Z,INT_CASE
  8367.                 INC     HL
  8368.                 LD      A,B
  8369.                 AND     #80
  8370.                 OR      (HL)
  8371.                 RLA
  8372.                 CCF
  8373.                 RRA
  8374.                 LD      (HL),A
  8375.                 DEC     HL
  8376.                 RET
  8377.  
  8378. INT_CASE:       PUSH    DE
  8379.                 PUSH    HL
  8380.                 CALL    INT_FETCH
  8381.                 POP     HL
  8382.                 LD      A,B
  8383.                 OR      C
  8384.                 CPL
  8385.                 LD      C,A
  8386.                 CALL    INT_STORE
  8387.                 POP     DE
  8388.                 RET
  8389.  
  8390. ; Signum
  8391. SGN:            CALL    TEST_ZERO
  8392.                 RET     C
  8393.                 PUSH    DE
  8394.                 LD      DE,#0001
  8395.                 INC     HL
  8396.                 RL      (HL)
  8397.                 DEC     HL
  8398.                 SBC     A,A
  8399.                 LD      C,A
  8400.                 CALL    INT_STORE
  8401.                 POP     DE
  8402.                 RET
  8403.  
  8404. ; Handle IN function
  8405. IN_FUNC:        CALL    FIND_INT2
  8406.                 IN      A,(C)
  8407.                 JR      IN_PK_STK
  8408.  
  8409. ; Handle PEEK function
  8410. PEEK:           CALL    FIND_INT2
  8411.                 LD      A,(BC)
  8412. IN_PK_STK:      JP      STACK_A
  8413.  
  8414. ; Handle USR number
  8415. USR_NO:         CALL    FIND_INT2
  8416.                 LD      HL,STACK_BC
  8417.                 PUSH    HL
  8418.                 PUSH    BC
  8419.                 RET
  8420.  
  8421. ; Handle USR string
  8422. USR_STR:        CALL    STK_FETCH
  8423.                 DEC     BC
  8424.                 LD      A,B
  8425.                 OR      C
  8426.                 JR      NZ,REPORT_A
  8427.                 LD      A,(DE)
  8428.                 CALL    ALPHA
  8429.                 JR      C,USR_RANGE
  8430.                 SUB     #90
  8431.                 JR      C,REPORT_A
  8432.                 CP      #15
  8433.                 JR      NC,REPORT_A
  8434.                 INC     A
  8435. USR_RANGE:      DEC     A
  8436.                 ADD     A,A
  8437.                 ADD     A,A
  8438.                 ADD     A,A
  8439.                 CP      #A8
  8440.                 JR      NC,REPORT_A
  8441.                 LD      BC,(#5C7B)
  8442.                 ADD     A,C
  8443.                 LD      C,A
  8444.                 JR      NC,USR_STACK
  8445.                 INC     B
  8446. USR_STACK:      JP      STACK_BC
  8447.  
  8448. REPORT_A:       RST     #08                     ; Error report
  8449.                 DB      #09                     ; Invalid argument
  8450.  
  8451. ; Test if top value on calc stack is zero
  8452. TEST_ZERO:      PUSH    HL
  8453.                 PUSH    BC
  8454.                 LD      B,A
  8455.                 LD      A,(HL)
  8456.                 INC     HL
  8457.                 OR      (HL)
  8458.                 INC     HL
  8459.                 OR      (HL)
  8460.                 INC     HL
  8461.                 OR      (HL)
  8462.                 LD      A,B
  8463.                 POP     BC
  8464.                 POP     HL
  8465.                 RET     NZ
  8466.                 SCF
  8467.                 RET
  8468.  
  8469. ; Test if the last value on calc stack is greater than zero
  8470. GREATER_0:      CALL    TEST_ZERO
  8471.                 RET     C
  8472.                 LD      A,#FF
  8473.                 JR      SIGN_TO_C
  8474.  
  8475. ; Handle NOT operator
  8476. NOT_FUNC:       CALL    TEST_ZERO
  8477.                 JR      FP_0_1
  8478.  
  8479. ; Test if the last value on calc stack is less than zero
  8480. LESS_0:         XOR     A
  8481. SIGN_TO_C:      INC     HL
  8482.                 XOR     (HL)
  8483.                 DEC     HL
  8484.                 RLCA
  8485.  
  8486. ; Place an iteger value zero or one at the calc stack or memory area
  8487. FP_0_1:         PUSH    HL
  8488.                 LD      A,#00
  8489.                 LD      (HL),A
  8490.                 INC     HL
  8491.                 LD      (HL),A
  8492.                 INC     HL
  8493.                 RLA
  8494.                 LD      (HL),A
  8495.                 RRA
  8496.                 INC     HL
  8497.                 LD      (HL),A
  8498.                 INC     HL
  8499.                 LD      (HL),A
  8500.                 POP     HL
  8501.                 RET
  8502.  
  8503. ; Handle OR operator
  8504. OR_FUNC:        EX      DE,HL
  8505.                 CALL    TEST_ZERO
  8506.                 EX      DE,HL
  8507.                 RET     C
  8508.                 SCF
  8509.                 JR      FP_0_1
  8510.  
  8511. ; Handle number AND number
  8512. NO_AND_NO:      EX      DE,HL
  8513.                 CALL    TEST_ZERO
  8514.                 EX      DE,HL
  8515.                 RET     NC
  8516.                 AND     A
  8517.                 JR      FP_0_1
  8518.  
  8519. ; Handle string AND number
  8520. STR_AND_NO:     EX      DE,HL
  8521.                 CALL    TEST_ZERO
  8522.                 EX      DE,HL
  8523.                 RET     NC
  8524.                 PUSH    DE
  8525.                 DEC     DE
  8526.                 XOR     A
  8527.                 LD      (DE),A
  8528.                 DEC     DE
  8529.                 LD      (DE),A
  8530.                 POP     DE
  8531.                 RET
  8532.  
  8533. ; Perform numeric or string comparison
  8534. NO_L_EQL:
  8535. NO_GR_EQL:
  8536. NOS_NEQL:
  8537. NO_GRTR:
  8538. NO_LESS:
  8539. NOS_EQL:
  8540. STR_L_EQL:
  8541. STR_GR_EQL:
  8542. STRS_NEQL:
  8543. STR_GRTR:
  8544. STR_LESS:
  8545. STRS_EQL:       LD      A,B
  8546.                 SUB     #08
  8547.                 BIT     2,A
  8548.                 JR      NZ,EX_OR_NOT
  8549.                 DEC     A
  8550. EX_OR_NOT:      RRCA
  8551.                 JR      NC,NU_OR_STR
  8552.                 PUSH    AF
  8553.                 PUSH    HL
  8554.                 CALL    EXCHANGE
  8555.                 POP     DE
  8556.                 EX      DE,HL
  8557.                 POP     AF
  8558. NU_OR_STR:      BIT     2,A
  8559.                 JR      NZ,STRINGS
  8560.                 RRCA
  8561.                 PUSH    AF
  8562.                 CALL    SUBTRACT
  8563.                 JR      END_TESTS
  8564.  
  8565. STRINGS:        RRCA
  8566.                 PUSH    AF
  8567.                 CALL    STK_FETCH
  8568.                 PUSH    DE
  8569.                 PUSH    BC
  8570.                 CALL    STK_FETCH
  8571.                 POP     HL
  8572. BYTE_COMP:      LD      A,H
  8573.                 OR      L
  8574.                 EX      (SP),HL
  8575.                 LD      A,B
  8576.                 JR      NZ,SEC_PLUS
  8577.                 OR      C
  8578. SECND_LOW:      POP     BC
  8579.                 JR      Z,BOTH_NULL
  8580.                 POP     AF
  8581.                 CCF
  8582.                 JR      STR_TEST
  8583.  
  8584. BOTH_NULL:      POP     AF
  8585.                 JR      STR_TEST
  8586.  
  8587. SEC_PLUS:       OR      C
  8588.                 JR      Z,FRST_LESS
  8589.                 LD      A,(DE)
  8590.                 SUB     (HL)
  8591.                 JR      C,FRST_LESS
  8592.                 JR      NZ,SECND_LOW
  8593.                 DEC     BC
  8594.                 INC     DE
  8595.                 INC     HL
  8596.                 EX      (SP),HL
  8597.                 DEC     HL
  8598.                 JR      BYTE_COMP
  8599.  
  8600. FRST_LESS:      POP     BC
  8601.                 POP     AF
  8602.                 AND     A
  8603. STR_TEST:       PUSH    AF
  8604.                 RST     #28                     ;FP_CALC
  8605.                 DB      #A0                     ;STK_ZERO
  8606.                 DB      #38                     ;END_CALC
  8607.  
  8608. END_TESTS:      POP     AF
  8609.                 PUSH    AF
  8610.                 CALL    C,NOT_FUNC
  8611.                 POP     AF
  8612.                 PUSH    AF
  8613.                 CALL    NC,GREATER_0
  8614.                 POP     AF
  8615.                 RRCA
  8616.                 CALL    NC,NOT_FUNC
  8617.                 RET
  8618.  
  8619. ; Combine two strings into one
  8620. STRS_ADD:       CALL    STK_FETCH
  8621.                 PUSH    DE
  8622.                 PUSH    BC
  8623.                 CALL    STK_FETCH
  8624.                 POP     HL
  8625.                 PUSH    HL
  8626.                 PUSH    DE
  8627.                 PUSH    BC
  8628.                 ADD     HL,BC
  8629.                 LD      B,H
  8630.                 LD      C,L
  8631.                 RST     #30
  8632.                 CALL    STK_STO_D
  8633.                 POP     BC
  8634.                 POP     HL
  8635.                 LD      A,B
  8636.                 OR      C
  8637.                 JR      Z,OTHER_STR
  8638.                 LDIR
  8639. OTHER_STR:      POP     BC
  8640.                 POP     HL
  8641.                 LD      A,B
  8642.                 OR      C
  8643.                 JR      Z,STK_PNTRS
  8644.                 LDIR
  8645.  
  8646. ; Check stack pointers
  8647. STK_PNTRS:      LD      HL,(#5C65)
  8648.                 LD      DE,#FFFB
  8649.                 PUSH    HL
  8650.                 ADD     HL,DE
  8651.                 POP     DE
  8652.                 RET
  8653.  
  8654. ; Handle CHR$
  8655. CHR_DLR:        CALL    NEW_CHR                 ;BSROM - bugfixed CHR$
  8656.                 JR      C,REPORT_BD
  8657.                 JR      NZ,REPORT_BD
  8658.                 PUSH    AF
  8659.                 LD      BC,#0001
  8660.                 RST     #30
  8661.                 POP     AF
  8662.                 LD      (DE),A
  8663. CHR_DLR1:       CALL    STK_STO_D
  8664.                 EX      DE,HL
  8665.                 RET
  8666.  
  8667. REPORT_BD:      RST     #08                     ; Error report
  8668.                 DB      #0A                     ; Integer out of range
  8669.  
  8670. ; Handle VAL and VAL$
  8671. VAL:
  8672. VAL_DLR:        CALL    VAL2                    ; BSROM - enhanced VAL & VAL$
  8673.                 PUSH    HL
  8674.                 LD      A,B
  8675.                 ADD     A,#E3
  8676.                 SBC     A,A
  8677.                 PUSH    AF
  8678.                 CALL    STK_FETCH
  8679.                 PUSH    DE
  8680.                 INC     BC
  8681.                 RST     #30
  8682.                 POP     HL
  8683.                 LD      (#5C5D),DE
  8684.                 PUSH    DE
  8685.                 LDIR
  8686.                 EX      DE,HL
  8687.                 DEC     HL
  8688.                 LD      (HL),#0D
  8689.                 RES     7,(IY+#01)
  8690.                 CALL    SCANNING
  8691.                 RST     #18
  8692.                 CP      #0D
  8693.                 JR      NZ,V_RPORT_C
  8694.                 POP     HL
  8695.                 POP     AF
  8696.                 XOR     (IY+#01)
  8697.                 AND     #40
  8698. V_RPORT_C:      JP      NZ,REPORT_C
  8699.                 LD      (#5C5D),HL
  8700.                 SET     7,(IY+#01)
  8701.                 CALL    SCANNING
  8702.                 POP     HL
  8703.                 LD      (#5C5D),HL
  8704.                 JR      STK_PNTRS
  8705.  
  8706. ; Handle STR$
  8707. STR_DLR:        LD      BC,#0001
  8708.                 RST     #30
  8709.                 LD      (#5C5B),HL
  8710.                 PUSH    HL
  8711.                 LD      HL,(#5C51)
  8712.                 PUSH    HL
  8713.                 LD      A,#FF
  8714.                 CALL    CHAN_OPEN
  8715.                 CALL    PRINT_FP
  8716.                 POP     HL
  8717.                 CALL    CHAN_FLAG
  8718.                 POP     DE
  8719.                 LD      HL,(#5C5B)
  8720.                 AND     A
  8721.                 SBC     HL,DE
  8722.                 LD      B,H
  8723.                 LD      C,L
  8724.                 CALL    STK_STO_D
  8725.                 EX      DE,HL
  8726.                 RET
  8727.  
  8728. ; Read in for INKEY$
  8729. READ_IN:        CALL    FIND_INT1
  8730.                 CP      #10
  8731.                 JP      NC,REPORT_BB
  8732.                 LD      HL,(#5C51)
  8733.                 PUSH    HL
  8734.                 CALL    CHAN_OPEN
  8735.                 CALL    INPUT_AD
  8736.                 LD      BC,#0000
  8737.                 JR      NC,R_I_STORE
  8738.                 INC     C
  8739.                 RST     #30
  8740.                 LD      (DE),A
  8741. R_I_STORE:      CALL    STK_STO_D
  8742.                 POP     HL
  8743.                 CALL    CHAN_FLAG
  8744.                 JP      STK_PNTRS
  8745.  
  8746. ; Handle CODE
  8747. CODE:           CALL    STK_FETCH
  8748.                 LD      A,B
  8749.                 OR      C
  8750.                 JR      Z,STK_CODE
  8751.                 LD      A,(DE)
  8752. STK_CODE        JP      STACK_A
  8753.  
  8754. ; Handle LEN
  8755. LEN:            CALL    STK_FETCH
  8756.                 JP      STACK_BC
  8757.  
  8758. ; Decrease the counter
  8759. DEC_JR_NZ:      EXX
  8760.                 PUSH    HL
  8761.                 LD      HL,#5C67
  8762.                 DEC     (HL)
  8763.                 POP     HL
  8764.                 JR      NZ,JUMP_2
  8765.                 INC     HL
  8766.                 EXX
  8767.                 RET
  8768.  
  8769. ; Relative jump
  8770. JUMP:           EXX
  8771. JUMP_2:         LD      E,(HL)
  8772.                 LD      A,E
  8773.                 RLA
  8774.                 SBC     A,A
  8775.                 LD      D,A
  8776.                 ADD     HL,DE
  8777.                 EXX
  8778.                 RET
  8779.  
  8780. ; Jump on true
  8781. JUMP_TRUE:      INC     DE
  8782.                 INC     DE
  8783.                 LD      A,(DE)
  8784.                 DEC     DE
  8785.                 DEC     DE
  8786.                 AND     A
  8787.                 JR      NZ,JUMP
  8788.                 EXX
  8789.                 INC     HL
  8790.                 EXX
  8791.                 RET
  8792.  
  8793. ; End of calculation
  8794. END_CALC:       POP     AF
  8795.                 EXX
  8796.                 EX      (SP),HL
  8797.                 EXX
  8798.                 RET
  8799.  
  8800. ; Modulus
  8801. N_MOD_M:        RST     #28                     ;FP_CALC
  8802.                 DB      #C0                     ;ST_MEM_0
  8803.                 DB      #02                     ;DELETE
  8804.                 DB      #31                     ;DUPLICATE
  8805.                 DB      #E0                     ;GET_MEM_0
  8806.                 DB      #05                     ;DIVISION
  8807.                 DB      #27                     ;INT
  8808.                 DB      #E0                     ;GET_MEM_0
  8809.                 DB      #01                     ;EXCHANGE
  8810.                 DB      #C0                     ;ST_MEM_0
  8811.                 DB      #04                     ;MULTIPLY
  8812.                 DB      #03                     ;SUBTRACT
  8813.                 DB      #E0                     ;GET_MEM_0
  8814.                 DB      #38                     ;END_CALC
  8815.                 RET
  8816.  
  8817. ; Handle INT
  8818. INT:            RST     #28                     ;FP_CALC
  8819.                 DB      #31                     ;DUPLICATE
  8820.                 DB      #36                     ;LESS_0
  8821.                 DB      #00                     ;JUMP_TRUE
  8822.                 DB      #04                     ;to X_NEG
  8823.                 DB      #3A                     ;TRUNCATE
  8824.                 DB      #38                     ;END_CALC
  8825.                 RET
  8826.  
  8827. X_NEG:          DB      #31                     ;DUPLICATE
  8828.                 DB      #3A                     ;TRUNCATE
  8829.                 DB      #C0                     ;ST_MEM_0
  8830.                 DB      #03                     ;SUBTRACT
  8831.                 DB      #E0                     ;GET_MEM_0
  8832.                 DB      #01                     ;EXCHANGE
  8833.                 DB      #30                     ;NOT
  8834.                 DB      #00                     ;JUMP_TRUE
  8835.                 DB      #03                     ;to EXIT
  8836.                 DB      #A1                     ;STK_ONE
  8837.                 DB      #03                     ;SUBTRACT
  8838. EXIT:           DB      #38                     ;END_CALC
  8839.                 RET
  8840.  
  8841. ; Exponential
  8842. EXP:            RST     #28                     ;FP_CALC
  8843.                 DB      #3D                     ;RE_STACK
  8844.                 DB      #34                     ;STK_DATA
  8845.                 DB      #F1                     ;Exponent
  8846.                 DB      #38                     ;
  8847.                 DB      #AA                     ;
  8848.                 DB      #3B                     ;
  8849.                 DB      #29                     ;
  8850.                 DB      #04                     ;MULTIPLY
  8851.                 DB      #31                     ;DUPLICATE
  8852.                 DB      #27                     ;INT
  8853.                 DB      #C3                     ;ST_MEM_3
  8854.                 DB      #03                     ;SUBTRACT
  8855.                 DB      #31                     ;DUPLICATE
  8856.                 DB      #0F                     ;ADDITION
  8857.                 DB      #A1                     ;STK_ONE
  8858.                 DB      #03                     ;SUBTRACT
  8859.                 DB      #88                     ;SERIES_08
  8860.                 DB      #13                     ;Exponent
  8861.                 DB      #36                     ;
  8862.                 DB      #58                     ;Exponent
  8863.                 DB      #65                     ;
  8864.                 DB      #66                     ;
  8865.                 DB      #9D                     ;Exponent
  8866.                 DB      #78                     ;
  8867.                 DB      #65                     ;
  8868.                 DB      #40                     ;
  8869.                 DB      #A2                     ;Exponent
  8870.                 DB      #60                     ;
  8871.                 DB      #32                     ;
  8872.                 DB      #C9                     ;
  8873.                 DB      #E7                     ;Exponent
  8874.                 DB      #21                     ;
  8875.                 DB      #F7                     ;
  8876.                 DB      #AF                     ;
  8877.                 DB      #24                     ;
  8878.                 DB      #EB                     ;Exponent
  8879.                 DB      #2F                     ;
  8880.                 DB      #B0                     ;
  8881.                 DB      #B0                     ;
  8882.                 DB      #14                     ;
  8883.                 DB      #EE                     ;Exponent
  8884.                 DB      #7E                     ;
  8885.                 DB      #BB                     ;
  8886.                 DB      #94                     ;
  8887.                 DB      #58                     ;
  8888.                 DB      #F1                     ;Exponent
  8889.                 DB      #3A                     ;
  8890.                 DB      #7E                     ;
  8891.                 DB      #F8                     ;
  8892.                 DB      #CF                     ;
  8893.                 DB      #E3                     ;GET_MEM_3
  8894.                 DB      #38                     ;END-CALC
  8895.                 CALL    FP_TO_A
  8896.                 JR      NZ,N_NEGTV
  8897.                 JR      C,REPORT_6B
  8898.                 ADD     A,(HL)
  8899.                 JR      NC,RESULT_OK
  8900. REPORT_6B:      RST     #08                     ; Error report
  8901.                 DB      #05                     ; Number too big
  8902.  
  8903. N_NEGTV:        JR      C,RSLT_ZERO
  8904.                 SUB     (HL)
  8905.                 JR      NC,RSLT_ZERO
  8906.                 NEG
  8907. RESULT_OK:      LD      (HL),A
  8908.                 RET
  8909.  
  8910. RSLT_ZERO:      RST     #28                     ;FP_CALC
  8911.                 DB      #02                     ;DELETE
  8912.                 DB      #A0                     ;STK_ZERO
  8913.                 DB      #38                     ;END_CALC
  8914.                 RET
  8915.  
  8916. ; Natural logarithm
  8917. LN:             RST     #28                     ;FP_CALC
  8918.                 DB      #3D                     ;RE_STACK
  8919.                 DB      #31                     ;DUPLICATE
  8920.                 DB      #37                     ;GREATER_0
  8921.                 DB      #00                     ;JUMP_TRUE
  8922.                 DB      #04                     ;to VALID
  8923.                 DB      #38                     ;END_CALC
  8924.  
  8925. REPORT_AB:      RST     #08                     ; Error report
  8926.                 DB      #09                     ; Invalid argument
  8927.  
  8928. VALID:          DB      #A0                     ;STK_ZERO
  8929.                 DB      #02                     ;DELETE
  8930.                 DB      #38                     ;END_CALC
  8931.                 LD      A,(HL)
  8932.                 LD      (HL),#80
  8933.                 CALL    STACK_A
  8934.                 RST     #28                     ;FP_CALC
  8935.                 DB      #34                     ;STK_DATA
  8936.                 DB      #38                     ;Exponent
  8937.                 DB      #00                     ;
  8938.                 DB      #03                     ;SUBTRACT
  8939.                 DB      #01                     ;EXCHANGE
  8940.                 DB      #31                     ;DUPLICATE
  8941.                 DB      #34                     ;STK_DATA
  8942.                 DB      #F0                     ;Exponent
  8943.                 DB      #4C                     ;
  8944.                 DB      #CC                     ;
  8945.                 DB      #CC                     ;
  8946.                 DB      #CD                     ;
  8947.                 DB      #03                     ;SUBTRACT
  8948.                 DB      #37                     ;GREATER_0
  8949.                 DB      #00                     ;JUMP_TURE
  8950.                 DB      #08                     ;to GRE_8
  8951.                 DB      #01                     ;EXCHANGE
  8952.                 DB      #A1                     ;STK_ONE
  8953.                 DB      #03                     ;SUBTRACT
  8954.                 DB      #01                     ;EXCHANGE
  8955.                 DB      #38                     ;END_CALC
  8956.                 INC     (HL)
  8957.                 RST     #28                     ;FP_CALC
  8958. GRE_8:          DB      #01                     ;EXCHANGE
  8959.                 DB      #34                     ;STK_DATA
  8960.                 DB      #F0                     ;Exponent
  8961.                 DB      #31                     ;
  8962.                 DB      #72                     ;
  8963.                 DB      #17                     ;
  8964.                 DB      #F8                     ;
  8965.                 DB      #04                     ;MULTIPLY
  8966.                 DB      #01                     ;EXCHANGE
  8967.                 DB      #A2                     ;STK_HALF
  8968.                 DB      #03                     ;SUBTRACT
  8969.                 DB      #A2                     ;STK_HALF
  8970.                 DB      #03                     ;SUBTRACT
  8971.                 DB      #31                     ;DUPLICATE
  8972.                 DB      #34                     ;STK_DATA
  8973.                 DB      #32                     ;Exponent
  8974.                 DB      #20                     ;
  8975.                 DB      #04                     ;MULTIPLY
  8976.                 DB      #A2                     ;STK_HALF
  8977.                 DB      #03                     ;SUBTRACT
  8978.                 DB      #8C                     ;SERIES_0C
  8979.                 DB      #11                     ;Exponent
  8980.                 DB      #AC                     ;
  8981.                 DB      #14                     ;Exponent
  8982.                 DB      #09                     ;
  8983.                 DB      #56                     ;Exponent
  8984.                 DB      #DA                     ;
  8985.                 DB      #A5                     ;
  8986.                 DB      #59                     ;Exponent
  8987.                 DB      #30                     ;
  8988.                 DB      #C5                     ;
  8989.                 DB      #5C                     ;Exponent
  8990.                 DB      #90                     ;
  8991.                 DB      #AA                     ;
  8992.                 DB      #9E                     ;Exponent
  8993.                 DB      #70                     ;
  8994.                 DB      #6F                     ;
  8995.                 DB      #61                     ;
  8996.                 DB      #A1                     ;Exponent
  8997.                 DB      #CB                     ;
  8998.                 DB      #DA                     ;
  8999.                 DB      #96                     ;
  9000.                 DB      #A4                     ;Exponent
  9001.                 DB      #31                     ;
  9002.                 DB      #9F                     ;
  9003.                 DB      #B4                     ;
  9004.                 DB      #E7                     ;Exponent
  9005.                 DB      #A0                     ;
  9006.                 DB      #FE                     ;
  9007.                 DB      #5C                     ;
  9008.                 DB      #FC                     ;
  9009.                 DB      #EA                     ;Exponent
  9010.                 DB      #1B                     ;
  9011.                 DB      #43                     ;
  9012.                 DB      #CA                     ;
  9013.                 DB      #36                     ;
  9014.                 DB      #ED                     ;Exponent
  9015.                 DB      #A7                     ;      
  9016.                 DB      #9C                     ;
  9017.                 DB      #7E                     ;
  9018.                 DB      #5E                     ;
  9019.                 DB      #F0                     ;Exponent
  9020.                 DB      #6E                     ;
  9021.                 DB      #23                     ;
  9022.                 DB      #80                     ;
  9023.                 DB      #93                     ;
  9024.                 DB      #04                     ;MULTIPLY
  9025.                 DB      #0F                     ;ADDITION
  9026.                 DB      #38                     ;END_CALC
  9027.                 RET
  9028.  
  9029. ; Reduce argument
  9030. GET_ARGT:       RST     #28                     ;FP_CALC
  9031.                 DB      #3D                     ;RE_STACK
  9032.                 DB      #34                     ;STK_DATA
  9033.                 DB      #EE                     ;Exponent
  9034.                 DB      #22                     ;
  9035.                 DB      #F9                     ;
  9036.                 DB      #83                     ;
  9037.                 DB      #6E                     ;
  9038.                 DB      #04                     ;MULTIPLY
  9039.                 DB      #31                     ;DUPLICATE
  9040.                 DB      #A2                     ;STK_HALF
  9041.                 DB      #0F                     ;ADDITION
  9042.                 DB      #27                     ;INT
  9043.                 DB      #03                     ;SUBTRACT
  9044.                 DB      #31                     ;DUPLICATE
  9045.                 DB      #0F                     ;ADDITION
  9046.                 DB      #31                     ;DUPLICATE
  9047.                 DB      #0F                     ;ADDITION
  9048.                 DB      #31                     ;DUPLICATE
  9049.                 DB      #2A                     ;ABS
  9050.                 DB      #A1                     ;STK_ONE
  9051.                 DB      #03                     ;SUBTRACT
  9052.                 DB      #31                     ;DUPLICATE
  9053.                 DB      #37                     ;GREATER_0
  9054.                 DB      #C0                     ;ST-MEM-0
  9055.                 DB      #00                     ;JUMP_TRUE
  9056.                 DB      #04                     ;to ZPLUS
  9057.                 DB      #02                     ;DELETE
  9058.                 DB      #38                     ;END_CALC
  9059.                 RET
  9060.  
  9061. ZPLUS:          DB      #A1                     ;STK_ONE
  9062.                 DB      #03                     ;SUBTRACT
  9063.                 DB      #01                     ;EXCHANGE
  9064.                 DB      #36                     ;LESS_0
  9065.                 DB      #00                     ;JUMP_TRUE
  9066.                 DB      #02                     ;to YNEG
  9067.                 DB      #1B                     ;NEGATE
  9068. YNEG:           DB      #38                     ;END_CALC
  9069.                 RET
  9070.  
  9071. ; Handle cosine
  9072. COS_FUNC:       RST     #28                     ;FP_CALC
  9073.                 DB      #39                     ;GET_ARGT
  9074.                 DB      #2A                     ;ABS
  9075.                 DB      #A1                     ;STK_ONE
  9076.                 DB      #03                     ;SUBTRACT
  9077.                 DB      #E0                     ;GET-MEM-0
  9078.                 DB      #00                     ;JUMP_TRUE
  9079.                 DB      #06                     ;fwd to C_ENT
  9080.                 DB      #1B                     ;NEGATE
  9081.                 DB      #33                     ;jump
  9082.                 DB      #03                     ;fwd to C_ENT
  9083.  
  9084. ; Handle sine
  9085. SIN_FUNC:       RST     #28                     ;FP_CALC
  9086.                 DB      #39                     ;GET_ARGT
  9087. C_ENT:          DB      #31                     ;DUPLICATE
  9088.                 DB      #31                     ;DUPLICATE
  9089.                 DB      #04                     ;MULTIPLY
  9090.                 DB      #31                     ;DUPLICATE
  9091.                 DB      #0F                     ;ADDITION
  9092.                 DB      #A1                     ;STK_ONE
  9093.                 DB      #03                     ;SUBTRACT
  9094.                 DB      #86                     ;SERIES-06
  9095.                 DB      #14                     ;Exponent                      
  9096.                 DB      #E6                     ;
  9097.                 DB      #5C                     ;Exponent
  9098.                 DB      #1F                     ;
  9099.                 DB      #0B                     ;
  9100.                 DB      #A3                     ;Exponent
  9101.                 DB      #8F                     ;
  9102.                 DB      #38                     ;
  9103.                 DB      #EE                     ;
  9104.                 DB      #E9                     ;Exponent
  9105.                 DB      #15                     ;
  9106.                 DB      #63                     ;
  9107.                 DB      #BB                     ;
  9108.                 DB      #23                     ;
  9109.                 DB      #EE                     ;Exponent
  9110.                 DB      #92                     ;
  9111.                 DB      #0D                     ;
  9112.                 DB      #CD                     ;
  9113.                 DB      #ED                     ;
  9114.                 DB      #F1                     ;Exponent
  9115.                 DB      #23                     ;
  9116.                 DB      #5D                     ;
  9117.                 DB      #1B                     ;
  9118.                 DB      #EA                     ;
  9119.                 DB      #04                     ;MULTIPLY
  9120.                 DB      #38                     ;END_CALC
  9121.                 RET
  9122.  
  9123. ; Handle tangent
  9124. TAN_FUNC:       RST     #28                     ;FP_CALC
  9125.                 DB      #31                     ;DUPLICATE
  9126.                 DB      #1F                     ;SIN
  9127.                 DB      #01                     ;EXCHANGE
  9128.                 DB      #20                     ;COS
  9129.                 DB      #05                     ;DIVISION
  9130.                 DB      #38                     ;END_CALC
  9131.                 RET
  9132.  
  9133. ; Handle arctan
  9134. ATN_FUNC:       CALL    RE_STACK
  9135.                 LD      A,(HL)
  9136.                 CP      #81
  9137.                 JR      C,SMALL
  9138.                 RST     #28                     ;FP_CALC
  9139.                 DB      #A1                     ;STK_ONE
  9140.                 DB      #1B                     ;NEGATE
  9141.                 DB      #01                     ;EXCHANGE
  9142.                 DB      #05                     ;DIVISION
  9143.                 DB      #31                     ;DUPLICATE
  9144.                 DB      #36                     ;LESS_0
  9145.                 DB      #A3                     ;STK_PI_2
  9146.                 DB      #01                     ;EXCHANGE
  9147.                 DB      #00                     ;JUMP_TRUE
  9148.                 DB      #06                     ;to CASES
  9149.                 DB      #1B                     ;NEGATE
  9150.                 DB      #33                     ;jump
  9151.                 DB      #03                     ;to CASES
  9152. SMALL:          RST     #28                     ;FP_CALC
  9153.                 DB      #A0                     ;STK_ZERO
  9154. CASES:          DB      #01                     ;EXCHANGE
  9155.                 DB      #31                     ;DUPLICATE
  9156.                 DB      #31                     ;DUPLICATE
  9157.                 DB      #04                     ;MULTIPLY
  9158.                 DB      #31                     ;DUPLICATE
  9159.                 DB      #0F                     ;ADDITION
  9160.                 DB      #A1                     ;STK_ONE
  9161.                 DB      #03                     ;SUBTRACT
  9162.                 DB      #8C                     ;SERIES_0C
  9163.                 DB      #10                     ;Exponent
  9164.                 DB      #B2                     ;
  9165.                 DB      #13                     ;Exponent
  9166.                 DB      #0E                     ;
  9167.                 DB      #55                     ;Exponent
  9168.                 DB      #E4                     ;
  9169.                 DB      #8D                     ;
  9170.                 DB      #58                     ;Exponent
  9171.                 DB      #39                     ;
  9172.                 DB      #BC                     ;
  9173.                 DB      #5B                     ;Exponent
  9174.                 DB      #98                     ;
  9175.                 DB      #FD                     ;
  9176.                 DB      #9E                     ;Exponent
  9177.                 DB      #00                     ;
  9178.                 DB      #36                     ;
  9179.                 DB      #75                     ;
  9180.                 DB      #A0                     ;Exponent
  9181.                 DB      #DB                     ;
  9182.                 DB      #E8                     ;
  9183.                 DB      #B4                     ;
  9184.                 DB      #63                     ;Exponent
  9185.                 DB      #42                     ;
  9186.                 DB      #C4                     ;
  9187.                 DB      #E6                     ;Exponent
  9188.                 DB      #B5                     ;
  9189.                 DB      #09                     ;
  9190.                 DB      #36                     ;
  9191.                 DB      #BE                     ;
  9192.                 DB      #E9                     ;Exponent
  9193.                 DB      #36                     ;
  9194.                 DB      #73                     ;
  9195.                 DB      #1B                     ;
  9196.                 DB      #5D                     ;
  9197.                 DB      #EC                     ;Exponent
  9198.                 DB      #D8                     ;
  9199.                 DB      #DE                     ;
  9200.                 DB      #63                     ;
  9201.                 DB      #BE                     ;
  9202.                 DB      #F0                     ;Exponent
  9203.                 DB      #61                     ;
  9204.                 DB      #A1                     ;
  9205.                 DB      #B3                     ;
  9206.                 DB      #0C                     ;
  9207.                 DB      #04                     ;MULTIPLY
  9208.                 DB      #0F                     ;ADDITION
  9209.                 DB      #38                     ;END_CALC
  9210.                 RET
  9211.  
  9212. ; Handle arcsin
  9213. ASN_FUNC:       RST     #28                     ;FP_CALC
  9214.                 DB      #31                     ;DUPLICATE
  9215.                 DB      #31                     ;DUPLICATE
  9216.                 DB      #04                     ;MULTIPLY
  9217.                 DB      #A1                     ;STK_ONE
  9218.                 DB      #03                     ;SUBTRACT
  9219.                 DB      #1B                     ;NEGATE
  9220.                 DB      #28                     ;SQR
  9221.                 DB      #A1                     ;STK_ONE
  9222.                 DB      #0F                     ;ADDITION
  9223.                 DB      #05                     ;DIVISION
  9224.                 DB      #24                     ;ATN
  9225.                 DB      #31                     ;DUPLICATE
  9226.                 DB      #0F                     ;ADDITION
  9227.                 DB      #38                     ;END_CALC
  9228.                 RET
  9229.  
  9230. ; Handle arccos
  9231. ACS_FUNC:       RST     #28                     ;FP_CALC
  9232.                 DB      #22                     ;ASN
  9233.                 DB      #A3                     ;STK_PI_2
  9234.                 DB      #03                     ;SUBTRACT
  9235.                 DB      #1B                     ;NEGATE
  9236.                 DB      #38                     ;END_CALC
  9237.                 RET
  9238.  
  9239. ; Handle square root
  9240. SQR_FUNC:       RST     #28                     ;FP_CALC
  9241.                 DB      #31                     ;DUPLICATE
  9242.                 DB      #30                     ;NOT
  9243.                 DB      #00                     ;JUMP_TRUE
  9244.                 DB      #1E                     ;to LAST
  9245.                 DB      #A2                     ;STK_HALF
  9246.                 DB      #38                     ;END_CALC
  9247.  
  9248. ; Handle exponential
  9249. TO_POWER:       RST     #28                     ;FP_CALC
  9250.                 DB      #01                     ;EXCHANGE
  9251.                 DB      #31                     ;DUPLICATE
  9252.                 DB      #30                     ;NOT
  9253.                 DB      #00                     ;JUMP_TRUE
  9254.                 DB      #07                     ;to XISO
  9255.                 DB      #25                     ;LN
  9256.                 DB      #04                     ;MULTIPLY
  9257.                 DB      #38                     ;END_CALC
  9258.                 JP      EXP                    
  9259.  
  9260. XISO:           DB      #02                     ;DELETE
  9261.                 DB      #31                     ;DUPLICATE
  9262.                 DB      #30                     ;NOT
  9263.                 DB      #00                     ;JUMP_TRUE
  9264.                 DB      #09                     ;to ONE
  9265.                 DB      #A0                     ;STK_ZERO
  9266.                 DB      #01                     ;EXCHANGE
  9267.                 DB      #37                     ;GREATER_0
  9268.                 DB      #00                     ;JUMP_TRUE
  9269.                 DB      #06                     ;to LAST
  9270.                 DB      #A1                     ;STK_ONE
  9271.                 DB      #01                     ;EXCHANGE
  9272.                 DB      #05                     ;DIVISION
  9273. ONE:            DB      #02                     ;DELETE
  9274.                 DB      #A1                     ;STK_ONE
  9275. LAST:           DB      #38                     ;END_CALC
  9276.                 RET
  9277.  
  9278. ; BSROM additional routines
  9279. ; Input of HEX numbers
  9280. HEXA:           LD      HL,SCAN_FUNC
  9281.                 CP      #25
  9282.                 RET     NZ
  9283.                 POP     AF
  9284.                 CALL    SYNTAX_Z
  9285.                 JP      NZ,S_STK_DEC
  9286.                 LD      DE,#0000
  9287. HEX1:           RST     #20
  9288.                 CALL    ALPHANUM
  9289.                 JR      NC,HEXEND
  9290.                 CP      #41
  9291.                 JR      C,CIS
  9292.                 OR      #20
  9293.                 CP      #67
  9294.                 JR      NC,HEXEND
  9295.                 SUB     #27
  9296. CIS:            AND     #0F
  9297.                 LD      C,A
  9298.                 LD      A,D
  9299.                 AND     #F0
  9300.                 JP      NZ,REPORT_6
  9301.                 LD      A,C
  9302.                 EX      DE,HL
  9303.                 ADD     HL,HL
  9304.                 ADD     HL,HL
  9305.                 ADD     HL,HL
  9306.                 ADD     HL,HL
  9307.                 OR      L
  9308.                 LD      L,A
  9309.                 EX      DE,HL
  9310.                 JR      HEX1
  9311.  
  9312. HEXEND:         CALL    BIN_END
  9313.                 JP      S_BIN_1
  9314.  
  9315. ; Allow number in VAL$ and VAL
  9316. VAL1:           CP      #18
  9317.                 RET     Z
  9318.                 CP      #9D
  9319.                 RET     Z
  9320.                 XOR     (IY+#01)
  9321.                 RET
  9322.  
  9323. ; Evaluation of VAL and VAL$
  9324. VAL2:           LD      HL,(#5C5D)
  9325.                 BIT     6,(IY+#01)
  9326.                 RET     Z
  9327.                 POP     AF
  9328.                 PUSH    BC
  9329.                 CALL    FIND_INT2
  9330.                 POP     AF
  9331.                 RRCA
  9332.                 JR      NC,DOLAR
  9333.                 LD      H,B
  9334.                 LD      L,C
  9335.                 LD      C,(HL)
  9336.                 INC     HL
  9337.                 LD      B,(HL)
  9338.                 JP      STACK_BC
  9339.  
  9340. DOLAR:          PUSH    BC
  9341.                 LD      BC,#0004
  9342.                 RST     #30
  9343.                 POP     HL
  9344.                 PUSH    DE
  9345.                 LD      A,H
  9346.                 CALL    HEX99
  9347.                 LD      A,L
  9348.                 CALL    HEX99
  9349.                 POP     DE
  9350.                 JP      CHR_DLR1
  9351.  
  9352. ; Hex numbers
  9353. HEX99:          PUSH    AF
  9354.                 RRCA
  9355.                 RRCA
  9356.                 RRCA
  9357.                 RRCA
  9358.                 CALL    HEX98
  9359.                 POP     AF
  9360. HEX98:          AND     #0F
  9361.                 OR      #30
  9362.                 CP      #3A
  9363.                 JR      C,HEX98_1
  9364.                 ADD     A,#27
  9365. HEX98_1:        LD      (DE),A
  9366.                 INC     DE
  9367.                 RET
  9368.  
  9369. INFSUB:         LD      DE,COPYRIGHT+5
  9370.                 CALL    PO_TOKENS1
  9371.                 JP      HLO
  9372.  
  9373. MM:             DW      #FFFF
  9374.  
  9375. USERJP:         JP      #0052
  9376.  
  9377. DISKTOOLS:      DW      #0052
  9378.  
  9379. ; 128k reset
  9380. RES128:         DI
  9381.                 XOR     A
  9382.                 LD      I,A
  9383.                 OUT     (#FE),A
  9384.                 LD      E,#17
  9385. CC0:            LD      BC,#7FFD
  9386.                 OUT     (C),E
  9387.                 LD      BC,#0008
  9388.                 LD      H,A
  9389.                 LD      L,A
  9390.                 LD      SP,HL
  9391. CC1:            PUSH    HL
  9392.                 PUSH    HL
  9393.                 PUSH    HL
  9394.                 PUSH    HL
  9395.                 DJNZ    CC1
  9396.                 DEC     C
  9397.                 JR      NZ,CC1
  9398.                 DEC     E
  9399.                 BIT     4,E
  9400.                 JR      NZ,CC0
  9401.                 LD      B,#5C
  9402. CC2:            LD      (BC),A
  9403.                 INC     C
  9404.                 JR      NZ,CC2
  9405.                 DEC     HL
  9406.                 JP      RAM_DONE2
  9407.  
  9408. ; NMI Menu
  9409. NMI_MENU:       PUSH    AF
  9410.                 PUSH    HL
  9411.                 LD      HL,#BFE0
  9412.                 ADD     HL,SP
  9413.                 JR      C,MM1
  9414.                 LD      SP,#5800
  9415.                 LD      HL,NMI_MENU
  9416.                 PUSH    HL
  9417.                 PUSH    HL
  9418.                 PUSH    HL
  9419. MM1:            PUSH    BC
  9420.                 PUSH    DE
  9421.                 PUSH    IX
  9422.                 LD      A,I
  9423.                 PUSH    AF
  9424. MMRET:          DI
  9425.                 LD      C,#FE
  9426.                 LD      A,R
  9427.                 OUT     (C),A
  9428.                 OUT     (C),0
  9429.                 CALL    KEY_SCAN
  9430.                 INC     E
  9431.                 JR      Z,MMRET
  9432.                 DEC     E
  9433.                 CALL    K_TEST
  9434.                 LD      XH,A
  9435.                 LD      A,#22
  9436.                 OUT     (#FE),A
  9437. PUST:           CALL    KEY_SCAN
  9438.                 INC     E
  9439.                 JR      NZ,PUST
  9440.                 LD      A,#08
  9441.                 OUT     (#FE),A
  9442.                 LD      A,XH
  9443.                 LD      HL,MMRET
  9444.                 PUSH    HL
  9445.                 CP      'U'                     ; U - user function.
  9446.                 JR      Z,USERJP
  9447.                 CP      'E'                     ; E - extended 128k reset.
  9448.                 JR      Z,RES128
  9449.                 CP      'I'                     ; I - quiet AY. Reset FDC, DMA and stop disk drive if MB-02 is present.
  9450.                 JP      Z,HARD
  9451.                 CP      'T'                     ; T - set tape as actual device (only on MB-02).
  9452.                 JP      Z,SETTAP
  9453.                 CP      'D'                     ; D - set disk as actual device (only on MB-02)
  9454.                 JP      Z,SETDSK
  9455.                 CP      'B'                     ; B - warm start. BASIC program with variables is not deleted.
  9456.                 JP      Z,BASIC
  9457.                 CP      'Z'                     ; Z - user function like 'U' but this key is reserved for MB-02 applications.
  9458.                 LD      HL,(DISKTOOLS)
  9459.                 JR      NZ,DSKIP
  9460.                 JP      (HL)
  9461. DSKIP:          CP      'N'                     ; N - CLEAR #5FFF: NEW - memory above #6000 is not changed.
  9462.                 LD      DE,#5FFF
  9463.                 JR      Z,RESNEW
  9464.                 CP      'R'                     ; R - CLEAR #FFFF: NEW - classic 48k reset.
  9465.                 LD      D,E
  9466. RESNEW:         JP      Z,NEW_1
  9467. NERES:          CP      'S'                     ; S - save SCREEN$ on tape, or disk if MB-02 is present.
  9468.                 JR      NZ,NESAV
  9469.                 LD      IX,#4000
  9470.                 LD      DE,#1B00
  9471.                 LD      A,#FF
  9472.                 JP      SA_BYTES1
  9473. NESAV:          CP      'Q'                     ; Q - quit / return from NMI menu.
  9474.                 JR      Z,QUIT
  9475.                 CP      'M'                     ; M - jump to MRS debugger (MRS must be loaded in memory).
  9476.                 JR      Z,MRS
  9477.                 CALL    NUMERIC
  9478.                 RET     C
  9479.                 LD      HL,#4000
  9480.                 ADD     HL,SP
  9481.                 JR      NC,DD0
  9482.                 LD      SP,#57F0
  9483. DD0:            POP     BC
  9484.                 CALL    OUT128
  9485.                 JP      MMRET
  9486.  
  9487. ; Quit from NMI Menu           
  9488. QUIT:           POP     AF
  9489.                 POP     AF
  9490.                 LD      I,A
  9491.                 JP      PO,RET_I
  9492.                 EI
  9493. RET_I:          POP     IX
  9494.                 POP     DE
  9495.                 POP     BC
  9496.                 POP     HL
  9497.                 POP     AF
  9498.                 RET
  9499.  
  9500. ; Jump to MRS debugger
  9501. MRS:            POP     AF
  9502.                 POP     AF
  9503.                 LD      I,A
  9504.                 POP     IX
  9505.                 POP     DE
  9506.                 POP     BC
  9507.                 POP     HL
  9508.                 POP     AF
  9509.                 LD      (#F4FF),HL
  9510.                 POP     HL
  9511.                 LD      (#F544),HL
  9512.                 JP      #F514
  9513.  
  9514. ; Print general number
  9515. HLODVA:         LD      A,':'
  9516.                 RST     #10
  9517. HLO:            LD      B,H
  9518.                 LD      C,L
  9519.                 CALL    STACK_BC
  9520.                 JP      PRINT_FP
  9521.  
  9522. TT:             DW      #0000                   ;DS #39FF-TT
  9523. UU:             DW      #FFFF
  9524.  
  9525. DISPL:          LD      C,A
  9526.                 LD      A,(IY+#02)
  9527.                 CP      #10
  9528.                 LD      A,C
  9529.                 JR      NZ,DIS
  9530.                 LD      BC,#FBFE
  9531.                 IN      C,(C)
  9532.                 RRC     C
  9533.                 JR      C,DII
  9534. PUSTI:          XOR     A
  9535.                 IN      A,(#FE)
  9536.                 RRCA
  9537.                 JR      NC,PUSTI
  9538.                 LD      SP,(#5C3F)              ;LISTSP
  9539.                 RES     5,(IY+#01)
  9540.                 RET
  9541.  
  9542. DII:            LD      C,(IY+#76)
  9543.                 BIT     1,C                     ;bit1=1 don't show colors during autolist
  9544.                 JR      Z,DIS
  9545.                 CP      #0D
  9546.                 JR      Z,DIS
  9547.                 CP      #20
  9548.                 JR      C,DIP
  9549. DIS:            JP      PO_FETCH
  9550.  
  9551. DIP:            BIT     2,C                     ;bit2=1 show comma instead of codes
  9552.                 JR      NZ,DID
  9553.                 POP     AF
  9554. DID:            LD      A,#1E
  9555.                 JR      DIS
  9556.  
  9557. ; General number printing with spaces
  9558. NUM_NEW:        PUSH    DE
  9559.                 PUSH    HL
  9560.                 LD      E,' '
  9561.                 DB      #06
  9562. NUMCOM:         LD      L,C
  9563.                 LD      BC,#D8F0
  9564.                 CALL    OUT_SP_NO
  9565.                 JP      OUT_NUM_3
  9566.  
  9567. ; Check of BASIC program presence
  9568. LIN2:           CALL    LINE_NO
  9569.                 PUSH    HL
  9570.                 LD      HL,(#5C53)
  9571.                 LD      A,(HL)
  9572.                 POP     HL
  9573.                 RET
  9574.  
  9575. ; Test of numbers at the begin of line
  9576. LIN3:           RST     #18
  9577.                 CALL    NUMERIC
  9578.                 PUSH    AF
  9579.                 CALL    E_LINE_NO
  9580.                 POP     AF
  9581.                 RET
  9582.  
  9583. ; Show empty cursor instead of '*'
  9584. LIN4:           LD      A,(IY+#02)
  9585.                 CP      #10
  9586.                 JR      Z,LL40
  9587.                 LD      D,#20
  9588. LL40:           PUSH    HL
  9589.                 XOR     A
  9590.                 LD      HL,(#5C51)              ;channel R?
  9591.                 LD      BC,#5CC0
  9592.                 SBC     HL,BC
  9593.                 POP     HL
  9594.                 JR      Z,LL41
  9595.                 BIT     0,(IY+#76)
  9596.                 JP      Z,OUT_NUM_2
  9597.                 DB      #01
  9598. LL41:           LD      D,#00                   ; no cursor at 'R'
  9599.                 PUSH    DE
  9600.                 LD      D,(HL)
  9601.                 INC     HL
  9602.                 LD      E,(HL)
  9603.                 EX      DE,HL
  9604.                 CALL    NUM_NEW
  9605.                 EX      DE,HL
  9606.                 POP     DE
  9607.                 RET
  9608.  
  9609. ; Moving around edit zone
  9610. DOLE:           CALL    ED_RIGHT
  9611.                 LD      IX,ED_RIGHT
  9612.                 JR      NZ,HORDOL
  9613.                 LD      HL,#5C49
  9614.                 RET
  9615.  
  9616. HORE:           CALL    ED_LEFT
  9617.                 LD      IX,ED_LEFT
  9618.                 JR      NC,HORDOL
  9619.                 LD      HL,(#5C49)
  9620.                 RET
  9621.  
  9622. HORDOL:         POP     BC
  9623.                 LD      B,#00
  9624. HD1:            INC     B
  9625.                 BIT     5,B
  9626.                 RET     NZ
  9627.                 PUSH    BC
  9628.                 CALL    L_03F0
  9629.                 POP     BC
  9630.                 LD      A,(HL)
  9631.                 CP      #0D
  9632.                 RET     Z
  9633.                 CP      ' '
  9634.                 JR      C,HD1+1
  9635.                 SUB     #A5
  9636.                 JR      C,HD1
  9637.                 EXX
  9638.                 LD      HL,INCB-2
  9639.                 LD      (#5C51),HL
  9640.                 CALL    PO_TOKENS
  9641.                 CALL    ED_LIST_1
  9642.                 EXX
  9643.                 JR      HD1+1
  9644.  
  9645.                 DW      INCB
  9646. INCB:           EXX
  9647.                 INC     B
  9648.                 EXX
  9649.                 RET
  9650.  
  9651. ; Switch 128k bank
  9652. BANKA:          RST     #20
  9653.                 CALL    FETCH_NUM
  9654.                 CALL    CHECK_END
  9655.                 CALL    FIND_INT1
  9656. OUT128:         AND     #0F
  9657.                 OR      #10
  9658.                 LD      BC,#7FFD
  9659.                 OUT     (C),A
  9660.                 RET
  9661.  
  9662. ; Comma instead of semicolon
  9663. EDIT:           RST     #20
  9664.                 CALL    FETCH_NUM
  9665.                 CALL    CHECK_END
  9666.                 CALL    FIND_INT2
  9667.                 LD      (#5C49),BC
  9668.                 CALL    SET_MIN
  9669.                 CALL    CLS_LOWER
  9670.                 RES     5,(IY+#37)
  9671. VV:             DW      #FFFF
  9672.                 RES     3,(IY+#01)
  9673.                 CALL    ED_EDIT
  9674.                 LD      SP,(#5C3D)
  9675.                 POP     AF
  9676.                 JP      MAIN_2
  9677.  
  9678. ; Modified CLS command
  9679. NEW_CLS:        CALL    FIND_INT1
  9680.                 OR      A
  9681.                 JR      Z,NECOL
  9682.                 LD      (#5C48),A
  9683.                 LD      (#5C8D),A
  9684.                 CALL    SA_LD_RET
  9685. NECOL:          JP      CLS
  9686.  
  9687. ; New commands
  9688. COMM:           CP      #27                     ;"'"
  9689.                 JR      Z,BANKA
  9690.                 CP      #2C                     ;","
  9691.                 JR      Z,EDIT
  9692.                 LD      HL,NEWTAB
  9693. COM1:           BIT     7,(HL)
  9694.                 JP      NZ,PRINT
  9695.                 CP      (HL)
  9696.                 INC     HL
  9697.                 LD      E,(HL)
  9698.                 INC     HL
  9699.                 LD      D,(HL)
  9700.                 INC     HL
  9701.                 JR      NZ,COM1
  9702.                 RST     #20
  9703.                 CALL    CHECK_END
  9704.                 EX      DE,HL
  9705.                 JP      (HL)
  9706.  
  9707. NEWTAB:         DB      '#'
  9708.                 DW      54885  
  9709.                 DB      '_'
  9710.                 DW      #66
  9711.                 DB      '*'
  9712.                 DW      HEA
  9713.                 DB      '?'
  9714.                 DW      INFO
  9715.                 DB      #7F                     ;(c)
  9716.                 DW      BASIC
  9717.                 DB      '^'
  9718.                 DW      RES128
  9719.                 DB      '!'
  9720.                 DW      HARD
  9721.                 DB      '='
  9722.                 DW      USERJP
  9723.  
  9724. ; Quiet AY. Reset FDC, DMA, stop drives if MB-02 is present
  9725. HARD:           XOR     A
  9726.                 LD      BC,#FFFD
  9727.                 OUT     (#13),A                 ; FDD motor
  9728.                 LD      A,#D0
  9729.                 OUT     (#0F),A                 ; FDC
  9730.                 LD      A,#C3
  9731.                 OUT     (#0B),A                 ; DMA
  9732.                 LD      A,#07  
  9733.                 OUT     (C),A                   ; AY
  9734.                 LD      A,#BF
  9735.                 OUT     (#FD),A
  9736.                 LD      A,#0D
  9737.                 OUT     (C),A
  9738.                 LD      A,#80
  9739.                 OUT     (#FD),A
  9740.                 RET
  9741.  
  9742. ; Warm start
  9743. BASIC:          LD      HL,INIT_CHAN
  9744.                 LD      DE,#5CB6
  9745.                 LD      BC,#0015
  9746.                 LD      (#5C4F),DE
  9747.                 LDIR
  9748.                 LD      HL,#3C00
  9749.                 LD      (#5C36),HL
  9750.                 LD      HL,#0040
  9751.                 LD      (#5C38),HL
  9752.                 LD      IY,#5C3A
  9753.                 LD      HL,(#5CB2)
  9754.                 LD      (HL),#3E
  9755.                 DEC     HL
  9756.                 LD      SP,HL
  9757.                 DEC     HL
  9758.                 DEC     HL
  9759.                 LD      (#5C3D),HL
  9760.                 IM      1
  9761.                 EI
  9762.                 LD      HL,(#5C59)
  9763.                 JP      WARM_ST
  9764.  
  9765. ; Enhanced POKE
  9766. NEW_POKE:       CALL    SYNTAX_Z
  9767.                 CALL    NZ,FIND_INT2
  9768.                 LD      D,B
  9769.                 LD      E,C
  9770. POKLOP:         RST     #18
  9771.                 CP      #2C
  9772.                 JR      Z,POKOK
  9773.                 CP      #3B
  9774.                 RET     NZ
  9775. POKOK:          PUSH    DE
  9776.                 PUSH    AF
  9777.                 RST     #20
  9778.                 CALL    SCANNING
  9779.                 POP     AF
  9780.                 POP     DE
  9781.                 CALL    SYNTAX_Z
  9782.                 JR      Z,POKLOP
  9783.                 BIT     6,(IY+#01)
  9784.                 JR      NZ,POKNUM
  9785. POKRET:         PUSH    AF
  9786.                 PUSH    DE
  9787.                 CALL    STK_FETCH
  9788.                 EX      DE,HL
  9789.                 POP     DE
  9790.                 LD      A,B
  9791.                 OR      C
  9792.                 JR      Z,POKNIC
  9793.                 LDIR
  9794.                 POP     AF
  9795.                 RRCA
  9796.                 JR      NC,POKLOP
  9797.                 LD      H,D
  9798.                 LD      L,E
  9799.                 DEC     HL
  9800.                 SET     7,(HL)
  9801.                 PUSH    AF
  9802. POKNIC:         POP     AF
  9803.                 JR      POKLOP
  9804.  
  9805. POKNUM:         PUSH    DE
  9806.                 RRCA
  9807.                 JR      C,POKDW
  9808. POKDB:          CALL    FIND_INT1
  9809.                 POP     DE
  9810.                 JR      POKLD
  9811.  
  9812. POKDW:          CALL    FIND_INT2
  9813.                 POP     DE
  9814.                 LD      A,C
  9815.                 LD      (DE),A
  9816.                 INC     DE
  9817.                 LD      A,B
  9818. POKLD:          LD      (DE),A
  9819.                 INC     DE
  9820.                 JR      POKLOP
  9821.  
  9822. SS:             DB      #FF
  9823. WW:             DW      #FFFF
  9824.  
  9825. ; New line number test
  9826. LIN1:           CALL    CP_LINES
  9827.                 RET     NC
  9828.                 LD      A,(HL)
  9829.                 AND     #C0
  9830.                 RET     NZ
  9831.                 SCF
  9832.                 RET
  9833.  
  9834. ; New boot screen
  9835. INFO:           CALL    CLS
  9836.                 LD      A,#FE
  9837.                 CALL    CHAN_OPEN
  9838.                 LD      HL,(#5C4B)
  9839.                 LD      BC,(#5C53)
  9840.                 XOR     A
  9841.                 PUSH    HL
  9842.                 SBC     HL,BC
  9843.                 CALL    INFSUB
  9844.                 POP     BC
  9845.                 SCF
  9846.                 LD      HL,(#5C59)
  9847.                 SBC     HL,BC
  9848.                 LD      A,#01
  9849.                 CALL    INFSUB
  9850.                 LD      BC,(#5C65)
  9851.                 LD      HL,#0000
  9852.                 ADD     HL,SP
  9853.                 SBC     HL,BC
  9854.                 LD      A,#02
  9855.                 CALL    INFSUB
  9856.                 JP      PRINT_5
  9857.  
  9858. ; Header command
  9859. HEA:            LD      A,#FE
  9860.                 CALL    CHAN_OPEN
  9861. ZNOVU:          DI
  9862.                 LD      IX,#5C9E
  9863.                 LD      DE,#0010
  9864.                 XOR     A
  9865.                 INC     E
  9866.                 SCF
  9867.                 EX      AF,AF'
  9868.                 LD      A,#0E
  9869.                 OUT     (#FE),A
  9870.                 IN      A,(#FE)
  9871.                 RRA
  9872.                 CALL    LD_BYTES1
  9873.                 CALL    SA_LD_RET
  9874.                 JR      NC,ZNOVU
  9875.                 LD      (#5C8C),A
  9876.                 LD      A,#17
  9877.                 RST     #10
  9878.                 XOR     A
  9879.                 RST     #10
  9880.                 RST     #10
  9881.                 LD      HL,#5C9E
  9882.                 LD      A,(HL)
  9883.                 OR      #30
  9884.                 RST     #10
  9885.                 LD      A,#3A
  9886.                 RST     #10
  9887.                 LD      B,#0A
  9888. MENO:           INC     HL
  9889.                 LD      A,(HL)
  9890.                 CP      #20
  9891.                 JR      NC,MENO1
  9892.                 LD      A,#1E
  9893. MENO1:          RST     #10
  9894.                 DJNZ    MENO
  9895.                 LD      A,#17
  9896.                 RST     #10
  9897.                 LD      A,#15
  9898.                 RST     #10
  9899.                 RST     #10
  9900.                 LD      HL,(#5CAB)
  9901.                 CALL    NUM_NEW
  9902.                 LD      HL,(#5CA9)
  9903.                 CALL    HLODVA
  9904.                 LD      A,#0D
  9905.                 RST     #10
  9906.                 JR      ZNOVU
  9907.  
  9908.                 DB      #FF
  9909.  
  9910. ; BSROM for MB02+
  9911. ; ROM BIOS
  9912. SETRWP:         JR      ROMDIS                  ; Set rom bank + write protect
  9913. SETDWP:         JR      DOSDIS                  ; Set dos bank + write protect
  9914. SETRWE:         JR      ROMENA                  ; Set rom bank + write enable
  9915. SETDWE:         JR      DOSENA                  ; Set dos bank + write enable
  9916. BNKCAL:         JR      BNCALL                  ; Switch rom/dos bank
  9917.  
  9918. SETTAP:         XOR     A
  9919.                 DB      #E6
  9920. SETDSK:         LD      A,#7F
  9921.                 CALL    SETRWE
  9922.                 LD      (TAPDSK),A
  9923.                 JR      SETRWP
  9924.  
  9925. TAPDSK:         DB      #03                     ; Bit0: 0=tape, 1=disk
  9926.  
  9927. BNCALL:         CALL    SETRWE
  9928.                 LD      (REGHL+1),HL
  9929.                 POP     HL
  9930.                 INC     HL
  9931.                 INC     HL
  9932.                 PUSH    HL
  9933.                 PUSH    AF
  9934.                 DEC     HL
  9935.                 LD      A,(HL)
  9936.                 DEC     HL
  9937.                 LD      L,(HL)
  9938.                 LD      H,A
  9939.                 POP     AF
  9940.                 PUSH    HL
  9941.                 LD      HL,SWITCH
  9942.                 EX      (SP),HL
  9943.                 PUSH    HL
  9944. REGHL:          LD      HL,#5555
  9945. SWITCH:         JP      SETDWE
  9946.  
  9947. ; BSROM for MB02+
  9948. ; this is hardware dependant part of ROM BIOS
  9949. ; here are FFs by standard
  9950. ; this part of code is loaded during system boot
  9951. ; valid only for MB02+
  9952. ROMDIS:         PUSH    AF
  9953.                 LD      A,#40
  9954.                 JR      BNKOUT
  9955. DOSDIS:         PUSH    AF
  9956.                 LD      A,#41
  9957.                 JR      BNKOUT
  9958. ROMENA:         PUSH    AF
  9959.                 LD      A,#60
  9960.                 JR      BNKOUT
  9961. DOSENA:         PUSH    AF
  9962.                 LD      A,#61
  9963. BNKOUT:         OUT     (#17),A
  9964.                 POP     AF
  9965.                 RET            
  9966.  
  9967. ; BSROM for MB02+
  9968. ; reserved for future BSDOS patches
  9969.  
  9970.                 DW      #0000
  9971.                 DW      #0000
  9972.                 DW      #0000
  9973.                 DW      #0000
  9974.                 DW      #0000
  9975.                 DW      #0000
  9976.                 DW      #0000
  9977.  
  9978. ; BSROM - new characters
  9979. CHAR_SET_N:     DB      #00,#00,#00,#00,#00,#00,#7E,#00 ;line
  9980.                 DB      #00,#7E,#7E,#7E,#7E,#7E,#7E,#00 ;square
  9981.  
  9982. ; Character set
  9983. CHAR_SET:       DB      #00,#00,#00,#00,#00,#00,#00,#00 ;space
  9984.                 DB      #00,#10,#10,#10,#10,#00,#10,#00 ;!
  9985.                 DB      #00,#24,#24,#00,#00,#00,#00,#00 ;"
  9986.                 DB      #00,#24,#7E,#24,#24,#7E,#24,#00 ;#
  9987.                 DB      #00,#08,#3E,#28,#3E,#0A,#3E,#08 ;$
  9988.                 DB      #00,#62,#64,#08,#10,#26,#46,#00 ;%
  9989.                 DB      #00,#10,#28,#10,#2A,#44,#3A,#00 ;&
  9990.                 DB      #00,#08,#10,#00,#00,#00,#00,#00 ;'
  9991.                 DB      #00,#04,#08,#08,#08,#08,#04,#00 ;(
  9992.                 DB      #00,#20,#10,#10,#10,#10,#20,#00 ;)
  9993.                 DB      #00,#00,#14,#08,#3E,#08,#14,#00 ;*
  9994.                 DB      #00,#00,#08,#08,#3E,#08,#08,#00 ;+
  9995.                 DB      #00,#00,#00,#00,#00,#08,#08,#10 ;,
  9996.                 DB      #00,#00,#00,#00,#3E,#00,#00,#00 ;-
  9997.                 DB      #00,#00,#00,#00,#00,#18,#18,#00 ;.
  9998.                 DB      #00,#00,#02,#04,#08,#10,#20,#00 ;/
  9999.                 DB      #00,#3C,#46,#4A,#52,#62,#3C,#00 ;0
  10000.                 DB      #00,#18,#28,#08,#08,#08,#3E,#00 ;1
  10001.                 DB      #00,#3C,#42,#02,#3C,#40,#7E,#00 ;2
  10002.                 DB      #00,#3C,#42,#0C,#02,#42,#3C,#00 ;3
  10003.                 DB      #00,#08,#18,#28,#48,#7E,#08,#00 ;4
  10004.                 DB      #00,#7E,#40,#7C,#02,#42,#3C,#00 ;5
  10005.                 DB      #00,#3C,#40,#7C,#42,#42,#3C,#00 ;6
  10006.                 DB      #00,#7E,#02,#04,#08,#10,#10,#00 ;7
  10007.                 DB      #00,#3C,#42,#3C,#42,#42,#3C,#00 ;8
  10008.                 DB      #00,#3C,#42,#42,#3E,#02,#3C,#00 ;9
  10009.                 DB      #00,#00,#00,#10,#00,#00,#10,#00 ;:
  10010.                 DB      #00,#00,#10,#00,#00,#10,#10,#20 ;;
  10011.                 DB      #00,#00,#04,#08,#10,#08,#04,#00 ;<
  10012.                 DB      #00,#00,#00,#3E,#00,#3E,#00,#00 ;=
  10013.                 DB      #00,#00,#10,#08,#04,#08,#10,#00 ;>
  10014.                 DB      #00,#3C,#42,#04,#08,#00,#08,#00 ;?
  10015.                 DB      #00,#3C,#02,#3A,#4A,#4A,#3C,#00 ;@ BSROM - more beautiful @ character
  10016.                 DB      #00,#3C,#42,#42,#7E,#42,#42,#00 ;A
  10017.                 DB      #00,#7C,#42,#7C,#42,#42,#7C,#00 ;B
  10018.                 DB      #00,#3C,#42,#40,#40,#42,#3C,#00 ;C
  10019.                 DB      #00,#78,#44,#42,#42,#44,#78,#00 ;D
  10020.                 DB      #00,#7E,#40,#7C,#40,#40,#7E,#00 ;E
  10021.                 DB      #00,#7E,#40,#7C,#40,#40,#40,#00 ;F
  10022.                 DB      #00,#3C,#42,#40,#4E,#42,#3C,#00 ;G
  10023.                 DB      #00,#42,#42,#7E,#42,#42,#42,#00 ;H
  10024.                 DB      #00,#3E,#08,#08,#08,#08,#3E,#00 ;I
  10025.                 DB      #00,#02,#02,#02,#42,#42,#3C,#00 ;J
  10026.                 DB      #00,#44,#48,#70,#48,#44,#42,#00 ;K
  10027.                 DB      #00,#40,#40,#40,#40,#40,#7E,#00 ;L
  10028.                 DB      #00,#42,#66,#5A,#42,#42,#42,#00 ;M
  10029.                 DB      #00,#42,#62,#52,#4A,#46,#42,#00 ;N
  10030.                 DB      #00,#3C,#42,#42,#42,#42,#3C,#00 ;O
  10031.                 DB      #00,#7C,#42,#42,#7C,#40,#40,#00 ;P
  10032.                 DB      #00,#3C,#42,#42,#52,#4A,#3C,#00 ;Q
  10033.                 DB      #00,#7C,#42,#42,#7C,#44,#42,#00 ;R
  10034.                 DB      #00,#3C,#40,#3C,#02,#42,#3C,#00 ;S
  10035.                 DB      #00,#FE,#10,#10,#10,#10,#10,#00 ;T
  10036.                 DB      #00,#42,#42,#42,#42,#42,#3C,#00 ;U
  10037.                 DB      #00,#42,#42,#42,#42,#24,#18,#00 ;V
  10038.                 DB      #00,#42,#42,#42,#42,#5A,#24,#00 ;W
  10039.                 DB      #00,#42,#24,#18,#18,#24,#42,#00 ;X
  10040.                 DB      #00,#82,#44,#28,#10,#10,#10,#00 ;Y
  10041.                 DB      #00,#7E,#04,#08,#10,#20,#7E,#00 ;Z
  10042.                 DB      #00,#0E,#08,#08,#08,#08,#0E,#00 ;[
  10043.                 DB      #00,#00,#40,#20,#10,#08,#04,#00 ;\
  10044.                 DB      #00,#70,#10,#10,#10,#10,#70,#00 ;]
  10045.                 DB      #00,#10,#38,#54,#10,#10,#10,#00 ;^
  10046.                 DB      #00,#00,#00,#00,#00,#00,#00,#FF ;_
  10047.                 DB      #00,#1C,#22,#78,#20,#20,#7E,#00
  10048.                 DB      #00,#00,#38,#04,#3C,#44,#3C,#00 ;a
  10049.                 DB      #00,#20,#20,#3C,#22,#22,#3C,#00 ;b
  10050.                 DB      #00,#00,#1C,#20,#20,#20,#1C,#00 ;c
  10051.                 DB      #00,#04,#04,#3C,#44,#44,#3C,#00 ;d
  10052.                 DB      #00,#00,#38,#44,#78,#40,#3C,#00 ;e
  10053.                 DB      #00,#0C,#10,#18,#10,#10,#10,#00 ;f
  10054.                 DB      #00,#00,#3C,#44,#44,#3C,#04,#38 ;g
  10055.                 DB      #00,#40,#40,#78,#44,#44,#44,#00 ;h
  10056.                 DB      #00,#10,#00,#30,#10,#10,#38,#00 ;i
  10057.                 DB      #00,#04,#00,#04,#04,#04,#24,#18 ;j
  10058.                 DB      #00,#20,#28,#30,#30,#28,#24,#00 ;k
  10059.                 DB      #00,#10,#10,#10,#10,#10,#0C,#00 ;l
  10060.                 DB      #00,#00,#68,#54,#54,#54,#54,#00 ;m
  10061.                 DB      #00,#00,#78,#44,#44,#44,#44,#00 ;n
  10062.                 DB      #00,#00,#38,#44,#44,#44,#38,#00 ;o
  10063.                 DB      #00,#00,#78,#44,#44,#78,#40,#40 ;p
  10064.                 DB      #00,#00,#3C,#44,#44,#3C,#04,#06 ;q
  10065.                 DB      #00,#00,#1C,#20,#20,#20,#20,#00 ;r
  10066.                 DB      #00,#00,#38,#40,#38,#04,#78,#00 ;s
  10067.                 DB      #00,#10,#38,#10,#10,#10,#0C,#00 ;t
  10068.                 DB      #00,#00,#44,#44,#44,#44,#38,#00 ;u
  10069.                 DB      #00,#00,#44,#44,#28,#28,#10,#00 ;v
  10070.                 DB      #00,#00,#44,#54,#54,#54,#28,#00 ;w
  10071.                 DB      #00,#00,#44,#28,#10,#28,#44,#00 ;x
  10072.                 DB      #00,#00,#44,#44,#44,#3C,#04,#38 ;y
  10073.                 DB      #00,#00,#7C,#08,#10,#20,#7C,#00 ;z
  10074.                 DB      #00,#0E,#08,#30,#08,#08,#0E,#00 ;{
  10075.                 DB      #00,#08,#08,#08,#08,#08,#08,#00 ;|
  10076.                 DB      #00,#70,#10,#0C,#10,#10,#70,#00 ;}
  10077.                 DB      #00,#14,#28,#00,#00,#00,#00,#00 ;~
  10078.                 DB      #3C,#42,#99,#A1,#A1,#99,#42,#3C ;(c)
  10079.