zx81-rom

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
Mzx81plus.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