SamForth-A
This page contains the SamForth-A specific information, as part of the SamForth disassembled project. SamForth(-A) was written by John A. Avis in 1991. SamForth(-A) is freeware but unfortunately its source is lost.
RST calls
SamForth-A is paged at 0000h, so RST
instructions call SamForth addresses. The calls are described in the documentation.
The following RST
calls have been already marked with symbols in the disassembled code, and their vectors too:
RST 8
calls ROM'sRST 10h
: prints char inA
to current stream.RST 10h
pushesHL
.RST 18h
popsHL
.RST 20h
pushesHL
andDE
.RST 28h
popsHL
andDE
.RST 30h
reports the error whose number is inA
.RST 38h
(NMI routine) updates theFRAMES
variables.
Memory map
Start | End | Content/Description |
---|---|---|
215B | 3FFF | Free space for the dictionary, pointed by the HERE variable |
11C8 | 2156 | Dictionary space already ocuppied (grows up) |
10E1 | 117B | Error messages (every message is finished with 8Dh |
05D6 | 10E0 | Code |
0502 | 05D5 | Empty space |
0502 | Return stack start, pointed at the start by the RSTACK variable | |
0403 | 0502 | Return stack (grows down); its pointer is backup in the RSTACK variable |
0402 | Data stack start, pointed by the STACK variable | |
0302 | 0402 | Data stack (grows down) |
0302 | Data stack end, pointed by the STKEND variable | |
0282 | 0301 | PAD |
0202 | 0281 | TIB |
0190 | 0200 | SamForth variables |
0038 | RST 38 's routine | |
0030 | Jump to RST 30 's routine | |
0028 | Jump to RST 28 's routine | |
0020 | Jump to RST 20 's routine | |
0018 | Jump to RST 18 's routine | |
0010 | Jump to RST 10 's routine | |
0008 | Jump to RST 8 's routine | |
0000 | Jump to init |
Screenshot
Start screen of SamForth(-A), showing a list of its words:
Source code
The SamForth-A's BASIC loader loads a routine at 50040 from the disk, then pokes a routine at 50000 (0c350h) and another routine an 50020 (c364h)
BASIC loader
The only change in the original loader is the name of the code files.
10 FORMAT "d3:DFORTH",2,40
15 PAPER 9
BORDER 9
CLS
20 LOAD "sf-a_code"CODE 65536
30 LOAD "sf-a_page"CODE
40 DEF KEYCODE 209,"goto warm"
41 setkeys
50 POKE &5A44,1
POKE &5C6A,0
60 CLS
PRINT AT 0,0; " FORTH ^? J.A. Avis 1991"
70 LABEL cold
ON ERROR GO TO 380
75 POKE &5ABA,1
POKE &5A34,0
DPOKE &5C7D,16384
80 GO TO 310
90 LABEL warm
ON ERROR GO TO 380
POKE &5A34,0
POKE &5C6A,0
100 GO TO 330
110 IF PEEK &101de=1 THEN fsave
GO TO 90
120 IF PEEK &101dE=2 THEN fload
GO TO 90
130 IF PEEK &101dE=3 THEN dr1
GO TO 90
140 IF PEEK &101dE=4 THEN GO TO 90
141 IF PEEK &101dE=11 THEN bload
GO TO 90
142 IF PEEK &101dE=12 THEN bsave
GO TO 90
143 IF PEEK &101dE=14 THEN dsave
GO TO 90
144 IF PEEK &101dE=13 THEN dload
GO TO 90
150 ON ERROR STOP
160 STOP
170 DEF PROC dr1
180 SCROLL RESTORE
DIR PEEK &5A07 "*.F*"
190 END PROC
200 DEF PROC fload
210 LET b$=MEM$(&10282 TO &1028f)
220 LET a$=TRUNC$ b$ + ".FS"
235 LET b=(PEEK &101b9 -1)*16384+DPEEK &101e4
240 LOAD A$ CODE b
245 LET a=(PEEK 19314*16384)+(DPEEK 19315-32768)
DPOKE &101e0,a
250 END PROC
260 DEF PROC fsave
270 LET b$=MEM$(&10282 TO &1028f)
LET a=(PEEK &101B9-1)*16384+DPEEK &101e4
LET b=DPEEK &101e0
280 LET a$=TRUNC$ b$ + ".FS"
290 SAVE A$ CODE a,b
300 END PROC
310 POKE 50000,&ed,&73,0,&f0,62,35,211,250,199
320 GO TO 340
330 POKE 50000,&ed,&73,0,&f0,62,35,211,250,195,&57,0
340 POKE 50020,&ed,&7b,0,&f0,62,31,211,250,205,&66,1,201
350 POKE SVAR 520,0
360 CALL 50000
365 POKE &101a2,0
370 GO TO 110
380 LET A= PEEK &5C3A
POKE &101A2,a
IF A>83 THEN PRINT "DOS error ";A
ELSE PRINT "SAM error ";a
390 GO TO 90
400 DEF PROC bload
410 LET b$=MEM$(&10282 TO &1028f)
430 LET a$=TRUNC$ b$ + ".FC"
435 LET b=65536+DPEEK &101e4
436 IF DPEEK &101e4 >=32768 THEN LET b= (PEEK &101EA-1)*16384+DPEEK &101e4
440 LOAD a$ CODE b
450 END PROC
460 DEF PROC bsave
470 LET b$=MEM$(&10282 TO &1028f)
LET a=65536+DPEEK &101e4
LET b=DPEEK &101e0
471 IF DPEEK &101e4 >=32768 THEN LET a= (PEEK &101EA-1)*16384+DPEEK &101e4
480 LET a$=TRUNC$ b$ + ".FC"
490 SAVE a$ CODE a,b
500 END PROC
510 DEF PROC dload
515 LET b$=MEM$(&10282 TO &1028f)
520 LET a$=TRUNC$ b$ + ".FD"
530 LET b=65536+DPEEK &101E4
540 LOAD A$ CODE b
550 END PROC
560 DEF PROC dsave
570 LET b$=MEM$(&10282 TO &1028F)
LET a=65536+DPEEK &101E4
LET b=DPEEK &101E0
580 LET a$=TRUNC$ b$+ ".FD"
590 SAVE A$ CODE a,b
600 END PROC
610 DEF PROC setkeys
620 KEY 24,33
REM f7
630 KEY 15,64
REM f8
640 KEY 6,47
REM f9
650 KEY 25,42
REM f4
660 KEY 16,60
REM f5
670 KEY 7,62
REM f6
675 DEF KEYCODE 207, "goto warm"
680 END PROC
685 DEF PROC s
SAVE OVER "sf-a_orig" LINE 1
END PROC
Routine at 50000 (0c350h)
This routine pages the proper RAM page in and starts SamForth. It's called from BASIC.
; z80dasm 1.1.3
; command line: z80dasm --origin=50000 --output=samforth-a_50000.z80s samforth-a_50000.bin
org 0c350h
ld (0f000h),sp ; save SP
ld a,023h ; bits 0-4: RAM page 3; bit 5: RAM0
out (0fah),a ; allocate pages 3 & 4 to section A
rst 0 ; start SamForth-A
Routine at 50020 (0c364h)
This routine is identical in both SamForth variants. It is called by SamForth only once, as part of the quit process.
org 0c364h
ld sp,(0f000h) ; restore SP
ld a,01fh ; RAM page 1
out (0fah),a ; allocate pages 1 & 2 to section A
call 00166h ; JKBFLUSH, flush keyboard buffer
ret
Routine at 50040 (0c378h)
This routine is the longest one, Its goal is to manage the memory pages and ROM calls. It has several entry points for different tasks.
; z80dasm 1.1.3
; command line: z80dasm --address --origin=50040 --labels --source --output=samforth-a_50040.z80s samforth-a_50040.bin
org 0c378h
ld (0c34eh),sp ;c378 ed 73 4e c3 . s N .
ld sp,0ea60h ;c37c 31 60 ea 1 ` .
ld (lc38fh),iy ;c37f fd 22 8f c3 . " . .
ld a,01fh ;c383 3e 1f > .
out (0fah),a ;c385 d3 fa . .
ld sp,(0c34ch) ;c387 ed 7b 4c c3 . { L .
ex af,af' ;c38b 08 .
call 00103h ;c38c cd 03 01 . . .
lc38fh:
nop ;c38f 00 .
nop ;c390 00 .
ld (0c34ch),sp ;c391 ed 73 4c c3 . s L .
ld sp,0ea60h ;c395 31 60 ea 1 ` .
ld b,a ;c398 47 G
ld a,023h ;c399 3e 23 > #
out (0fah),a ;c39b d3 fa . .
ld sp,(0c34eh) ;c39d ed 7b 4e c3 . { N .
ld iy,00190h ;c3a1 fd 21 90 01 . ! . .
ei ;c3a5 fb .
jp 000cch ;c3a6 c3 cc 00 . . .
nop ;c3a9 00 .
nop ;c3aa 00 .
nop ;c3ab 00 .
nop ;c3ac 00 .
nop ;c3ad 00 .
nop ;c3ae 00 .
nop ;c3af 00 .
nop ;c3b0 00 .
nop ;c3b1 00 .
nop ;c3b2 00 .
nop ;c3b3 00 .
ld (0c34eh),sp ;c3b4 ed 73 4e c3 . s N .
ld sp,0ea60h ;c3b8 31 60 ea 1 ` .
ld a,01fh ;c3bb 3e 1f > .
out (0fah),a ;c3bd d3 fa . .
ld sp,(0c34ch) ;c3bf ed 7b 4c c3 . { L .
lc3c3h:
call 00103h ;c3c3 cd 03 01 . . .
ld l,h ;c3c6 6c l
ld bc,0083ah ;c3c7 01 3a 08 . : .
ld e,h ;c3ca 5c \
cp 000h ;c3cb fe 00 . .
ld (0c34bh),a ;c3cd 32 4b c3 2 K .
jr z,lc3c3h ;c3d0 28 f1 ( .
ld a,000h ;c3d2 3e 00 > .
ld (05c08h),a ;c3d4 32 08 5c 2 . \
ld (05c6ah),a ;c3d7 32 6a 5c 2 j \
ld a,(05c3bh) ;c3da 3a 3b 5c : ; \
and 0dfh ;c3dd e6 df . .
ld (05c3bh),a ;c3df 32 3b 5c 2 ; \
ld (0c34ch),sp ;c3e2 ed 73 4c c3 . s L .
ld sp,0ea60h ;c3e6 31 60 ea 1 ` .
ld a,023h ;c3e9 3e 23 > #
out (0fah),a ;c3eb d3 fa . .
ld sp,(0c34eh) ;c3ed ed 7b 4e c3 . { N .
ld iy,00190h ;c3f1 fd 21 90 01 . ! . .
ld a,(0c34bh) ;c3f5 3a 4b c3 : K .
ld (00191h),a ;c3f8 32 91 01 2 . .
jp 000cch ;c3fb c3 cc 00 . . .
nop ;c3fe 00 .
nop ;c3ff 00 .
nop ;c400 00 .
nop ;c401 00 .
nop ;c402 00 .
nop ;c403 00 .
nop ;c404 00 .
nop ;c405 00 .
nop ;c406 00 .
nop ;c407 00 .
nop ;c408 00 .
nop ;c409 00 .
nop ;c40a 00 .
nop ;c40b 00 .
nop ;c40c 00 .
nop ;c40d 00 .
nop ;c40e 00 .
nop ;c40f 00 .
nop ;c410 00 .
nop ;c411 00 .
nop ;c412 00 .
nop ;c413 00 .
nop ;c414 00 .
nop ;c415 00 .
nop ;c416 00 .
nop ;c417 00 .
nop ;c418 00 .
nop ;c419 00 .
nop ;c41a 00 .
nop ;c41b 00 .
nop ;c41c 00 .
nop ;c41d 00 .
nop ;c41e 00 .
nop ;c41f 00 .
nop ;c420 00 .
nop ;c421 00 .
nop ;c422 00 .
nop ;c423 00 .
nop ;c424 00 .
nop ;c425 00 .
nop ;c426 00 .
nop ;c427 00 .
nop ;c428 00 .
nop ;c429 00 .
nop ;c42a 00 .
nop ;c42b 00 .
nop ;c42c 00 .
nop ;c42d 00 .
nop ;c42e 00 .
nop ;c42f 00 .
nop ;c430 00 .
nop ;c431 00 .
nop ;c432 00 .
nop ;c433 00 .
nop ;c434 00 .
nop ;c435 00 .
nop ;c436 00 .
nop ;c437 00 .
nop ;c438 00 .
nop ;c439 00 .
nop ;c43a 00 .
nop ;c43b 00 .
nop ;c43c 00 .
nop ;c43d 00 .
nop ;c43e 00 .
nop ;c43f 00 .
Main program at 0 (0000h)
; SamForth for the SAM Coupé
; Copyright (C) 1991 John A. Avis
;
; This file is part of the
; "SamForth disassembled" project (2012-2013)
; (<http://programandala.net/en.program.samforth>),
; by Marcos Cruz (programandala.net).
;
; This file was created on 2013-02-01T19:52:53 CET.
;
; First, the binaries were searched for data with:
; SamForth2z80dasm, a Gforth program.
; Second, they were disassembled with:
; z80dasm 1.1.3
; command line: z80dasm --address --origin=0 --labels --source --block-def=samforth-a.bin_blocks.txt --sym-input=samforth-a.bin_symbols.z80s --output=samforth-a.raw.z80s samforth-a.bin
; And third, the assembly was postprocessed with:
; z80dasm2tidySamForth, a Vim program.
org 0x0000
rst_10_rom_routine: equ 0x0010 ; Print char in A register to current stream
jsetstrm_rom_routine: equ 0x0112 ; Set the stream specified by the A register
jdrawto_rom_routine: equ 0x013f ; Draw a line from the current position C pixel horizontally and B pixels vertically
jput_rom_routine: equ 0x0133 ; Place a block of data on the screen at given coordinates
jgrab_rom_routine: equ 0x0136 ; Store a block of screen data from given coordinates to a buffer
jplot_rom_routine: equ 0x0139 ; Plot pixel at x coordinate in C and y coordinate in B
jfill_rom_routine: equ 0x0145 ; Fills an area at coordinates C,B with the pattern at DE
jblitz_rom_routine: equ 0x0148 ; Execute a string of graphics commands BC long at DE
jroll_rom_routine: equ 0x014b ; Move part of the screen (A=wrap/roll, B=pixels, C=direction, D=length, E=width, L=x, H=y
jclsbl_rom_routine: equ 0x014e ; Clear entire screen if A=0, else clear upper screen
jclslower_rom_routine: equ 0x0151 ; Clear lower screen and select channel K
jpalet_rom_routine: equ 0x0154 ; Put colours BC for palette colour E; A=y
jgdump_rom_routine: equ 0x0160 ; Do a graphic screen dump
jreadkey_rom_routine: equ 0x0169 ; Read keyboard; NZ/CY if pressed, A=key
jnchar_rom_routine: equ 0x0184 ; Try to match the char at line D, column E; CY=found?, A=char
lmpr: equ 0xfa ; Low Memory Page Register
hmpr: equ 0xfb ; High Memory Page Register
di
ld iy,flags_fvar
jp init
org 0x0008
rst08:
jp jp_rom_rst10
org 0x0010
rst10:
jp push_hl
org 0x0018
rst18:
jp pop_hl
org 0x0020
rst20:
jp push_hl_de
org 0x0028
rst28:
jp pop_hl_de
org 0x0030
rst30:
jp_error_a:
jp error_a
org 0x0038
rst38:
push af
push bc
push de
push hl
ld hl,(frames2_fvar)
inc hl
ld (frames2_fvar),hl
ld a,h
or l
jr nz,l004eh
ld hl,(frames1_fvar)
inc hl
ld (frames1_fvar),hl
l004eh:
call sub_0df0h
pop hl
pop de
pop bc
pop af
ei
ret
ld iy,flags_fvar
ld (bastack_fvar),sp
ld sp,(tempstk_fvar) ; xxx -- warning: this variable is used as temporary storage
jp l006ah ; xxx -- this looks unfinished or debugging code
org 0x0066
nmi_routine:
ld hl,(nmi_fvar)
jp (hl)
l006ah:
call page_pageno_in_and_set_iy_to_flags
jr l0073h
nop
jp page_pageno_in_and_set_iy_to_flags
l0073h:
ld a,(samerr_fvar)
cp 0x00
jr nz,l0094h
ld a,(svblk_fvar)
cp 0x02
jr nz,l009bh
ld de,(slen_fvar)
ld hl,(se_fvar)
add hl,de
ld (se_fvar),hl
ld (elist_fvar),hl
xor a
ld (svblk_fvar),a
ret
l0094h:
ld sp,(errsp_fvar)
jp main_loop
l009bh:
cp 0x0d
ret nz
ld hl,(chere_fvar)
dec hl
ld b,(hl)
dec hl
ld c,(hl)
dec hl
ld d,(hl)
dec hl
ld e,(hl)
ld (latest_fvar),bc
ld (here_fvar),de
call save_dictionary_pointers
jp l0094h
nop
nop
nop
nop
nop
nop
nop
nop
nop
jp_main_loop:
jp main_loop
jp_page_rampage_in:
jp page_rampage_in
jp_u_dot_code_field:
jp u_dot_code_field
sub_00c9h:
jp l103dh
jp_page_pageno_in_and_set_iy_to_flags:
jp page_pageno_in_and_set_iy_to_flags
jp_interpret_code_field:
jp interpret_code_field
jp_keyboard_input:
jp keyboard_input
jp_wait_for_keypress_and_return_it_in_a:
jp wait_for_keypress_and_return_it_in_a
jp_de_hl_slash_mod:
jp de_hl_slash_mod
jp_rom_rst10:
jp rom_rst10
jp_change_drive_to_tos:
jp change_drive_to_tos
jp_call_jplot:
jp call_jplot
jp_call_jdrawto:
jp call_jdrawto
jp_beep:
jp beep
jp_do_sound:
jp do_sound
jp_cls:
jp cls
jp_fetch_from_page_0:
jp fetch_from_page_0
jp_mode:
jp mode
jp_colour:
jp colour
jp_load:
jp load
jp_save:
jp save
jp_at:
jp at
jp_link:
jp link
jp_link_l:
jp link_l
jp_sam:
jp sam
jp_clear_lower_screen_and_set_palette_l_to_e:
jp clear_lower_screen_and_set_palette_l_to_e
jp_paper:
jp paper
jp_pen:
jp pen
jp_dir:
jp dir
jp_call_jpalette:
jp call_jpalette
jp_border:
jp border
jp_flash:
jp flash
jp_bright:
jp bright
jp_store_into_page_0:
jp store_into_page_0
jp_c_fetch_from_page_0:
jp c_fetch_from_page_0
jp_c_store_into_page_0:
jp c_store_into_page_0
jp_sound_off:
jp sound_off
jp_rols:
jp rols
jp_csize:
jp csize
jp_udgdef:
jp udgdef
jp_screen:
jp screen
jp_blitz:
jp blitz
jp_tab:
jp tab
jp_overp:
jp overp
jp_inverse:
jp inverse
jp_bload:
jp bload
jp_bsave:
jp bsave
jp_dload:
jp dload
jp_dsave:
jp dsave
jp_editor_command_p:
jp editor_command_p
jp_clear:
jp clear
jp_editor_command_l:
jp editor_command_l
jp_editor_command_f:
jp editor_command_f
jp_editor_command_to:
jp editor_command_to
jp_editor_command_n:
jp editor_command_n
jp_where:
jp where
jp_edit:
jp edit
jp_list:
jp list
jp_newl:
jp newl
sub_0171h:
jp l0be1h
sub_0174h:
jp l0c09h
jp_editor_command_h:
jp editor_command_h
sub_017ah:
jp l0c5ch
sub_017dh:
jp l0c66h
jp_editor_command_from:
jp editor_command_from
sub_0183h:
jp l0a0ah
jp_grab:
jp grab
jp_put:
jp put
jp_fill:
jp fill
nop
flags_fvar:
; Various flags to control the system.
defb 0x02
lastk_fvar:
; ASCII code of last key pressed.
defb 0x00
bord_fvar:
; Current border colour.
defb 0x09
frames1_fvar:
; Counts television picture frames into a double number. Not used by SamForth-B.
defw 0x0000
frames2_fvar:
; Counts television picture frames into a double number. Not used by SamForth-B.
defw 0x0000
ycord_fvar:
; Last Y position plotted or drawn.
defb 0x00
xcord_fvar:
; Last X position plotted or drawn.
defw 0x0000
rstack_fvar:
; Address of return stack (Z80 stack).
defw return_stack_end
stp_fvar:
; Stack pointer to Forth stack.
defw data_stack_end
stack_fvar:
; Start of Forth stack.
defw data_stack_end
stkend_fvar:
; End of Forth stack.
defw data_stack_start
samerr_fvar:
; Holds SAM error number. Not used by SamForth-B, but used by the error trapping code of its BASIC loader.
defb 0x00
nmi_fvar:
; Address to jump to when NMI button pressed. Not used by SamForth-B.
defw 0x0000
clate_fvar:
; Address of last Forth word in dictionary at cold start.
defw expand_name
chere_fvar:
; Next vacant address in dictionary at cold start.
defw cold_here
latest_fvar:
; Address of last Forth word in dictionary.
defw expand_name
here_fvar:
; Next vacant address in dictionary.
defw cold_here
base_fvar:
; Current number base.
defw 0x000a
fence_fvar:
; Address below which FORGET will not operate. It is by hold in the variable FENCE.
defw cold_here
tib_fvar:
; Start address of the Terminal Input Buffer.
defw tib_start
pad_fvar:
; Start address of the temporary data holding area.
defw pad_start
st_fvar:
; Start address of source, usually 32768. The page holding the source file is paged in at C & D.
defw 0x8000
tempstk_fvar: ; xxx -- warning: this variable is used as temporary storage
; Used as temporary stack store.
defw 0x0000
rampage_fvar:
; Page number where source file will be held. Defaults to page 7.
defb 0x07
errsp_fvar:
; Address at which return stack is set upon an error.
defw return_stack_end
corestore_fvar: ; xxx -- not used: chere_fvar does its function
; Next vacant address in dictionary at cold start.
defw 0x0000
state_fvar:
; Flag showing compile or immediate mode.
defb 0x00
length_fvar:
; Used to test for the length of a word being looked for in the dictionary.
defb 0x00
leng_fvar:
; Used to test for the length of a word being looked for in the dictionary.
defb 0x00
ip_fvar:
; Address of interpreter pointer within source being compiled.
defw 0x0000
dubflag_fvar:
; Flag indicating double number.
defb 0x00
bastack_fvar:
; Holds stack pointer from SAM BASIC.
defw 0x0000
edits_fvar:
; Start address of source to be edited.
defw 0x0000
numbit_fvar:
; Temporary store used during number output.
defw 0x0000
part1_fvar:
; Temporary addresses used during number input.
defw 0x0000
part2_fvar:
; Temporary addresses used during number input.
defw 0x0000
endf_fvar:
; Temporary store used during number output.
defw 0x0000
nega_fvar:
; Flag for negative number during number output.
defw 0x0000
temp1_fvar:
; Temporary store for HERE during compiling.
defw 0x0000
temp2_fvar:
; Temporary store for LATEST during compiling.
defw 0x0000
il1_fvar:
; Length of input line before cursor.
defb 0x00
il2_fvar:
; Length of input line after cursor.
defb 0x00
etib_fvar:
; End address of Terminal Input Buffer.
defw tib_end
iflag_fvar:
; Flag indicating that characters may be inserted into the input line and existing input is not over written.
defb 0x01
ldflg_fvar:
; Flag showing that source is being compiled.
defb 0x00
errhld_fvar:
; Address of interpreter pointer position when an error occurred during source compilation.
defw 0x0000
svblk_fvar:
; Flag used during LOAD, SAVE and DIR commands.
defw 0x0000
slen_fvar:
; Length of source to be saved.
defw 0x0000
se_fvar:
; End address of source.
defw 0x8000
sadd_fvar:
; Address from where source will be LOADed or SAVEd.
defw 0x0000
hlds_fvar:
; Temporary store during number formatting.
defw 0x0000
pairs_fvar:
; Flags to indicate whether pairs such as DO-LOOP match up during compilation.
defw 0x0000
pageno_fvar:
; Holds number of page paged in at 32768 in sections C & D.
defw 0x0005
cur_fvar:
; Address of cursor in input buffer.
defw 0x0000
smode_fvar:
; Indicates SAM screen mode 1, 2, 3 or 4.
defw 0x0000
notused0_fvar:
defw 0x0000
notused1_fvar:
defw 0x0000
notused2_fvar:
defw 0x0000
len2_fvar:
; Used to increase or decrease length of source during editing.
defw 0x0000
len1_fvar:
; Used to increase or decrease length of source during editing.
defw 0x0000
lists_fvar:
; Start address of source list on screen, or of source to be SAVEd. Changed with T, N, FROM.
defw 0x8000
elist_fvar:
; End address of source list on screen or source to be SAVEd. Changed with N or ES.
defw 0x8000
blong_fvar:
; Used during source editing.
defw 0x0000
endline_fvar:
; Used during source editing.
defw 0x0000
tib_start:
defs 128
tib_end:
pad_start:
defs 128
pad_end:
data_stack_start:
defs 256
data_stack_end:
return_stack_start:
defs 256
return_stack_end:
rst 0x38
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cls:
bit 7,(iy+0x00)
jp nz,jp_page_pageno_in_and_set_iy_to_flags
ld a,0x01
ld iy,jclsbl_rom_routine
jp call_rom_address_in_iy
rom_rst10:
ld iy,rst_10_rom_routine
jp call_rom_address_in_iy
mode:
call cls
rst 0x18
ld a,l
ld (smode_fvar),a
dec a
ld iy,jgdump_rom_routine
jp call_rom_address_in_iy
link:
rst 0x18
link_l:
ld a,l
cp 0x03
jr nz,link_a_not_to_channel_p
set 7,(iy+0x00)
jr link_a
link_a_not_to_channel_p:
res 7,(iy+0x00)
link_a:
ld iy,jsetstrm_rom_routine
jp call_rom_address_in_iy
at:
ld a,0x16
rst 8
rst 0x28
push hl
ld a,e
rst 8
pop hl
ld a,l
rst 8
ret
border:
rst 0x18
ld a,l
ld (bord_fvar),a
out (0xfe),a
ret
beep:
rst 0x18
push hl
rst 0x18
push hl
rst 0x18
push hl
ld a,0x1c
ld l,0x01
call sound_out_a_l
ld a,0x14
ld l,0x3f
call sound_out_a_l
ld a,0x00
ld l,0xff
call sound_out_a_l
ld a,0x08
pop hl
call sound_out_a_l
pop hl
ld a,l
sla a
sla a
sla a
sla a
add a,l
ld l,a
ld a,0x10
call sound_out_a_l
pop hl
l065ah:
dec hl
ld de,0x2710
l065eh:
dec de
ld a,d
or e
jr nz,l065eh
ld a,h
or l
jr nz,l065ah
sound_off:
ld a,0x1c
ld l,0x00
call sound_out_a_l
ret
sound_out_a_l:
ld bc,0x01ff
out (c),a
ld bc,0x00ff
out (c),l
ret
do_sound:
rst 0x18
push hl
rst 0x18
ld a,l
pop hl
jp sound_out_a_l
sam:
ld a,0x00
ld (svblk_fvar),a
ld (smode_fvar),a
return_to_basic:
ld (tempstk_fvar),sp
ld sp,(bastack_fvar)
ld a,0x01
out (hmpr),a
jp 0xc364
sub_0699h:
ld hl,(elist_fvar)
ld de,(lists_fvar)
sbc hl,de
ld (slen_fvar),hl
ld hl,(lists_fvar)
ld (sadd_fvar),hl
sub_06abh:
ld hl,(ip_fvar)
l06aeh:
inc hl
ld a,0x0d
cp (hl)
jp z,error_0x0c_xxx_unknown
ld a,0x20
cp (hl)
jr nz,l06bch
jr l06aeh
l06bch:
ld b,0x0e
ld de,(pad_fvar)
ld a,0x20
l06c4h:
ld (de),a
inc de
djnz l06c4h
ld de,(pad_fvar)
l06cch:
ld a,(hl)
ld (de),a
cp 0x20
jr z,l06dah
cp 0x0d
jr z,l06dfh
inc hl
inc de
jr l06cch
l06dah:
dec hl
ld (ip_fvar),hl
ret
l06dfh:
ld a,0x20
ld (de),a
jr l06dah
error_0x0c_xxx_unknown:
ld a,0x0c
rst 0x30
save:
call sub_0699h
ld a,0x01
ld (svblk_fvar),a
jp return_to_basic
l06f2h:
ld hl,(se_fvar)
ld (sadd_fvar),hl
call sub_06abh
ld a,0x02
ld (svblk_fvar),a
jp return_to_basic
xxx_unknown_zone_00_start:
defb 0xe7
defb 0x06
dir:
ld a,0x03
ld (svblk_fvar),a
jp return_to_basic
call_rom_address_in_iy:
ex af,af'
ld a,0x01
out (hmpr),a
jp 0xc378
call_jplot:
call get_stack_coords_and_copy_to_bc
ld iy,jplot_rom_routine
jp call_rom_address_in_iy
call_jdrawto:
call get_stack_coords_and_copy_to_bc
ld iy,jdrawto_rom_routine
jp call_rom_address_in_iy
get_stack_coords_and_copy_to_bc:
rst 0x28
ld b,l
ld a,b
ld (ycord_fvar),a
ld (xcord_fvar),de
ld c,e
ret
paper:
ld a,0x11
jr print_a_and_tos
pen:
ld a,0x10
jr print_a_and_tos
inverse:
ld a,0x14
jr print_a_and_tos
flash:
ld a,0x12
print_a_and_tos:
rst 8
rst 0x18
ld a,l
rst 8
ret
bright:
ld a,0x13
jr print_a_and_tos
clear_lower_screen_and_set_palette_l_to_e:
ld iy,jclslower_rom_routine
jp call_rom_address_in_iy
ld a,0xff
rst 0x28
ld b,e
ld c,e
ld e,l
call_jpalette:
ld iy,jpalet_rom_routine
jp call_rom_address_in_iy
change_drive_to_tos:
ld a,0x00
out (hmpr),a
rst 0x18
ld a,l
ld (0x9a07),a
jp jp_page_pageno_in_and_set_iy_to_flags
store_into_page_0:
ld a,0x00
out (hmpr),a
rst 0x28
ld bc,0x4000
add hl,bc
ld (hl),e
inc hl
ld (hl),d
jp jp_page_pageno_in_and_set_iy_to_flags
fetch_from_page_0:
ld a,0x00
out (hmpr),a
rst 0x18
ld bc,0x4000
add hl,bc
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
rst 0x10
jp jp_page_pageno_in_and_set_iy_to_flags
c_store_into_page_0:
ld a,0x00
out (hmpr),a
rst 0x28
ld bc,0x4000
add hl,bc
ld (hl),e
jp jp_page_pageno_in_and_set_iy_to_flags
c_fetch_from_page_0:
ld a,0x00
out (hmpr),a
rst 0x18
ld bc,0x4000
add hl,bc
ld a,(hl)
ld l,a
ld h,0x00
rst 0x10
jp jp_page_pageno_in_and_set_iy_to_flags
colour:
rst 0x18
push hl
rst 0x18
ex de,hl
pop hl
ld a,0x00
out (hmpr),a
ld a,(0x9a40)
cp 0x01
jr z,l07c0h
cp 0x00
jr z,l07c0h
jr l07cdh
l07c0h:
ld a,e
rlca
rlca
rlca
add a,l
ld (0x9a45),a
ld (0x9c48),a
jr jp_jp_page_pageno_in_and_set_iy_to_flags
l07cdh:
push hl
push de
push af
ld a,e
rlca
rlca
rlca
rlca
add a,e
ld (0x9a30),a
ld e,a
ld a,l
rlca
rlca
rlca
rlca
add a,l
ld (0x9a31),a
ld l,a
pop af
cp 0x02
jr z,l07f5h
ld a,l
ld (0x9a49),a
ld a,e
ld (0x9a48),a
pop de
pop hl
jr jp_jp_page_pageno_in_and_set_iy_to_flags
l07f5h:
pop de
pop hl
ld a,e
rlca
rlca
add a,e
rlca
rlca
add a,e
rlca
rlca
add a,e
ld (0x9a48),a
ld a,l
rlca
rlca
add a,l
rlca
rlca
add a,l
rlca
rlca
add a,l
ld (0x9a49),a
jp_jp_page_pageno_in_and_set_iy_to_flags:
jp jp_page_pageno_in_and_set_iy_to_flags
ret
rols:
rst 0x18
ld c,e
rst 0x18
ld d,c
push de
rst 0x18
ld c,e
rst 0x18
ld d,e
ld e,c
push de
rst 0x18
ld c,e
rst 0x18
ld b,e
rst 0x18
ld a,e
pop de
pop hl
ld iy,0x014b ; xxx fixed -- 'ld ix' in the original
jp call_rom_address_in_iy
csize:
rst 0x28
ld d,l
ld a,0x00
out (hmpr),a
ld hl,0x9a36
ld (hl),d
inc hl
ld (hl),e
ld l,d
ld h,0x00
ld de,jp_main_loop
call jp_de_hl_slash_mod
rst 0x18
ld e,l
ld hl,0x9a3f
dec e
ld (hl),e
ld hl,0x9a3e
dec e
ld (hl),e
dec e
ld hl,0x9a3b
ld (hl),e
rst 0x18
ld a,l
ld hl,0x9a5d
ld (hl),a
ld a,0x05
out (hmpr),a
ret
pop de
udgdef:
rst 0x18
ld a,0x00
cp h
jr nz,l086ch
ld a,0xa8
cp l
jr nc,l0875h
l086ch:
ld de,0x00a8
sbc hl,de
ld a,0x01
jr l0877h
l0875h:
ld a,0x00
l0877h:
ld (tempstk_fvar),a
push hl
ld de,rst08
ld hl,(pad_fvar)
add hl,de
ld b,0x08
l0884h:
push hl
rst 0x18
ex de,hl
pop hl
ld (hl),e
dec hl
djnz l0884h
pop hl
add hl,hl
add hl,hl
add hl,hl
ld a,0x00
out (hmpr),a
ld a,(tempstk_fvar)
cp 0x00
jr z,l08a1h
ld de,(0x9c7d)
jr l08a5h
l08a1h:
ld de,(0x9c36)
l08a5h:
add hl,de
ld de,0x4000
add hl,de
ex de,hl
ld hl,(pad_fvar)
inc hl
ld bc,rst08
ldir
jp jp_page_pageno_in_and_set_iy_to_flags
screen:
rst 0x28
ld d,e
ld e,l
ld iy,jnchar_rom_routine
call call_rom_address_in_iy
ld l,b
ld h,0x00
rst 0x10
ret
blitz:
rst 0x28
ld b,h
ld c,l
ld iy,jblitz_rom_routine
ld a,0x01
out (hmpr),a
ld h,d
ld l,e
push bc
ld de,0xc000
push de
ldir
pop de
pop bc
jp call_rom_address_in_iy
tab:
ld a,0x17
rst 8
rst 0x18
ld a,l
rst 8
ld a,0x00
rst 8
ret
overp:
ld a,0x15
jp print_a_and_tos
bload:
rst 0x18
ld (sadd_fvar),hl
call sub_06abh
ld a,0x0b
ld (svblk_fvar),a
jp return_to_basic
bsave:
rst 0x28
ld (slen_fvar),hl
ld (sadd_fvar),de
call sub_06abh
ld a,0x0c
ld (svblk_fvar),a
jp return_to_basic
dload:
ld hl,(chere_fvar)
ld de,0x0004
sbc hl,de
ld (sadd_fvar),hl
call sub_06abh
ld a,0x0d
ld (svblk_fvar),a
jp return_to_basic
dsave:
ld hl,(chere_fvar)
ld bc,(here_fvar)
ld de,(latest_fvar)
dec hl
ld (hl),d
dec hl
ld (hl),e
dec hl
ld (hl),b
dec hl
ld (hl),c
ld (sadd_fvar),hl
ex de,hl
ld h,b
ld l,c
sbc hl,de
ld (slen_fvar),hl
call sub_06abh
ld a,0x0e
ld (svblk_fvar),a
jp return_to_basic
editor_command_p:
call jp_page_rampage_in
ld hl,(ip_fvar)
ld de,(se_fvar)
l0959h:
inc hl
ld a,(hl)
ld (de),a
inc de
ld a,0x0d
cp (hl)
jr nz,l0959h
ld (se_fvar),de
ld (elist_fvar),de
dec hl
ld (ip_fvar),hl
jp jp_page_pageno_in_and_set_iy_to_flags
clear:
ld hl,(lists_fvar)
ld (se_fvar),hl
ld (elist_fvar),hl
ret
editor_command_l:
call cls
ld hl,(elist_fvar)
ld de,(st_fvar)
ld a,d
cp h
jr nz,l098eh
ld a,e
cp l
jr nz,l098eh
ret
l098eh:
call jp_page_rampage_in
l0991h:
ld hl,(lists_fvar)
ld (elist_fvar),hl
ld b,0x01
l0999h:
ld l,b
inc b
ld a,b
cp 0x11
jr z,l09cfh
push bc
ld h,0x00
rst 0x10
call jp_u_dot_code_field
ld a,0x20
rst 8
call jp_page_rampage_in
ld hl,(elist_fvar)
l09b0h:
ld a,(hl)
inc hl
ld (elist_fvar),hl
push af
rst 8
call jp_page_rampage_in
pop af
cp 0x0d
jr nz,l09b0h
pop bc
push hl
ld de,(se_fvar)
and a
sbc hl,de
pop hl
jr z,l09cfh
jr nc,l09cfh
jr l0999h
l09cfh:
ld hl,(elist_fvar)
dec hl
ld (elist_fvar),hl
jp jp_page_pageno_in_and_set_iy_to_flags
editor_command_from:
ld hl,(lists_fvar)
ld de,(st_fvar)
ld a,e
cp l
jr nz,l09e9h
ld a,h
cp d
jp z,l0b0ch
l09e9h:
call jp_page_rampage_in
dec hl
l09edh:
dec hl
ld a,e
cp l
jr nz,l09f7h
ld a,h
cp d
jp z,l0a04h
l09f7h:
ld a,0x0d
cp (hl)
jr nz,l09edh
inc hl
ld (lists_fvar),hl
call jp_page_pageno_in_and_set_iy_to_flags
ret
l0a04h:
ld (lists_fvar),hl
jp l0b0ch
l0a0ah:
ld hl,(lists_fvar)
call jp_page_rampage_in
l0a10h:
inc hl
ld a,0x0d
cp (hl)
jr nz,l0a10h
ld de,(se_fvar)
ld a,e
cp l
jr nz,l0a23h
ld a,d
cp h
jp z,l0b0ch
l0a23h:
inc hl
ld (lists_fvar),hl
call jp_page_pageno_in_and_set_iy_to_flags
ret
editor_command_f:
call sub_0c8eh
ld hl,(sadd_fvar)
ld (lists_fvar),hl
ret
editor_command_to:
call sub_0c8eh
call jp_page_rampage_in
ld hl,(sadd_fvar)
l0a3eh:
dec hl
ld a,0x0d
cp (hl)
jr nz,l0a3eh
inc hl
ld (elist_fvar),hl
call jp_page_pageno_in_and_set_iy_to_flags
ret
editor_command_n:
ld hl,(elist_fvar)
inc hl
push hl
ld de,(se_fvar)
sbc hl,de
pop hl
ret nc
ld (lists_fvar),hl
jp editor_command_l
load:
ld hl,(ip_fvar)
l0a62h:
inc hl
ld a,(hl)
cp 0x0d
jr z,l0a6fh
cp 0x20
jr z,l0a62h
jp l06f2h
l0a6fh:
ld hl,(lists_fvar)
ld (sadd_fvar),hl
l0a75h:
call jp_page_rampage_in
ld de,(tib_fvar)
l0a7ch:
ld a,(hl)
ld (de),a
inc hl
inc de
cp 0x0d
jr nz,l0a7ch
ld (endline_fvar),hl
call jp_page_pageno_in_and_set_iy_to_flags
call jp_interpret_code_field
ld hl,(endline_fvar)
ld (sadd_fvar),hl
ld de,(elist_fvar)
ld a,d
cp h
jr nz,l0a75h
ld a,e
cp l
jr nz,l0a75h
ld a,(ldflg_fvar)
cp 0x80
call z,sub_0aaeh ; xxx -- why?
ld sp,(errsp_fvar)
jp jp_main_loop
sub_0aaeh: ; xxx -- why?
ret
where:
ld hl,(errhld_fvar)
dec hl
ld de,(tib_fvar)
sbc hl,de
ex de,hl
ld hl,(sadd_fvar)
ld (lists_fvar),hl
add hl,de
call jp_page_rampage_in
ld (hl),0x83
jp l0991h
edit:
call sub_0cffh
l0acch:
call jp_page_rampage_in
ld hl,(edits_fvar)
ld de,(se_fvar)
sbc hl,de
jp z,l0b0ch
ld hl,(edits_fvar)
call sub_0bc1h
ld hl,(tib_fvar)
call jp_keyboard_input
ld a,(il1_fvar)
ld c,a
ld a,(il2_fvar)
add a,c
inc a
ld (len2_fvar),a
ld c,a
ld a,(len1_fvar)
cp c
jr z,l0afeh
jr nc,l0b03h
jr l0b09h
l0afeh:
call sub_0b51h
jr l0b0ch
l0b03h:
call sub_0b73h
jp l0b0ch
l0b09h:
call sub_0b2dh
l0b0ch:
call jp_page_pageno_in_and_set_iy_to_flags
ld hl,0x0002
call link_l
call editor_command_l
ld sp,(errsp_fvar)
jp jp_main_loop
sub_0b1fh:
ld hl,(se_fvar)
ld bc,(endline_fvar)
and a
sbc hl,bc
ld (blong_fvar),hl
ret
sub_0b2dh:
call sub_0b1fh
call jp_page_rampage_in
ld a,(len1_fvar)
ld c,a
ld a,(len2_fvar)
sub c
ld b,0x00
ld c,a
ld hl,(se_fvar)
push hl
and a
add hl,bc
ld (se_fvar),hl
ld d,h
ld e,l
pop hl
ld bc,(blong_fvar)
inc bc
lddr
sub_0b51h:
ld hl,(edits_fvar)
ld de,(edits_fvar)
call jp_page_rampage_in
ld a,(len2_fvar)
cp 0x00
jp z,l0acch
ld c,a
ld b,0x00
add hl,bc
ld (endline_fvar),hl
ld hl,(tib_fvar)
ldir
ld hl,(endline_fvar)
ret
sub_0b73h:
call sub_0b1fh
call jp_page_rampage_in
ld a,(len2_fvar)
ld c,a
ld a,(len1_fvar)
sub c
ld c,a
ld b,0x00
ld hl,(se_fvar)
and a
sbc hl,bc
ld (se_fvar),hl
ld hl,(endline_fvar)
push hl
and a
sbc hl,bc
ld d,h
ld e,l
pop hl
ld bc,(blong_fvar)
ld a,b
or c
jr z,sub_0b51h
ldir
jr sub_0b51h
sub_0ba3h:
call jp_page_rampage_in
ld hl,(edits_fvar)
l0ba9h:
ld a,(hl)
cp 0x0d
jr z,l0bb1h
inc hl
jr l0ba9h
l0bb1h:
inc hl
ld (endline_fvar),hl
ld bc,(edits_fvar)
and a
sbc hl,bc
ld a,l
ld (len1_fvar),a
ret
sub_0bc1h:
call sub_0ba3h
ld c,a
ld b,0x00
dec a
ld (il2_fvar),a
ld a,0x00
ld hl,(edits_fvar)
ld de,(tib_fvar)
ld (cur_fvar),de
ld (il1_fvar),a
ldir
call sub_00c9h
ret
l0be1h:
call sub_0cffh
ld hl,(se_fvar)
call jp_page_rampage_in
ld bc,(endline_fvar)
sbc hl,bc
ld b,h
ld c,l
inc bc
ld hl,(se_fvar)
ld de,(se_fvar)
inc de
ld (se_fvar),de
lddr
ld hl,(endline_fvar)
ld (hl),0x0d
jp l0c52h
l0c09h:
call sub_0cffh
call jp_page_rampage_in
ld hl,(edits_fvar)
l0c12h:
ld a,(hl)
cp 0x0d
jr z,l0c1ah
inc hl
jr l0c12h
l0c1ah:
inc hl
ld (endline_fvar),hl
ld bc,(edits_fvar)
and a
sbc hl,bc
ld a,l
ld (len1_fvar),a
ld hl,(se_fvar)
ld de,(endline_fvar)
sbc hl,de
ld b,h
ld c,l
ld a,(len1_fvar)
ld e,a
ld d,0x00
ld hl,(se_fvar)
sbc hl,de
ld (se_fvar),hl
ld hl,(endline_fvar)
push hl
sbc hl,de
ld (endline_fvar),hl
ex de,hl
pop hl
ldir
ld hl,(edits_fvar)
l0c52h:
call jp_page_pageno_in_and_set_iy_to_flags
ld hl,0x0002
call link_l
ret
l0c5ch:
rst 0x18
rst 0x10
rst 0x10
call l0c09h
call l0be1h
ret
l0c66h:
rst 0x18
rst 0x10
rst 0x10
call l0c5ch
call sub_0cffh
ld hl,(tib_fvar)
push hl
ld hl,(pad_fvar)
inc hl
ld (tib_fvar),hl
ld hl,(pad_fvar)
ld a,(hl)
ld (len2_fvar),a
ld a,0x01
ld (len1_fvar),a
call sub_0b2dh
pop hl
ld (tib_fvar),hl
ret
sub_0c8eh:
ld de,(ip_fvar)
call jp_page_rampage_in
l0c95h:
inc de
ld a,(de)
cp 0x20
jr z,l0c95h
cp 0x3a
jr z,l0c95h
cp 0x0d
jr z,jp_page_pageno_in_and_set_iy_to_flags_and_error_0x0a_not_found
ld hl,(lists_fvar)
dec hl
l0ca7h:
push hl
push de
dec de
l0caah:
inc de
inc hl
ld a,(de)
ld c,(hl)
cp c
jr nz,l0ce3h
cp 0x0d
jr z,l0cbbh
cp 0x20
jr z,l0cbbh
jr l0caah
l0cbbh:
pop bc
pop hl
ld (sadd_fvar),hl
dec de
ld (ip_fvar),de
jp jp_page_pageno_in_and_set_iy_to_flags
l0cc8h:
pop de
pop bc
l0ccah:
push hl
ld bc,(se_fvar)
and a
sbc hl,bc
jr nc,jp_page_pageno_in_and_set_iy_to_flags_and_error_0x0a_not_found
jr z,jp_page_pageno_in_and_set_iy_to_flags_and_error_0x0a_not_found
pop hl
ld a,(hl)
cp 0x0d
jr z,l0ca7h
cp 0x20
jr z,l0ca7h
inc hl
jr l0ccah
l0ce3h:
cp 0x0d
jr nz,l0ceeh
ld a,c
cp 0x20
jr z,l0cbbh
jr l0cc8h
l0ceeh:
cp 0x20
jr nz,l0cc8h
ld a,c
cp 0x0d
jr z,l0cbbh
jr l0cc8h
jp_page_pageno_in_and_set_iy_to_flags_and_error_0x0a_not_found:
call jp_page_pageno_in_and_set_iy_to_flags
ld a,0x0a
rst 0x30
sub_0cffh:
rst 0x18
ld a,0x0f
cp l
jr c,error_0x0b_editor_error
ld a,0x00
cp l
jr z,error_0x0b_editor_error
ld b,l
ld hl,(lists_fvar)
ld a,b
ld (notused1_fvar),a
ld a,0x01
cp b
jr z,l0d33h
call jp_page_rampage_in
dec b
dec hl
l0d1ch:
inc hl
push hl
ld de,(se_fvar)
sbc hl,de
pop hl
jp nc,error_0x0b_editor_error
ld a,0x0d
cp (hl)
jr nz,l0d1ch
djnz l0d1ch
ld (endline_fvar),hl
inc hl
l0d33h:
ld (edits_fvar),hl
jp jp_page_pageno_in_and_set_iy_to_flags
error_0x0b_editor_error:
ld a,0x0b
rst 0x30
newl:
ld a,(rampage_fvar)
out (hmpr),a
ld hl,(se_fvar)
ld b,0x10
l0d46h:
ld (hl),0x0d
inc hl
djnz l0d46h
ld (se_fvar),hl
ld (elist_fvar),hl
jp editor_command_l
list:
ld hl,(elist_fvar)
ld de,(st_fvar)
ld a,d
cp h
jr nz,l0d64h
ld a,e
cp l
jr nz,l0d64h
ret
l0d64h:
ld a,(rampage_fvar)
out (hmpr),a
ld hl,(lists_fvar)
l0d6ch:
ld a,(hl)
rst 8
ld a,(rampage_fvar)
out (hmpr),a
inc hl
ld bc,(elist_fvar)
push hl
and a
sbc hl,bc
pop hl
jr nc,l0da1h
jr z,l0da1h
ld a,(hl)
cp 0x3a
jr nz,l0d8bh
ld (lists_fvar),hl
jr l0d6ch
l0d8bh:
cp 0x3b
jr nz,l0d6ch
rst 8
ld a,(rampage_fvar)
out (hmpr),a
inc hl
bit 7,(iy+0x00)
call z,jp_wait_for_keypress_and_return_it_in_a
cp 0x20
jr nz,l0d6ch
l0da1h:
jp jp_page_pageno_in_and_set_iy_to_flags
editor_command_h:
call sub_0cffh
call sub_0ba3h
ld hl,(edits_fvar)
ld a,(len1_fvar)
ld c,a
ld b,0x00
ld de,(pad_fvar)
inc de
ldir
ld hl,(pad_fvar)
ld (hl),a
jp jp_page_pageno_in_and_set_iy_to_flags
grab:
rst 0x28
ld d,l
push de
rst 0x28
ld c,l
ld b,e
pop de
ld iy,jgrab_rom_routine
jp call_rom_address_in_iy
put:
rst 0x28
ld a,l
push de
rst 0x28
ld b,l
ld c,e
pop hl
ld iy,jput_rom_routine
jp call_rom_address_in_iy
fill:
rst 0x28
ld b,l
ld c,e
rst 0x18
ex de,hl
ld a,0x00
ld iy,jfill_rom_routine
jp call_rom_address_in_iy
nop
nop
nop
nop
nop
sub_0df0h:
ld bc,0xfef9
in a,(c)
cp 0xdf
ret nz
ld bc,0xfefe
in a,(c)
cp 0x5e
ret nz
ld a,0x08
jp error_a
pop_hl:
ld (rstack_fvar),sp
ld sp,(stp_fvar)
ld hl,(stack_fvar)
sbc hl,sp
jp z,error_0x01_stack_empty
pop hl
ld (stp_fvar),sp
ld sp,(rstack_fvar)
ret
push_hl:
push hl
ld (rstack_fvar),sp
ld sp,(stp_fvar)
push hl
ld hl,(stkend_fvar)
sbc hl,sp
jp nc,error_0x02_stack_full
ld (stp_fvar),sp
ld sp,(rstack_fvar)
pop hl
ret
pop_hl_de:
ld (rstack_fvar),sp
ld sp,(stp_fvar)
ld hl,(stack_fvar)
sbc hl,sp
jp z,error_0x01_stack_empty
ld hl,(stack_fvar)
dec hl
dec hl
sbc hl,sp
jp z,error_0x01_stack_empty
pop hl
pop de
ld (stp_fvar),sp
ld sp,(rstack_fvar)
ret
push_hl_de:
push hl
ld (rstack_fvar),sp
ld sp,(stp_fvar)
push de
push hl
ld hl,(stkend_fvar)
sbc hl,sp
jp nc,error_0x02_stack_full
ld (stp_fvar),sp
ld sp,(rstack_fvar)
pop hl
ret
res 5,(iy+0x00)
bit 5,(iy+0x00)
wait_for_keypress_and_return_it_in_a:
call get_keypress_with_what_xxx
ld a,(lastk_fvar)
cp 0x00
jr z,wait_for_keypress_and_return_it_in_a
bit 1,(iy+0x00)
ret z
cp 0x61
ret c
cp 0x7b
ret nc
res 5,a
ret
restore_the_input_pointer:
ld hl,(tib_fvar)
ld (cur_fvar),hl
ld a,0x00
ld (il1_fvar),a
ld (il2_fvar),a
keyboard_input:
push hl
call l103dh
call wait_for_keypress_and_return_it_in_a
pop hl
cp 0x08
jp z,keyboard_input_cursor_left
cp 0x09
jp z,keyboard_input_cursor_right
cp 0x0c
jp z,keyboard_input_backspace
cp 0x0e
jp z,keyboard_input_delete
cp 0xc3
jp z,l0fd2h
cp 0xc2
jp z,restore_the_input_pointer
cp 0x07
jp z,keyboard_input_edit
cp 0x06
jr z,toggle_caps_lock
cp 0x0b
jp z,keyboard_input_up
cp 0x0a
jp z,keyboard_input_down
cp 0xc0
jp z,toggle_insert_mode
cp 0x0d
jr z,keyboard_input_cr
push af
ld a,(iflag_fvar)
cp 0x01
call z,sub_1010h
pop af
ld (hl),a
inc hl
ld (cur_fvar),hl
ld a,(il1_fvar)
inc a
ld (il1_fvar),a
ld a,(iflag_fvar)
cp 0x01
jr z,keyboard_input
ld a,(il2_fvar)
dec a
cp 0xff
jr z,keyboard_input
ld (il2_fvar),a
jp keyboard_input
keyboard_input_edit:
ld (hl),0x20
inc hl
ld (hl),0x45
inc hl
ld (hl),0x44
inc hl
ld (hl),0x49
inc hl
ld (hl),0x54
inc hl
ld (hl),0x20
ld a,(il1_fvar)
add a,0x06
ld (il1_fvar),a
call keyboard_input_cr
call interpret_code_field
ret
toggle_caps_lock:
ld a,(flags_fvar)
xor 0x02
ld (flags_fvar),a
jp keyboard_input
keyboard_input_cr:
ld hl,(tib_fvar)
ld a,(il1_fvar)
ld c,a
ld a,(il2_fvar)
add a,c
ld c,a
ld b,0x00
add hl,bc
ld (hl),0x0d
ld (etib_fvar),hl
call sub_1069h
print_cr: ; xxx -- duplicated code; already in the CR word
ld a,0x0d
rst 8
ret
keyboard_input_backspace:
ld a,(il1_fvar)
dec a
cp 0xff
jp z,keyboard_input
ld (il1_fvar),a
ld hl,(cur_fvar)
ld de,(cur_fvar)
dec de
ld (cur_fvar),de
ld a,(il2_fvar)
l0f79h:
cp 0x00
jr z,l0f82h
ld c,a
ld b,0x00
ldir
l0f82h:
ld hl,(cur_fvar)
jp keyboard_input
keyboard_input_delete:
ld a,(il2_fvar)
dec a
cp 0xff
jp z,keyboard_input
ld (il2_fvar),a
ld hl,(cur_fvar)
inc hl
ld de,(cur_fvar)
jr l0f79h
keyboard_input_cursor_left:
ld a,(il1_fvar)
dec a
cp 0xff
jp z,keyboard_input
ld (il1_fvar),a
ld a,(il2_fvar)
inc a
ld (il2_fvar),a
dec hl
ld (cur_fvar),hl
jp keyboard_input
keyboard_input_cursor_right:
ld a,(il2_fvar)
dec a
cp 0xff
jp z,keyboard_input
ld (il2_fvar),a
ld a,(il1_fvar)
inc a
ld (il1_fvar),a
inc hl
ld (cur_fvar),hl
jp keyboard_input
l0fd2h:
ld a,0x00
ld (il2_fvar),a
jp keyboard_input
keyboard_input_up:
ld a,(il1_fvar)
ld c,a
ld a,(il2_fvar)
add a,c
ld (il2_fvar),a
ld a,0x00
ld (il1_fvar),a
ld hl,(tib_fvar)
ld (cur_fvar),hl
jp keyboard_input
keyboard_input_down:
ld a,(il1_fvar)
ld c,a
ld a,(il2_fvar)
add a,c
ld (il1_fvar),a
ld c,a
ld a,0x00
ld (il2_fvar),a
ld b,0x00
ld hl,(tib_fvar)
add hl,bc
ld (cur_fvar),hl
jp keyboard_input
sub_1010h:
ld hl,(tib_fvar)
ld a,(il1_fvar)
ld c,a
ld a,(il2_fvar)
add a,c
ld c,a
ld b,0x00
add hl,bc
ld (etib_fvar),hl
ld a,(il2_fvar)
inc a
ld c,a
ld de,(etib_fvar)
inc de
lddr
ld hl,(cur_fvar)
ret
toggle_insert_mode:
ld a,(iflag_fvar)
xor 0x01
ld (iflag_fvar),a
jp keyboard_input
l103dh:
ld hl,0x0001
call jp_link_l
call jp_clear_lower_screen_and_set_palette_l_to_e
ld hl,(tib_fvar)
ld a,(il1_fvar)
cp 0x00
jr z,l1056h
ld c,a
ld b,0x00
call type_bc_chars_at_hl
l1056h:
ld a,0x5f
rst 8
ld hl,(cur_fvar)
ld a,(il2_fvar)
cp 0x00
ret z
ld c,a
ld b,0x00
call type_bc_chars_at_hl
ret
sub_1069h:
ld hl,0x0002
call jp_link_l
ld hl,(tib_fvar)
ld a,(il1_fvar)
ld c,a
ld a,(il2_fvar)
add a,c
ld c,a
ld a,0x00
cp c
ret z
ld b,0x00
call type_bc_chars_at_hl
ret
type_bc_chars_at_hl:
ld a,(hl)
inc hl
push hl
push bc
rst 8
pop bc
pop hl
dec bc
ld a,b
or c
jr nz,type_bc_chars_at_hl
ret
main_loop:
call restore_the_input_pointer
call interpret_code_field
jr main_loop
error_0x01_stack_empty:
ld a,0x01
jr error_a
error_0x02_stack_full:
ld a,0x02
error_a:
ld hl,error_messages
error_message_not_found_yet:
bit 7,(hl)
inc hl
jr z,error_message_not_found_yet
dec a
jr nz,error_message_not_found_yet
next_error_message_char:
ld a,(hl)
bit 7,a
inc hl
jr nz,warm_restart
rst 8
jr next_error_message_char
warm_restart:
ld hl,(stack_fvar)
ld (stp_fvar),hl
ld hl,(ip_fvar)
ld (errhld_fvar),hl
ld sp,(errsp_fvar)
ld hl,tib_start
ld (tib_fvar),hl
ld hl,tib_end
ld (pad_fvar),hl
call restore_dictionary_pointers_and_set_interpretation_mode
call print_cr
call page_pageno_in_and_set_iy_to_flags
ld a,0x00
ld (dubflag_fvar),a
jp main_loop
error_messages:
defb 0x80
defm "Stack empty" ; Error number 0x01
defb 0x8d
defm "Stack full" ; Error number 0x02
defb 0x8d
defm "Undefined word" ; Error number 0x03
defb 0x8d
defm "Colon definitions only" ; Error number 0x04
defb 0x8d
defm "Division by zero" ; Error number 0x05
defb 0x8d
defm "Return stack full" ; Error number 0x06
defb 0x8d
defm "Inside fence" ; Error number 0x07
defb 0x8d
defm "Break" ; Error number 0x08
defb 0x8d
defm "Incomplete form" ; Error number 0x09
defb 0x8d
defm "Not found" ; Error number 0x0a
defb 0x8d
defm "Editor error" ; Error number 0x0b
defb 0x8d
init:
ld (bastack_fvar),sp
ld (0xc34c),sp
ld sp,(errsp_fvar)
ld a,0x0d
rst 8
call page_pageno_in_and_set_iy_to_flags
call save_dictionary_pointers
ld a,0x00
ld (state_fvar),a
im 1
ei
ld hl,0x0002
call jp_link_l
call print_cr
set 1,(iy+0x00)
jp main_loop
save_dictionary_pointers:
ld hl,(here_fvar)
ld (temp1_fvar),hl
ld hl,(latest_fvar)
ld (temp2_fvar),hl
ret
restore_dictionary_pointers_and_set_interpretation_mode:
ld hl,(temp1_fvar)
ld (here_fvar),hl
ld hl,(temp2_fvar)
ld (latest_fvar),hl
ld a,0x00
ld (state_fvar),a
ret
lit_link_field:
defw 0xffff
lit_name_field:
defb 0x03
lit_name:
defm "LIT"
lit_code_field:
pop hl
ld e,(hl)
inc hl
ld d,(hl)
inc hl
push hl
ex de,hl
rst 0x10
ret
execute_link_field:
defw lit_name
execute_name_field:
defb 0x07
execute_name:
defm "EXECUTE"
execute_code_field:
rst 0x18
jp (hl)
branch_link_field:
defw execute_name
branch_name_field:
defb 0x06
branch_name:
defm "BRANCH"
branch_code_field:
pop hl
ld c,(hl)
inc hl
ld b,(hl)
push bc
ret
zero_branch_link_field:
defw branch_name
zero_branch_name_field:
defb 0x07
zero_branch_name:
defm "0BRANCH"
zero_branch_code_field:
rst 0x18
ld a,0x01
cp l
jr nz,branch_code_field
pop hl
inc hl
inc hl
jp (hl)
swap_link_field:
defw zero_branch_name
swap_name_field:
defb 0x04
swap_name:
defm "SWAP"
swap_code_field:
rst 0x28
ex de,hl
rst 0x20
ret
dup_link_field:
defw swap_name
dup_name_field:
defb 0x03
dup_name:
defm "DUP"
dup_code_field:
rst 0x18
rst 0x10
rst 0x10
ret
drop_link_field:
defw dup_name
drop_name_field:
defb 0x04
drop_name:
defm "DROP"
drop_code_field:
rst 0x18
ret
interpret_link_field:
defw drop_name
interpret_name_field:
defb 0x09
interpret_name:
defm "INTERPRET"
interpret_code_field:
ld hl,(tib_fvar)
dec hl
skip_space:
inc hl
ld a,0x20
cp (hl)
jr z,skip_space
ld a,0x0d
cp (hl)
jr nz,first_char_to_interpret_found
ret
first_char_to_interpret_found:
ld (ip_fvar),hl
call paren_find_code_field
rst 0x18
ld a,h
or l
jr nz,l1298h
ld hl,(ip_fvar)
rst 0x10
call number_code_field
ld hl,(numbit_fvar)
ld (ip_fvar),hl
rst 0x18
ld a,h
or l
jr z,l1263h
ld a,0x01
ld (dubflag_fvar),a
rst 0x10
l1263h:
ld a,(state_fvar)
cp 0x00
jr z,l1293h
ld a,(dubflag_fvar)
cp 0x01
jr nz,l1274h
rst 0x28
ex de,hl
rst 0x20
l1274h:
rst 0x18
ld b,h
ld c,l
ld hl,lit_code_field
rst 0x10
call compile_call_tos
ld (hl),c
inc hl
ld (hl),b
inc hl
ld (here_fvar),hl
ld a,(dubflag_fvar)
cp 0x01
jr nz,l1293h
ld a,0x00
ld (dubflag_fvar),a
jr l1274h
l1293h:
ld hl,(ip_fvar)
jr skip_space
l1298h:
ld a,(leng_fvar)
bit 6,a
jr nz,l12b5h
ld a,(state_fvar)
bit 7,a
jr nz,l12bfh
ld a,(leng_fvar)
bit 7,a
jr z,l12b5h
ld a,(state_fvar)
bit 7,a
jp z,error_0x04_colon_definitions_only_xxx_1
l12b5h:
rst 0x10
call execute_code_field
ld hl,(ip_fvar)
jp skip_space
l12bfh:
ld a,(leng_fvar)
bit 7,a
jr nz,l12b5h
rst 0x10
call compile_call_tos
ld hl,(ip_fvar)
jp skip_space
compile_call_tos:
rst 0x18
ex de,hl
compile_call_de:
ld hl,(here_fvar)
ld (hl),0xcd
inc hl
ld (hl),e
inc hl
ld (hl),d
inc hl
ld (here_fvar),hl
ret
error_0x04_colon_definitions_only_xxx_1:
ld a,0x04
rst 0x30
paren_find_link_field:
defw interpret_name
paren_find_name_field:
defb 0x06
paren_find_name:
defm "(FIND)"
paren_find_code_field:
ld de,(ip_fvar)
ld b,0x00
l12f2h:
ld a,(de)
cp 0x20
jr z,l12ffh
cp 0x0d
jr z,l12ffh
inc b
inc de
jr l12f2h
l12ffh:
ld a,b
ld (length_fvar),a
ld hl,(latest_fvar)
jr l131ch
l1308h:
pop hl
l1309h:
dec hl
ld b,(hl)
dec hl
ld c,(hl)
ld h,b
ld l,c
ld a,0xff
cp l
jr nz,l131ch
cp h
jr nz,l131ch
ld hl,0x0000
rst 0x10
ret
l131ch:
dec hl
ld a,(length_fvar)
ld c,a
ld a,(hl)
res 7,a
res 6,a
cp c
jr nz,l1309h
ld a,(hl)
ld (leng_fvar),a
push hl
ld de,(ip_fvar)
ld b,(hl)
res 7,b
res 6,b
l1337h:
inc hl
ld c,(hl)
ld a,(de)
cp c
jr nz,l1308h
inc de
djnz l1337h
inc hl
dec de
ld (ip_fvar),de
rst 0x10
pop hl
ret
u_mult_link_field:
defw paren_find_name
u_mult_name_field:
defb 0x02
u_mult_name:
defm "U*"
u_mult_code_field:
rst 0x28
ld b,h
ld a,l
call sub_1365h
push hl
ld h,a
ld a,b
ld b,h
call sub_1365h
pop de
ld c,d
add hl,bc
adc a,0x00
ld d,l
ld l,h
ld h,a
rst 0x20
ret
sub_1365h:
ld hl,0x0000
ld c,0x08
l136ah:
add hl,hl
rla
jr nc,l1371h
add hl,de
adc a,0x00
l1371h:
dec c
jr nz,l136ah
ret
plus_link_field:
defw u_mult_name
plus_name_field:
defb 0x01
plus_name:
defm "+"
plus_code_field:
rst 0x28
and a
add hl,de
rst 0x10
ret
d_plus_link_field:
defw plus_name
d_plus_name_field:
defb 0x02
d_plus_name:
defm "D+"
d_plus_code_field:
rst 0x18
push hl
pop bc
rst 0x18
push hl
call swap_code_field
rst 0x18
pop de
add hl,de
ex de,hl
push af
rst 0x18
pop af
adc hl,bc
rst 0x20
ret
minus_link_field:
defw d_plus_name
minus_name_field:
defb 0x01
minus_name:
defm "-"
minus_code_field:
rst 0x28
ex de,hl
sbc hl,de
rst 0x10
ret
do_minus_link_field:
defw minus_name
do_minus_name_field:
defb 0x05
do_minus_name:
defm "MINUS"
do_minus_code_field:
rst 0x18
ex de,hl
ld hl,0x0000
sbc hl,de
rst 0x10
ret
d_do_minus_link_field:
defw do_minus_name
d_do_minus_name_field:
defb 0x06
d_do_minus_name:
defm "DMINUS"
d_do_minus_code_field:
rst 0x28
sub a
sub e
ld e,a
ld a,0x00
sbc a,d
ld d,a
ld a,0x00
sbc a,l
ld l,a
ld a,0x00
sbc a,h
ld h,a
rst 0x20
ret
number_link_field:
defw d_do_minus_name
number_name_field:
defb 0x06
number_name:
defm "NUMBER"
number_code_field:
rst 0x18
ld a,0x2d
cp (hl)
jr nz,l1410h
inc hl
ld a,0x01
ld (nega_fvar),a
jr l1410h
l13e3h:
ld hl,(part1_fvar)
ld de,(part2_fvar)
rst 0x20
ld a,(nega_fvar)
cp 0x01
jr nz,l140ah
ld a,h
or l
jr nz,l13fbh
ld a,0x80
ld (nega_fvar),a
l13fbh:
call d_do_minus_code_field
ld a,(nega_fvar)
cp 0x80
jr nz,l140ah
rst 0x18
ld hl,0x0000
rst 0x10
l140ah:
ld a,0x00
ld (nega_fvar),a
ret
l1410h:
ld a,0x00
ld (endf_fvar),a
ex de,hl
ld hl,0x0000
ld (part1_fvar),hl
ld (part2_fvar),hl
l141fh:
ld a,(de)
cp 0x30
jp c,error_0x03_undefined_word_xxx_1
ld c,a
ld a,(base_fvar)
ld b,0x0a
cp b
jr nc,l1434h
add a,0x30
cp c
jp c,error_0x03_undefined_word_xxx_1
l1434h:
ld a,c
cp 0x3a
jr nc,l1486h
sub 0x30
l143bh:
ld h,0x00
ld l,a
rst 0x10
inc de
ld a,(de)
cp 0x20
jr z,l147fh
cp 0x0d
jr z,l147fh
l1449h:
dec de
ld (numbit_fvar),de
ld hl,(part1_fvar)
rst 0x10
ld hl,(base_fvar)
rst 0x10
call u_mult_code_field
rst 0x18
ld hl,(base_fvar)
rst 0x10
ld hl,(part2_fvar)
rst 0x10
call u_mult_code_field
call d_plus_code_field
rst 0x18
ld (part1_fvar),hl
rst 0x18
ld (part2_fvar),hl
ld a,(endf_fvar)
cp 0x01
jp z,l13e3h
ld de,(numbit_fvar)
inc de
jr l141fh
l147fh:
ld a,0x01
ld (endf_fvar),a
jr l1449h
l1486h:
ld c,a
ld a,(base_fvar)
add a,0x37
cp c
jp c,error_0x03_undefined_word_xxx_1
ld a,c
sub 0x37
jr l143bh
error_0x03_undefined_word_xxx_1:
ld a,0x03
rst 0x30
emit_link_field:
defw number_name
emit_name_field:
defb 0x04
emit_name:
defm "EMIT"
emit_code_field:
rst 0x18
ld a,l
rst 8
ret
u_dot_link_field:
defw emit_name
u_dot_name_field:
defb 0x02
u_dot_name:
defm "U."
u_dot_code_field:
ld hl,(stp_fvar)
push hl
l14ach:
ld hl,(base_fvar)
rst 0x10
call slash_mod_code_field
call swap_code_field
rst 0x18
ld a,0x09
cp l
jr c,l14cch
ld a,0x30
l14beh:
add a,l
ld l,a
rst 0x10
call swap_code_field
rst 0x18
ld a,h
or l
jr z,l14d0h
rst 0x10
jr l14ach
l14cch:
ld a,0x37
jr l14beh
l14d0h:
pop hl
ld de,(stp_fvar)
sbc hl,de
srl l
ld b,l
inc b
l14dbh:
rst 0x18
ld a,l
push bc
rst 8
pop bc
djnz l14dbh
ld a,0x20
rst 8
ret
slash_mod_link_field:
defw u_dot_name
slash_mod_name_field:
defb 0x04
slash_mod_name:
defm "/MOD"
slash_mod_code_field:
rst 0x28
de_hl_slash_mod:
ex de,hl
ld a,d
or e
jp z,error_0x05_division_by_zero
and a
ld b,d
ld c,e
ld de,0xffff
l14fah:
inc de
sbc hl,bc
jr nc,l14fah
add hl,bc
ex de,hl
rst 0x20
ret
error_0x05_division_by_zero:
ld a,0x05
rst 0x30
jp jp_clear_lower_screen_and_set_palette_l_to_e
jp l1955h
cls_link_field:
defw slash_mod_name
cls_name_field:
defb 0x03
cls_name:
defm "CLS"
cls_code_field:
jp jp_cls
create_link_field:
defw cls_name
create_name_field:
defb 0x06
create_name:
defm "CREATE"
create_code_field:
call create_header_with_name_from_the_input_stream
call save_dictionary_pointers
ret
create_header_with_name_from_the_input_stream:
ld de,(ip_fvar)
ld hl,(here_fvar)
l152ch:
inc de
ld a,(de)
cp 0x20
jr z,l152ch
ld bc,(latest_fvar)
ld (hl),c
inc hl
ld (hl),b
push de
ld b,0x00
l153ch:
ld a,(de)
cp 0x20
jr z,l1549h
cp 0x0d
jr z,l1549h
inc b
inc de
jr l153ch
l1549h:
ld a,b
inc hl
ld (hl),a
pop de
inc hl
ld (latest_fvar),hl
l1551h:
ld a,(de)
ld (hl),a
inc de
inc hl
djnz l1551h
ld (here_fvar),hl
dec de
ld (ip_fvar),de
ret
colon_link_field:
defw create_name
colon_name_field:
defb 0x41
colon_name:
defm ":"
colon_code_field:
ld a,(state_fvar)
bit 7,a
jr nz,error_0x04_colon_definitions_only_xxx_2
set 7,a
ld (state_fvar),a
call create_header_with_name_from_the_input_stream
ld hl,0x0001
rst 0x10
ret
error_0x04_colon_definitions_only_xxx_2:
ld a,0x04
rst 0x30
semicolon_link_field:
defw colon_name
semicolon_name_field:
defb 0x41
semicolon_name:
defm ";"
semicolon_code_field:
rst 0x18
ld a,0x01
cp l
jr nz,error_0x0a_not_found
ld hl,(here_fvar)
ld (hl),0xc9
inc hl
ld (here_fvar),hl
ld a,0x00
ld (state_fvar),a
call save_dictionary_pointers
ret
error_0x0a_not_found:
ld a,0x0a
rst 0x30
cr_link_field:
defw semicolon_name
cr_name_field:
defb 0x02
cr_name:
defm "CR"
cr_code_field:
ld a,0x0d
rst 8
ret
mode_link_field:
defw cr_name
mode_name_field:
defb 0x04
mode_name:
defm "MODE"
mode_code_field:
jp jp_mode
vlist_link_field:
defw mode_name
vlist_name_field:
defb 0x05
vlist_name:
defm "VLIST"
vlist_code_field:
ld hl,(latest_fvar)
l15b8h:
dec hl
push hl
ld c,(hl)
res 7,c
res 6,c
ld b,0x00
inc hl
call type_bc_chars_at_hl
ld a,0x20
rst 8
pop hl
dec hl
ld b,(hl)
dec hl
ld c,(hl)
ld h,b
ld l,c
ld a,0xff
cp b
jr nz,l15b8h
cp c
jr nz,l15b8h
ld a,0x0d
rst 8
ret
base_link_field:
defw vlist_name
base_name_field:
defb 0x04
base_name:
defm "BASE"
base_code_field:
rst 0x18
ld a,l
base_a:
ld hl,base_fvar
ld (hl),a
ret
decimal_link_field:
defw base_name
decimal_name_field:
defb 0x07
decimal_name:
defm "DECIMAL"
decimal_code_field:
ld a,0x0a
jp base_a
hex_link_field:
defw decimal_name
hex_name_field:
defb 0x03
hex_name:
defm "HEX"
hex_code_field:
ld a,0x10
jp base_a
c_comma_link_field:
defw hex_name
c_comma_name_field:
defb 0x02
c_comma_name:
defm "C,"
c_comma_code_field:
rst 0x18
ld a,l
ld hl,(here_fvar)
ld (hl),a
inc hl
ld (here_fvar),hl
call save_dictionary_pointers
ret
comma_link_field:
defw c_comma_name
comma_name_field:
defb 0x01
comma_name:
defm ","
comma_code_field:
rst 0x18
ld de,(here_fvar)
ex de,hl
ld (hl),e
inc hl
ld (hl),d
inc hl
ld (here_fvar),hl
call save_dictionary_pointers
ret
allot_link_field:
defw comma_name
allot_name_field:
defb 0x05
allot_name:
defm "ALLOT"
allot_code_field:
rst 0x18
ld de,(here_fvar)
add hl,de
ld (here_fvar),hl
call save_dictionary_pointers
ret
store_link_field:
defw allot_name
store_name_field:
defb 0x01
store_name:
defm "!"
store_code_field:
rst 0x28
ld (hl),e
inc hl
ld (hl),d
ret
c_store_link_field:
defw store_name
c_store_name_field:
defb 0x02
c_store_name:
defm "C!"
c_store_code_field:
rst 0x28
ld (hl),e
ret
fetch_link_field:
defw c_store_name
fetch_name_field:
defb 0x01
fetch_name:
defm "@"
fetch_code_field:
rst 0x18
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
rst 0x10
ret
c_fetch_link_field:
defw fetch_name
c_fetch_name_field:
defb 0x02
c_fetch_name:
defm "C@"
c_fetch_code_field:
rst 0x18
ld l,(hl)
ld h,0x00
rst 0x10
ret
here_link_field:
defw c_fetch_name
here_name_field:
defb 0x04
here_name:
defm "HERE"
here_code_field:
ld hl,(here_fvar)
rst 0x10
ret
latest_link_field:
defw here_name
latest_name_field:
defb 0x06
latest_name:
defm "LATEST"
latest_code_field:
ld hl,(latest_fvar)
rst 0x10
ret
semicolon_code_link_field:
defw latest_name
semicolon_code_name_field:
defb 0x45
semicolon_code_name:
defm ";CODE"
semicolon_code_code_field:
rst 0x18
ld a,0x01
cp l
jr z,l1695h
ld (pairs_fvar),a
rst 0x10
jr l169ah
l1695h:
ld a,0x00
ld (pairs_fvar),a
l169ah:
ld a,0x00
ld (state_fvar),a
call save_dictionary_pointers
ret
code_colon_link_field:
defw semicolon_code_name
code_colon_name_field:
defb 0x45
code_colon_name:
defm "CODE:"
code_colon_code_field:
ld a,0x80
ld (state_fvar),a
ld a,(pairs_fvar)
cp 0x00
ret nz
ld hl,0x0001
rst 0x10
ret
in_link_field:
defw code_colon_name
in_name_field:
defb 0x02
in_name:
defm "IN"
in_code_field:
rst 0x18
ld b,h
ld c,l
in a,(c)
ld l,a
ld h,0x00
rst 0x10
ret
out_link_field:
defw in_name
out_name_field:
defb 0x03
out_name:
defm "OUT"
out_code_field:
rst 0x28
ld b,h
ld c,l
out (c),e
ret
page_link_field:
defw out_name
page_name_field:
defb 0x04
page_name:
defm "PAGE"
page_code_field:
rst 0x18
ld a,l
ld (pageno_fvar),a
out (hmpr),a
ret
do_link_field:
defw page_name
do_name_field:
defb 0x82
do_name:
defm "DO"
do_code_field:
ld de,l16f6h
call compile_call_de
rst 0x10
ld hl,0x0002
rst 0x10
ret
l16f6h:
pop bc
rst 0x28
push hl
push de
push bc
ret
sub_16fch:
rst 0x18
cp l
jr nz,error_0x09_incomplete_form
ret
error_0x09_incomplete_form:
ld a,0x09
rst 0x30
l1704h:
pop hl
pop de
pop bc
push hl
push bc
ld a,0x80
xor d
ld d,a
rst 0x18
ld b,h
ld c,l
pop hl
add hl,bc
rl b
push af
ld b,h
ld c,l
ld a,0x80
xor h
ld h,a
pop af
jr c,l1725h
and a
sbc hl,de
jr c,l172ch
jr l1738h
l1725h:
and a
sbc hl,de
jr c,l1738h
jr z,l1738h
l172ch:
pop hl
push bc
ld a,0x80
xor d
ld d,a
push de
ld c,(hl)
inc hl
ld b,(hl)
push bc
ret
l1738h:
pop hl
inc hl
inc hl
jp (hl)
l173ch:
jp l213fh
plus_loop_link_field:
defw do_name
plus_loop_name_field:
defb 0x85
plus_loop_name:
defm "+LOOP"
plus_loop_code_field:
ld a,0x02
call sub_16fch
ld de,l1704h
call compile_call_de
call sub_1756h
ret
sub_1756h:
rst 0x18
ld b,h
ld c,l
ld hl,(here_fvar)
ld (hl),c
inc hl
ld (hl),b
inc hl
ld (here_fvar),hl
ret
loop_link_field:
defw plus_loop_name
loop_name_field:
defb 0x84
loop_name:
defm "LOOP"
loop_code_field:
ld a,0x02
call sub_16fch
ld de,l173ch
call compile_call_de
call sub_1756h
ret
i_link_field:
defw loop_name
i_name_field:
defb 0x01
i_name:
defm "I"
i_code_field:
pop bc
pop de
pop hl
push hl
push de
push bc
rst 0x10
ret
link_link_field:
defw i_name
link_name_field:
defb 0x04
link_name:
defm "LINK"
link_code_field:
jp jp_link
jp jp_link_l
at_link_field:
defw link_name
at_name_field:
defb 0x02
at_name:
defm "AT"
at_code_field:
jp jp_at
border_link_field:
defw at_name
border_name_field:
defb 0x06
border_name:
defm "BORDER"
border_code_field:
jp jp_border
beep_link_field:
defw border_name
beep_name_field:
defb 0x04
beep_name:
defm "BEEP"
beep_code_field:
jp jp_beep
dot_quote_link_field:
defw beep_name
dot_quote_name_field:
defb 0x82
dot_quote_name:
defb 0x2e,0x22 ; '."' string -- notation compatible with Pasmo and pyz80
dot_quote_code_field:
ld de,l17dah
call compile_call_de
ld de,(ip_fvar)
inc de
l17c1h:
inc de
ld a,(de)
cp 0x22
jr z,l17cfh
cp 0x0d
jr z,l17cfh
ld (hl),a
inc hl
jr l17c1h
l17cfh:
ld (hl),0xff
inc hl
ld (here_fvar),hl
ld (ip_fvar),de
ret
l17dah:
pop hl
l17dbh:
ld a,(hl)
cp 0xff
jr z,l17e4h
rst 8
inc hl
jr l17dbh
l17e4h:
inc hl
jp (hl)
sc_store_link_field:
defw dot_quote_name
sc_store_name_field:
defb 0x03
sc_store_name:
defm "SC!"
sc_store_code_field:
in a,(0xfc)
and 0x1f
out (hmpr),a
rst 0x28
ld bc,0x8000
add hl,bc
ld (hl),e
jp page_pageno_in_and_set_iy_to_flags
sc_fetch_link_field:
defw sc_store_name
sc_fetch_name_field:
defb 0x03
sc_fetch_name:
defm "SC@"
sc_fetch_code_field:
in a,(0xfc)
and 0x1f
out (hmpr),a
rst 0x18
ld bc,0x8000
add hl,bc
ld l,(hl)
ld h,0x00
rst 0x10
jp page_pageno_in_and_set_iy_to_flags
p_link_field:
defw sc_fetch_name
p_name_field:
defb 0x01
p_name:
defm "P"
p_code_field:
jp jp_editor_command_p
clear_link_field:
defw p_name
clear_name_field:
defb 0x05
clear_name:
defm "CLEAR"
clear_code_field:
jp jp_clear
l_link_field:
defw clear_name
l_name_field:
defb 0x01
l_name:
defm "L"
l_code_field:
jp jp_editor_command_l
b_link_field:
defw l_name
b_name_field:
defb 0x01
b_name:
defm "B"
b_code_field:
ld b,0x0f
l1832h:
call jp_editor_command_from
djnz l1832h
jp l_name ; xxx fixme -- wrong jump
r_link_field:
defw b_name
r_name_field:
defb 0x01
r_name:
defm "R"
r_code_field:
call sub_017dh
jp jp_editor_command_l
c_link_field:
defw r_name
c_name_field:
defb 0x01
c_name:
defm "C"
c_code_field:
call swap_code_field
call jp_editor_command_h
call sub_017dh
jp jp_editor_command_l
e_link_field:
defw c_name
e_name_field:
defb 0x01
e_name:
defm "E"
e_code_field:
call sub_017ah
jp jp_editor_command_l
up_link_field:
defw e_name
up_name_field:
defb 0x02
up_name:
defm "UP"
up_code_field:
rst 0x18
ld b,l
l1865h:
call sub_0183h
djnz l1865h
jp l_name ; xxx fixme -- wrong jump
dn_link_field:
defw up_name
dn_name_field:
defb 0x02
dn_name:
defm "DN"
dn_code_field:
rst 0x18
ld b,l
l1874h:
call jp_editor_command_from
djnz l1874h
jp l_name ; xxx fixme -- wrong jump
newl_link_field:
defw dn_name
newl_name_field:
defb 0x04
newl_name:
defm "NEWL"
newl_code_field:
jp jp_newl
list_link_field:
defw newl_name
list_name_field:
defb 0x04
list_name:
defm "LIST"
list_code_field:
jp jp_list
t_link_field:
defw list_name
t_name_field:
defb 0x01
t_name:
defm "T"
t_code_field:
ld hl,(st_fvar)
ld (lists_fvar),hl
ret
es_link_field:
defw t_name
es_name_field:
defb 0x02
es_name:
defm "ES"
es_code_field:
ld hl,(se_fvar)
ld (elist_fvar),hl
ret
from_link_field:
defw es_name
from_name_field:
defb 0x04
from_name:
defm "FROM"
from_code_field:
call jp_editor_command_f
jp jp_editor_command_from
f_link_field:
defw from_name
f_name_field:
defb 0x01
f_name:
defm "F"
f_code_field:
jp jp_editor_command_f
to_link_field:
defw f_name
to_name_field:
defb 0x02
to_name:
defm "TO"
to_code_field:
jp jp_editor_command_to
edit_link_field:
defw to_name
edit_name_field:
defb 0x04
edit_name:
defm "EDIT"
edit_code_field:
jp jp_edit
n_link_field:
defw edit_name
n_name_field:
defb 0x01
n_name:
defm "N"
n_code_field:
jp jp_editor_command_n
del_link_field:
defw n_name
del_name_field:
defb 0x03
del_name:
defm "DEL"
del_code_field:
rst 0x18
ld b,l
l18dch:
push bc
call dup_code_field
call sub_0174h
pop bc
djnz l18dch
call drop_code_field
jp l_name ; xxx fixme -- wrong jump
d_link_field:
defw del_name
d_name_field:
defb 0x01
d_name:
defm "D"
d_code_field:
call sub_0174h
jp jp_editor_command_l
ins_link_field:
defw d_name
ins_name_field:
defb 0x03
ins_name:
defm "INS"
ins_code_field:
rst 0x18
ld b,l
l18feh:
push bc
call dup_code_field
call sub_0171h
pop bc
djnz l18feh
call drop_code_field
jp l_name ; xxx fixme -- wrong jump
s_link_field:
defw ins_name
s_name_field:
defb 0x01
s_name:
defm "S"
s_code_field:
call sub_0171h
jp jp_editor_command_l
h_link_field:
defw s_name
h_name_field:
defb 0x01
h_name:
defm "H"
h_code_field:
jp jp_editor_command_h
load_link_field:
defw h_name
load_name_field:
defb 0x04
load_name:
defm "LOAD"
load_code_field:
jp jp_load
where_link_field:
defw load_name
where_name_field:
defb 0x05
where_name:
defm "WHERE"
where_code_field:
jp jp_where
star_link_field:
defw where_name
star_name_field:
defb 0x01
star_name:
defm "*"
star_code_field:
call u_mult_code_field
rst 0x18
ret
type_link_field:
defw star_name
type_name_field:
defb 0x04
type_name:
defm "TYPE"
type_code_field:
rst 0x28
ex de,hl
ld b,d
ld c,e
call type_bc_chars_at_hl
ret
sam_link_field:
defw type_name
sam_name_field:
defb 0x03
sam_name:
defm "SAM"
sam_code_field:
jp jp_sam
l1955h:
push af
ld a,0x01
out (hmpr),a
pop af
jp 0xc378
get_keypress_with_what_xxx:
ld a,0x01
out (hmpr),a
jp 0xc3b4
save_link_field:
defw sam_name
save_name_field:
defb 0x04
save_name:
defm "SAVE"
save_code_field:
jp jp_save
dir_link_field:
defw save_name
dir_name_field:
defb 0x03
dir_name:
defm "DIR"
dir_code_field:
jp jp_dir
equals_link_field:
defw dir_name
equals_name_field:
defb 0x01
equals_name:
defm "="
equals_code_field:
rst 0x28
ld a,l
cp e
jr nz,push_false
ld a,h
cp d
jr nz,push_false
push_true:
ld hl,0x0001
l1988h:
rst 0x10
ret
push_false:
ld hl,0x0000
jr l1988h
slash_link_field:
defw equals_name
slash_name_field:
defb 0x01
slash_name:
defm "/"
slash_code_field:
call slash_mod_code_field
call swap_code_field
rst 0x18
ret
mod_link_field:
defw slash_name
mod_name_field:
defb 0x03
mod_name:
defm "MOD"
mod_code_field:
call slash_mod_code_field
rst 0x18
ret
begin_link_field:
defw mod_name
begin_name_field:
defb 0x85
begin_name:
defm "BEGIN"
begin_code_field:
ld hl,(here_fvar)
rst 0x10
ld hl,0x0003
rst 0x10
ret
until_link_field:
defw begin_name
until_name_field:
defb 0x85
until_name:
defm "UNTIL"
until_code_field:
ld a,0x03
call sub_16fch
ld de,zero_branch_code_field
call compile_call_de
call sub_1756h
ret
less_than_link_field:
defw until_name
less_than_name_field:
defb 0x01
less_than_name:
defm "<"
less_than_code_field:
rst 0x28
ex de,hl
ld a,d
xor h
bit 7,a
jr nz,l19dch
sbc hl,de
l19dch:
bit 7,h
jp z,push_false
jp push_true
greater_than_link_field:
defw less_than_name
greater_than_name_field:
defb 0x01
greater_than_name:
defm ">"
greater_than_code_field:
call swap_code_field
call less_than_code_field
ret
to_r_link_field:
defw greater_than_name
to_r_name_field:
defb 0x02
to_r_name:
defm "R>"
to_r_code_field:
pop bc
pop hl
push bc
rst 0x10
ret
r_from_link_field:
defw to_r_name
r_from_name_field:
defb 0x02
r_from_name:
defm ">R"
r_from_code_field:
rst 0x18
pop bc
push hl
push bc
ret
key_link_field:
defw r_from_name
key_name_field:
defb 0x03
key_name:
defm "KEY"
key_code_field:
call wait_for_keypress_and_return_it_in_a
ld l,a
ld h,0x00
rst 0x10
ret
over_link_field:
defw key_name
over_name_field:
defb 0x04
over_name:
defm "OVER"
over_code_field:
rst 0x28
rst 0x20
ex de,hl
rst 0x10
ret
rot_link_field:
defw over_name
rot_name_field:
defb 0x03
rot_name:
defm "ROT"
rot_code_field:
rst 0x28
ld b,h
ld c,l
rst 0x18
push hl
ld h,b
ld l,c
rst 0x20
pop hl
rst 0x10
ret
two_dup_link_field:
defw rot_name
two_dup_name_field:
defb 0x04
two_dup_name:
defm "2DUP"
two_dup_code_field:
rst 0x28
rst 0x20
rst 0x20
ret
pad_link_field:
defw two_dup_name
pad_name_field:
defb 0x03
pad_name:
defm "PAD"
pad_code_field:
ld hl,(pad_fvar)
rst 0x10
ret
query_link_field:
defw pad_name
query_name_field:
defb 0x05
query_name:
defm "QUERY"
query_code_field:
ld hl,(tib_fvar)
push hl
ld hl,(pad_fvar)
inc hl
ld (tib_fvar),hl
call restore_the_input_pointer
pop hl
ld (tib_fvar),hl
ret
retype_link_field:
defw query_name
retype_name_field:
defb 0x06
retype_name:
defm "RETYPE"
retype_code_field:
ld hl,(tib_fvar)
push hl
ld hl,(pad_fvar)
inc hl
ld (tib_fvar),hl
call keyboard_input
pop hl
ld (tib_fvar),hl
ret
word_link_field:
defw retype_name
word_name_field:
defb 0x04
word_name:
defm "WORD"
word_code_field:
rst 0x18
ld a,l
ld hl,(pad_fvar)
ld d,0xff
l1a89h:
inc hl
inc d
cp (hl)
jr nz,l1a89h
ld hl,(pad_fvar)
ld (hl),d
rst 0x10
ret
if_link_field:
defw word_name
if_name_field:
defb 0x82
if_name:
defm "IF"
if_code_field:
ld de,zero_branch_code_field
call compile_call_de
rst 0x10
inc hl
inc hl
ld (here_fvar),hl
ld hl,0x0004
rst 0x10
ret
else_link_field:
defw if_name
else_name_field:
defb 0x84
else_name:
defm "ELSE"
else_code_field:
ld a,0x04
call sub_16fch
ld de,branch_code_field
call compile_call_de
push hl
inc hl
inc hl
ld (here_fvar),hl
rst 0x18
ld bc,(here_fvar)
ld (hl),c
inc hl
ld (hl),b
pop hl
rst 0x10
ld hl,0x0004
rst 0x10
ret
endif_link_field:
defw else_name
endif_name_field:
defb 0x85
endif_name:
defm "ENDIF"
endif_code_field:
ld a,0x04
call sub_16fch
rst 0x18
ld bc,(here_fvar)
ld (hl),c
inc hl
ld (hl),b
ret
then_link_field:
defw endif_name
then_name_field:
defb 0x84
then_name:
defm "THEN"
then_code_field:
jp endif_code_field
builds_link_field:
defw then_name
builds_name_field:
defb 0x87
builds_name:
defm "<BUILDS"
builds_code_field:
ld de,create_header_with_name_from_the_input_stream
call compile_call_de
ld (hl),0x11
inc hl
rst 0x10
inc hl
inc hl
ld (here_fvar),hl
ld de,compile_call_de
call compile_call_de
ld (hl),0x36
inc hl
ld (hl),0xc9
inc hl
ld (hl),0x23
inc hl
ld (hl),0x22
inc hl
ld bc,here_fvar
ld (hl),c
inc hl
ld (hl),b
inc hl
ld (here_fvar),hl
ld hl,rst08+1
rst 0x10
ret
does_link_field:
defw builds_name
does_name_field:
defb 0x85
does_name:
defm "DOES>"
does_code_field:
ld a,0x09
call sub_16fch
ld hl,(here_fvar)
ld (hl),0xc9
inc hl
ld (here_fvar),hl
ld d,h
ld e,l
rst 0x18
ld (hl),e
inc hl
ld (hl),d
ld hl,(here_fvar)
ld (hl),0xe1
inc hl
ld (hl),0xe5
inc hl
ld (hl),0x23
inc hl
ld (hl),0xd7
inc hl
ld (here_fvar),hl
ret
while_link_field:
defw does_name
while_name_field:
defb 0x85
while_name:
defm "WHILE"
while_code_field:
ld a,0x03
call sub_16fch
ld de,zero_branch_code_field
call compile_call_de
rst 0x10
inc hl
inc hl
ld (here_fvar),hl
ld hl,0x0003
rst 0x10
ret
repeat_link_field:
defw while_name
repeat_name_field:
defb 0x86
repeat_name:
defm "REPEAT"
repeat_code_field:
ld a,0x03
call sub_16fch
ld de,branch_code_field
call compile_call_de
push hl
inc hl
inc hl
ld (here_fvar),hl
ld b,h
ld c,l
rst 0x18
ld (hl),c
inc hl
ld (hl),b
rst 0x18
ld b,h
ld c,l
pop hl
ld (hl),c
inc hl
ld (hl),b
ret
variable_link_field:
defw repeat_name
variable_name_field:
defb 0x08
variable_name:
defm "VARIABLE"
variable_code_field:
call create_header_with_name_from_the_input_stream
ld de,l1bc7h
call compile_call_de
ld hl,(here_fvar)
ld (hl),0xc9
inc hl
ld (hl),0x00
inc hl
ld (hl),0x00
inc hl
ld (here_fvar),hl
call save_dictionary_pointers
ret
l1bc7h:
pop hl
push hl
inc hl
rst 0x10
ret
constant_link_field:
defw variable_name
constant_name_field:
defb 0x08
constant_name:
defm "CONSTANT"
constant_code_field:
call create_header_with_name_from_the_input_stream
ld de,l1bf3h
call compile_call_de
rst 0x18
ex de,hl
ld hl,(here_fvar)
ld (hl),0xc9
inc hl
ld (hl),e
inc hl
ld (hl),d
inc hl
ld (here_fvar),hl
call save_dictionary_pointers
ret
l1bf3h:
pop hl
push hl
inc hl
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
rst 0x10
ret
dot_link_field:
defw constant_name
dot_name_field:
defb 0x01
dot_name:
defm "."
dot_code_field:
rst 0x18
bit 7,h
jr z,l1c0eh
ex de,hl
ld hl,0x0000
sbc hl,de
ld a,0x2d
rst 8
l1c0eh:
rst 0x10
jp u_dot_code_field
cmove_link_field:
defw dot_name
cmove_name_field:
defb 0x05
cmove_name:
defm "CMOVE"
cmove_code_field:
rst 0x18
ld a,h
or l
jr z,l1c26h
ld b,h
ld c,l
rst 0x28
ex de,hl
ldir
ret
l1c26h:
rst 0x28
ret
and_link_field:
defw cmove_name
and_name_field:
defb 0x03
and_name:
defm "AND"
and_code_field:
rst 0x28
ld a,e
and l
ld l,a
ld a,d
and h
ld h,a
rst 0x10
ret
or_link_field:
defw and_name
or_name_field:
defb 0x02
or_name:
defm "OR"
or_code_field:
rst 0x28
ld a,e
or l
ld l,a
ld a,d
or h
ld h,a
rst 0x10
ret
xor_link_field:
defw or_name
xor_name_field:
defb 0x03
xor_name:
defm "XOR"
xor_code_field:
rst 0x28
ld a,e
xor l
ld l,a
ld a,d
xor h
ld h,a
rst 0x10
ret
not_link_field:
defw xor_name
not_name_field:
defb 0x03
not_name:
defm "NOT"
not_code_field:
rst 0x18
ld a,0x00
cp l
inc hl
jr z,l1c63h
ld l,0x00
l1c63h:
ld h,0x00
rst 0x10
ret
find_link_field:
defw not_name
find_name_field:
defb 0x04
find_name:
defm "FIND"
find_code_field:
ld de,(ip_fvar)
l1c72h:
inc de
ld a,(de)
cp 0x20
jr z,l1c72h
cp 0x0d
jr z,l1c72h
ld (ip_fvar),de
call paren_find_code_field
ret
cold_link_field:
defw find_name
cold_name_field:
defb 0x44
cold_name:
defm "COLD"
cold_code_field:
ld hl,(clate_fvar)
ld (latest_fvar),hl
ld hl,(chere_fvar)
ld (here_fvar),hl
ld (fence_fvar),hl
call save_dictionary_pointers
ld hl,(stack_fvar)
ld (stp_fvar),hl
ld a,0x00
ld (state_fvar),a
ld (ldflg_fvar),a
ret
fence_link_field:
defw cold_name
fence_name_field:
defb 0x05
fence_name:
defm "FENCE"
fence_code_field:
ld hl,fence_fvar
rst 0x10
ret
u_slash_mod_link_field:
defw fence_name
u_slash_mod_name_field:
defb 0x05
u_slash_mod_name:
defm "U/MOD"
u_slash_mod_code_field:
rst 0x18
ld b,h
ld c,l
rst 0x28
ld a,l
sub c
ld a,h
sbc a,b
jr c,l1cd3h
ld hl,0xffff
ld de,0xffff
jr l1cf3h
l1cd3h:
ld a,0x10
l1cd5h:
add hl,hl
rla
ex de,hl
add hl,hl
jr nc,l1cddh
inc de
and a
l1cddh:
ex de,hl
rra
push af
jr nc,l1ce7h
and l
sbc hl,bc
jr l1ceeh
l1ce7h:
and a
sbc hl,bc
jr nc,l1ceeh
add hl,bc
dec de
l1ceeh:
inc de
pop af
dec a
jr nz,l1cd5h
l1cf3h:
ex de,hl
rst 0x20
ret
less_number_sign_link_field:
defw u_slash_mod_name
less_number_sign_name_field:
defb 0x02
less_number_sign_name:
defm "<#"
less_number_sign_code_field:
call pad_code_field
rst 0x18
ld (hlds_fvar),hl
ret
number_sign_greater_link_field:
defw less_number_sign_name
number_sign_greater_name_field:
defb 0x02
number_sign_greater_name:
defm "#>"
number_sign_greater_code_field:
rst 0x28
ld hl,(hlds_fvar)
rst 0x10
call pad_code_field
call over_code_field
call minus_code_field
ret
number_sign_link_field:
defw number_sign_greater_name
number_sign_name_field:
defb 0x01
number_sign_name:
defm "#"
number_sign_code_field:
ld hl,(base_fvar)
rst 0x10
call sub_1e9ah
call rot_code_field
ld hl,rst08+1
rst 0x10
call over_code_field
call less_than_code_field
call zero_branch_code_field
defw branch_1d3b
ld hl,0x0007
rst 0x10
call plus_code_field
branch_1d3b:
ld hl,jp_error_a
rst 0x10
call plus_code_field
call hold_code_field
ret
number_sign_s_link_field:
defw number_sign_name
number_sign_s_name_field:
defb 0x02
number_sign_s_name:
defm "#S"
number_sign_s_code_field:
branch_1d4b:
call number_sign_code_field
call over_code_field
call over_code_field
call or_code_field
call zero_equals_code_field
call zero_branch_code_field
defw branch_1d4b
ret
d_dot_link_field:
defw number_sign_s_name
d_dot_name_field:
defb 0x02
d_dot_name:
defm "D."
d_dot_code_field:
call less_number_sign_code_field
call number_sign_s_code_field
call number_sign_greater_code_field
call type_code_field
ld a,0x20
rst 8
ret
hold_link_field:
defw d_dot_name
hold_name_field:
defb 0x04
hold_name:
defm "HOLD"
hold_code_field:
ld hl,(hlds_fvar)
dec hl
ld (hlds_fvar),hl
rst 0x18
ld a,l
ld hl,(hlds_fvar)
ld (hl),a
ret
sign_link_field:
defw hold_name
sign_name_field:
defb 0x04
sign_name:
defm "SIGN"
sign_code_field:
call rot_code_field
call zero_less_code_field
call zero_branch_code_field
defw branch_1da3
ld hl,0x002d
rst 0x10
call hold_code_field
branch_1da3:
ret
call dup_code_field
call zero_less_code_field
call zero_branch_code_field
defw branch_1db2
call d_do_minus_code_field
branch_1db2:
ret
zero_equals_link_field:
defw sign_name
zero_equals_name_field:
defb 0x02
zero_equals_name:
defm "0="
zero_equals_code_field:
rst 0x18
ld a,l
or h
ld hl,0x0000
jr nz,l1dc1h
inc hl
l1dc1h:
rst 0x10
ret
zero_less_link_field:
defw zero_equals_name
zero_less_name_field:
defb 0x02
zero_less_name:
defm "0<"
zero_less_code_field:
rst 0x18
bit 7,h
ld hl,0x0000
jr z,l1dd1h
inc hl
l1dd1h:
rst 0x10
ret
inkey_link_field:
defw zero_less_name
inkey_name_field:
defb 0x05
inkey_name:
defm "INKEY"
inkey_code_field:
ld iy,jreadkey_rom_routine
call l1955h
ld h,0x00
ld l,b
rst 0x10
ret
forget_link_field:
defw inkey_name
forget_name_field:
defb 0x06
forget_name:
defm "FORGET"
forget_code_field:
call find_code_field
ex de,hl
rst 0x18
ld a,h
or l
jr z,error_0x03_undefined_word_xxx_2
ld hl,(fence_fvar)
sbc hl,de
jr nc,error_0x08_break
ex de,hl
dec hl
ld b,(hl)
dec hl
ld c,(hl)
ld (latest_fvar),bc
ld (here_fvar),hl
call save_dictionary_pointers
ret
error_0x03_undefined_word_xxx_2:
ld a,0x03
rst 0x30
error_0x08_break:
ld a,0x08
rst 0x30
error_link_field:
defw forget_name
error_name_field:
defb 0x05
error_name:
defm "ERROR"
error_code_field:
rst 0x18
ld a,l
rst 0x30
paren_link_field:
defw error_name
paren_name_field:
defb 0x01
paren_name:
defm "("
paren_code_field:
ld hl,(ip_fvar)
l1e28h:
inc hl
ld a,0x29
cp (hl)
jr nz,l1e28h
ld (ip_fvar),hl
ret
pick_link_field:
defw paren_name
pick_name_field:
defb 0x04
pick_name:
defm "PICK"
pick_code_field:
rst 0x18
ld a,h
or l
ret z
ld e,l
dec e
rl e
ld hl,(stp_fvar)
ld d,0x00
add hl,de
ld c,(hl)
inc hl
ld b,(hl)
ld h,b
ld l,c
rst 0x10
ret
roll_link_field:
defw pick_name
roll_name_field:
defb 0x04
roll_name:
defm "ROLL"
roll_code_field:
rst 0x18
ld a,h
or l
ret z
ld b,l
ld c,l
l1e5bh:
rst 0x18
push hl
djnz l1e5bh
pop de
ld b,c
dec b
l1e62h:
pop hl
rst 0x10
djnz l1e62h
ld h,d
ld l,e
rst 0x10
ret
ascii_link_field:
defw roll_name
ascii_name_field:
defb 0x45
ascii_name:
defm "ASCII"
ascii_code_field:
ld hl,(ip_fvar)
l1e75h:
inc hl
ld a,0x20
cp (hl)
jr z,l1e75h
ld a,(hl)
ld (ip_fvar),hl
ld l,a
ld h,0x00
rst 0x10
ld a,(state_fvar)
bit 7,a
ret z
rst 0x18
ld b,h
ld c,l
ld de,lit_code_field
call compile_call_de
ld (hl),c
inc hl
ld (hl),b
inc hl
ld (here_fvar),hl
ret
sub_1e9ah:
call r_from_code_field
ld hl,0x0000
rst 0x10
call to_r_code_field
call dup_code_field
call r_from_code_field
call u_slash_mod_code_field
call to_r_code_field
call swap_code_field
call r_from_code_field
call u_slash_mod_code_field
call to_r_code_field
ret
paper_link_field:
defw ascii_name
paper_name_field:
defb 0x05
paper_name:
defm "PAPER"
paper_code_field:
jp jp_paper
pen_link_field:
defw paper_name
pen_name_field:
defb 0x03
pen_name:
defm "PEN"
pen_code_field:
jp jp_pen
bright_link_field:
defw pen_name
bright_name_field:
defb 0x06
bright_name:
defm "BRIGHT"
bright_code_field:
jp jp_bright
flash_link_field:
defw bright_name
flash_name_field:
defb 0x05
flash_name:
defm "FLASH"
flash_code_field:
jp jp_flash
colour_link_field:
defw flash_name
colour_name_field:
defb 0x06
colour_name:
defm "COLOUR"
colour_code_field:
jp jp_colour
plot_link_field:
defw colour_name
plot_name_field:
defb 0x04
plot_name:
defm "PLOT"
plot_code_field:
jp jp_call_jplot
draw_link_field:
defw plot_name
draw_name_field:
defb 0x04
draw_name:
defm "DRAW"
draw_code_field:
jp jp_call_jdrawto
drawby_link_field:
defw draw_name
drawby_name_field:
defb 0x06
drawby_name:
defm "DRAWBY"
drawby_code_field:
rst 0x28
ex de,hl
ld bc,(xcord_fvar)
add hl,bc
ld a,(ycord_fvar)
add a,e
ld e,a
ex de,hl
rst 0x20
jp jp_call_jdrawto
question_scroll_link_field:
defw drawby_name
question_scroll_name_field:
defb 0x07
question_scroll_name:
defm "?SCROLL"
question_scroll_code_field:
rst 0x18
ld a,0x00
out (hmpr),a
ld a,0x01
xor l
ld (0x9abb),a
jp page_pageno_in_and_set_iy_to_flags
palette_link_field:
defw question_scroll_name
palette_name_field:
defb 0x07
palette_name:
defm "PALETTE"
palette_code_field:
rst 0x28
ld a,l
push de
rst 0x28
ld c,l
ld b,e
pop de
jp jp_call_jpalette
drive_link_field:
defw palette_name
drive_name_field:
defb 0x05
drive_name:
defm "DRIVE"
drive_code_field:
jp jp_change_drive_to_tos
sv_fetch_link_field:
defw drive_name
sv_fetch_name_field:
defb 0x03
sv_fetch_name:
defm "SV@"
sv_fetch_code_field:
jp jp_fetch_from_page_0
sv_store_link_field:
defw sv_fetch_name
sv_store_name_field:
defb 0x03
sv_store_name:
defm "SV!"
sv_store_code_field:
jp jp_store_into_page_0
sv_c_fetch_link_field:
defw sv_store_name
sv_c_fetch_name_field:
defb 0x04
sv_c_fetch_name:
defm "SVC@"
sv_c_fetch_code_field:
jp jp_c_fetch_from_page_0
sv_c_store_link_field:
defw sv_c_fetch_name
sv_c_store_name_field:
defb 0x04
sv_c_store_name:
defm "SVC!"
sv_c_store_code_field:
jp jp_c_store_into_page_0
sound_link_field:
defw sv_c_store_name
sound_name_field:
defb 0x05
sound_name:
defm "SOUND"
sound_code_field:
jp jp_do_sound
soff_link_field:
defw sound_name
soff_name_field:
defb 0x04
soff_name:
defm "SOFF"
soff_code_field:
jp jp_sound_off
rols_link_field:
defw soff_name
rols_name_field:
defb 0x04
rols_name:
defm "ROLS"
rols_code_field:
jp jp_rols
csize_link_field:
defw rols_name
csize_name_field:
defb 0x05
csize_name:
defm "CSIZE"
csize_code_field:
jp jp_csize
udgdef_link_field:
defw csize_name
udgdef_name_field:
defb 0x06
udgdef_name:
defm "UDGDEF"
udgdef_code_field:
jp jp_udgdef
screen_link_field:
defw udgdef_name
screen_name_field:
defb 0x06
screen_name:
defm "SCREEN"
screen_code_field:
jp jp_screen
blitz_link_field:
defw screen_name
blitz_name_field:
defb 0x05
blitz_name:
defm "BLITZ"
blitz_code_field:
jp jp_blitz
blitz_dollar_link_field:
defw blitz_name
blitz_dollar_name_field:
defb 0x06
blitz_dollar_name:
defm "BLITZ$"
blitz_dollar_code_field:
call create_header_with_name_from_the_input_stream
ld de,0x2011
call compile_call_de
ld (hl),0xc9
inc hl
ld (here_fvar),hl
call dup_code_field
call c_comma_code_field
ld hl,(here_fvar)
dec hl
rst 0x10
call swap_code_field
call allot_code_field
ld hl,(here_fvar)
dec hl
rst 0x10
call l16f6h
call i_code_field
call c_store_code_field
call lit_code_field
rst 0x38
rst 0x38
call l1704h
defb 0xfd,0x1f,0xcd ;illegal sequence
xor c
ld de,0xe1c9
push hl
inc hl
rst 0x10
rst 0x10
call c_fetch_code_field
call swap_code_field
rst 0x18
inc hl
rst 0x10
call swap_code_field
jp jp_blitz
put_link_field:
defw blitz_dollar_name
put_name_field:
defb 0x03
put_name:
defm "PUT"
put_code_field:
jp jp_put
put_dollar_link_field:
defw put_name
put_dollar_name_field:
defb 0x04
put_dollar_name:
defm "PUT$"
put_dollar_code_field:
rst 0x18
push hl
ld a,(hl)
inc hl
ld c,(hl)
ld h,0x00
ld l,a
rst 0x10
ld l,c
rst 0x10
call star_code_field
rst 0x18
ld b,h
ld c,l
ld de,0xe001
pop hl
ld a,0x1e
out (hmpr),a
ldir
ld a,(pageno_fvar)
out (hmpr),a
ld hl,0xe001
rst 0x10
call swap_code_field
jp jp_put
fill_link_field:
defw put_dollar_name
fill_name_field:
defb 0x04
fill_name:
defm "FILL"
fill_code_field:
jp jp_fill
grab_link_field:
defw fill_name
grab_name_field:
defb 0x04
grab_name:
defm "GRAB"
grab_code_field:
jp jp_grab
grab_dollar_link_field:
defw grab_name
grab_dollar_name_field:
defb 0x05
grab_dollar_name:
defm "GRAB$"
grab_dollar_code_field:
call jp_grab
call create_header_with_name_from_the_input_stream
ld de,l20bdh
call compile_call_de
ld (hl),0xc9
inc hl
ld (here_fvar),hl
ld a,0x1e
out (hmpr),a
ld hl,0xe001
ld a,(hl)
inc hl
ld c,(hl)
ld h,0x00
ld l,c
rst 0x10
ld l,a
rst 0x10
call star_code_field
rst 0x18
inc hl
inc hl
ex de,hl
ld hl,(here_fvar)
push hl
add hl,de
ld (here_fvar),hl
ld b,d
ld c,e
pop de
ld hl,0xe001
ldir
ld a,(pageno_fvar)
out (hmpr),a
call save_dictionary_pointers
ret
l20bdh:
pop hl
push hl
inc hl
rst 0x10
ret
tab_link_field:
defw grab_dollar_name
tab_name_field:
defb 0x03
tab_name:
defm "TAB"
tab_code_field:
jp jp_tab
overp_link_field:
defw tab_name
overp_name_field:
defb 0x05
overp_name:
defm "OVERP"
overp_code_field:
jp jp_overp
inverse_link_field:
defw overp_name
inverse_name_field:
defb 0x07
inverse_name:
defm "INVERSE"
inverse_code_field:
jp jp_inverse
bload_link_field:
defw inverse_name
bload_name_field:
defb 0x05
bload_name:
defm "BLOAD"
bload_code_field:
jp jp_bload
bsave_link_field:
defw bload_name
bsave_name_field:
defb 0x05
bsave_name:
defm "BSAVE"
bsave_code_field:
jp jp_bsave
dload_link_field:
defw bsave_name
dload_name_field:
defb 0x05
dload_name:
defm "DLOAD"
dload_code_field:
jp jp_dload
dsave_link_field:
defw dload_name
dsave_name_field:
defb 0x05
dsave_name:
defm "DSAVE"
dsave_code_field:
jp jp_dsave
page_rampage_in:
ld a,(rampage_fvar)
out (hmpr),a
ret
expand_link_field:
defw dsave_name
expand_name_field:
defb 0x06
expand_name:
defm "EXPAND"
expand_code_field:
ld hl,(latest_fvar)
ld (clate_fvar),hl
ld hl,(here_fvar)
inc hl
inc hl
inc hl
inc hl
ld (chere_fvar),hl
ld (fence_fvar),hl
call save_dictionary_pointers
ret
page_pageno_in_and_set_iy_to_flags:
ld a,(pageno_fvar)
out (hmpr),a
ld iy,flags_fvar
ret
l213fh:
pop de
pop hl
pop bc
inc bc
push hl
and a
sbc hl,bc
jr z,l2152h
pop hl
push bc
push hl
ex de,hl
ld c,(hl)
inc hl
ld b,(hl)
push bc
ret
l2152h:
pop bc
ex de,hl
inc hl
inc hl
jp (hl)
nop
nop
nop
nop
cold_here:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
0x2710:
Downloads
- samforth-a.bin (16.00 KiB), the SamForth-A binary code.
- samforth-a.bin_blocks.txt (24.40 KiB), its blocks file, required by z80dasm and created by SamForth2z80dasm.
- samforth-a.bin_symbols.z80s (25.59 KiB), its symbols file, required by z80dasm and created by SamForth2z80dasm.
- samforth-a.z80s.gz (15.91 KiB), the SamForth-A disassembled code.
- samforth-a_50000.z80s (687 B), the SamForth-A routines at 50000 and 50020, disassembled.
- samforth-a_50040.z80s (3.25 KiB), the SamForth-A routine at 50040, disassembled.
Tools and other related project files can be downloaded from the download section of SamForth.