commit ad443b4b5a3850e130a8962fcd0a1002bed559e9
parent 3e5d2faac223164a0a12c25510ddc6fe4392e3d7
Author: Brian Swetland <swetland@frotz.net>
Date: Thu, 18 Aug 2022 22:37:22 -0700
remove extra G007 rom image at the end
Diffstat:
M | zx81plus.asm | | | 3577 | +------------------------------------------------------------------------------ |
1 file changed, 1 insertion(+), 3576 deletions(-)
diff --git a/zx81plus.asm b/zx81plus.asm
@@ -12066,3582 +12066,7 @@ char_set ; - begins with space character.
DEFB %00000000
-; .END ;TASM assembler instruction.
-
-
-
;
; This marks the end of the ZX81 ROM.
-;
-; As a bonus feature, I will now include the code for
-; the G007 graphics board and
-; the ZX81 monitor
-;
-; The 8K space divides into four 2K spaces like so:
-;
-; 2000 RAM (1K or 2K) remapped
-; 2800 G007 ROM
-; 3000
-; 3800 ZX81 Monitor
-;
-; The G007 uses some RAM
-; 2300 G007 RAM variables
-;
-; 2000
-#code $2000,$0800
-; RAM_2K
-; 2300
-; xxxx data 4 ; reserves 4 bytes from the #data segment for variable "Toto"
-
-#code $2800,$0800
-
-#if 0
-;
-; just copy bytes. Provides a reference for comparing code output.
-;
-; G007 Graphics
-; Start = 2800H
-; End = 2FFFH
-mark_2800: DEFB $2A, $23, $23, $3A, $25, $23, $67, $EB
-mark_2808: DEFB $3A, $18, $23, $3D, $92, $57, $3E, $07
-mark_2810: DEFB $A3, $6F, $26, $2D, $7E, $2A, $08, $23
-mark_2818: DEFB $4A, $06, $00, $09, $09, $CB, $3A, $CB
-mark_2820: DEFB $1B, $CB, $3A, $CB, $1B, $CB, $3A, $CB
-mark_2828: DEFB $1B, $19, $47, $C9, $3A, $21, $23, $2A
-mark_2830: DEFB $27, $23, $ED, $5B, $23, $23, $D9, $2A
-mark_2838: DEFB $25, $23, $ED, $5B, $29, $23, $CB, $77
-mark_2840: DEFB $28, $1C, $CB, $7F, $C0, $3A, $21, $40
-mark_2848: DEFB $F5, $06, $08, $0F, $FD, $CB, $21, $16
-mark_2850: DEFB $10, $F9, $EB, $D9, $EB, $D9, $CD, $5E
-mark_2858: DEFB $28, $F1, $32, $21, $40, $C9, $01, $DE
-mark_2860: DEFB $FF, $3A, $18, $23, $3D, $93, $ED, $52
-mark_2868: DEFB $F2, $76, $28, $01, $22, $00, $7B, $D5
-mark_2870: DEFB $19, $EB, $B7, $ED, $52, $D1, $E5, $63
-mark_2878: DEFB $5F, $D9, $01, $FB, $28, $7D, $D9, $6F
-mark_2880: DEFB $D9, $B7, $ED, $52, $F2, $90, $28, $01
-mark_2888: DEFB $04, $29, $2F, $19, $EB, $B7, $ED, $52
-mark_2890: DEFB $ED, $43, $1A, $23, $D1, $B7, $ED, $52
-mark_2898: DEFB $19, $30, $09, $EB, $01, $F6, $28, $D9
-mark_28A0: DEFB $53, $5F, $7A, $D9, $ED, $43, $1C, $23
-mark_28A8: DEFB $D9, $57, $D5, $D9, $C1, $3A, $21, $23
-mark_28B0: DEFB $FE, $40, $30, $02, $45, $4B, $04, $0C
-mark_28B8: DEFB $CB, $3C, $38, $02, $28, $08, $CB, $1D
-mark_28C0: DEFB $CB, $3A, $CB, $1B, $18, $F2, $55, $CB
-mark_28C8: DEFB $3D, $D9, $C5, $CD, $07, $28, $D1, $3A
-mark_28D0: DEFB $1F, $23, $4F, $FD, $CB, $21, $06, $38
-mark_28D8: DEFB $08, $3A, $1E, $23, $AE, $B1, $A0, $AE
-mark_28E0: DEFB $77, $D9, $7D, $05, $C8, $93, $30, $0A
-mark_28E8: DEFB $0D, $C8, $82, $D9, $19, $D9, $2A, $1A
-mark_28F0: DEFB $23, $E9, $2A, $1C, $23, $E9, $6F, $D9
-mark_28F8: DEFB $19, $18, $D8, $6F, $D9, $CB, $00, $30
-mark_2900: DEFB $D2, $2B, $18, $CF, $6F, $D9, $CB, $08
-mark_2908: DEFB $30, $C9, $23, $18, $C6, $2A, $A8, $0E
-mark_2910: DEFB $E9, $CD, $0D, $29, $38, $0E, $21, $00
-mark_2918: DEFB $00, $28, $06, $ED, $42, $F8, $C8, $18
-mark_2920: DEFB $03, $ED, $4A, $F0, $E1, $C9, $CD, $11
-mark_2928: DEFB $29, $22, $25, $23, $CD, $11, $29, $E5
-mark_2930: DEFB $CD, $02, $0C, $C1, $ED, $5B, $25, $23
-mark_2938: DEFB $28, $0C, $3D, $C0, $21, $9C, $0C, $22
-mark_2940: DEFB $30, $40, $43, $C3, $B2, $0B
-; The Plot Routine:
-; A == the plot number N
-; BC == screen X
-; DE == screen Y
-mark_2946: DEFB $B7, $28
-mark_2948: DEFB $F9, $3D, $D5, $C5, $F5, $CD, $1F, $2E
-mark_2950: DEFB $F1, $D1, $C1, $FE, $81, $20, $0F, $ED
-mark_2958: DEFB $53, $30, $23, $ED, $43, $32, $23, $01
-mark_2960: DEFB $00, $00, $50, $58, $3E, $0B, $CB, $57
-mark_2968: DEFB $28, $09, $2A, $29, $23, $E5, $2A, $27
-mark_2970: DEFB $23, $18, $07, $2A, $32, $23, $E5, $2A
-mark_2978: DEFB $30, $23, $B7, $ED, $5A, $D1, $E8, $22
-mark_2980: DEFB $23, $23, $EB, $B7, $ED, $4A, $E8, $22
-mark_2988: DEFB $25, $23, $5F, $3E, $C0, $A4, $E0, $3E
-mark_2990: DEFB $C0, $A2, $E0, $D9, $E5, $D5, $C5, $CD
-mark_2998: DEFB $9F, $29, $C1, $D1, $E1, $D9, $C9, $D9
-mark_29A0: DEFB $7C, $B2, $37, $20, $05, $3A, $18, $23
-mark_29A8: DEFB $3D, $BD, $3A, $21, $23, $1F, $32, $21
-mark_29B0: DEFB $23, $7B, $CB, $7F, $28, $04, $2A, $10
-mark_29B8: DEFB $23, $E9, $F5, $E6, $03, $1F, $3D, $2F
-mark_29C0: DEFB $67, $9F, $6F, $22, $1E, $23, $E5, $CB
-mark_29C8: DEFB $5B, $20, $28, $3A, $20, $23, $AB, $E6
-mark_29D0: DEFB $FB, $28, $0F, $21, $34, $23, $7B, $07
-mark_29D8: DEFB $07, $07, $E6, $03, $85, $6F, $7E, $32
-mark_29E0: DEFB $21, $40, $CD, $2C, $28, $E1, $FD, $CB
-mark_29E8: DEFB $21, $0E, $38, $26, $7C, $A5, $28, $22
-mark_29F0: DEFB $2C, $5D, $E5, $3A, $21, $23, $CB, $6B
-mark_29F8: DEFB $20, $3D, $CB, $73, $20, $3E, $E1, $CB
-mark_2A00: DEFB $7F, $20, $0F, $E5, $CD, $00, $28, $A6
-mark_2A08: DEFB $32, $17, $23, $D1, $7E, $B2, $AB, $A0
-mark_2A10: DEFB $AE, $77, $F1, $32, $20, $23, $21, $2A
-mark_2A18: DEFB $23, $11, $2E, $23, $01, $08, $00, $CB
-mark_2A20: DEFB $67, $28, $11, $3A, $21, $23, $E6, $C0
-mark_2A28: DEFB $17, $30, $02, $CB, $F7, $32, $21, $23
-mark_2A30: DEFB $2E, $26, $0E, $04, $ED, $B8, $C9, $21
-mark_2A38: DEFB $FF, $FF, $18, $03, $2A, $0A, $23, $D9
-mark_2A40: DEFB $E6, $E0, $C2, $AD, $0E, $21, $21, $23
-mark_2A48: DEFB $FD, $36, $21, $55, $06, $03, $23, $23
-mark_2A50: DEFB $5E, $23, $23, $56, $D5, $10, $F7, $C1
-mark_2A58: DEFB $D1, $E1, $B7, $28, $02, $44, $4D, $78
-mark_2A60: DEFB $BC, $30, $03, $C5, $E3, $C1, $7C, $BA
-mark_2A68: DEFB $30, $01, $EB, $7A, $D9, $E6, $07, $3C
-mark_2A70: DEFB $47, $7C, $CB, $05, $07, $07, $07, $10
-mark_2A78: DEFB $F9, $67, $22, $38, $23, $D9, $7C, $B8
-mark_2A80: DEFB $3E, $07, $30, $03, $C5, $E3, $C1, $EB
-mark_2A88: DEFB $F5, $79, $D9, $67, $6F, $4F, $22, $1A
-mark_2A90: DEFB $23, $06, $FE, $D9, $93, $D9, $30, $04
-mark_2A98: DEFB $06, $00, $ED, $44, $57, $D9, $7A, $90
-mark_2AA0: DEFB $D9, $67, $BA, $30, $02, $EB, $04, $6C
-mark_2AA8: DEFB $2C, $5C, $CB, $3B, $F1, $0F, $30, $09
-mark_2AB0: DEFB $E5, $D5, $C5, $0F, $D9, $38, $CD, $18
-mark_2AB8: DEFB $CE, $D9, $60, $2E, $01, $C1, $D1, $E3
-mark_2AC0: DEFB $2D, $20, $16, $2A, $1A, $23, $79, $BC
-mark_2AC8: DEFB $38, $01, $67, $BD, $30, $01, $6F, $22
-mark_2AD0: DEFB $1A, $23, $E1, $2D, $28, $E7, $E5, $18
-mark_2AD8: DEFB $15, $7B, $92, $38, $0A, $5F, $CB, $40
-mark_2AE0: DEFB $28, $0C, $79, $80, $4F, $18, $D9, $84
-mark_2AE8: DEFB $5F, $3E, $01, $B0, $81, $4F, $79, $D9
-mark_2AF0: DEFB $FD, $CB, $21, $0E, $38, $CA, $E3, $D5
-mark_2AF8: DEFB $C5, $E5, $ED, $5B, $1A, $23, $47, $B9
-mark_2B00: DEFB $30, $02, $41, $4F, $ED, $43, $1A, $23
-mark_2B08: DEFB $79, $BB, $3C, $38, $01, $7B, $6F, $7A
-mark_2B10: DEFB $B8, $30, $02, $78, $3D, $95, $3C, $F5
-mark_2B18: DEFB $CD, $07, $28, $F1, $4F, $EB, $21, $39
-mark_2B20: DEFB $23, $7E, $07, $07, $07, $77, $2B, $CB
-mark_2B28: DEFB $06, $B6, $2A, $1E, $23, $AD, $2F, $6F
-mark_2B30: DEFB $EB, $7B, $AE, $B2, $A0, $AE, $77, $0D
-mark_2B38: DEFB $20, $14, $E1, $24, $CB, $7D, $28, $94
-mark_2B40: DEFB $E1, $E1, $E1, $E1, $7C, $A5, $CA, $12
-mark_2B48: DEFB $2A, $2C, $E5, $C3, $45, $2A, $CB, $18
-mark_2B50: DEFB $30, $DF, $23, $41, $79, $E6, $07, $4F
-mark_2B58: DEFB $CB, $38, $CB, $38, $CB, $38, $28, $08
-mark_2B60: DEFB $7B, $AE, $B2, $AE, $77, $23, $10, $F8
-mark_2B68: DEFB $37, $0C, $18, $CB, $2A, $13, $23, $2D
-mark_2B70: DEFB $B5, $C2, $09, $08, $25, $C2, $B8, $23
-mark_2B78: DEFB $3A, $21, $23, $17, $D8, $00, $00, $2A
-mark_2B80: DEFB $28, $23, $3A, $27, $23, $CB, $72, $20
-mark_2B88: DEFB $05, $6F, $C6, $08, $30, $0D, $7C, $D6
-mark_2B90: DEFB $08, $30, $04, $3A, $18, $23, $3D, $32
-mark_2B98: DEFB $29, $23, $AF, $32, $27, $23, $CB, $72
-mark_2BA0: DEFB $C0, $CD, $EF, $2E, $7D, $FE, $F9, $38
-mark_2BA8: DEFB $02, $1E, $02, $2F, $E6, $07, $3C, $57
-mark_2BB0: DEFB $7C, $3C, $D9, $57, $D9, $D5, $CD, $07
-mark_2BB8: DEFB $28, $D9, $79, $AE, $D9, $EB, $C1, $C5
-mark_2BC0: DEFB $6F, $26, $00, $29, $10, $FD, $EB, $06
-mark_2BC8: DEFB $02, $3A, $7B, $40, $AE, $FD, $B6, $7C
-mark_2BD0: DEFB $A2, $AE, $0D, $28, $01, $77, $53, $23
-mark_2BD8: DEFB $10, $EF, $0E, $20, $09, $D9, $23, $15
-mark_2BE0: DEFB $28, $02, $10, $D6, $E1, $C3, $9A, $29
-mark_2BE8: DEFB $ED, $57, $0F, $30, $08, $AF, $32, $22
-mark_2BF0: DEFB $40, $3C, $32, $13, $23, $CD, $CF, $0A
-mark_2BF8: DEFB $AF, $32, $13, $23, $FD, $36, $22, $02
-mark_2C00: DEFB $4F, $C9, $CD, $A0, $0C, $DA, $AD, $0E
-mark_2C08: DEFB $0E, $01, $C8, $0E, $FF, $C9, $FD, $46
-mark_2C10: DEFB $22, $0E, $21, $CD, $18, $09, $CD, $9B
-mark_2C18: DEFB $09, $7E, $12, $FD, $34, $3A, $2A, $0C
-mark_2C20: DEFB $40, $23, $54, $5D, $ED, $B1, $C3, $5D
-mark_2C28: DEFB $0A, $8B, $8D, $2D, $7F, $81, $49, $75
-mark_2C30: DEFB $5F, $40, $42, $2B, $17, $1F, $37, $52
-mark_2C38: DEFB $45, $0F, $6D, $2B, $44, $2D, $5A, $3B
-mark_2C40: DEFB $4C, $45, $0D, $52, $54, $4D, $15, $6A
-mark_2C48: DEFB $01, $14, $02, $06, $00, $81, $0E, $06
-mark_2C50: DEFB $DE, $05, $AB, $0D, $06, $00, $B5, $0E
-mark_2C58: DEFB $00, $DC, $0C, $00, $D8, $0E, $04, $14
-mark_2C60: DEFB $06, $DF, $06, $05, $B9, $0D, $04, $00
-mark_2C68: DEFB $2E, $0E, $05, $E8, $2B, $01, $00, $E9
-mark_2C70: DEFB $0E, $05, $A7, $2E, $05, $6A, $0D, $00
-mark_2C78: DEFB $C3, $03, $03, $AF, $0E, $03, $30, $07
-mark_2C80: DEFB $06, $1A, $06, $00, $92, $0E, $03, $6C
-mark_2C88: DEFB $0E, $05, $40, $03, $05, $4D, $2F, $00
-mark_2C90: DEFB $7C, $0E, $00, $B2, $0E, $03, $4E, $2E
-mark_2C98: DEFB $06, $1A, $06, $1A, $06, $00, $26, $29
-mark_2CA0: DEFB $2A, $A8, $0E, $E9, $00, $0E, $0C, $06
-mark_2CA8: DEFB $00, $AE, $2E, $03, $B2, $2E, $03, $B6
-mark_2CB0: DEFB $2E, $03, $53, $2F, $05, $CB, $0A, $03
-mark_2CB8: DEFB $2C, $07, $FD, $36, $01, $01, $CD, $73
-mark_2CC0: DEFB $0A, $CD, $95, $0A, $21, $00, $40, $36
-mark_2CC8: DEFB $FF, $21, $2D, $40, $CB, $6E, $28, $0E
-mark_2CD0: DEFB $FE, $E3, $7E, $C2, $6F, $0D, $CD, $A6
-mark_2CD8: DEFB $0D, $C8, $CF, $0C, $CF, $08, $DF, $06
-mark_2CE0: DEFB $00, $FE, $76, $C8, $4F, $E7, $79, $D6
-mark_2CE8: DEFB $E1, $38, $3B, $4F, $21, $29, $0C, $09
-mark_2CF0: DEFB $4E, $09, $18, $03, $2A, $30, $40, $7E
-mark_2CF8: DEFB $23, $22, $30, $40, $01, $F4, $0C, $C5
-;
-; bits shifting right within a byte:
-;
-mark_2D00: DEFB $80, $40, $20, $10, $08, $04, $02, $01
-;
-mark_2D08: DEFB $CD, $F7, $2B, $C3, $07, $02, $32, $28
-mark_2D10: DEFB $40, $EB, $21, $0A, $00, $39, $7E, $3C
-mark_2D18: DEFB $E6, $F0, $D6, $D0, $4F, $23, $7E, $D6
-mark_2D20: DEFB $04, $B1, $4F, $3A, $3B, $40, $07, $9F
-mark_2D28: DEFB $A1, $20, $10, $2A, $10, $40, $01, $DF
-mark_2D30: DEFB $FF, $09, $CB, $FC, $22, $04, $23, $3E
-mark_2D38: DEFB $01, $18, $0E, $2A, $0C, $40, $ED, $4B
-mark_2D40: DEFB $00, $23, $09, $CB, $FC, $22, $06, $23
-mark_2D48: DEFB $AF, $32, $19, $23, $2B, $7E, $EB, $C9
-mark_2D50: DEFB $3A, $19, $23, $3D, $C2, $73, $2D, $3E
-mark_2D58: DEFB $1E, $ED, $47, $ED, $6A, $2A, $04, $23
-mark_2D60: DEFB $01, $08, $01, $3E, $FE, $CD, $B5, $02
-mark_2D68: DEFB $3E, $1F, $ED, $47, $3A, $28, $40, $D6
-mark_2D70: DEFB $08, $18, $04, $2B, $3A, $28, $40, $4F
-mark_2D78: DEFB $DD, $E1, $FD, $CB, $3B, $7E, $C2, $9D
-mark_2D80: DEFB $02, $3E, $FE, $06, $01, $21, $9A, $2D
-mark_2D88: DEFB $CD, $95, $2D, $29, $00, $5F, $2A, $06
-mark_2D90: DEFB $23, $CB, $FC, $DD, $E9, $ED, $4F, $3E
-mark_2D98: DEFB $DD, $FB, $76, $21, $00, $22, $3E, $24
-mark_2DA0: DEFB $36, $01, $35, $28, $02, $CF, $1A, $23
-mark_2DA8: DEFB $BC, $20, $F5, $65, $11, $00, $20, $01
-mark_2DB0: DEFB $00, $01, $ED, $B0, $24, $14, $04, $ED
-mark_2DB8: DEFB $B0, $21, $F1, $07, $11, $A0, $23, $01
-mark_2DC0: DEFB $60, $00, $ED, $B0, $16, $20, $21, $B4
-mark_2DC8: DEFB $2F, $46, $18, $04, $5E, $23, $7E, $12
-mark_2DD0: DEFB $23, $10, $F9, $14, $CB, $52, $28, $F1
-mark_2DD8: DEFB $C9
-
-; Delete Display File:
-
-mark_2DD9: DEFB $CD, $E7, $02, $21, $87, $3E, $CD
-mark_2DE0: DEFB $D8, $09, $C0, $EB, $2A, $29, $40, $CB
-mark_2DE8: DEFB $76, $28, $04, $ED, $53, $29, $40, $2A
-mark_2DF0: DEFB $0C, $40, $C3, $5D, $0A, $CD, $D9, $2D
-mark_2DF8: DEFB $01, $92, $19, $2A, $0C, $40, $2B, $CD
-mark_2E00: DEFB $9E, $09, $3E, $76, $12, $13, $12, $23
-mark_2E08: DEFB $23, $36, $3E, $23, $36, $87, $23, $36
-mark_2E10: DEFB $8D, $23, $36, $19, $23, $77, $23, $77
-mark_2E18: DEFB $CD, $07, $02, $3E, $01, $18, $37
-; Check & Set Up Display File:
-mark_2E1F: DEFB $2A
-mark_2E20: DEFB $65, $22, $11, $D9, $BF, $19, $3A, $64
-mark_2E28: DEFB $22, $D6, $21, $B4, $B5, $C4, $9B, $2D
-mark_2E30: DEFB $2A, $0C, $40, $3E, $76, $2B, $2B, $BE
-mark_2E38: DEFB $C4, $F5, $2D, $2A, $0C, $40, $ED, $5B
-mark_2E40: DEFB $00, $23, $19, $22, $06, $23, $11, $09
-mark_2E48: DEFB $00, $19, $22, $08, $23, $C9, $CD, $02
-mark_2E50: DEFB $0C, $C0
-; Clear The Screen:
-mark_2E52: DEFB $3D, $FA, $2A, $0A, $F5, $CD
-mark_2E58: DEFB $1F, $2E, $F1, $FE, $02, $ED, $4B, $18
-mark_2E60: DEFB $23, $2A, $0C, $40, $30, $30, $3D, $23
-mark_2E68: DEFB $22, $0E, $40, $2B, $2B, $2B, $1E, $00
-mark_2E70: DEFB $06, $10, $2B, $73, $2B, $73, $2B, $77
-mark_2E78: DEFB $2B, $77, $10, $FA, $0D, $20, $F1, $06
-mark_2E80: DEFB $09, $3E, $01, $2B, $73, $10, $FC, $21
-mark_2E88: DEFB $34, $23, $06, $14, $3D, $28, $F4, $21
-mark_2E90: DEFB $21, $18, $22, $39, $40, $C9, $C0, $2B
-mark_2E98: DEFB $2B, $06, $20, $2B, $2B, $2B, $7E, $2F
-mark_2EA0: DEFB $77, $10, $FA, $0D, $20, $F3, $C9, $2A
-mark_2EA8: DEFB $96, $0A, $3E, $4D, $18, $35, $3E, $DD
-mark_2EB0: DEFB $18, $2E, $3E, $D6, $18, $02, $3E, $CE
-mark_2EB8: DEFB $F5, $CD, $02, $0C, $06, $1E, $3D, $FE
-mark_2EC0: DEFB $06, $30, $19, $CB, $3F, $67, $28, $02
-mark_2EC8: DEFB $3E, $01, $F5, $9F, $6F, $CB, $8C, $25
-mark_2ED0: DEFB $22, $7B, $40, $CD, $1F, $2E, $06, $1F
-mark_2ED8: DEFB $F1, $32, $14, $23, $78, $ED, $47, $F1
-mark_2EE0: DEFB $2A, $71, $0D, $85, $6F, $E9, $57, $3A
-mark_2EE8: DEFB $39, $40, $E6, $80, $C3, $6C, $2B, $7A
-mark_2EF0: DEFB $D1, $D9, $E5, $D5, $C5, $2A, $0C, $23
-mark_2EF8: DEFB $87, $30, $0B, $2A, $0E, $23, $CB, $77
-mark_2F00: DEFB $28, $04, $2A, $15, $23, $3F, $EB, $6F
-mark_2F08: DEFB $26, $00, $9F, $4F, $3A, $7B, $40, $2F
-mark_2F10: DEFB $FD, $A6, $7C, $A9, $4F, $29, $29, $19
-mark_2F18: DEFB $06, $08, $D9, $D5, $C9, $FD, $35, $39
-mark_2F20: DEFB $3E, $18, $90, $47, $87, $87, $87, $6F
-mark_2F28: DEFB $3A, $18, $23, $95, $D8, $3E, $21, $91
-mark_2F30: DEFB $4F, $26, $00, $29, $09, $ED, $4B, $08
-mark_2F38: DEFB $23, $09, $CD, $EF, $2E, $01, $22, $00
-mark_2F40: DEFB $D9, $79, $AE, $D9, $77, $09, $D9, $23
-mark_2F48: DEFB $10, $F7, $C3, $9A, $29, $CD, $D9, $2D
-mark_2F50: DEFB $C3, $F6, $02, $CD, $02, $0C, $C0, $3D
-mark_2F58: DEFB $FA, $69, $08, $CD, $1F, $2E, $CD, $E7
-mark_2F60: DEFB $02, $3A, $18, $23, $47, $2A, $08, $23
-mark_2F68: DEFB $AF, $5F, $D3, $FB, $3E, $7F, $DB, $FE
-mark_2F70: DEFB $0F, $D2, $86, $08, $DB, $FB, $87, $FA
-mark_2F78: DEFB $AD, $2F, $30, $F0, $0E, $20, $C5, $4E
-mark_2F80: DEFB $06, $08, $CB, $01, $1F, $B3, $57, $DB
-mark_2F88: DEFB $FB, $1F, $30, $FB, $7A, $D3, $FB, $10
-mark_2F90: DEFB $F1, $23, $C1, $0D, $20, $E8, $23, $23
-mark_2F98: DEFB $3E, $03, $B8, $38, $02, $5F, $1D, $DB
-mark_2FA0: DEFB $FB, $1F, $30, $FB, $7B, $D3, $FB, $10
-mark_2FA8: DEFB $C3, $3E, $04, $D3, $FB, $C3, $07, $02
-mark_2FB0: DEFB $FB, $10, $C3, $3E, $0A, $12, $A0, $13
-mark_2FB8: DEFB $23, $15, $A4, $16, $23, $40, $C1, $60
-mark_2FC0: DEFB $08, $61, $2D, $75, $06, $76, $23, $01
-mark_2FC8: DEFB $0A, $54, $02, $85, $C1, $7F, $73, $80
-mark_2FD0: DEFB $2D, $8D, $50, $8E, $2D, $E3, $C3, $E4
-mark_2FD8: DEFB $0E, $E5, $2D, $13, $00, $75, $01, $E6
-mark_2FE0: DEFB $0A, $55, $0D, $1E, $0F, $1E, $16, $20
-mark_2FE8: DEFB $10, $07, $11, $08, $18, $C0, $35, $EE
-mark_2FF0: DEFB $36, $55, $37, $C6, $AD, $E6, $AE, $2E
-mark_2FF8: DEFB $F2, $C3, $F3, $1D, $F4, $2F, $ED, $00
-;
-#else
-; G007 source code, reverse engineered.
-;
-; The ZX81 labels will have been generated already.
-; No need to include ZX definitions:
-;
-
-
-;===============================
-; G007 Hi-Res graphics board for the ZX81
-;
-; Source code partially reverse-engineered.
-; A work in progress...
-;
-; 2011-05-15 Assembles to create correct ROM image.
-;
-; Verifed by comparing the hex files,
-; the known-good reference generated by
-; 2048 defb statements containing the original bytes.
-;
-; The source code below is not guaranteed to create the ROM image
-; exactly the way the original author had in mind,
-; as I'm not him and I don't have the original source code.
-;
-; This file was created from a disassembly generated by the
-; impressive VB81 emulator program.
-;
-; It was already know that the G007 switched out pages of
-; the ZX81 BASIC ROM and patched in replacements from
-; the G007 ROM and the ZX81's internal 1K (or 2K) RAM.
-; This is a thrifty use of RAM that expansion RAM packs
-; usually just disabled.
-;
-; Memory map:
-;
-; 0000-0FFF
-; 2000-23FF 1K RAM inside ZX81, remapped here.
-; 2400-27FF 1K RAM more RAM if ZX81 has a 2K RAM chip
-; 2800-2FFF 2K G007
-; 3000-3FFF Empty
-; 4000-7FFF External RAM pack
-;
-; Patching:
-;
-; 2C00-2CFF (ROM) also appears at 0C00-0CFF
-; 2000-20FF (RAM) also appears at 0000-00FF
-; 2200-22FF (RAM) also appears at 0200-02FF
-;
-; The ROM patching is active all the time.
-; The RAM patching is active only in hi-res mode.
-;
-; The patches didn't cover every modification needed,
-; so one routine is copied from ROM to RAM and
-; then individual bytes are modified there
-; by the initialisation routine which also
-; initialises some variables.
-;
-; Graphics routines:
-;
-; These have not yet been analysed.
-; Bresenham's algorithm will be there is some form.
-;
-; Triangle-filling is a sophisticated feature,
-; using 8-bit maths for a practical speed.
-;
-; Future enhancements
-;
-; Programmers may like to try writing faster routines,
-; or adding more commands now that memory is cheap.
-;
-; The bit-mask array at $2D00 looks like this:
-; 10000000
-; 01000000
-; 00100000
-; 00010000
-; 00001000
-; 00000100
-; 00000010
-; 00000001
-;
-; and suggests that pixels
-; may be plotted one at a time.
-; When I wrote a triangle-filling algorithm for the Atom,
-; I made frequent use of horizontal lines.
-; I optimised these by working out the partially-filled
-; bytes at the left and right sides, and writing
-; whole bytes (of 8 pixels) between the partial bytes.
-; This used two overlapping tables like so:
-;
-; 10000000 ; BIT_MASK_R
-; 11000000
-; 11100000
-; 11110000
-; 11111000
-; 11111100
-; 11111110
-; 11111111 ; BIT_MASK_L
-; 01111111
-; 00111111
-; 00011111
-; 00001111
-; 00000111
-; 00000011
-; 00000001
-;
-; This technique might be able to increase the triangle filling speed.
-;
-; A proper ellipse algorithm would also be welcome,
-; not one of those approximations using polygons!
-;
-;===============================
-; Assembly was done by a very handy online tool:
-; http://k1.dyndns.org/cgi-bin/zasm.cgi
-; which avoids the chore of installing it
-; on one's own machine.
-; The online tool is limited to one source file and
-; one include file, but that's not a big deal
-; for a tiny 2K ROM like this one.
-;
-;===============================
-; Problems
-; The G007 ROM had several instances of opcdoes
-; beginning with FD CB
-; involving the Y register.
-; VB81 disassembled them into statements
-; that looked mangled and would not re-assemble.
-; So I've just added them with defb statements.
-;
-;
-;===============================
-; Global constants:
-;===============================
-FALSE equ 0
-NOT_G007 equ FALSE
-
-
-
-;===============================
-; ZX81 constants:
-;===============================
-; ZX characters (not the same as ASCII)
-;-------------------------------
-ZX_EQU equ $14
-ZX_COMMA equ $1A
-ZX_THEN equ $DE
-ZX_TO equ $DF
-ZX_INV_K equ $B0
-ZX_NEWLINE equ $76
-HRG_BYTES_PER_LINE equ 34
-ALL_BITS_SET equ -1
-;-------------------------------
-; tokens
-;-------------------------------
-_CLASS_00 equ 0
-_CLASS_01 equ 1
-_CLASS_02 equ 2
-_CLASS_03 equ 3
-_CLASS_04 equ 4
-_CLASS_05 equ 5
-_CLASS_06 equ 6
-;===============================
-; ZX81 I/O locations:
-;===============================
-IO_PORT_KEYBOARD_RD equ $FE ; A0 low
-ZX_NMI_GEN equ $FD ; A1 low
-ZX_PRINTER_PORT equ $FB ; A2 low
-;===============================
-; ZX81 RAM variables
-;===============================
-RAMBASE equ $4000
-ERR_NR equ $4000
-FLAGS equ $4001
-ERR_SP equ $4002
-RAMTOP equ $4004
-MODE equ $4006
-PPC equ $4007
-VERSN equ $4009
-E_PPC equ $400A
-D_FILE equ $400C
-DF_CC equ $400E
-VARS equ $4010
-DEST equ $4012
-E_LINE equ $4014
-CH_ADD equ $4016
-X_PTR equ $4018
-STKBOT equ $401A
-STKEND equ $401C
-BERG equ $401E
-MEM equ $401F
-UNUSED_8 equ $4021
-G007_FLAG_Y equ UNUSED_8 ;
-
-DF_SZ equ $4022
-S_TOP equ $4023
-LAST_K equ $4025
-DEBOUNCE equ $4027
-MARGIN equ $4028
-NXTLIN equ $4029
-NXT_LINE equ $4029
-OLDPPC equ $402B
-FLAGX equ $402D
-
-STRLEN equ $402E
-T_ADDR equ $4030
-SEED equ $4032
-FRAMES equ $4034
-COORDS equ $4036
-PR_CC equ $4038
-S_POSN equ $4039
-S_POSN_hi equ S_POSN+1
-CDFLAG equ $403B
-PRBUFF equ $403C
-MEMBOT equ $407B
-PROGRAM equ $407D
-UNUSED_16 equ $407B
-UNUSED_16_hi equ UNUSED_16+1
-
-G007_RESTART equ UNUSED_16
-
-; First byte after system variables:
-USER_RAM equ $407D
-MAX_RAM equ $7FFF
-
-;===============================
-; ZX BASIC ROM addresses
-;===============================
-; restart constants
-START equ $0000 ; = 0
-ERROR_1 equ $0008 ; = 8
-PRINT_A equ $0010 ; = 16
-GET_CHAR equ $0018 ; = 24
-TEST_SP equ $001C ; = 28
-NEXT_CH equ $0020 ; = 32
-FP_CALC equ $0028 ; = 40
-;-------------------------------
-L0108 equ $0108
-SLOW_FAST equ $0207 ;
-DISPLAY_5 equ $02B5 ;
-L029D equ $029D ; Inside the 'LOC_ADDR' subroutine
-SET_FAST equ $02E7
-LOAD equ $0340
-LIST equ $0730
-COPY equ $0869
-SAVE equ $02F6
-NEW equ $03C3
-LLIST equ $072C
-PRINT_CH equ $07F1 ; old, replaced
-L0809 equ $0809
-LOC_ADDR equ $0918
-ONE_SPACE equ $099B
-MAKE_ROOM equ $099E
-LINE_ADDR equ $09D8
-E_LINE_NO equ $0A73
-L0A95 equ $0A95 ; []*BIOS ROM*. Part way into 088A COPY_CONT
-PRINT equ $0ACF
-CLS equ $0A2A
-RECLAIM_1 equ $0A5D
-LPRINT equ $0ACB
-PRINT equ $0ACF
-PLOT_UNPLOT equ $0BAF
-L0BB2 equ $0BB2 ;
-STK_TO_A equ $0C02
-SCROLL equ $0C0E
-
-;-------------------------------
-; Parameter table addresses:
-; Checked in ROM disassembly book:
-;-------------------------------
-P_LET equ $0C48
-P_GOTO equ $0C4B
-P_IF equ $0C4F
-P_GOSUB equ $0C54
-P_STOP equ $0C58
-P_RETURN equ $0C5B
-P_FOR equ $0C5E
-P_NEXT equ $0C66
-P_PRINT equ $0C6A
-P_INPUT equ $0C6D
-P_DIM equ $0C71
-P_REM equ $0C74
-P_NEW equ $0C77
-P_RUN equ $0C7A
-P_LIST equ $0C7D
-P_POKE equ $0C80
-P_RAND equ $0C86
-P_LOAD equ $0C89
-P_SAVE equ $0C8C
-P_CONT equ $0C8F
-P_CLEAR equ $0C92
-P_CLS equ $0C95
-
-P_PLOT equ $0C98 ; redefined in G007 patch
-P_UNPLOT equ $0C9E ; redefined in G007 patch
-P_SCROLL equ $0CA4
-
-P_PAUSE equ $0CA7
-;P_SLOW equ $0CAB
-;P_FAST equ $0CAE
-;P_COPY equ $0CB1
-;P_LPRINT equ $0CB4
-;P_LLIST equ $0CB7
-;-------------------------------
-
-STOP equ $0CDC ; defined in this file
-
-REM equ $0D6A
-INPUT_RE equ $0D6F
-
-REPORT_C equ $0D9A ; according to the book
-REPORT_C_007 equ $0D26 ; seems the right one
-SYNTAX_Z equ $0DA6
-IF equ $0DAB
-FOR equ $0DB9
-
-NEXT equ $0E2E
-RAND equ $0E6C
-CONT equ $0E7C
-GOTO equ $0E81
-POKE equ $0E92
-L0EA8 equ $0EA8 ; Inside the 'FIND_INT.' subroutine
-REPORT_B equ $0EAD
- ; check this!!!
-RUN equ $0EAF
-CLEAR_007 equ $0EB2 ; goes to JP CLEAR
-GOSUB equ $0EB5
-RETURN equ $0ED8
-INPUT equ $0EE9
-
-FAST equ $0F23
-SLOW equ $0F2B
-PAUSE equ $0F32
-
-DIM equ $1409
-CLEAR equ $149A
-SET_MEM equ $14BC
-
-
-;===============================
-; G007 Memory patch addresses
-;===============================
-; These patches only appear in hi-res mode
-;
-RAM_PATCH_0000 equ $0000
-RAM_PATCH_0200 equ $0200
-ROM_PATCH_0C00 equ $0C00
-;
-; Their aliases are always present:
-;
-RAM_PATCH_2000 equ $2000
-RAM_PATCH_2200 equ $2200
-;===============================
-; G007 Plot number notes (a work in prgress)
-;===============================
-; N-1
-;
-; 76543 210
-; ..... .00 Line in white.
-; ..... .01 Line black.
-; ..... .10 Line inverting.
-; ..... .11 Line inverting, omit last pixel.
-;
-; ..... 0.. Absolute co-ordinates
-; ..... 1.. Relative co-ordinates
-;
-; ....0 ... Line
-; ....1 ... Single pixel
-;
-; .0100 ... Coarse dotted line
-; .0101 ... Add 40: triangle, plain
-; .1001.... Add 72: triangle, textured (not available in invert mode)
-; .1000 ... Add 64: fine dotted line
-; .1100 ... Add 96: chain dotted line
-;
-; Note that PLOT 12 and PLOT 16 miss out the pixel, so simply move the PLOT position.
-;
-
-
-
-
-
-;===============================
-; G007 Byte constants
-;===============================
-
-
-
-
-
-G007_INT_REG_VALUE_FOR_HI_RES_GRAPHICS equ $1F
-G007_INT_REG_VALUE_FOR_LO_RES_GRAPHICS equ $1E
-
-; Dec. Hex. Bytes System Variables: G007
-
-; 8448 2100 Reserved for user defined characters
-; 8703 21FF
-;
-; 8704 2200 Another page, possibly
-; 8959 22FF
-
-;===============================
-; G007 Byte constants
-;===============================
-MEM_PATCH_SIZE equ $0100
-;===============================
-; G007 RAM variables
-;===============================
-
-V2265 equ $2265
-V2264 equ $2264
-
-; Dec. Hex. Bytes System Variables: G007
-; 8960 2300 2 Offset of hi-res display file, less 9, from the D-FILE variable
-; 8962 2302 2 Not used
-; 8964 2304 2 Start address of last line of lo-res display file
-
-G007_DISPLAY_OFFSET_FROM_DFILE_LESS_9 equ $2300 ; conflict!
-
-G007_UNUSED_2302 equ $2302
-G007_DISPLAY_ADDRESS_LO_RES_LAST_LINE equ $2304
-G007_DISPLAY_ADDRESS_LESS_9 equ $2306 ; 8966 2306 2 Start address of hi-res display file, less 9 (used for video)
-G007_DISPLAY_ADDRESS equ $2308 ; 8968 2308 2 Start address of hi-res display file
-G007_TRIANGLE_TEXTURE equ $230A ; 8970 230A 2 Bytes defining triangle texture
-G007_CHAR_TABLE_ADDR_0_63 equ $230C ; 8972 230C 2 Character table address for CHR$0-63
-G007_CHAR_TABLE_ADDR_128_159 equ $230E ; 8974 230E 2 Character table address for CHR$128-159
-G007_PLOT_ROUTINES_VECTOR equ $2310 ; 8976 2310 2 Vector for additional plot routines
-G007_FLAG_0 equ $2312 ; 8978 2312 3 * Various flags
-G007_FLAG_1 equ $2313
-G007_FLAG_2 equ $2314
-G007_USR_DEF_CHR_TAB_LESS_256 equ $2315 ; 8981 2315 2 Address of user-defined character table, less 256
-G007_READ_POINT_BYTE equ $2317 ; 8983 2317 1 Read-point byte. Non-zero if pixel is set.
-G007_DISPLAY_HEIGHT equ $2318 ; 8984 2318 1 * Display height, normally 192
-G007_FLAG_3 equ $2319 ; 8985 2319 1 Flags
-
-;G007_TEMP_WORD_0 equ $231C ;
-G007_TEMP_BYTE_0 equ $231A ; 9886 231A 7 Temporary variables for PLOT routine.
-G007_TEMP_BYTE_1 equ $231B
-
-G007_TEMP_WORD_1 equ $231C ;
-;G007_TEMP_BYTE_2 equ $231C
-;G007_TEMP_BYTE_3 equ $231D
-
-G007_TEMP_WORD_2 equ $231E ;
-G007_TEMP_BYTE_4 equ $231E
-G007_TEMP_BYTE_5 equ $231F
-
-G007_TEMP_BYTE_6 equ $2320
-G007_OUT_OF_RANGE_FLAGS equ $2321 ; 8993 2321 1 Plot out of range flags. Bit 7 = latest statement
-G007_UNUSED equ $2322 ; 8994 2322 1 Not used
-G007_PLOT_X equ $2323 ; 8995 2323 2 X co-ordinate for PLOT. Signed 16-bit
-G007_PLOT_Y equ $2325 ; 8997 2325 2 Y co-ordinate for PLOT. Signed 16-bit
-G007_PLOT_X_PREVIOUS_N1 equ $2327 ; 8999 2327 8 X and Y co-ordinates for previous two statements
-G007_PLOT_Y_PREVIOUS_N1 equ $2329
-G007_PLOT_X_PREVIOUS_N2 equ $232B
-G007_PLOT_Y_PREVIOUS_N2 equ $232D
-G007_FLAG_4 equ $232F ; 9007 232F 1 Flags
-G007_ORIGIN_Y equ $2330 ; 9008 2330 2 Y co-ordinate of graphics origin
-G007_ORIGIN_X equ $2332 ; 9010 2332 2 X co-ordinate of graphics origin
-G007_LINE_TYPE equ $2334 ; 9012 2334 4 Bytes defining four line types
-G007_TEMP_BYTE_7 equ $2338 ; 9016 2338 2 Temporary variable for PLOT
-G007_TEMP_BYTE_8 equ $2339 ;
-G007_V23A0 equ $23A0
-;===============================
-; G007 RAM routines
-;===============================
-; Yes, there is such a thing!
-L23B8 equ $23B8
-;===============================
-; G007 ROM routines
-;===============================
-L2BF7 equ $2BF7 ; invalid opcode address
-SLOW_FAST_007 equ $2D08 ; new!
-;===============================
-; Needed by zasm:
-#target rom ; declare target file format
-#code $2800,$0800 ; declare code segment start and size
-;
-;===============================
-; G007 ROM assembly code
-;===============================
-; Start of ROM contents;
-; 10240/12287 : 2800/2FFF
-;===============================
-G007_GET_PIXEL_ADDRESS_AND_MASK: ;
- LD HL,(G007_PLOT_X) ; X co-ordinate for PLOT. Signed 16-bit. Fetch 16 bits
-L2803:
- LD A,(G007_PLOT_Y) ; Y co-ordinate for PLOT. Signed 16-bit. Fetch 8 bits
- LD H,A ; and store in H
-L2807:
- EX DE,HL ; then swap it into D
- LD A,(G007_DISPLAY_HEIGHT)
- DEC A;
- SUB D ;
- LD D,A
- LD A,7 ; A must be 0 to 7
- AND A,E ; E is the LS byte of the X co-ordinate
- LD L,A ; L = A = selects bit-mask
- LD H,$2D ; bit-mask array is at $2D00
- LD A,(HL) ; get byte with bit set at appropriate position
-
- LD HL,(G007_DISPLAY_ADDRESS) ; Start address of hi-res display file
-;-------------------------------
-; Add two bytes for every line
-;
- LD C,D ; BC = Y coordinate
- LD B,0
- ADD HL,BC ; HL += BC*2
- ADD HL,BC
-;-------------------------------
-; DE /= 8 gets byte offset from left of screen
-;
- SRL D ; shift DE right
- RR E
- SRL D ; shift DE right
- RR E
- SRL D ; shift DE right
- RR E
-
- ADD HL,DE ; HL = G007_DISPLAY_ADDRESS + byte offset of XY-co-ordinates
- LD B,A ; A and B hold the bitmask
- RET ; return
-;===============================
-L282C:
- LD A,(G007_OUT_OF_RANGE_FLAGS) ; Plot out of range flags. Bit 7 = latest statement
-
- LD HL,(G007_PLOT_X_PREVIOUS_N1)
- LD DE,(G007_PLOT_X) ; X co-ordinate for PLOT. Signed 16-bit
-
- EXX
-
- LD HL,(G007_PLOT_Y)
- LD DE,(G007_PLOT_Y_PREVIOUS_N1)
-
- ; test two most recent out-of-range flag bits:
- BIT 6,A
- JR Z,L285E
- BIT 7,A
- RET NZ
-
- LD A,(G007_FLAG_Y);
- PUSH AF
- LD B,8
-;-------------------------------
-loop_284B:
- RRCA
-
-;284C FD;CB;21;16 LD C,SLA (IY+CH_ADD-RAMBASE) output from VB81 disassembler
-
-#if 1
- RL (IY+G007_FLAG_Y-RAMBASE) ; makes FD CB 21 16 - correct!
-#else ; force bytes
- defb $FD
- defb $CB
- defb $21
- defb $16
-#endif
- DJNZ loop_284B
-;-------------------------------
- EX DE,HL
- EXX
- EX DE,HL
- EXX
- CALL L285E
- POP AF
- LD (G007_FLAG_Y),A;
- RET
-;===============================
-L285E:
- LD BC,-HRG_BYTES_PER_LINE ; NB negative number = $FFDE
- LD A,(G007_DISPLAY_HEIGHT)
- DEC A
- SUB E
- SBC HL,DE
- JP P,L2876
-;-------------------------------
- LD BC,HRG_BYTES_PER_LINE
- LD A,E
-
- PUSH DE
- ADD HL,DE
- EX DE,HL
- OR A,A
- SBC HL,DE
- POP DE
-;-------------------------------
-L2876:
- PUSH HL
- LD H,E
- LD E,A
- EXX
-
- LD BC,L28FB
- LD A,L
- EXX
- LD L,A
- EXX
- OR A,A
- SBC HL,DE
- JP P,L2890 ; [10384]
-;-------------------------------
- LD BC,L2904
- CPL
- ADD HL,DE
- EX DE,HL
- OR A,A
- SBC HL,DE
-L2890:
- LD (G007_TEMP_BYTE_0),BC ; Temporary variables for PLOT routine.
- POP DE
- OR A,A
- SBC HL,DE
- ADD HL,DE
- JR NC,L28A4
-;-------------------------------
- EX DE,HL
-
- LD BC,L28F6
- EXX
- LD D,E
- LD E,A
- LD A,D
- EXX
-L28A4:
- LD (G007_TEMP_WORD_1),BC
- EXX
- LD D,A
-;-------------------------------
- PUSH DE
- EXX
- POP BC
-;-------------------------------
- LD A,(G007_OUT_OF_RANGE_FLAGS) ; Plot out of range flags. Bit 7 = latest statement
- CP $40
- JR NC,L28B6
-;-------------------------------
- LD B,L ; BC = LE
- LD C,E
-;-------------------------------
-L28B6:
- INC B
- INC C
-;-------------------------------
-L28B8:
- SRL H
- JR C,L28BE
-
- JR Z,L28C6
-;-------------------------------
-L28BE:
- RR L
- SRL D
- RR E
- JR L28B8
-;-------------------------------
-L28C6:
- LD D,L
- SRL L
- EXX
- PUSH BC
- CALL L2807
- POP DE
- LD A,(G007_TEMP_BYTE_5)
- LD C,A
-;-------------------------------
-L28D3:
-; Bytes from disassembler:
-;28D3 FD;CB;21;06 LD C,SLA (IY+6)
-#if 1
- RLC (IY+G007_FLAG_Y-RAMBASE) ; makes FD CB 21 06
-#else
-; force bytes
- defb $FD
- defb $CB
- defb $21
- defb $06
-#endif
-
- JR C,L28E1
-;-------------------------------
- LD A,(G007_TEMP_BYTE_4)
- XOR A,(HL)
- OR A,C
- AND A,B
- XOR A,(HL)
- LD (HL),A
-;-------------------------------
-L28E1:
- EXX
-
- LD A,L
- DEC B
- RET Z
-;-------------------------------
- SUB E
- JR NC,L28F2
-;-------------------------------
- DEC C
- RET Z
-;-------------------------------
- ADD A,D
- EXX
- ADD HL,DE
- EXX
- LD HL,(G007_TEMP_BYTE_0) ; Temporary variables for PLOT routine.
- JP (HL)
-;-------------------------------
-L28F2:
- LD HL,(G007_TEMP_WORD_1)
- JP (HL)
-;-------------------------------
-L28F6:
- LD L,A
- EXX
- ADD HL,DE
- JR L28D3
-;-------------------------------
-L28FB:
- LD L,A
- EXX
- RLC B
- JR NC,L28D3
-;-------------------------------
- DEC HL
- JR L28D3
-;-------------------------------
-L2904:
- LD L,A
- EXX
-
- RRC B
- JR NC,L28D3
-;-------------------------------
- INC HL
- JR L28D3
-;-------------------------------
-G007_INTEGER_FROM_STACK_TO_BC:
- LD HL,(L0EA8) ; Inside the 'FIND_INT.' subroutine
- ; 0EA7 FIND_INT CALL 158A,FP_TO_BC
- ; so 0EA8 should contain $158A, pointing to the FP_TO_BC routine
- JP (HL) ; exit
-;===============================
-G007_INTEGER_FROM_STACK_TO_HL:
- CALL G007_INTEGER_FROM_STACK_TO_BC ; get an integer
- JR C,L2924
-;-------------------------------
- LD HL,0
- JR Z,L2921
-;-------------------------------
- SBC HL,BC ; HL = 0 - BC
- RET M
- RET Z
-;-------------------------------
- JR L2924
-;-------------------------------
-L2921:
- ADC HL,BC
- RET P
-;-------------------------------
-L2924:
- POP HL
- RET
-;===============================
-;
-G007_PLOT_UNPLOT_N_X_Y: ; takes parameters from the stack
-;
- CALL G007_INTEGER_FROM_STACK_TO_HL ; get Y
- LD (G007_PLOT_Y),HL
- CALL G007_INTEGER_FROM_STACK_TO_HL ; get X
- PUSH HL
- CALL STK_TO_A ; get N
- ;
- POP BC ; BC = X
- LD DE,(G007_PLOT_Y) ; DE = Y
- JR Z,G007_PLOT ;
- DEC A ; if (N-1) is zero
- RET NZ
-;-------------------------------
- LD HL,L0C9C ; then T_ADDR = HL = L0C9C
- LD (T_ADDR),HL ;
-;-------------------------------
-L2942:
- LD B,E
- JP L0BB2 ; []*BIOS ROM*
-;===============================
-; The Plot Routine:
-; A == the plot number N
-; BC == screen X
-; DE == screen Y
-;-------------------------------
-G007_PLOT:
- OR A,A
- JR Z,L2942
-;-------------------------------
- DEC A ; when PLOT N value is decremented, bits make more sense
-;-------------------------------
- PUSH DE ; push screen Y
- PUSH BC ; push screen X
- PUSH AF ; push plot number-1
-
- CALL G007_CHECK_AND_SET_UP_DISPLAY_FILE
-
- POP AF
- POP DE
- POP BC ; NB BC and DE are swapped
-;-------------------------------
- CP $81 ; Was A=129 (PLOT 130 sets graphics origin)
- JR NZ,G007_PLOT_XY_TO_HISTORY
-
-;-------------------------------
-G007_ORIGIN_SET:
- ;
- LD (G007_ORIGIN_Y),DE ; Y co-ordinate of graphics origin
- LD (G007_ORIGIN_X),BC ; X co-ordinate of graphics origin
- LD BC,$0000 ; BC = 0
- LD D,B ; DE = BC = 0
- LD E,B
- LD A,$0B
-
-;-------------------------------
-G007_PLOT_XY_TO_HISTORY:
- ;
- BIT 2,A; ; the (PLOT_N -1)
- JR Z,G007_PLOT_ABSOLUTE
-
-;-------------------------------
-G007_PLOT_RELATIVE: ;
- LD HL,(G007_PLOT_Y_PREVIOUS_N1)
- PUSH HL
- LD HL,(G007_PLOT_X_PREVIOUS_N1)
- JR G007_PLOT_ABSOLUTE_OR_RELATIVE
-;===============================
-G007_PLOT_ABSOLUTE:
- LD HL,(G007_ORIGIN_X) ; X co-ordinate of graphics origin
- PUSH HL
- LD HL,(G007_ORIGIN_Y) ; Y co-ordinate of graphics origin
-;------------------------------- ;
- ;
-G007_PLOT_ABSOLUTE_OR_RELATIVE: ;
- OR A,A ; update flags
- ADC HL,DE ; HL = G007_PLOT_Y + G007_ORIGIN_Y
- POP DE ; DE = G007_PLOT_X co-ordinate of graphics origin
- RET PE
-;-------------------------------
- LD (G007_PLOT_X),HL ; record plot X
- EX DE,HL
- OR A,A ; restore Flags
- ADC HL,BC ; HL = G007_PLOT_X + G007_ORIGIN_X
- RET PE
-;-------------------------------
- LD (G007_PLOT_Y),HL ; record plot Y
- LD E,A
- LD A,%11000000 ; $C0
- AND A,H ;
- RET PO;
-;-------------------------------
- LD A,%11000000 ; $C0
- AND A,D
- RET PO
-;------------------------------- ; push alternate HL,DE,BC
- EXX
- PUSH HL
- PUSH DE
- PUSH BC
- CALL G007_RANGE_CHECK
-;------------------------------- ; pop alternate BC,DE,HL
-L299A:
- POP BC
- POP DE
- POP HL
- EXX
- RET
-;===============================
-G007_RANGE_CHECK:
- EXX
- LD A,H ; A = H OR D
- OR A,D
- SCF
- JR NZ,G007_RANGE_CHECK_UPDATE ; if not zero, out of range already so ignore display height
-;-------------------------------
- LD A,(G007_DISPLAY_HEIGHT) ; check Y coordinate
- DEC A ; if (G007_DISPLAY_HEIGHT - Y ) is less than zero,
- CP L ; set the Carry flag
-;-------------------------------
-G007_RANGE_CHECK_UPDATE: ; latest flag in Carry is shifted into history flags
- LD A,(G007_OUT_OF_RANGE_FLAGS) ;
- RRA ; shift bits right. Bit 7 = latest statement
- LD (G007_OUT_OF_RANGE_FLAGS),A ;
- LD A,E ; E bit 7
- BIT 7,A
- JR Z,L29BA
-;------------------------------- ; gets here if PLOT_N is over 130
- LD HL,(G007_PLOT_ROUTINES_VECTOR) ; Vector for additional plot routines
- JP (HL) ; This looks very promising,
- ; makes it easy to bolt-on extra graphics routines
-;===============================
-L29BA:
- PUSH AF
- AND 3
- RRA
- DEC A
- CPL
- LD H,A
- SBC A,A
- LD L,A
- LD (G007_TEMP_WORD_2),HL
- PUSH HL
- BIT 3,E
- JR NZ,L29F3
-;-------------------------------
- LD A,(G007_TEMP_BYTE_6)
- XOR A,E
- AND %11111011 ; $FB. Bit 2 ignored
- JR Z,L29E2
-;-------------------------------
- LD HL,G007_LINE_TYPE
- LD A,E
-;------------------------------- ; A *= 8
- RLCA
- RLCA
- RLCA
-;-------------------------------
- AND $03
- ADD A,L
- LD L,A
- LD A,(HL)
- LD (G007_FLAG_Y),A;
-;-------------------------------
-L29E2:
- CALL L282C;
- POP HL
-
-;-------------------------------
-; Bytes from disassembler: 29E6 FD;CB;21;0E LD C,SLA (IY+14)
-
- RRC (IY+G007_FLAG_Y-RAMBASE) ; makes FD CB 21 0E
- JR C,L2A12
-;===============================
- LD A,H ; A = H and L
- AND A,L
- JR Z,L2A12
-;-------------------------------
- INC L
- LD E,L
- PUSH HL
-;-------------------------------
-L29F3:
- LD A,(G007_OUT_OF_RANGE_FLAGS) ; Bit 7 = latest statement
- BIT 5,E
- JR NZ,G007_TRIANGLE_PLAIN
-;-------------------------------
- BIT 6,E
- JR NZ,G007_TRIANGLE_TEXTURED
-;-------------------------------
- POP HL
- BIT 7,A
- JR NZ,L2A12
-;-------------------------------
- PUSH HL
- CALL G007_GET_PIXEL_ADDRESS_AND_MASK
- AND A,(HL)
- LD (G007_READ_POINT_BYTE),A ; "Read-point" byte. Non-zero if pixel is set.
- POP DE
- LD A,(HL)
- OR A,D
- XOR A,E
- AND A,B
- XOR A,(HL)
- LD (HL),A
-;-------------------------------
-L2A12:
- POP AF
- LD (G007_TEMP_BYTE_6),A
- LD HL,G007_PLOT_Y_PREVIOUS_N1+1
- LD DE,G007_PLOT_Y_PREVIOUS_N2+1
- LD BC,8
- BIT 4,A
- JR Z,L2A34
-;-------------------------------
- LD A,(G007_OUT_OF_RANGE_FLAGS) ; Plot out of range flags. Bit 7 = latest statement
- AND $C0 ; only want most recent two bits
- RLA
- JR NC,L2A2D
- SET 6,A ; carry flag into bit 6 of A
-;-------------------------------
-L2A2D:
- LD (G007_OUT_OF_RANGE_FLAGS),A
- LD L,$26
- LD C,4
-;-------------------------------
-L2A34:
- LDDR ; (DE--)=(HL--); BC-- UNTIL BC IS ZERO
- RET
-;===============================
-G007_TRIANGLE_PLAIN:
- LD HL,ALL_BITS_SET
- JR G007_TRIANGLE_TEXTURED_BY_HL
-;===============================
-G007_TRIANGLE_TEXTURED:
- LD HL,(G007_TRIANGLE_TEXTURE) ; Bytes defining triangle texture
-;-------------------------------
-G007_TRIANGLE_TEXTURED_BY_HL:
- EXX
- AND $E0 ; = 224
- JP NZ,REPORT_B;
-;-------------------------------
-L2A45:
- LD HL,G007_OUT_OF_RANGE_FLAGS
- LD (IY+G007_FLAG_Y-RAMBASE),$55
- LD B,3
-;-------------------------------
-loop_2A4E:
- INC HL ; HL+=2
- INC HL
- LD E,(HL)
- INC HL ; HL+=2
- INC HL
- LD D,(HL)
- PUSH DE
- DJNZ loop_2A4E ; BC--
-;-------------------------------
- POP BC ; restore register pairs
- POP DE
- POP HL
-;-------------------------------
- OR A,A
- JR Z,L2A5F
-;-------------------------------
- LD B,H ; BC=HL
- LD C,L
-;-------------------------------
-L2A5F:
- LD A,B
- CP H
- JR NC,L2A66
-;-------------------------------
- PUSH BC
- EX (SP),HL
- POP BC
-;-------------------------------
-L2A66:
- LD A,H
- CP D
- JR NC,L2A6B
-;-------------------------------
- EX DE,HL
-;-------------------------------
-L2A6B:
- LD A,D
- EXX
- AND 7
- INC A
- LD B,A
- LD A,H
-;-------------------------------
-loop_2A72:
- RLC L ; L *= 2
-;-------------------------------
- RLCA ; A *= 8
- RLCA
- RLCA
-;-------------------------------
- DJNZ loop_2A72 ; loop while BC-- is not zero
-;-------------------------------
- LD H,A
- LD (G007_TEMP_BYTE_7),HL ; Temporary variable for PLOT
- EXX
-;-------------------------------
- LD A,H
- CP B
- LD A,7
- JR NC,L2A87
-;-------------------------------
-loop_2A84:
- PUSH BC
- EX (SP),HL
- POP BC
-;-------------------------------
-L2A87:
- EX DE,HL
- PUSH AF
- LD A,C
- EXX
- LD H,A
- LD L,A
- LD C,A
- LD (G007_TEMP_BYTE_0),HL ; Temporary variables for PLOT routine.
- LD B,$FE
- EXX
- SUB E
- EXX
-;-------------------------------
- JR NC,skip_2A9C
- LD B,$00
- NEG
-skip_2A9C:
-;-------------------------------
- LD D,A
- EXX
- LD A,D
- SUB B
- EXX
- LD H,A
-;-------------------------------
- CP D
- JR NC,skip_2AA7
- EX DE,HL
- INC B
-skip_2AA7:
-;-------------------------------
- LD L,H
- INC L
- LD E,H
- SRL E
-
- POP AF
- RRCA
- JR NC,L2AB9
-;-------------------------------
- PUSH HL
-;-------------------------------
- PUSH DE
- PUSH BC
-;-------------------------------
- RRCA
- EXX
-;-------------------------------
- JR C,loop_2A84
- JR L2A87
-;===============================
-L2AB9:
- EXX
- LD H,B
- LD L,1
-;-------------------------------
-loop_2ABD:
- POP BC
- POP DE
-;-------------------------------
- EX (SP),HL
-;-------------------------------
-L2AC0:
- DEC L
- JR NZ,L2AD9
-;-------------------------------
- LD HL,(G007_TEMP_BYTE_0) ; Temporary variables for PLOT routine.
- LD A,C
-;-------------------------------
- CP H
- JR C,skip_2ACB
- LD H,A
-skip_2ACB:
-;-------------------------------
- CP L
- JR NC,skip_2ACF
- LD L,A
-skip_2ACF:
-;-------------------------------
- LD (G007_TEMP_BYTE_0),HL ; Temporary variables for PLOT routine.
- POP HL
- DEC L
-;-------------------------------
-L2AD4:
-
- JR Z,loop_2ABD
-
- PUSH HL
- JR L2AEE
-;-------------------------------
-L2AD9:
- LD A,E
- SUB D
- JR C,L2AE7
-;-------------------------------
- LD E,A
- BIT 0,B
- JR Z,L2AEE
-;-------------------------------
- LD A,C
- ADD A,B
- LD C,A
- JR L2AC0
-;-------------------------------
-L2AE7:
- ADD A,H
- LD E,A
- LD A,1
- OR A,B
- ADD A,C
- LD C,A
-;-------------------------------
-L2AEE:
- LD A,C
- EXX
-;-------------------------------
- RRC (IY+G007_FLAG_Y-RAMBASE) ; makes FD CB 21 0E
-
- JR C,L2AC0 ; if
-;-------------------------------
- EX (SP),HL
-;-------------------------------
- PUSH DE
- PUSH BC
- PUSH HL
-;-------------------------------
- LD DE,(G007_TEMP_BYTE_0)
- LD B,A
-;-------------------------------
- CP C
- JR NC,skip_2B04
- LD B,C
- LD C,A
-skip_2B04:
-;-------------------------------
- LD (G007_TEMP_BYTE_0),BC
- LD A,C
-;-------------------------------
- CP E
- INC A
- JR C,skip_2B0E
- LD A,E
-skip_2B0E:
-;-------------------------------
- LD L,A
- LD A,D
-;-------------------------------
- CP B
- JR NC,skip_2B15
- LD A,B
- DEC A
-skip_2B15:
-;-------------------------------
- SUB L
- INC A
- PUSH AF
- CALL L2807
-
- POP AF
- LD C,A
- EX DE,HL
- LD HL,G007_TEMP_BYTE_8
- LD A,(HL)
-;-------------------------------
- RLCA
- RLCA
- RLCA
-;-------------------------------
- LD (HL),A
- DEC HL
- RLC (HL)
- OR A,(HL)
- LD HL,(G007_TEMP_WORD_2)
- XOR A,L
- CPL
- LD L,A
- EX DE,HL
-;-------------------------------
-loop_2B31:
- LD A,E
- XOR A,(HL)
- OR A,D
- AND A,B
- XOR A,(HL)
- LD (HL),A
-;-------------------------------
-loop_2B37:
- DEC C
- JR NZ,L2B4E
-;-------------------------------
- POP HL
- INC H
- BIT 7,L
- JR Z,L2AD4
-;------------------------------- ; discard 3 words from stack
- POP HL
- POP HL
- POP HL
-;-------------------------------
- POP HL
- LD A,H
- AND A,L
- JP Z,L2A12
-;-------------------------------
- INC L
- PUSH HL
- JP L2A45
-;-------------------------------
-L2B4E:
- RR B
- JR NC,loop_2B31
-;-------------------------------
- INC HL
- LD B,C
- LD A,C
- AND $07
- LD C,A
-;-------------------------------
- SRL B ; B *= 8
- SRL B
- SRL B
-;-------------------------------
- JR Z,L2B68
-;-------------------------------
-loop_2B60:
- LD A,E
- XOR A,(HL)
- OR A,D
- XOR A,(HL)
- LD (HL),A
- INC HL
- DJNZ loop_2B60
-;-------------------------------
-L2B68:
- SCF
- INC C
- JR loop_2B37
-;-------------------------------
-L2B6C:
- LD HL,(G007_FLAG_1)
- DEC L
- OR A,L
- JP NZ,L0809 ; iii) Testing S-POSN: 0808 ENTER-CH LD D,A
- ; G007 skips that first instruction though.
-;-------------------------------
-
- DEC H ; if --H,
- JP NZ,L23B8 ; then jump to modified copy of a ZX81 routine, in RAM.
-;------------------------------- ;
- LD A,(G007_OUT_OF_RANGE_FLAGS) ; Plot out of range flags. Bit 7 = latest statement
- RLA
- RET C
-;-------------------------------
- NOP
- NOP
- LD HL,(G007_PLOT_X_PREVIOUS_N1+1)
- LD A, (G007_PLOT_X_PREVIOUS_N1)
- BIT 6,D
-;-------------------------------
-mark_2B87:
- JR NZ,L2B8E ; 20;05
-
- LD L,A
- ADD A,8
- JR NC,L2B9B
-;-------------------------------
-L2B8E:
- LD A,H
-;-------------------------------
- SUB 8
- JR NC,skip_2B97
- LD A,(G007_DISPLAY_HEIGHT)
- DEC A
-skip_2B97:
-;-------------------------------
- LD (G007_PLOT_Y_PREVIOUS_N1),A;
- XOR A,A ; A = 0
-;-------------------------------
-L2B9B:
- LD (G007_PLOT_X_PREVIOUS_N1),A
- BIT 6,D
- RET NZ
-;-------------------------------
- CALL L2EEF
-
- LD A,L
-;-------------------------------
- CP $F9
- JR C,skip_2BAB
- LD E,2
-skip_2BAB:
-;-------------------------------
- CPL
- AND 7
- INC A
- LD D,A
- LD A,H
- INC A
- EXX
-
- LD D,A
- EXX
- PUSH DE
- CALL L2807
- EXX
-;-------------------------------
-L2BBA:
- LD A,C
- XOR A,(HL)
- EXX
- EX DE,HL
-LXXX:
- POP BC
- PUSH BC
- LD L,A
- LD H,$00
-;-------------------------------
-loop_2BC3:
- ADD HL,HL
- DJNZ loop_2BC3
-;-------------------------------
- EX DE,HL
- LD B,2
-;-------------------------------
-L2BC9:
- LD A,(G007_RESTART);
- XOR A,(HL)
- OR A,(IY+G007_RESTART+1-RAMBASE)
- AND A,D
- XOR A,(HL)
-;-------------------------------
- DEC C
- JR Z,skip_2BD6
- LD (HL),A
-skip_2BD6:
-;-------------------------------
- LD D,E
- INC HL
- DJNZ L2BC9
-;-------------------------------
- LD C,$20
- ADD HL,BC
- EXX
- INC HL
-;-------------------------------
- DEC D
- JR Z,skip_2BE4
-;-------------------------------
- DJNZ L2BBA
-;-------------------------------
-skip_2BE4:
-;-------------------------------
- POP HL
- JP L299A
-;===============================
-PRINT_007:
- LD A,I ; read graphics mode
- RRCA
-;-------------------------------
- JR NC,skip_2BF5
- XOR A,A ; A = 0
- LD (DF_SZ),A ; SET DF_SZ
- INC A
- LD (G007_FLAG_1),A
-skip_2BF5:
-;-------------------------------
- CALL PRINT ; [PRINT]
- XOR A,A ; A = 0
- LD (G007_FLAG_1),A
- LD (IY+DF_SZ-RAMBASE),2 ; The lines above have no return or jump statements
-; They will fall into copy of the end of the STK_TO_BC routine
-; Perhaps a cunning trick to save two bytes? :-)
-;===============================
-;===============================
-;===============================
-
- org ROM_PATCH_0C00
-;
-; 256-byte block patched in to ZX81 BASIC at 0C00 hex
-; This cleverly alters the language syntax,
-; adding parameters and/or pointing to new routines.
-;
- LD C,A ; from the end of the STK_TO_BC routine
- RET
-;===============================
-; THE 'STK_TO_A' SUBROUTINE (duplicated for the paged ROM)
-
-; This subroutine 'loads' the A register with the floating point number held at the top of the calculator stack. The number must be in the range 00-FF.
-;-------------------------------
-STK_TO_A:
-
-#if NOT_G007
-; CALL 15CD,FP_TO_A ; This is what the disassembly book says
-#else
- CALL L0CA0 ; new in G007
-#endif
- JP C,REPORT_B
-;-------------------------------
- LD C,$01
- RET Z
- LD C,$FF
- RET
-;===============================
-
-; THE 'SCROLL' COMMAND ROUTINE (duplicated for the paged ROM)
-
-; The first part of the routine sets the correct values of DF_CC and S_POSN to allow for the next printing to occur at the start of the bottom line + 1.
-
-; Next the end address of the first line in the display file is identified and the whole of the display file moved to overwrite this line.
-;-------------------------------
-
-SCROLL:
-mark_0C0E:
- LD B,(IY+DF_SZ-RAMBASE) ; ??? Disassembly book says LD B,(DF_SZ)
- LD C,CHARS_HORIZONTAL + 1 ;change here, $21 originally
- CALL LOC_ADDR
- CALL ONE_SPACE
- LD A,(HL)
- LD (DE),A
-
- INC (IY+S_POSN_hi-RAMBASE) ;
-
- LD HL,(D_FILE);
- INC HL
- LD D,H
- LD E,L
- CPIR
- JP RECLAIM_1
-;===============================
-;
-; THE SYNTAX TABLES
-;
-; i) The offset table
-;
-; There is an offset value for each of the BASIC commands and by
-; adding this offset to the value of the address where it is found,
-; the correct address for the command in the parameter table is
-; obtained.
-
-; 2C29: 8B 8D 2D 7F 81 49 75
-
-mark_0C29:
-offset_t:
-
-; expression address byte offset expected
- defb P_LPRINT-$ ; 0CB4 $8B
- defb P_LLIST-$ ; 0CB1 ; $8D ;
- defb P_STOP-$ ; 0C58 ; $2D ;
- defb P_SLOW-$ ; 0CAB ; $7F ;
- defb P_FAST-$ ; 0CAE ; $81 ;
- defb P_NEW-$ ; 0C77 ; $49 ;
- defb P_SCROLL_007-$ ; 0CA4 ; $75 ;
- ; 2C30: 5F 40 42 2B 17 1F 37 52
- defb P_CONT-$ ; 0CBF ; $5F ;
- defb P_DIM-$ ; 0C71 ; $40 ;
- defb P_REM-$ ; 0C74 ; $42 ;
- defb P_FOR-$ ; 0C5E ; $2B ;
- defb P_GOTO-$ ; 0C4B ; $17 ;
- defb P_GOSUB-$ ; 0C54 ; $1F ;
- defb P_INPUT-$ ; 0C6D ; $37 ;
- defb P_LOAD-$ ; 0C89 ; $52 ;
- ; 2C38: 45 0F 6D 2B 44 2D 5A 3B
- defb P_LIST-$ ; 0C7D ; $45 ;
- defb P_LET-$ ; 0C48 ; $0F ;
- defb P_PAUSE-$ ; 0CA7 ; $6D ;
- defb P_NEXT-$ ; 0C66 ; $2B ;
- defb P_POKE-$ ; 0C80 ; $44 ;
- defb P_PRINT-$ ; 0C6A ; $2D ; Same as normal ZX81
- defb P_PLOT_007-$ ; 0C98 ; $5A ;
- defb P_RUN-$ ; 0C7A ; $3B ;
- ; 2C40: 4C 45 0D 52 54 4D 15 6A
- defb P_SAVE-$ ; 0C8C ; $4C ;
- defb P_RAND-$ ; 0C86 ; $45 ;
- defb P_IF-$ ; 0C4F ; $0D ;
- defb P_CLS-$ ; 0C95 ; $52 ;
- defb P_UNPLOT_007-$ ; 0C98 ; $54 ; This byte is 5A, an offset to 0C9E, in normal ZX81
- ; NB same address as PLOT
- defb P_CLEAR-$ ; 0C92 ; $4D ;
- defb P_RETURN-$ ; 0C5B ; $15 ;
- defb P_COPY-$ ; 0CB1 ; $6A ;
-;
-; ii) The parameter table.
-;
-; For each of the BASIC commands there are between 3 and 8
-; entries in the parameter table. The command classes for each of
-; the commands are given, together with the required separators and
-; these are followed by the address of the appropriate routine.
-
-
- ; 2C48: 01 14 02
-mark_0C48:
-P_LET:
- defb _CLASS_01 ; A variable is required.
- defb ZX_EQU ; Separator: '='
- defb _CLASS_02 ; An expression, numeric or string,
- ; must follow.
-
-; 244B: 06 00 81 0E 06
-
-P_GOTO:
-mark_0C4B:
- defb _CLASS_06 ; A numeric expression must follow.
- defb _CLASS_00 ; No further operands.
- defw GOTO
-
-
-P_IF:
-mark_0C4F:
- defb _CLASS_06 ; A numeric expression must follow.
-mark_0C50 ; 2C50: DE 05 AB 0D
- defb ZX_THEN ; Separator: 'THEN'
- defb _CLASS_05 ; Variable syntax checked entirely
- ; by routine.
- defw IF
-
-
-P_GOSUB: ; mark_0C54:
- defb _CLASS_06 ; A numeric expression must follow.
- defb _CLASS_00 ; No further operands.
- defw GOSUB ; 0EB5
-
- ; 2C58: 00 DC 0C
-
-P_STOP: ; mark_0C58:
- ; 2C54: 06 00 B5 0E
- defb _CLASS_00 ; No further operands.
- defw STOP
-
- ; 2c5B: 00 D8 0E
-
-P_RETURN
- defb _CLASS_00 ; No further operands.
- defw RETURN
-
-
- ; 2c5e: 04 14
-
-
-P_FOR:
-#if 0
-mark_0C5E:
-#else
-#endif
- defb _CLASS_04 ; A single character variable must
- ; follow.
- defb ZX_EQU ; Separator: '='
- defb _CLASS_06 ; A numeric expression must follow.
- defb ZX_TO ; Separator: 'TO'
- defb _CLASS_06 ; A numeric expression must follow.
- defb _CLASS_05 ; Variable syntax checked entirely
- ; by routine.
- defw FOR
-
- ; 0C66: 04 00 2E 0E
-
-P_NEXT: ; at $0C66:
-
- defb _CLASS_04 ; A single character variable must follow.
- defb _CLASS_00 ; No further operands.
- defw NEXT
-
-
-; 2C6A: 05 E8 2B
-
-P_PRINT:
-
-mark_0C6A:
-
-
-
- defb _CLASS_05 ; Variable syntax checked entirely
- ; by routine.
-#if NOT_G007
- defw PRINT ; This is the original routine
-#else
- defw PRINT_007 ; 2BE8 This is the new routine!
-#endif
-
-; ; 2C6D: 01 00 E9 0E
-
-
-mark_0C6D:
-
-
-P_INPUT:
- defb _CLASS_01 ; A variable is required.
- defb _CLASS_00 ; No further operands.
- defw INPUT
-
-P_DIM:
-mark_0C71:
- defb _CLASS_05 ; Variable syntax checked entirely
- ; by routine.
-#if NOT_G007
- defw DIM ; 1409 Original ZX81 replaced by
-#else
- defw DIM_007 ; 2EA7 new routine
-#endif
-;
-; ; 2c74: 05 6A 0D
-;
-mark_0C74:
-P_REM:
-
- defb _CLASS_05 ; Variable syntax checked entirely by routine.
- defw REM
-
-mark_0C77:
-P_NEW:
- defb _CLASS_00 ; No further operands.
- defw NEW
-
-P_RUN:
-mark_0C7A:
-
-P_RUN:
- defb _CLASS_03 ; A numeric expression may follow
- ; else default to zero.
- defw RUN
-
-P_LIST:
-#if 0
-mark_0C7D:
-#else
-#endif
- defb _CLASS_03 ; A numeric expression may follow
- ; else default to zero.
- defw LIST
-
-P_POKE: ; mark_0C80:
- defb _CLASS_06 ; A numeric expression must follow.
- defb ZX_COMMA ; Separator: ','
- defb _CLASS_06 ; A numeric expression must follow.
- defb _CLASS_00 ; No further operands.
- defw POKE
-
-P_RAND: ; mark_0C86:
- defb _CLASS_03 ; A numeric expression may follow
- ; else default to zero.
- defw RAND
-
-P_LOAD: ; mark_0C89:
- defb _CLASS_05 ; Variable syntax checked entirely
- ; by routine.
- defw LOAD
-
-P_SAVE: ; mark_0C8C:
- defb _CLASS_05 ; Variable syntax checked entirely
- ; by routine.
-#if NOT_G007
- defw SAVE ; 02F6 original
-#else
- defw SAVE_007 ; 2F4D new!
-#endif
-;
-P_CONT:
-#if 0
-#else
-#endif
-mark_0C8F:
- defb _CLASS_00 ; No further operands.
- defw CONT ; 0E7C
-;
-P_CLEAR: ; mark_0C92:
- defb _CLASS_00
-#if NOT_G007
- defw CLEAR ; 149A original
-#else
- defw CLEAR_007 ; 0EB2 new. this points outside the G007 ROM
-#endif
-
-
-P_CLS: ; mark_0C95:
-#if NOT_G007
- defb _CLASS_00 ; No further operands.
-;; defw CLS ; original
-#else
- defb _CLASS_03 ; A numeric expression may follow
- ; else default to zero.
- defw G007_CLS_N ; 2E4E new!
-#endif
-;
-;
-;
-mark_0C98:
-
-#if NOT_G007
- ; originally the ZX81 does this:
-P_PLOT: ; original: plot X,Y
- defb _CLASS_06 ; A numeric expression must follow. X
- defb ZX_COMMA ; Separator: ','
- defb _CLASS_06 ; A numeric expression must follow. Y
- defb _CLASS_00 ; No further operands.
- defw PLOT_UNPLOT ; 0BAF
-
-P_UNPLOT: ; original: plot X,Y
- defb _CLASS_06 ; A numeric expression must follow. X
- defb ZX_COMMA ; Separator: ','
- defb _CLASS_06 ; A numeric expression must follow. Y
- defb _CLASS_00 ; No further operands.
- defw PLOT_UNPLOT ; 0BAF
-
- ; These are identical, so they could overlap
-#else
- ; The G007 saves bytes by having these
- ; identical parameter table entries overlapping:
- ; 0C98 / 2C98: 06 1A 06 1A 06 00 26 29
-P_PLOT_007:
-P_UNPLOT_007:
- ; new: plot N,X,Y
- defb _CLASS_06 ; A numeric expression must follow. N
- defb ZX_COMMA ; Separator: ','
- defb _CLASS_06 ; A numeric expression must follow. X
- defb ZX_COMMA ; Separator: ','
-L0C9C:
- defb _CLASS_06 ; A numeric expression must follow. Y
- defb _CLASS_00 ; No further operands.
- defw G007_PLOT_UNPLOT_N_X_Y ; 2926 new!
- ;
- ; by saving those bytes, can put a tiny routine here:
-L0CA0:
- LD HL,(L0EA8) ; Inside the 'FIND_INT.' subroutine
- JP (HL)
-#endif
-;
-; Now back to the table!
-;
-P_SCROLL_007
-mark_0CA4:
- defb _CLASS_00
- defw SCROLL ; 0C0E
-
-
-
-P_PAUSE:
- defb _CLASS_06
- defb _CLASS_00
-#if NOT_G007
-mark_0CA9:
-; 2CA9: 0F 32
- defw PAUSE ; 0F32 original
-#else
-mark_0CA9:
-; 2CA9: AE 2E
-; 0CA7
- defw PAUSE_007 ; 2EAE new!
-#endif
-;
-; 2CAB: 03 B2 2E
-; 0CAB
-
-
-
-P_SLOW:
-mark_0CAB:
-#if NOT_G007
- defb _CLASS_00 ; No further operands.
- defw SLOW ; 2B 0F SLOW,0F2B original
-#else
- defb _CLASS_03 ; new! Extra parameter sets graphic mode
- defw SLOW_007 ; 2EB2 new!
-#endif
-
-
-P_FAST:
-mark_0CAE:
-#if NOT_G007
- defb _CLASS_00 ; No further operands.
- defw FAST ; 23 0F FAST,0F23 original
-#else
- defb _CLASS_03 ; new! Extra parameter sets graphic mode
- defw FAST_007 ; 2EB6 new!
-#endif
-
-
-
-
-
-
-
-
-;
-; 2CB1: 03 53 2F
-;
-; 0CB1
-
-P_COPY:
-#if NOT_G007
- defb _CLASS_00 ; original
- defw COPY ; 0869 original
-#else
- defb _CLASS_03 ; new! Extra parameter sets graphic mode
-;;; defw COPY_007 ; 2EB6 new but wrong ???!
- defw L2F53 ; what the disassembler said
-#endif
-
-mark_0CB4:
-
-
-P_LPRINT:
-
- defb _CLASS_05
- defw LPRINT ; 0ACB
-;
-; ; 2CB7: 03 2C 07
-; 0CB7
-P_LLIST:
- defb _CLASS_03
- defw LLIST ; 072C
-;
-;
-; the rest of this page is just a copy of the usual ZX81 code
-
-LINE_SCAN:
-L0CBA:
-; 2CBA: FD 36 01 01 CD 73
-; 2CC0: 0A CD 95 0A 21 00 40 36
-; 2CC8: FF 21 2D 40 CB 6E 28 0E
-; 2CD0: FE E3 7E C2 6F 0D CD A6
-; 2CD8: 0D C8 CF 0C CF 08 DF 06
-; 2CE0: 00 FE 76 C8 4F E7 79 D6
-; 2CE8: E1 38 3B 4F 21 29 0C 09
-; 2CF0: 4E 09 18 03 2A 30 40 7E
-; 2CF8: 23 22 30 40 01 F4 0C C5
-;
-; which is described as follows in the ZX81 disassembly book:
-;
-; THE 'LINE SCANNING' ROUTINE
-;
-; The BASIC interpreter scans each line for BASIC commands and as each one is found
-; the appropriate command routine is followed.
-; The different parts of the routine are:
-;-------------------------------
-; i) The LINE_SCAN entry point leads to the line number being checked for validity.
-
- LD (IY+FLAGS-RAMBASE),$01 ; FLAGS = 1
- CALL E_LINE_NO ;
-;-------------------------------
-; ii) The LINE_RUN entry point is used when replying to an INPUT prompt
-; and this fact has be identified.
-;-------------------------------
-LINE_RUN
-#if NOT_G007
- CALL SET_MEM ; at $14BC
-#else
- CALL L0A95 ; JP 14BC,SET_MEM then return
- ; why it does this I do not know - KH
-#endif
- LD HL,ERR_NR
- LD (HL),$FF
- LD HL,FLAGX
- BIT 5,(HL)
- JR Z,LINE_NULL
-;-------------------------------
-; iii) The INPUT reply is tested to see if STOP was entered.
-
- CP $E3
- LD A,(HL)
- JP NZ,INPUT_RE
- CALL SYNTAX_Z
- RET Z
-
-; iv) If appropriate, report D is given.
-
- RST ERROR_1
- defb $0C
-;-------------------------------
- ; THE 'STOP' COMMAND ROUTINE
- ; The only action is to give report 9.
-;-------------------------------
-STOP
- RST ERROR_1
- defb 8
-;-------------------------------
- ; v) A return is made if the line is 'null'.
-;-------------------------------
-LINE_NULL:
-
-mark_0CDE:
-
-; old software from disassembly book:
-
- RST GET_CHAR
- LD B,0
- CP ZX_NEWLINE
- RET Z
-
- ; vi) The first character is tested so as to check that it is a command.
-
- LD C,A
- RST NEXT_CH
- LD A,C
- SUB $E1
-#if NOT_G007
- JR C,REPORT_C ; $0D9A as per the book
-#else
- JR C,REPORT_C_007 ; $0D26 in G007 systems
-#endif
-;-------------------------------
- ; vii) The offset for the command is found from the offset table.
-
- LD C,A
- LD HL,offset_t ; $0C29
- ADD HL,BC
- LD C,(HL)
- ADD HL,BC
- JR GET_PARAM
-
- ; viii) The parameters are fetched in turn by a loc that returns to 0CF4.
- ; The separators are identitied by the test against +0B.
-;-------------------------------
-mark_0CF4:
-
-SCAN_LOOP:
- LD HL,(T_ADDR)
-GET_PARAM:
- LD A,(HL)
- INC HL
- LD (T_ADDR),HL
- LD BC,SCAN_LOOP
- PUSH BC
-
-;
-; there is more to this routine but the patch ends here
-;
-; end of patch
-;-------------------------------
- org $2D00
-
-
-; bits shifting right within a byte:
-;
- defb %10000000 ; $80
- defb %01000000 ; $40
- defb %00100000 ; $20
- defb %00010000 ; $10
- defb %00001000 ; $08
- defb %00000100 ; $04
- defb %00000010 ; $02
- defb %00000001 ; $01
-;-------------------------------
-L2D08:
-
-SLOW_FAST_007: ; at $2D08
-
- CALL L2BF7 ; ??? not a valid opcode address?
- JP SLOW_FAST ; old routine
-;-------------------------------
-L2D0E:
- LD (MARGIN),A ;
- EX DE,HL
- LD HL,10
- ADD HL,SP
- LD A,(HL)
- INC A
- AND $F0
- SUB $D0
- LD C,A
- INC HL
- LD A,(HL)
- SUB 4
- OR A,C
- LD C,A
- LD A,(CDFLAG) ;
- RLCA
- SBC A,A
- AND A,C
- JR NZ,L2D3B
-;-------------------------------
- LD HL,(VARS) ;
- LD BC,-(CHARS_HORIZONTAL+1) ; $FFDF
- ADD HL,BC
- SET 7,H
- LD (G007_DISPLAY_ADDRESS_LO_RES_LAST_LINE),HL
- LD A,1
- JR L2D49
-;-------------------------------
-L2D3B:
- LD HL,(D_FILE) ; GET D_FILE
- LD BC,(G007_DISPLAY_OFFSET_FROM_DFILE_LESS_9)
- ADD HL,BC
- SET 7,H
- LD (G007_DISPLAY_ADDRESS_LESS_9),HL
- XOR A,A ; A = 0
-;-------------------------------
-L2D49:
- LD (G007_FLAG_3),A
- DEC HL
- LD A,(HL)
- EX DE,HL
- RET
-;-------------------------------
- LD A,(G007_FLAG_3)
- DEC A
- JP NZ,L2D73 ; [11635]
-;-------------------------------
- LD A,G007_INT_REG_VALUE_FOR_LO_RES_GRAPHICS
- LD I,A ; Interrupt register = 0x1E sets low res mode
- ADC HL,HL
- LD HL,(G007_DISPLAY_ADDRESS_LO_RES_LAST_LINE)
-
- LD BC,$0108
- LD A,$FE
- CALL DISPLAY_5;
- LD A,G007_INT_REG_VALUE_FOR_HI_RES_GRAPHICS
- LD I,A ; Interrupt register = 0x1F sets high res mode
- LD A,(MARGIN) ; GET MARGIN
- SUB 8
- JR L2D77
-;-------------------------------
-L2D73:
- DEC HL
- LD A,(MARGIN) ; GET MARGIN
-;-------------------------------
-L2D77:
- LD C,A
- POP IX
-;-------------------------------
- BIT 7,(IY+CDFLAG-RAMBASE) ; makes FD CB 3B 7E
- JP NZ,L029D ; []*BIOS ROM*
-;-------------------------------
-
-; This jumps into the middle of the DISPLAY_3, where it meets this code:
-;029D 79 LD A,C
-;029E ED;44 NEG
-;02A0 3C INC A
-;02A1 08 EX AF,AF'
-;02A2 D3;FE OUT (IO_PORT_KEYBOARD_RD),A ; ZX81 NMI GENERATOR on, for SLOW mode
-;02A4 E1 POP HL ; restore registers
-;02A5 D1 POP DE
-;02A6 C1 POP BC
-;02A7 F1 POP AF
-;02A8 C9 RET
-;-------------------------------
- LD A,$FE
- LD B,$01
- LD HL,HALT_AT_2D9A
- CALL LOAD_R_AND_WAIT_FOR_INT
- ADD HL,HL ; double HL
- NOP
- LD E,A
- LD HL,(G007_DISPLAY_ADDRESS_LESS_9)
- SET 7,H
- JP (IX)
-;===============================
-LOAD_R_AND_WAIT_FOR_INT ; mark_2D95
- ; Sets up the refresh register and waits for an interrupt:
- LD R,A ; Refresh row counter := accumulator
- LD A,221 ; 221 = $DD
- EI ; Enable interrupts, then drop into HALT
-;-------------------------------
-HALT_AT_2D9A:
-
- HALT
-;===============================
-; Copy two pages of ZX81 BASIC ROM to RAM patch areas,
-; then modify bytes as controlled by a table of offsets and values
-; This uses less memory than two whole pages of ROM
-; If the RAM patches are not changed thereafter,
-; one might be able to use a 16K ROM to hold two different versions of the ZX81 BASIC space,
-; one with the 'RAM' patch and one without.
-; The RAM testing would have to be disabled, because the ROM would cause it to fail.
-;-------------------------------
-#if NOT_G007
-ZX81_COPY:
-#else
-G007_COPY:
-#endif
-;-------------------------------
-; First check RAM by loading 512 bytes RAM from $2200 to $23FF with value 1,
-; and decrement them to zero to test they are working RAM
-;
- LD HL,RAM_PATCH_2200 ; destination RAM patch 2
- LD A,$24
-;-------------------------------
-mark_2DA0:
-G007_COPY_LOOP:
- LD (HL),1 ; try writing the value 1 to a byte in RAM patch 2
- DEC (HL) ; try decrementing it to zero
- JR Z,G007_COPY_SKIP ; if result is zero, skip error code report
-;-------------------------------
- RST $08
- defb $1A ; RST8 Arg ; Error Code:'R' (ZX81 on-board 1K/2K RAM not found)
-;-------------------------------
-G007_COPY_SKIP
-mark_2DA7:
- INC HL ; next address
- CP H ; has HL reached $2400 (yet?
- JR NZ,G007_COPY_LOOP ; no, repeat.
-;-------------------------------
- ; HL is now $2400
- ; Copy 256 bytes from BASIC ROM to RAM patch 1:
- LD H,L ; HL is now $0000 (data source is start of ZX81 BASIC ROM)
- LD DE,RAM_PATCH_2000 ; data destination
- LD BC,$0100 ; 256 bytes
- LDIR ; (HL) -> (DE) 256 times
-;-------------------------------
- ; HL is now $0100
- ; DE is now $2100
- ; BC is now $0000
-;-------------------------------
- INC H ; HL is now $0200
- INC D ; DE is now $2200
- INC B ; BC is now $0100
- LDIR ; copy another 256 bytes to RAM patch 2
-;-------------------------------
- LD HL,PRINT_CH ; src = the original ZX81 print character routine
- LD DE,G007_V23A0 ; dst =
- LD BC,$0060 ; 60hex = 96 bytes, so stops just before 0851 (the 'LPRINT_CH routine)
- LDIR ; move
- ; BC is now $0000
- LD D,$20 ; DE is now $20??
- LD HL,TABLE_ONE ; copy data from this table:
-LOOP_2DC9:
- LD B,(HL) ; BC is now $0A00 (seems way too many bytes)
- JR G007_TABLE_END_TEST ; branch to end-of-table test
-;-------------------------------
-G007_TABLE_ONE_LOOP:
- LD E,(HL) ; Get the offset
- INC HL ; next byte is data
- LD A,(HL) ; Get the data byte
- LD (DE),A ; ($2000+offset) = data byte
-;-------------------------------
-G007_TABLE_END_TEST:
-mark_2DD0:
- INC HL ; next offset
- DJNZ G007_TABLE_ONE_LOOP ; repeat until BC is zero
-;-------------------------------
- INC D ; D becomes $21
- BIT 2,D ; test bit 2 (has D incremented to $23 ?)
- JR Z,LOOP_2DC9
-
- RET
-;===============================
-; Delete Display File:
-;
-G007_DELETE_DISPLAY_FILE:
- CALL SET_FAST;
- LD HL,$3E87
- CALL LINE_ADDR;
- RET NZ
-;-------------------------------
- EX DE,HL
- LD HL,(NXT_LINE) ;
- BIT 6,(HL)
- JR Z,L2DEF
-;-------------------------------
- LD (NXT_LINE),DE ;
-;-------------------------------
-L2DEF:
- LD HL,(D_FILE) ;
- JP RECLAIM_1 ; exit
-;-------------------------------
-L2DF5:
- CALL G007_DELETE_DISPLAY_FILE
- LD BC,$1992 ; 6546 decimal =
- LD HL,(D_FILE) ;
- DEC HL
- CALL MAKE_ROOM
-
- LD A,ZX_NEWLINE
- LD (DE),A ; to DE
- INC DE
- LD (DE),A ; and DE+1
-
- INC HL ; HL += 2
- INC HL
-
- LD (HL),$3E ; (HL++) = $3E 'Y'
- INC HL
- LD (HL),$87 ; (HL++) = $87
- INC HL
- LD (HL),$8D ; (HL++) = $8D
- INC HL
- LD (HL),$19 ; (HL++) = $19 ';'
- INC HL
- LD (HL),A ; (HL++) = ZX_NEWLINE
- INC HL
- LD (HL),A ; (HL++) = ZX_NEWLINE
-;-------------------------------
-L2E18:
- CALL SLOW_FAST ;
- LD A,1
- JR G007_CLS_HI_RES
-;-------------------------------
-G007_CHECK_AND_SET_UP_DISPLAY_FILE:
- ;
- LD HL,(V2265) ; in the RAM page 2 area ! Usually $4027
- LD DE,$BFD9 ; 3FD9 + 32K, or -16423 = 16K - 39 bytes
- ADD HL,DE
-
- LD A,(V2264)
- SUB CHARS_HORIZONTAL+1 ; bytes per screen line
-
- OR A,H
- OR A,L
-
- CALL NZ,G007_COPY
- LD HL,(D_FILE) ; GET D_FILE
- LD A,ZX_NEWLINE
-
- DEC HL
- DEC HL
- CP (HL) ; pointing to a HALT?
-
- CALL NZ,L2DF5 ; no,
- ; else yes
- LD HL,(D_FILE) ; GET D_FILE
- LD DE,(G007_DISPLAY_OFFSET_FROM_DFILE_LESS_9)
- ADD HL,DE
- LD (G007_DISPLAY_ADDRESS_LESS_9),HL
-
- LD DE,9 ; HL += 9
- ADD HL,DE
-
- LD (G007_DISPLAY_ADDRESS),HL
- RET
-;-------------------------------
-G007_CLS_N:
-;
- CALL STK_TO_A
- RET NZ ; drop through if zero flag set
-;-------------------------------
-; Clear The Screen:
-;
-G007_CLS_A:
- DEC A
- JP M,CLS ; if A was zero
-;-------------------------------
-G007_CLS_HI_RES:
- PUSH AF
- CALL G007_CHECK_AND_SET_UP_DISPLAY_FILE
- POP AF
-;-------------------------------
- CP 2
- LD BC,(G007_DISPLAY_HEIGHT)
- LD HL,(D_FILE)
- JR NC,L2E96
-;-------------------------------
- DEC A
-
- INC HL
- LD (DF_CC),HL ; Addr. for PRINT AT position
- DEC HL
-
- DEC HL
- DEC HL
-
- LD E,0 ; E = 0 is byte to fill screen
-;-------------------------------
-loop_2E70:
- LD B,16 ; 16
- DEC HL
- LD (HL),E ; but writes 2 bytes for each loop
- DEC HL
- LD (HL),E ; perhaps to reduce loop overhead?
-;-------------------------------
-loop_2E76:
- DEC HL
- LD (HL),A ; writes A twice over
- DEC HL
- LD (HL),A
- DJNZ loop_2E76
-;-------------------------------
- DEC C
- JR NZ,loop_2E70
-;------------------------------- ; C is now zero
- LD B,9 ; BC is now $0900
- LD A,1
-;-------------------------------
-loop_2E83:
- DEC HL
- LD (HL),E ; (--HL) = E while --BC
- DJNZ loop_2E83
-;------------------------------- ; BC is now zero
- LD HL,G007_LINE_TYPE
- LD B,20 ; decimal 20
- DEC A
- JR Z,loop_2E83
-;-------------------------------
- LD HL,256*CHARS_VERTICAL + CHARS_HORIZONTAL + 1
- LD (S_POSN),HL ; SET S_POSN
- RET
-;===============================
-L2E96:
- RET NZ
-
- DEC HL ; HL -= 2
- DEC HL
-;------------------------------- outer loop
-loop_2E99:
- LD B,32 ; 32 bytes to invert
- DEC HL ; HL -= 2
- DEC HL ; skips past 2 HALT characters
-
-;------------------------------- inner loop
-loop_2E9D:
- DEC HL
-
- LD A,(HL) ; read
- CPL ; invert (one's complement)
- LD (HL),A ; write
-
- DJNZ loop_2E9D
-;-------------------------------
- DEC C ; C is obviously the number of horizontal lines to invert
- JR NZ,loop_2E99
-;-------------------------------
- RET
-;-------------------------------
-mark_2EA7:
-DIM_007: ; 2EA7
- LD HL,($0A96)
- LD A,$4D
- JR L2EE3
-;-------------------------------
-PAUSE_007:
- LD A,$DD
- JR skip_2EE0
-;-------------------------------
-SLOW_007: ; 2EB2
- LD A,$D6
- JR skip_2EB8
-;-------------------------------
-FAST_007: ; 2EB6
- LD A,$CE
-;-------------------------------
-skip_2EB8:
- PUSH AF
-
- CALL STK_TO_A
- LD B,$1E
- DEC A
- CP 6
- JR NC,skip_2EDC
-;-------------------------------
- SRL A
- LD H,A
-;-------------------------------
- JR Z,skip_2ECA
- LD A,1
-skip_2ECA:
-;-------------------------------
- PUSH AF
- SBC A,A
- LD L,A
- RES 1,H
- DEC H
- LD (G007_RESTART),HL
- CALL G007_CHECK_AND_SET_UP_DISPLAY_FILE
- LD B,G007_INT_REG_VALUE_FOR_HI_RES_GRAPHICS
- POP AF
-
- LD (G007_FLAG_2),A
-;-------------------------------
-skip_2EDC:
- LD A,B ;
- LD I,A ; I = B = G007_INT_REG_VALUE_FOR_HI_RES_GRAPHICS = set video mode
- POP AF
-;-------------------------------
-skip_2EE0:
- LD HL,($0D71) ; inside the 'COMMAND CLASS 2' routine of the ZX BASIC ROM
-;-------------------------------
-L2EE3:
- ADD A,L
- LD L,A
- JP (HL)
-
- LD D,A
- LD A,(S_POSN) ;
- AND $80
- JP L2B6C
-;===============================
-L2EEF: ; print a character on high-res screen perhaps?
- LD A,D
- POP DE
-
- EXX
-;-------------------------------
- PUSH HL
- PUSH DE
- PUSH BC
-;-------------------------------
- LD HL,(G007_CHAR_TABLE_ADDR_0_63)
- ADD A,A ; if (A < 128) goto
- JR NC,skip_2F06
-;------------------------------- ;
- LD HL,(G007_CHAR_TABLE_ADDR_128_159)
- BIT 6,A
- JR Z,skip_2F06
-;-------------------------------
- LD HL,(G007_USR_DEF_CHR_TAB_LESS_256)
- CCF
-;-------------------------------
-skip_2F06:
- EX DE,HL ; DE now points to the selected charater table
-
- LD L,A ; HL = A
- LD H,0
-
- SBC A,A ; A = carry
- LD C,A ;
-;-------------------------------
- LD A,(G007_RESTART) ; invert this variable
- CPL
- AND A,(IY+G007_RESTART+1-RAMBASE)
-;-------------------------------
- XOR A,C
- LD C,A
-
- ADD HL,HL ; HL *= 4
- ADD HL,HL
- ADD HL,DE ; HD += DE
-
- LD B,8
-
- EXX
- PUSH DE
- RET
-;===============================
-L2F1D: ; The copied and modified PRINT_CH / WRITE_CH jumps here from $23FF
- DEC (IY+S_POSN-RAMBASE) ; Line and Column for PRINT AT
- LD A,24 ; 24 character rows per screen
- SUB B
- LD B,A
-;
- ADD A,A
- ADD A,A
- ADD A,A
- LD L,A ; L = A * 8
-;
- LD A,(G007_DISPLAY_HEIGHT)
- SUB L ; A = G007_DISPLAY_HEIGHT - something
- RET C ; return if beyond limit
-;-------------------------------
- LD A,CHARS_HORIZONTAL+1 ; 32 video bytes plus HALT ?
- SUB C
- LD C,A
-;-------------------------------
- LD H,0
- ADD HL,HL
- ADD HL,BC
- LD BC,(G007_DISPLAY_ADDRESS)
- ADD HL,BC ; HL = L*2 + BC + G007_DISPLAY_ADDRESS:
-;-------------------------------
- CALL L2EEF
- LD BC,$0022 ; B = 0, C = 34
- EXX
-;-------------------------------
-COPY_007:
-loop_2F41: ;
- LD A,C
- XOR A,(HL)
- EXX
- LD (HL),A
- ADD HL,BC
- EXX
- INC HL
- DJNZ loop_2F41
-;-------------------------------
- JP L299A
-;-------------------------------
-SAVE_007: ; 2F4D
- CALL G007_DELETE_DISPLAY_FILE
- JP SAVE
-;-------------------------------
-L2F53:
- CALL STK_TO_A
- RET NZ
-
- DEC A
- JP M,COPY ; A was zero, jump to low-res copy-to-printer
-;-------------------------------
- CALL G007_CHECK_AND_SET_UP_DISPLAY_FILE ; check we have a display
- CALL SET_FAST ; print in FAST mode!
- LD A,(G007_DISPLAY_HEIGHT)
- LD B,A ; B = (G007_DISPLAY_HEIGHT)
- LD HL,(G007_DISPLAY_ADDRESS)
- XOR A,A ; A = 0
- LD E,A ; E = 0
- OUT (ZX_PRINTER_PORT),A
-;-------------------------------
-loop_2F6C:
- LD A,$7F ; looks pointless
- IN A,(IO_PORT_KEYBOARD_RD)
- RRCA
- JP NC,$0886 ; []*BIOS ROM* between 0880 COPY-BRK and 0888 REPORT-D2
- IN A,(ZX_PRINTER_PORT)
-;-------------------------------
-loop_2F76:
- ADD A,A
- JP M,L2FAD
-;-------------------------------
- JR NC,loop_2F6C
-;-------------------------------
- LD C,$20 ; 32
-;-------------------------------
-loop_2F7E:
- PUSH BC
- LD C,(HL)
- LD B,8
-;------------------------------- ; outer loop
-loop_2F82:
- RLC C
- RRA
- OR A,E
- LD D,A
-;------------------------------- ; inner loop
-loop_2F87:
- IN A,(ZX_PRINTER_PORT) ; read printer port bit 0 into carry flag
- RRA
- JR NC,loop_2F87 ; repeat while bit is zero
-;-------------------------------
- LD A,D
- OUT (ZX_PRINTER_PORT),A ; D register to printer
- DJNZ loop_2F82
-;-------------------------------
- INC HL
- POP BC
- DEC C
- JR NZ,loop_2F7E
-;-------------------------------
- INC HL
- INC HL
- LD A,3
-;-------------------------------
- CP B
- JR C,skip_2F9F
-;-------------------------------
- LD E,A
- DEC E
-skip_2F9F:
-;-------------------------------
-loop_2F9F:
- IN A,(ZX_PRINTER_PORT) ; read printer port bit 0 into carry flag
- RRA
- JR NC,loop_2F9F ; repeat while bit is zero
-;-------------------------------
- LD A,E
- OUT (ZX_PRINTER_PORT),A ; E register to printer
- DJNZ loop_2F6C
-;-------------------------------
- LD A,4
- OUT (ZX_PRINTER_PORT),A
-;-------------------------------
-L2FAD:
- JP SLOW_FAST ; normal
- EI
- DJNZ loop_2F76
-;-------------------------------
- defb $3E ; something to do with the table below?
-;-------------------------------
-TABLE_ONE:
-;
-; this table is copied to offsets from $2000, $2200, and $2300
-;-------------------------------
-; Modify 9 bytes in page 20xx / 00xx:
-;-------------------------------
-L2FB4 :
- defb (9+1) ; Modify 9 bytes in page 20xx / 00xx:
-;-------------------------------
-; Original routine Modifications made in page 00xx
-;
-L2FB5:
-; 0011 C2;F1;07 JP NZ,PRINT_CH ; old
-; 0011 C2;A0;23 JP NZ,L23A0 ; new, jump somewhere in RAM ???
-
- defb $12
- defb $A0
- defb $13
- defb $23
-;-------------------------------
-L2FB9
-; 0014 F5 07 JP PRINT_SP ; $07F5
-; 2014 A4 23 JP L23A4 ; new, jumps to somewhere in RAM
-
- defb $15
- defb $A4
- defb $16
- defb $23
-;-------------------------------
-; 003F CB;D9 SET 3,C ; old
-; 003F CB;C1 SET 0,C ; new
-
-L2FBD: defb $40
-L2FBE: defb $C1
-;-------------------------------
-; 005F CD;07;02 CALL SLOW_FAST ; 0207 is old
-; 005F CD;08;2D CALL SLOW_FAST_007 ; 2D08 is new
-
-L2FBF: defb $60
-L2FC0: defb $08
-L2FC1: defb $61
-L2FC2: defb $2D
-;-------------------------------
-; 0074 2A;0C;40 LD HL,(D_FILE)
-; 0074 2A;06:23 LD HL,(G007_DISPLAY_ADDRESS_LESS_9) ; new
-
-L2FC3: defb $75
-L2FC4: defb $06
- defb $76
-L2FC6: defb $23
-;-------------------------------
-; Modifications made in page 02xx
-;-------------------------------
-L2FC7: defb $01
- defb $0A
-
-; 0253 06;0B LD B,$0B
-; 2253 06;02 LD B,$02
-
-L2FC9 defb $54
- defb $02
-;-------------------------------
-; 0283 01;01;19 LD BC,$1901
-; 2283 01;01;C1 LD BC,$C101
-L2FCB: defb $85
- defb $C1
-;-------------------------------
-; 027E CD;92;02 CALL DISPLAY_3
-; 227E CD;73;2D CALL L2D73
-;
-L2FCD: defb $7F
- defb $73
-L2FCF: defb $80
- defb $2D
-;-------------------------------
-; 028C CD;92;02 CALL $0292 ; [DISPLAY-3]
-; 228C CD;50;2D CALL $2D50
-L2FD1: defb $8D
-L2FD2: defb $50
-L2FD3: defb $8E
-L2FD4: defb $2D
-;-------------------------------
-; 02E3 32;28;40 LD ($4028),A ; SET MARGIN
-; 22E3 C3;0E;2D JP L2D0E
-L2FD5: defb $E3
-L2FD6: defb $C3
- defb $E4
- defb $0E
-L2FD9: defb $E5
-L2FDA: defb $2D
-;-------------------------------
-L2FDB: defb $13 ; some kind of marker?
-;-------------------------------
-;
-; Original routine Modifications made to the copy of the PRINT-CH routines:
-;
-;
-; Variables in the sparsely populated G007 RAM areas
-;
-; Initialise 18 (decimal, = 12 in hex)RAM variables at $23xx:
-;
-; 2FE0 E6 0A ; 23E6 0A
-; 2FE2 55 0D ; 2355 0D
-; 2FE4 1E 0F ; 231E 0F
-; 2FE6 16 20 ; 2316 20
-; 2FE8 10 07 ; 2310 07
-; 2FEA 11 08 ; 2311 08
-; 2FEC 18 C0 ; 2318 C0
-;
-;------------------ ; G007_DISPLAY_OFFSET_FROM_DFILE_LESS_9 = E675 (6675 echoed in top 32K ???)
-L2FDC: defb $00 ; 2300 75
- defb $75
-;------------------
-L2FDE: defb $01 ; 2301 E6
- defb $E6
-;------------------
-L2FE0: defb $0A
-;------------------
-L2FE1: defb $55 ; 2355 0D
-L2FE2: defb $0D
-;------------------
-L2FE3: defb $1E ; 231E 0F
-L2FE4: defb $0F
-;------------------
- defb $1E ; some kind of marker?
-;------------------
-L2FE6: defb $16 ; 2316 20
- defb $20
-;------------------ ; G007_PLOT_ROUTINES_VECTOR = G007_PLOT_ROUTINES_VECTOR_DEFAULT = $0807
-L2FE8: defb $10 ; 2310 07
- defb $07
-;------------------
-L2FEA: defb $11 ; 2311 08
- defb $08
-;------------------
-L2FEC: defb $18 ; 2318 C0
- defb $C0
-;------------------
-L2FEE: defb $35 ; 2335 EE
- defb $EE
-;------------------
-L2FF0: defb $36 ; 2336 55
- defb $55
-;------------------
-L2FF2: defb $37 ; 2337 C6
- defb $C6
-;------------------
-; The values below were seen in RAM but are not initialised from this table:
-;
-; 2306 84 4084 G007_DISPLAY_ADDRESS_LESS_9
-; 2307 40
-; 2308 8D 408D G007_DISPLAY_ADDRESS
-; 2309 40
-; 230A 55 00 55,00 G007_TRIANGLE_TEXTURE
-; 230C 00 1E00 Character table address for CHR$0-63
-; 230D 1E
-; 230E 00 1E00 Character table address for CHR$128-159
-; 230F 1E
-;------------------
-; Modding offsets in copied code:
-;------------------
-; 07FD CD 08 08 CALL $0808 ; [ENTER-CH]
-; 23AC CD E6 2E CALL $2EE6
-;
-L2FF4: defb $AD
- defb $E6
- defb $AE
- defb $2E
-;------------------
-; 0843 FD 35 39 DEC (IY+SPOSN-RAMBASE)
-; 23F2 C3 1D 2F JP $2F1D
-;
-L2FF8: defb $F2
- defb $C3
-
- defb $F3
- defb $1D
-
- defb $F4
- defb $2F
-;------------------
-;
-; 083E 77 LD (HL),A ; WRITE-CH
-; 23ED 00 NOP ; WRITE-CH modified!
-;
-L2FFE: defb $ED
- defb $00
-;------------------
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-; end of g007 stuff
-;
-#endif
-
-
-
-#code $3800,$0800
-
-
-
-
-#if 1
-
-mark_3800: DEFB $21, $00, $38 ; ld hl,Source
-mark_3803: DEFB $11, $00, $78 ; ld de,Destination
-mark_3806: DEFB $01, $00, $08 ; ld bc,MonitorSize
-mark_3809: DEFB $ED, $B0 ; ldir
-mark_380B: DEFB $3E, $74 ; ld a,74
-mark_380D: DEFB $32, $05, $40 ; ld (RamtopHi),a
-mark_3810: DEFB $CD, $C3, $03 ; call New
-
-mark_3813: DEFB $3E, $01 ; ld a,01
-mark_3815: DEFB $01, $93, $7B ; ld bc,Input_Prompt_Data
-mark_3818: DEFB $CD, $02, $79 ; call Get_A_addresses
-mark_381B: DEFB $CD, $2A, $0A ; call Cls
-mark_381E: DEFB $ED, $6B, $F8, $7F ; ld hl,Next_Address
-mark_3822: DEFB $E9 ; jp (hl)
-
-; Routine 0 the disassembler
-mark_3823: DEFB $CD, $FD, $78, $CD, $09
-mark_3828: DEFB $79, $18, $05, $16, $13, $CD, $53, $7B
-mark_3830: DEFB $CD, $81, $7B, $30, $05, $AF, $32, $21
-mark_3838: DEFB $40, $C9
-mark_383A: DEFB $21, $7B, $40, $36, $30, $23
-mark_3840: DEFB $36, $78, $CD, $2E, $7A, $CD, $72, $7A
-mark_3848: DEFB $78, $FE, $76, $20, $08, $21, $F5, $7C
-mark_3850: DEFB $CD, $A4, $7B, $18, $D6, $FE, $CB, $28
-mark_3858: DEFB $32, $FE, $ED, $28, $38, $FE, $DD, $28
-mark_3860: DEFB $44, $FE, $FD, $28, $44, $CD, $4F, $7A
-mark_3868: DEFB $2E, $24, $FE, $00, $28, $11, $2E, $2C
-mark_3870: DEFB $FE, $01, $28, $0E, $2C, $FE, $02, $28
-mark_3878: DEFB $09, $3E, $5E, $32, $42, $7D, $2C, $7D
-mark_3880: DEFB $81, $6F, $26, $7D, $6E, $EB, $CD, $D4
-mark_3888: DEFB $7A, $18, $A0, $CD, $72, $7A, $CD, $4F
-mark_3890: DEFB $7A, $C6, $36, $18, $EC, $CD, $72, $7A
-mark_3898: DEFB $CD, $4F, $7A, $2E, $18, $FE, $01, $28
-mark_38A0: DEFB $DE, $2E, $20, $18, $DA, $3E, $0B, $18
-mark_38A8: DEFB $02, $3E, $0D, $32, $41, $7D, $3E, $12
-mark_38B0: DEFB $32, $40, $7D, $2A, $F8, $7F, $23, $7E
-mark_38B8: DEFB $21, $16, $7D, $CD, $89, $7A, $23, $CB
-mark_38C0: DEFB $BE, $CD, $72, $7A, $78, $FE, $CB, $20
-mark_38C8: DEFB $05, $CD, $72, $7A, $18, $BD, $CD, $4F
-mark_38D0: DEFB $7A, $FE, $03, $28, $93, $F5, $C5, $FE
-mark_38D8: DEFB $00, $20, $05, $3E, $06, $B8, $20, $03
-mark_38E0: DEFB $CD, $72, $7A, $C1, $F1, $18, $81
-
-; Spare bytes
-mark_38E7: DEFB $00
-mark_38E8: DEFB $00, $00, $00, $00, $00, $00, $00, $00
-mark_38F0: DEFB $00, $00, $00, $00, $00, $00, $00, $00
-mark_38F8: DEFB $00, $00, $00, $00, $00
-
-; Start/Finish Addresses
-; prints request for input then calls input address routine
-mark_38FD: DEFB $01, $93, $7B
-mark_3900: DEFB $3E, $02
-
-; Get_A_addresses
-mark_3902: DEFB $11, $F8, $7F, $CD, $14, $7A, $C9
-
-; Check printer
-mark_3909: DEFB $11, $E1, $10, $CD, $3B, $7B, $2B
-mark_3910: DEFB $7E, $21, $21, $40, $36, $83, $FD, $CB
-mark_3918: DEFB $01, $CE, $FE, $1D, $C4, $2A, $0A, $C9
-
-; routine 1: DEFB hex dump
-mark_3920: DEFB $CD, $FD, $78, $CD, $09, $79, $21, $F9
-mark_3928: DEFB $7C, $CD, $9F, $7B, $21, $7B, $40, $36
-mark_3930: DEFB $33, $23, $36, $79, $CD, $81, $7B, $F8
-mark_3938: DEFB $CD, $3D, $7A, $0E, $08, $CD, $72, $7A
-mark_3940: DEFB $0D, $28, $0B, $CD, $81, $7B, $30, $F5
-mark_3948: DEFB $16, $0B, $CD, $53, $7B, $C9
-mark_394E: DEFB $CD, $48, $79, $18, $E1
-
-; routine 2: DEFB write
-mark_3953: DEFB $3E, $01, $01, $93, $7B
-mark_3958: DEFB $CD, $02, $79, $CD, $2A, $0A, $CD, $0E
-mark_3960: DEFB $0C, $CD, $3D, $7A, $11, $E8, $1C, $CD
-mark_3968: DEFB $A5, $7F, $CB, $45, $28, $05, $CD, $AD
-mark_3970: DEFB $7F, $18, $F7, $ED, $5B, $F8, $7F, $CD
-mark_3978: DEFB $0B, $7B, $ED, $53, $F8, $7F, $3E, $76
-mark_3980: DEFB $D7, $18, $DB
-
-; prints data associated with RST 08 or RST 28
-mark_3983: DEFB $0D, $20, $24, $0E, $04
-mark_3988: DEFB $16, $13, $CD, $53, $7B, $18, $18, $78
-mark_3990: DEFB $FE, $01, $20, $1A, $21, $7B, $40, $36
-mark_3998: DEFB $62, $23, $36, $7A, $16, $13, $CD, $53
-mark_39A0: DEFB $7B, $21, $F9, $7C, $CD, $9F, $7B, $CD
-mark_39A8: DEFB $3D, $7A, $CD, $72, $7A, $C9
-mark_39AE: DEFB $FE, $05
-mark_39B0: DEFB $C0, $21, $7B, $40, $36, $68, $23, $36
-mark_39B8: DEFB $7A, $0E, $04, $CD, $9C, $79, $78, $FE
-mark_39C0: DEFB $34, $C8, $CD, $83, $79, $18, $F7
-
-; Data Calculates absolute address for JR instructions
-; and adds number and addresses to mnemonic
-mark_39C7: DEFB $CD
-mark_39C8: DEFB $72, $7A, $AF, $CB, $78, $28, $01, $2F
-mark_39D0: DEFB $48, $47, $2A, $F8, $7F, $09, $EB, $21
-mark_39D8: DEFB $00, $7D, $7B, $CD, $89, $7A, $2B, $7A
-mark_39E0: DEFB $CD, $89, $7A, $23, $CB, $BE, $2B, $18
-mark_39E8: DEFB $1B, $CD, $72, $7A, $2B, $18, $15, $CD
-mark_39F0: DEFB $07, $7A, $18, $10, $CD, $72, $7A, $2B
-mark_39F8: DEFB $18, $03, $CD, $07, $7A, $2B, $CD, $A4
-mark_3A00: DEFB $7B, $21, $0D, $7C, $C3, $A4, $7B, $21
-mark_3A08: DEFB $00, $7D, $CD, $75, $7A, $CD, $72, $7A
-mark_3A10: DEFB $CB, $BE, $2B, $C9
-
-; Input_Address
-mark_3A14: DEFB $F5, $D5, $11, $E4
-mark_3A18: DEFB $10, $CD, $3B, $7B, $7D, $BB, $28, $05
-mark_3A20: DEFB $CD, $AD, $7F, $18, $F7, $D1, $CD, $21
-mark_3A28: DEFB $7B, $F1, $3D, $20, $E7, $C9
-
-; Initial
-mark_3A2E: DEFB $21, $42
-mark_3A30: DEFB $7D, $36, $5C, $2B, $36, $09, $2B, $36
-mark_3A38: DEFB $0F, $2B, $2B, $36, $E0
-
-; Next_Address
-mark_3A3D: DEFB $11, $F9, $7F
-mark_3A40: DEFB $21, $FE, $7C, $1A, $CD, $7F, $7A, $1B
-mark_3A48: DEFB $1A, $CD, $7F, $7A, $AF, $D7, $C9
-
-; Octal
-mark_3A4F: DEFB $78
-mark_3A50: DEFB $E6, $07, $4F, $78, $F5, $E6, $38, $0F
-mark_3A58: DEFB $0F, $0F, $47, $F1, $E6, $C0, $07, $CB
-mark_3A60: DEFB $07, $C9
-
-; Cont, $RST
-mark_3A62: DEFB $CD, $A1, $79, $C3, $2B, $78
-mark_3A68: DEFB $0E, $04, $CD, $A1, $79, $CD, $BE, $79
-mark_3A70: DEFB $18, $F3
-
-; Next_Byte
-mark_3A72: DEFB $21, $FE, $7C, $ED, $5B, $F8
-mark_3A78: DEFB $7F, $1A, $13, $ED, $53, $F8, $7F, $CD
-mark_3A80: DEFB $89, $7A, $D7, $23, $7E, $CB, $BF, $D7
-mark_3A88: DEFB $C9
-mark_3A89: DEFB $47, $E6, $0F, $C6, $1C, $CB, $FF
-mark_3A90: DEFB $77, $2B, $78, $E6, $F0, $1F, $1F, $1F
-mark_3A98: DEFB $1F, $C6, $1C, $77, $C9
-
-; Offsets
-mark_3A9D: DEFB $CB, $40, $20
-mark_3AA0: DEFB $19, $CD, $B3, $7A, $13, $C9
-mark_3AA6: DEFB $3E, $01
-mark_3AA8: DEFB $CB, $40, $20, $1E, $18, $05, $CB, $40
-mark_3AB0: DEFB $28, $0F, $13, $AF, $18, $14, $CB, $40
-mark_3AB8: DEFB $28, $07, $13, $78, $CB, $87, $0F, $18
-mark_3AC0: DEFB $09, $CD, $BB, $7A, $13, $C9
-mark_3AC7: DEFB $78, $18
-mark_3AC8: DEFB $01, $79, $13, $62, $6B, $6E, $26, $7C
-mark_3AD0: DEFB $CD, $A5, $7B, $C9
-
-; Control
-mark_3AD4: DEFB $1A, $F5, $E6, $07
-mark_3AD8: DEFB $21, $DD, $7A, $18, $1E, $F1, $F5, $CB
-mark_3AE0: DEFB $77, $28, $0D, $2A, $3E, $7D, $CB, $55
-mark_3AE8: DEFB $36, $00, $23, $28, $F9, $22, $3E, $7D
-mark_3AF0: DEFB $E6, $38, $0F, $0F, $CB, $0F, $28, $0C
-mark_3AF8: DEFB $21, $04, $7B, $E5, $3C, $26, $7D, $6F
-mark_3B00: DEFB $6E, $26, $7A, $E9, $F1, $CB, $7F, $C0
-mark_3B08: DEFB $13, $18, $C9
-
-; Transfer
-mark_3B0B: DEFB $C5, $7D, $2E, $E0, $95
-mark_3B10: DEFB $0F, $47, $7E, $CD, $8C, $7B, $23, $86
-mark_3B18: DEFB $D6, $1C, $12, $13, $23, $10, $F3, $C1
-mark_3B20: DEFB $C9
-mark_3B21: DEFB $C5, $06, $02, $2B, $4E, $2B, $7E
-mark_3B28: DEFB $CD, $8C, $7B, $81, $D6, $1C, $12, $13
-mark_3B30: DEFB $10, $F2, $C1, $3E, $76, $D7, $D7, $C9
-
-mark_3B38: DEFB $11, $EF, $10, $CD, $33, $78, $26, $7E
-mark_3B40: DEFB $0A, $6F, $CD, $9F, $7B, $03, $0A, $6F
-mark_3B48: DEFB $03, $CD, $A4, $7B, $CD, $53, $7B, $CD
-mark_3B50: DEFB $A5, $7F, $C9
-
-; Print_String
-mark_3B53: DEFB $C5, $D5, $E5, $FD, $CB
-mark_3B58: DEFB $21, $46, $28, $08, $ED, $4B, $39, $40
-mark_3B60: DEFB $4A, $CD, $0B, $09, $11, $E0, $7F, $ED
-mark_3B68: DEFB $4B, $3E, $7D, $06, $00, $79, $D6, $E0
-mark_3B70: DEFB $4F, $CD, $6B, $0B, $FD, $CB, $21, $4E
-mark_3B78: DEFB $28, $03, $3E, $76, $D7, $E1, $D1, $C1
-mark_3B80: DEFB $C9
-
-; Check_Finish
-mark_3B81: DEFB $2A, $FA, $7F, $ED, $5B, $F8, $7F
-mark_3B88: DEFB $A7, $ED, $52, $C9
-mark_3B8C: DEFB $D6, $1C, $07, $07
-mark_3B90: DEFB $07, $07, $C9
-
-; data for input prompt messages
-mark_3B93: DEFB $DD, $E3, $EB, $E3, $F2
-mark_3B98: DEFB $F8, $D5, $DC, $30, $E3, $D0, $E3
-
-; Add_String, for building mnemonic
-mark_3B9F: DEFB $3E
-mark_3BA0: DEFB $E0, $32, $3E, $7D, $AF, $C5, $D5, $A7
-mark_3BA8: DEFB $28, $0B, $CB, $7E, $20, $03, $23, $18
-mark_3BB0: DEFB $F9, $3D, $23, $18, $F2, $CD, $BB, $7B
-mark_3BB8: DEFB $D1, $C1, $C9
-mark_3BBB: DEFB $ED, $5B, $3E, $7D, $7E
-mark_3BC0: DEFB $CB, $7F, $20, $05, $CD, $CB, $7B, $18
-mark_3BC8: DEFB $F2, $CB, $BF, $FE, $40, $30, $08, $12
-mark_3BD0: DEFB $13, $ED, $53, $3E, $7D, $23, $C9
-mark_3BD7: DEFB $23
-mark_3BD8: DEFB $ED, $53, $3E, $7D, $E5, $FE, $43, $30
-mark_3BE0: DEFB $06, $26, $7D, $6F, $6E, $18, $14, $FE
-mark_3BE8: DEFB $64, $30, $05, $26, $7D, $6F, $18, $0B
-mark_3BF0: DEFB $21, $FE, $7B, $E5, $26, $7D, $6F, $6E
-mark_3BF8: DEFB $26, $79, $E9, $CD, $BB, $7B, $E1, $C9
-;
-; data for mnemonics
-; lower case are ZX inverse characters
-;
-mark_3C00: DEFB $A7, $A8, $A9, $AA, $AD, $B1, $C0, $A6
-mark_3C08: DEFB $A6, $C1, $A6, $10, $43, $91, $10, $45
-mark_3C10: DEFB $91, $E7, $E7, $C3, $C5, $C1, $C2, $62
-mark_3C18: DEFB $A8, $45, $A8, $47, $D6, $49, $D6, $47
-mark_3C20: DEFB $A6, $49, $A6, $29, $26, $A6, $28, $35
-mark_3C28: DEFB $B1, $38, $28, $AB, $28, $28, $AB, $9C
-mark_3C30: DEFB $9D, $9E, $9F, $A0, $A1, $A2, $A3, $35
-mark_3C38: DEFB $3A, $38, $AD, $56, $31, $B1, $37, $2A
-mark_3C40: DEFB $B9, $4B, $BD, $2F, $B5, $CD, $58, $A9
-mark_3C48: DEFB $58, $A8, $38, $3A, $A7, $38, $C3, $26
-mark_3C50: DEFB $33, $A9, $3D, $34, $B7, $34, $B7, $28
-mark_3C58: DEFB $B5, $35, $34, $B5, $37, $38, $B9, $2F
-mark_3C60: DEFB $B5, $80, $D3, $E2, $CB, $CB, $29, $AE
-mark_3C68: DEFB $2A, $AE, $E5, $E8, $66, $1A, $A6, $4F
-mark_3C70: DEFB $E6, $10, $5C, $11, $DA, $45, $DA, $80
-mark_3C78: DEFB $80, $10, $41, $91, $5C, $DA, $CF, $CF
-mark_3C80: DEFB $80, $CF, $80, $80, $80, $80, $33, $BF
-mark_3C88: DEFB $BF, $33, $A8, $A8, $35, $B4, $35, $AA
-mark_3C90: DEFB $B5, $B2, $47, $A8, $49, $A8, $C7, $C9
-mark_3C98: DEFB $38, $31, $A6, $38, $37, $A6, $E4, $38
-mark_3CA0: DEFB $C7, $27, $2E, $B9, $37, $2A, $B8, $38
-mark_3CA8: DEFB $2A, $B9, $10, $28, $91, $33, $2A, $AC
-mark_3CB0: DEFB $B3, $AE, $38, $C3, $58, $A8, $2E, $B2
-mark_3CB8: DEFB $9C, $A4, $9D, $9E, $CD, $CD, $CD, $CD
-mark_3CC0: DEFB $49, $A9, $47, $A9, $2E, $9A, $37, $9A
-mark_3CC8: DEFB $CF, $CF, $80, $80, $5E, $1A, $DE, $E9
-mark_3CD0: DEFB $E9, $E0, $E0, $E0, $E0, $A6, $A6, $AE
-mark_3CD8: DEFB $B7, $80, $80, $AE, $A9, $2E, $B7, $29
-mark_3CE0: DEFB $B7, $CD, $28, $B5, $E2, $D3, $34, $B9
-mark_3CE8: DEFB $33, $34, $B5, $CB, $29, $2F, $33, $BF
-mark_3CF0: DEFB $D1, $D1, $D1, $D1, $D1, $2D, $26, $31
-mark_3CF8: DEFB $B9, $45, $2B, $A7, $10, $1D, $A9, $27
-;
-; data and data pointers for disassembler
-;
-mark_3D00: DEFB $9F, $A6, $C9, $B3, $AE, $BB, $9D, $B6
-mark_3D08: DEFB $C6, $2D, $B1, $2E, $BD, $2E, $BE, $10
-mark_3D10: DEFB $41, $91, $10, $41, $15, $2A, $27, $91
-mark_3D18: DEFB $CD, $D3, $D9, $DF, $3C, $E8, $EB, $EE
-mark_3D20: DEFB $F3, $F3, $F3, $F5, $91, $81, $89, $6D
-mark_3D28: DEFB $6A, $F9, $7B, $3A, $70, $9C, $A1, $76
-mark_3D30: DEFB $A4, $AA, $AD, $FC, $B3, $96, $B8, $BB
-mark_3D38: DEFB $C1, $C7, $87, $1B, $81, $A1, $E4, $7F
-mark_3D40: DEFB $0F, $09, $5C, $27, $A8, $29, $AA, $37
-mark_3D48: DEFB $B1, $37, $B7, $2A, $BD, $31, $A9, $26
-mark_3D50: DEFB $9A, $2F, $B7, $34, $3A, $B9, $28, $A6
-mark_3D58: DEFB $26, $A9, $1A, $C1, $38, $B5, $26, $AB
-mark_3D60: DEFB $1A, $E9, $2E, $B3, $E9, $EF, $F4, $FA
-mark_3D68: DEFB $8F, $C7, $FA, $17, $00, $E0, $17, $13
-mark_3D70: DEFB $7A, $45, $00, $8A, $C5, $00, $F5, $59
-mark_3D78: DEFB $3E, $13, $77, $7A, $45, $00, $92, $C5
-mark_3D80: DEFB $9E, $58, $45, $13, $15, $AA, $C5, $6A
-mark_3D88: DEFB $13, $72, $45, $0B, $07, $B2, $C5, $07
-mark_3D90: DEFB $0B, $7F, $E8, $82, $87, $CB, $62, $5C
-mark_3D98: DEFB $2F, $90, $B8, $6B, $7F, $46, $7E, $81
-mark_3DA0: DEFB $00, $FA, $3E, $86, $7A, $43, $86, $92
-mark_3DA8: DEFB $C5, $6A, $FF, $5F, $6A, $7A, $3B, $86
-mark_3DB0: DEFB $92, $C5, $6A, $7F, $46, $7E, $82, $9E
-mark_3DB8: DEFB $CF, $92, $00, $7A, $A1, $2F, $8A, $C5
-mark_3DC0: DEFB $00, $7A, $A4, $2F, $8A, $C5, $00, $7A
-mark_3DC8: DEFB $A7, $2F, $8A, $C5, $00, $7A, $63, $00
-mark_3DD0: DEFB $92, $C5, $AA, $52, $62, $AA, $BA, $C5
-mark_3DD8: DEFB $00, $50, $B2, $15, $A2, $C5, $13, $6A
-mark_3DE0: DEFB $45, $11, $13, $9A, $C5, $13, $11, $00
-mark_3DE8: DEFB $BA, $3E, $B0, $FA, $B6, $B8, $7F, $BC
-mark_3DF0: DEFB $C4, $87, $D5, $B9, $E1, $D7, $BC, $E2
-mark_3DF8: DEFB $D7, $FA, $19, $00, $D8, $37, $13, $6A
-;
-; print data for menu & routines
-;
-mark_3E00: DEFB $00, $00, $00, $00, $32, $2A, $33, $BA
-mark_3E08: DEFB $00, $00, $00, $00, $14, $14, $14, $94
-mark_3E10: DEFB $1C, $00, $35, $37, $2E, $33, $39, $00
-mark_3E18: DEFB $28, $34, $29, $AA, $1D, $00, $2D, $2A
-mark_3E20: DEFB $3D, $00, $29, $3A, $32, $B5, $1E, $00
-mark_3E28: DEFB $3C, $37, $2E, $39, $AA, $1F, $00, $2E
-mark_3E30: DEFB $33, $38, $2A, $37, $B9, $20, $00, $29
-mark_3E38: DEFB $2A, $31, $2A, $39, $AA, $21, $00, $39
-mark_3E40: DEFB $37, $26, $33, $38, $2B, $2A, $B7, $22
-mark_3E48: DEFB $00, $38, $2A, $26, $37, $28, $AD, $23
-mark_3E50: DEFB $00, $37, $2A, $35, $31, $26, $28, $AA
-mark_3E58: DEFB $24, $00, $26, $38, $38, $2A, $32, $27
-mark_3E60: DEFB $31, $2A, $B7, $25, $00, $37, $3A, $33
-mark_3E68: DEFB $00, $28, $34, $29, $AA, $26, $00, $28
-mark_3E70: DEFB $26, $31, $28, $3A, $31, $26, $39, $34
-mark_3E78: DEFB $B7, $27, $00, $28, $2D, $37, $0D, $00
-mark_3E80: DEFB $29, $3A, $32, $B5, $28, $00, $26, $38
-mark_3E88: DEFB $28, $2E, $2E, $00, $29, $3A, $32, $B5
-mark_3E90: DEFB $29, $00, $37, $2A, $33, $3A, $32, $27
-mark_3E98: DEFB $2A, $B7, $2A, $00, $2E, $32, $26, $2C
-mark_3EA0: DEFB $2A, $B7, $2B, $00, $32, $2A, $33, $3A
-mark_3EA8: DEFB $00, $9E, $80, $80, $00, $00, $00, $00
-mark_3EB0: DEFB $00, $00, $00, $00, $00, $00, $00, $00
-mark_3EB8: DEFB $00, $00, $00, $00, $00, $00, $00, $00
-mark_3EC0: DEFB $00, $00, $00, $00, $00, $00, $00, $00
-mark_3EC8: DEFB $00, $00, $00, $00, $00, $00, $00, $00
-mark_3ED0: DEFB $31, $2E, $32, $2E, $B9, $37, $34, $3A
-mark_3ED8: DEFB $39, $2E, $33, $2A, $80, $38, $39, $26
-mark_3EE0: DEFB $37, $39, $80, $26, $29, $29, $37, $2A
-mark_3EE8: DEFB $38, $38, $80, $2B, $2E, $33, $2E, $38
-mark_3EF0: DEFB $2D, $80, $1D, $00, $2B, $34, $37, $80
-mark_3EF8: DEFB $35, $37, $2E, $33, $39, $2A, $37, $80
-
-; addresses of routines
-mark_3F00: DEFB $23, $78 ;, $.dw, $7823
-mark_3F02: DEFB $20, $79 ; , $.dw, $7902
-mark_3F04: DEFB $53, $79 ;, $.dw, $7953
-mark_3F06: DEFB $FF, $FF
-mark_3F08: DEFB $FF, $FF
-mark_3F0A: DEFB $FF, $FF
-mark_3F0C: DEFB $FF, $FF
-mark_3F0E: DEFB $FF, $FF
-mark_3F10: DEFB $FF, $FF
-mark_3F12: DEFB $13, $38 ;, $.dw, $3813
-mark_3F14: DEFB $FF, $FF
-mark_3F16: DEFB $FF, $FF
-mark_3F18: DEFB $FF, $FF
-mark_3F1A: DEFB $FF, $FF
-mark_3F1C: DEFB $FF, $FF
-mark_3F1E: DEFB $FF, $FF
-
-; Read_Keyboard
-mark_3F20: DEFB $D5, $C5, $E5, $2A, $25, $40, $E5, $ED
-mark_3F28: DEFB $4B, $25, $40, $E1, $C5, $A7, $ED, $42
-mark_3F30: DEFB $28, $F5, $79, $3C, $28, $F1, $E1, $CD
-mark_3F38: DEFB $BD, $07, $7E, $E1, $C1, $D1, $FE, $76
-mark_3F40: DEFB $C8, $FE, $77, $C8, $FE, $00, $20, $05
-mark_3F48: DEFB $CD, $2A, $0A, $CF, $0C, $FE, $1C, $38
-mark_3F50: DEFB $CF, $FE, $2C, $30, $CB, $C9
-;
-; Menu
-;
-mark_3F56: DEFB $21, $21
-mark_3F58: DEFB $40, $CB, $7E, $28, $04, $2A, $7B, $40
-mark_3F60: DEFB $E9, $21, $00, $7E, $06, $14, $3E, $03
-mark_3F68: DEFB $32, $21, $40, $11, $E1, $18, $CD, $9F
-mark_3F70: DEFB $7B, $CD, $53, $7B, $10, $F8, $01, $99
-mark_3F78: DEFB $7B, $CD, $3B, $7B, $2B, $7E, $D6, $1C
-mark_3F80: DEFB $47, $07, $6F, $26, $7F, $7E, $23, $66
-mark_3F88: DEFB $6F, $E5, $C5, $CD, $2A, $0A, $C1, $3E
-mark_3F90: DEFB $E0, $32, $3E, $7D, $78, $21, $10, $7E
-mark_3F98: DEFB $CD, $A5, $7B, $16, $1A, $CD, $53, $7B
-mark_3FA0: DEFB $3E, $76, $D7, $D7, $C9
-;
-; InputString, the heart of all routines
-;
-mark_3FA5: DEFB $3E, $01, $32
-mark_3FA8: DEFB $21, $40, $21, $E0, $7F, $36, $17, $CD
-mark_3FB0: DEFB $C0, $7F, $CD, $20, $7F, $FE, $76, $20
-mark_3FB8: DEFB $10, $3E, $E0, $BD, $28, $F4, $36, $00
-mark_3FC0: DEFB $23, $22, $3E, $7D, $CD, $53, $7B, $2B
-mark_3FC8: DEFB $C9
-mark_3FC9: DEFB $FE, $77, $20, $0B, $3E, $E0, $BD
-mark_3FD0: DEFB $28, $DB, $CD, $BE, $7F, $2B, $18, $D5
-mark_3FD8: DEFB $77, $7B, $BD, $28, $D0, $23, $18, $CD
-;
-; mnemonic string, ram area for mnemonic to be built up
-;
-mark_3FE0: DEFB $00, $00, $00, $00, $00, $00, $00, $00
-mark_3FE8: DEFB $00, $00, $00, $00, $00, $00, $00, $00
-;
-; spare bytes
-;
-mark_3FF0: DEFB $00, $00, $00, $00, $00, $00, $00, $00
-;
-; next address for routine
-;
-mark_3FF8: DEFB $00, $00
-;
-; finish address for routine
-;
-mark_3FFA: DEFB $00, $00
-;
-; spare bytes
-;
-mark_3FFC: DEFB $00, $00, $00
-mark_3FFF: DEFB $C9 ; ret
-
-
-#else
-;
-;
-;
-Input_Prompt_Data equ $7B93
-Get_A_addresses equ $7902
-Next_Address equ $7FFB
-#endif
-
-
-
-
-
-
-
-
-#end ; required by zasm
-
-
+#end