// ZX81 ASSEMBLY & BASIC FILE FOR ZX-IDE // GET ZX-IDE AT https://www.sinclairzxworld.com/viewtopic.php?f=6&t=1064 ; Enable and Disable BREAK DURING INKEY$ ; SIMPLE WORD PROCESSOR DEMO for 2K ZX81 ; BASED ON work by Bean at https://www.sinclairzxworld.com/viewtopic.php?p=19092#p19092 ; When the BREAK key is disabled you can actually read the SPACE and "£" keys with INKEY$ format zx81 ;labelusenumeric ;LISTON PAL EQU 55 NTSC EQU 31 SLOW_MODE EQU $40 FAST_MODE EQU 0 NOAUTORUN EQU 0 ERR_NR EQU $4000 ;DB ;16384 FLAGS EQU $4001 ;DB ;16385 ERR_SP EQU $4002 ;DW ;16386 RAMTOP EQU $4004 ;DW ;16388 MODE EQU $4006 ;DB ;16390 PPC EQU $4007 ;DW ;16391 ORG $4009 VERSN db $00 E_PPC dw $0000 D_FILE dw DFILE_ADDR DF_CC dw DFILE_ADDR +1 VARS dw VARS_ADDR DEST dw $0000 E_LINE dw WORKSPACE CH_ADD dw $0000 X_PTR dw $0000 STKBOT dw WORKSPACE STKEND dw WORKSPACE BERG db $00 MEM dw MEMBOT UNUSED1 db $00 DF_SZ db $02 S_TOP dw $0000 LAST_K dw $0000 DEBOUNCE db $00 MARGIN db PAL NXTLIN dw AUTORUN OLDPPC dw $0000 FLAGX db $00 STRLEN dw $0000 T_ADDR dw $0000 SEED dw $0000 FRAMES dw $0000 COORDS db $00 db $00 PR_CC db $BC S_POSN db $21 db $18 CDFLAG db SLOW_MODE PRBUFF db $00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00 db $76 MEMBOT db $00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00 UNUSED2 dw $0000 macro dbinv va { local dbsize dbsize: dbzx va s=$-dbsize while s>0 lod vb byte from $-s store byte vb xor 128 at $-s s=s-1 end while } //TYPE YOUR BASIC PROGRAM HERE ; 1 REM ...................................................................... HIDE=0 IF HIDE=0 1 REM _asm ;PHASE $066C ;ORIGINAL ROM ROUTINE ORG $066C, BUT IS RELOCATABLE CODE NEXT_LINE_CPY:LD (NXTLIN),HL EX DE,HL CALL $004D ;TEMP-PTR CALL $0CC1 ;LINE-RUN RES 1,(IY+ FLAGS-$4000) LD A,$C0 LD (IY+ X_PTR+1-$4000),A CALL $14A3 ;X-TEMP RES 5,(IY+ FLAGX-$4000) BIT 7,(IY+ERR_NR-$4000) JR Z,STOP_LINE_CPY LD HL,(NXTLIN) AND (HL) JR NZ,STOP_LINE_CPY LD D,(HL) INC HL LD E,(HL) LD (PPC),DE INC HL LD E,(HL) INC HL LD D,(HL) INC HL EX DE,HL ADD HL,DE CALL $0F46 ;BREAK-1 L40B9:JR C,NEXT_LINE_CPY LD HL,ERR_NR BIT 7,(HL) JR Z,STOP_LINE_CPY LD (HL),$0C STOP_LINE_CPY:dbzx '....' ;DEPHASE END _asm END IF AUTORUN: 2 REM COPY & MODIFY 'NEXT-LINE' ROM ROUTINE 3 GOSUB 1000 4 PRINT "±±±±±ôêîñíæ±ùðóå±ñóðãæôôðó±±±±±±" 5 PRINT "±±±±±±ñóæôô±ôéêçõÎò±õð±æïå±±±±±±" 10 REM DISABLE BREAK, WHICH NORMALLY ENDS INKEY$ WITH 'D' REPORT (INTERRUPTED BY BREAK) 11 RAND USR 16521 20 REM THE WORD PROCESSOR: USE INKEY$ EVERY TIME, PRINT THE CHARACTER TYPED 21 LET A$=INKEY$ 30 IF A$="" THEN GOTO 20 40 IF INKEY$ = """" THEN STOP //'9' REPORT (STOP EXECUTED) 50 PRINT A$; 60 IF INKEY$<>"" THEN GOTO 60 70 GOTO 20 1000 REM COPY ROM ROUTINE 'NEXT-LINE' TO REM 1 1001 FOR A=1644 TO 1709 // 1644/$066C TO $06AD 'NEXT-LINE' ROM ROUTINE 1010 POKE 14870+A,PEEK A // 14870+A/$3A16+A: 16514/$4082 1020 NEXT A 1030 REM CHANGE LINE 1 REM TO 0 REM SO THAT IT IS NON-EDITABLE 1031 POKE 16510,0 //$407E LINE NUMBER LOW BYTE 1040 REM MODIFY THE CODE SLIGHTLY TO IGNORE BREAK 1041 REM CHANGE 'JR C,NEXT_LINE' TO 'JR NEXT_LINE' 1042 POKE 16569,24 //$40B9,$18 1050 REM MODIFY IT JUMP BACK TO THE ROM: ADD AT END OF CODE 'JP STOP-LINE' 1051 POKE 16580,195 //$40C4 POKE #STOP_LINE,195 ;$C3 'STOP_LINE_CPY: JP STOP-LINE($06AE)' 1052 POKE 16581,174 //$40C5 POKE #STOP_LINE+1,174 ;$AE 1053 POKE 16582,6 //$40C6 POKE #STOP_LINE+2,6 ;$06 1060 RETURN DFILE_ADDR: db $76 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 dbzx '',13 assert (VARS_ADDR-DFILE_ADDR)>24 VARS_ADDR: //Variables Resident in Memory: //none db $80 ; end of VARS WORKSPACE: ; end of program