?login_element?

Subversion Repositories NedoOS

Rev

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

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