diff --git a/README.md b/README.md index 5d821cd..97b4663 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ More details of the features added in version 5.00 can be found in the file WHAT The files in green constitute the generic BBC BASIC interpreter which is shared by all the editions, it (just!) fits in 16 Kbytes so could be held in a ROM of this size. The files in -the blue box are used to build the CP/M edition. The files in the red box are used to build -the Acorn Z80 Second Processor edition (in principle: the source files are on an 8" floppy!) +the blue box are used to build the generic CP/M edition. The files in the red box are used +to build the Acorn Z80 Second Processor edition. Note that the name 'BBC BASIC' is used by permission of the British Broadcasting Corporation and is not transferrable to a derived or forked work. diff --git a/WHATSNEW.TXT b/WHATSNEW.TXT index 2f96ea4..e435ae1 100644 --- a/WHATSNEW.TXT +++ b/WHATSNEW.TXT @@ -50,17 +50,18 @@ New features in BBC BASIC (Z80) version 5.00, June 2024: 4.1 Bit-shifts <<, >>, >>> 4.2 Floating-point indirection (|) -4.3 RETURNed parameters from FN/PROC -4.4 Compound assignment (+=, -=, *=, /= etc.) -4.5 Assigning to a sub-string: LEFT$()=, MID$()= , RIGHT$()= -4.6 Hooks for CIRCLE,ELLIPSE,FILL,LINE,MOUSE,ORIGIN,RECTANGLE,TINT,SYS,WAIT -4.7 Hooks for WIDTH function, TINT function, MODE function +4.3 Additional VDU delimiter '|' +4.4 RETURNed parameters from FN/PROC +4.5 Compound assignment (+=, -=, *=, /= etc.) +4.6 Assigning to a sub-string: LEFT$()=, MID$()= , RIGHT$()= +4.7 Hooks for CIRCLE,ELLIPSE,FILL,LINE,MOUSE,ORIGIN,RECTANGLE,SYS,TINT,WAIT +4.8 Hooks for MODE function, TINT function, WIDTH function 5. Extensions to Acorn's BASIC V, compatible with BB4W, BBCSDL and BBCTTY 5.1 EXIT REPEAT / WHILE / FOR [var] 5.2 Address-of operator (^) -5.3 Byte variables and arrays (& suffix) +5.3 Byte (unsigned 8-bit) variables and arrays (& suffix) 5.4 'BY len' and 'TO term' qualifiers to GET$#file 5.5 ELSE IF THEN; (trailing semicolon) 5.6 == synonymous with = in comparisons diff --git a/bin/acorn/BBCBASIC.COM b/bin/acorn/BBCBASIC.COM new file mode 100644 index 0000000..db61258 Binary files /dev/null and b/bin/acorn/BBCBASIC.COM differ diff --git a/bin/acorn/MAKE.SUB b/bin/acorn/MAKE.SUB new file mode 100644 index 0000000..37b3633 --- /dev/null +++ b/bin/acorn/MAKE.SUB @@ -0,0 +1,13 @@ +z80asm main/rmf +z80asm exec/rmf +z80asm eval/rmf +z80asm asmb/rmf +z80asm math/rmf +z80asm amos/rmf +z80asm acorn/rmf +z80asm data/rmf +era bbctube.com +link bbctube=/p:0100,main,exec,eval,asmb,math,acorn,amos,/p:4B00,data +hexbin bbctube +era bbctube.hex +ren bbctube.com=bbctube.bin diff --git a/bin/cpm/BBCBASIC.COM b/bin/cpm/BBCBASIC.COM index 0b3f046..dc7cbcb 100644 Binary files a/bin/cpm/BBCBASIC.COM and b/bin/cpm/BBCBASIC.COM differ diff --git a/src/ACORN.Z80 b/src/ACORN.Z80 new file mode 100644 index 0000000..404b8ea --- /dev/null +++ b/src/ACORN.Z80 @@ -0,0 +1,737 @@ + TITLE COPYRIGHT (C) R.T.RUSSELL 1983-2024 +; +;PATCH FOR BBC BASIC TO CP/M 2.2 & 3.0 +;* ACORN COMPUTERS Z80 TUBE VERSION * +;(C) COPYRIGHT R.T.RUSSELL, 02-01-1984 +;VERSION 5.0, 16-06-2024 +; +OSWRCH EQU 0FFEEH +OSWORD EQU 0FFF1H +OSBYTE EQU 0FFF4H +; +ESC EQU 1BH +TBY EQU 0FH +TTO EQU 0B8H +TFILL EQU 03H +; + EXTRN ITEMI + EXTRN EXPRI + EXTRN COMMA + EXTRN TERMQ + EXTRN BRAKET + EXTRN EXTERR + EXTRN STOREN + EXTRN TRAP + EXTRN VAR + EXTRN NXT + EXTRN XEQ +; + EXTRN ACCS + EXTRN COUNT + EXTRN WIDTH + EXTRN SCRAP +; + GLOBAL OSCALL + GLOBAL CLRSCN + GLOBAL PUTCSR + GLOBAL GETCSR + GLOBAL PUTIME + GLOBAL GETIME + GLOBAL OSKEY +; + GLOBAL CLG + GLOBAL MOVE + GLOBAL DRAW + GLOBAL PLOT + GLOBAL MODE + GLOBAL COLOUR + GLOBAL GCOL + GLOBAL ADVAL + GLOBAL SOUND + GLOBAL ENVEL + GLOBAL POINT +; + GLOBAL CIRCLE + GLOBAL ELLIPS + GLOBAL FILL + GLOBAL MOUSE + GLOBAL ORIGIN + GLOBAL RECTAN + GLOBAL LINE + GLOBAL TINT + GLOBAL WAIT + GLOBAL SYS +; + GLOBAL PUTIMS + GLOBAL GETIMS + GLOBAL TINTFN + GLOBAL MODEFN + GLOBAL WIDFN +; +;GETIME - Read elapsed-time clock. +; Outputs: DEHL = elapsed time (centiseconds) +; Destroys: A,D,E,H,L,F +; +GETIME: LD A,1 + LD HL,SCRAP + CALL OSWORD + LD HL,SCRAP + LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + EX DE,HL + RET +; +;GETIMS - Read real-time clock as string. +; Outputs: TIME$ in string accumulator +; E = string length (25) +; Destroys: A,B,C,D,E,H,L,F +; +GETIMS: LD A,14 + LD HL,SCRAP + LD (HL),0 + CALL OSWORD + LD HL,SCRAP + LD DE,ACCS + LD A,(HL) + CP E + RET Z + LD BC,25 + LDIR + RET +; +; +;PUTIME - Load elapsed-time clock. +; Inputs: DEHL = time to load (centiseconds) +; Destroys: A,D,E,H,L,F +; +PUTIME: PUSH IX + LD IX,SCRAP + LD (IX+0),L + LD (IX+1),H + LD (IX+2),E + LD (IX+3),D + LD A,2 + LD HL,SCRAP + CALL OSWORD + POP IX + RET +; +;PUTIMS - Wtite real-time clock as string. +; Inputs: string in string accumulator +; E = string length +; Destroys: A,B,C,D,E,H,L,F +; +PUTIMS: LD A,E ;Length + CP 26 + RET NC + LD B,0 + LD C,A + LD DE,SCRAP+1 + LD HL,ACCS + LDIR + LD HL,SCRAP + LD (HL),A + LD A,15 + JP OSWORD +; +; +;CLRSCN - Clear screen. +; Destroys: A,D,E,H,L,F +; +CLRSCN: LD A,0CH + JP OSWRCH +; +; +;OSKEY - Sample keyboard with specified wait. +; Inputs: HL = Time to wait (centiseconds) +; Outputs: Carry reset indicates time-out. +; If carry set, A = character typed. +; Destroys: A,D,E,H,L,F +; +OSKEY: LD A,129 + CALL OSBYTE + LD A,H + OR A + RET NZ ;TIME-OUT, CARRY RESET + LD A,L + SCF + RET ;NORMAL, CARRY SET +; +;PUTCSR - Move cursor to specified position. +; Inputs: DE = horizontal position (LHS=0) +; HL = vertical position (TOP=0) +; Destroys: A,D,E,H,L,F +; +PUTCSR: LD A,1FH + CALL OSWRCH + LD A,E + CALL OSWRCH + LD A,L + JP OSWRCH +; +;GETCSR - Return cursor coordinates. +; Outputs: DE = X coordinate (POS) +; HL = Y coordinate (VPOS) +; Destroys: A,D,E,H,L,F +; +GETCSR: LD A,134 + CALL OSBYTE + LD E,L + LD L,H + LD D,0 + LD H,D + RET +; +;POINT - var=POINT(x,y) +; +POINT: CALL EXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + POP DE + CALL BRAKET + LD IX,SCRAP + LD (IX+0),E + LD (IX+1),D + LD (IX+2),L + LD (IX+3),H + LD HL,SCRAP + LD A,9 + CALL OSWORD + LD A,(IX+4) + LD L,A + ADD A,1 + SBC A,A + LD H,A +RETEXX: EXX + LD H,A + LD L,A + XOR A + LD C,A + RET +; +;ADVAL - var=ADVAL(n) +; +ADVAL: CALL ITEMI + EXX + LD A,128 + CALL OSBYTE + XOR A + JR RETEXX +; +;MODEFN - var=MODE +; +MODEFN: LD A,135 + CALL OSBYTE + LD L,H +RETU8: XOR A + LD H,A + JR RETEXX +; +;WIDFN - var=WIDTH +; +WIDFN: LD A,(WIDTH) + LD L,A + JR RETU8 +; +;ENVEL - ENVELOPE var,var,var,var,var,var,var, +; var,var,var,var,var,var,var +; +ENVEL: LD B,0 + LD IX,SCRAP + PUSH BC + PUSH IX +ENVEL1: CALL EXPRI + EXX + POP IX + POP BC + LD (IX),L + LD A,B + CP 13 + JR Z,ENVEL2 + INC B + INC IX + PUSH BC + PUSH IX + CALL COMMA + JR ENVEL1 +ENVEL2: LD HL,SCRAP + LD A,8 + CALL OSWORD + JP XEQ +; +;SOUND - SOUND var,var,var,var +; +SOUND: LD B,0 + LD IX,SCRAP + PUSH BC + PUSH IX +SOUND1: CALL EXPRI + EXX + POP IX + POP BC + LD (IX+0),L + LD (IX+1),H + INC IX + INC IX + INC B + INC B + LD A,B + CP 8 + JR Z,SOUND2 + PUSH BC + PUSH IX + CALL COMMA + JR SOUND1 +SOUND2: LD HL,SCRAP + LD A,7 + CALL OSWORD + JP XEQ +; +;MODE - MODE n +; +MODE: CALL EXPRI + XOR A + LD (COUNT),A + EXX + LD H,L + LD L,22 + CALL WRCH2 + JR XEQGO1 +; +;CLG +; +CLG: LD A,16 + CALL OSWRCH + JR XEQGO1 +; +;ORIGIN x,y +; +ORIGIN: CALL EXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + POP DE + LD C,29 + CALL WRCH5 + JR XEQGO1 +; +;COLOUR n +;COLOUR n,p +;COLOUR n,r,g,b +; +COLOUR: CALL EXPRI ;n + EXX + LD A,(IY) + CP ',' + JR Z,PALCOL + LD H,L + LD L,17 + CALL WRCH2 + JR XEQGO1 +; +PALCOL: PUSH HL + CALL CEXPRI ;p or r + EXX + EX DE,HL + LD HL,0 + LD A,(IY) + CP ',' + JR NZ,PALET1 + PUSH DE + CALL CEXPRI ;g + EXX + PUSH HL + CALL CEXPRI ;b + EXX + POP DE + POP BC + LD A,L + POP HL + LD D,C ;r + LD C,L ;n + LD L,E ;g + LD H,A ;b + LD E,16 + PUSH BC +PALET1: POP BC + LD B,19 + CALL WRCH6 + JR XEQGO1 +; +;GCOL [a,]b +; +GCOL: CALL EXPRI + EXX + LD E,0 + LD A,(IY) + CP ',' + JR NZ,GCOL0 + PUSH HL + CALL CEXPRI + EXX + POP DE +GCOL0: LD H,L + LD L,E + LD D,18 + CALL WRCH3 ;DLH +XEQGO1: JP XEQ +; +;LINE x1,y1,x2,y2 +; +LINE: CALL EXPRI + EXX + PUSH HL + CALL EXPR3 + EX (SP),HL ;HL <- x1, (SP) <- y2 + PUSH BC + EX DE,HL + LD C,4 + CALL VDU25 + POP DE + POP HL + LD C,5 + JR PLOT4A +; +;CIRCLE [FILL] x,y,r +; +CIRCLE: CP TFILL + PUSH AF + JR NZ,CIRCL0 + INC IY +CIRCL0: CALL EXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + POP BC ;y + POP DE ;x + PUSH HL + LD L,C + LD H,B + LD C,4 ; PLOT 4 = MOVE + CALL VDU25 + POP DE ;r + LD HL,0 + POP AF + LD C,145 ; PLOT 145 = outline circle + JR NZ,PLOT4A + LD C,153 ; PLOT 153 = filled circle +PLOT4A: JR PLOT4 +; +;ELLIPSE [FILL] x,y,a,b +; +ELLIPS: CP TFILL + PUSH AF + JR NZ,ELLIP0 + INC IY +ELLIP0: CALL EXPRI + EXX + PUSH HL + CALL EXPR3 + EX (SP),HL ;HL <- x, (SP) <- b + PUSH BC + EX DE,HL + LD C,4 ; PLOT 4 = Move absolute + CALL VDU25 + POP DE ;a + PUSH DE + LD HL,0 + LD C,L ; PLOT 0 - Move relative + CALL VDU25 + POP DE ;a + XOR A + LD L,A + LD H,A + SBC HL,DE + EX DE,HL + POP HL ;b + POP AF + LD C,193 ; PLOT 193 = outline ellipse + JR NZ,PLOT4 + LD C,201 ; PLOT 201 = filled ellipse + JR PLOT4 +; +;MOVE [BY} x,y +;DRAW [BY] x,y +;PLOT [BY] [n,]x,y +;FILL [BY] x,y +; +MOVE: LD C,4 + JR PLOT1 +; +DRAW: LD C,5 + JR PLOT1 +; +FILL: LD C,133 + JR PLOT1 +; +PLOT: LD C,69 + CP TBY + JR Z,PLOT1 + CALL EXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + LD A,(IY) + CP ',' + JR Z,PLOT3 + POP DE + LD C,69 + JR PLOT4 +; +PLOT1: CP TBY + JR NZ,PLOT2 + INC IY + RES 2,C ;Change absolute to relative +PLOT2: PUSH BC + CALL EXPRI + EXX +PLOT3: PUSH HL + CALL CEXPRI + EXX + POP DE + POP BC +PLOT4: CALL VDU25 + JP XEQ +; +;RECTANGLE [FILL] x,y,w[,h] [TO xnew,ynew] +; +RECTAN: CP TFILL + PUSH AF + JR NZ,RECT0 + INC IY +RECT0: CALL EXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + PUSH HL + LD A,(IY) + CP ',' + JR NZ,RECT1 + CALL CEXPRI + EXX +RECT1: POP BC ;w + POP DE ;y + EX (SP),HL ;HL <- x, (SP) <- h + PUSH BC + EX DE,HL + LD C,4 + CALL VDU25 + LD A,(IY) + CP TTO + JR Z,RECTTO + POP DE ;w + POP HL ;h + POP AF + JR NZ,OUTLIN + LD C,97 + JR PLOT4 +; +;Block copy / move: +; +RECTTO: INC IY ; Bump over TO + CALL EXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + POP BC ;newx + POP DE ;w + EX (SP),HL ;HL <- h, (SP) <- newy + PUSH BC + EX DE,HL + LD C,0 + CALL VDU25 + POP DE ;newx + POP HL ;newy + POP AF + LD C,190 ; PLOT 190 - Block copy + JR NZ,PLOT4B + DEC C ; PLOT 189 - Block move +PLOT4B: JR PLOT4 +; +;Outline rectangle: +; +OUTLIN: LD C,9 ; PLOT 9 - draw relative + PUSH HL + LD HL,0 + CALL VDU25 ; side 1 + POP HL + PUSH DE + LD DE,0 + CALL VDU25 ; side 2 + POP DE + PUSH HL + XOR A + LD L,A + LD H,A + SBC HL,DE + EX DE,HL + LD L,A + LD H,A + CALL VDU25 ; side 3 + POP DE + XOR A + LD L,A + LD H,A + SBC HL,DE + LD E,A + LD D,A + JR PLOT4B +; +;MOUSE x, y, b +; +MOUSE: LD A,128 + LD HL,9 + CALL OSBYTE + PUSH HL + LD A,128 + LD HL,8 + CALL OSBYTE + PUSH HL + LD A,128 + LD HL,7 + CALL OSBYTE + PUSH HL + CALL VAR + POP HL + CALL STOREI + CALL COMMA + CALL NXT + CALL VAR + POP HL + CALL STOREI + CALL COMMA + CALL NXT + CALL VAR + POP HL + CALL STOREI +XEQGO2: JP XEQ +; +;WAIT [n] +; +WAIT: CALL TERMQ + JR Z,XEQGO2 + CALL EXPRI + EXX + LD B,H + LD C,L + CALL GETIME + ADD HL,BC + LD BC,0 + EX DE,HL + ADC HL,BC + EX DE,HL +WAIT1: CALL TRAP + PUSH DE + PUSH HL + CALL GETIME + POP BC + OR A + SBC HL,BC + LD H,B + LD L,C + EX DE,HL + POP BC + SBC HL,BC + JR NC,XEQGO2 + EX DE,HL + LD D,B + LD E,C + JR WAIT1 +; +;OSCALL - Trap call to FFxx +; +OSCALL: POP HL ;DITCH RETURN ADDRESS + LD HL,OSRET + PUSH HL ;NEW RETURN ADDRESS + LD A,(IX+4) ;A% + LD E,(IX+20) ;E% + LD H,(IX+100) ;Y% + LD L,(IX+96) ;X% + JP (IY) +OSRET: PUSH AF + LD A,L ;F H L A + LD L,H ;| | | | + EXX ;| | | | + POP BC ;| | | | + LD H,A ;| | | | + LD L,B ;H L H' L' + LD A,C + EXX + LD H,A + RET +; +VDU25: LD B,25 +WRCH6: LD A,B + CALL OSWRCH +WRCH5: LD A,C + CALL OSWRCH +WRCH4: LD A,E + CALL OSWRCH +WRCH3: LD A,D + CALL OSWRCH +WRCH2: LD A,L + CALL OSWRCH + LD A,H + JP OSWRCH +; +EXPR3: CALL CEXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + PUSH HL + CALL CEXPRI + EXX + POP BC ;x2 + POP DE ;y1 + RET +; +CEXPRI: CALL COMMA + JP EXPRI +; +STOREI: BIT 7,A + JR NZ,EEK + BIT 6,A + JR NZ,EEK + EXX + LD HL,0 + LD C,L + JP STOREN +; +EEK: LD A,50 + CALL EXTERR + DEFB 13H ;'Bad ' + DEFB 04H ;'MOUSE' + DEFB 20H + DEFB 15H ;'variable' + DEFB 0 +; +TINT: +TINTFN: +SYS: + XOR A + CALL EXTERR + DEFM 'Sorry' + DEFB 0 +; + END + \ No newline at end of file diff --git a/src/AMOS.Z80 b/src/AMOS.Z80 new file mode 100644 index 0000000..711db2f --- /dev/null +++ b/src/AMOS.Z80 @@ -0,0 +1,1119 @@ + TITLE BBC BASIC (C) R.T.RUSSELL 1984-2024 +; +;PATCH FOR BBC BASIC TO CP/M 2.2 & 3.0 +;* ACORN COMPUTERS Z80 TUBE VERSION * +;(C) COPYRIGHT R.T.RUSSELL, 08-05-1984 +;VERSION 5.0, 14-06-2024 +; + GLOBAL OSINIT + GLOBAL OSRDCH + GLOBAL OSWRCH + GLOBAL OSLINE + GLOBAL OSSAVE + GLOBAL OSLOAD + GLOBAL OSOPEN + GLOBAL OSSHUT + GLOBAL OSBGET + GLOBAL OSBPUT + GLOBAL OSSTAT + GLOBAL GETEXT + GLOBAL GETPTR + GLOBAL PUTPTR + GLOBAL PROMPT + GLOBAL RESET + GLOBAL LTRAP + GLOBAL OSCLI + GLOBAL TRAP + GLOBAL BYE + GLOBAL SCRAP +; + EXTRN ESCAPE + EXTRN EXTERR + EXTRN CHECK + EXTRN CRLF +; + EXTRN ACCS + EXTRN FREE + EXTRN CURLIN + EXTRN USER + EXTRN VERMSG +; +;OSSAVE - Save an area of memory to a file. +; Inputs: HL addresses filename (term CR) +; DE = start address of data to save +; BC = length of data to save (bytes) +; Destroys: A,B,C,D,E,H,L,F +; +STSAVE: CALL SAVLOD ;*SAVE + JP C,HUH ;"Bad command" + PUSH HL + JR OSS1 +; +OSSAVE: PUSH BC ;SAVE + CALL SETUP0 +OSS1: EX DE,HL + CALL CREATE + JR NZ,SAVE + LD A,190 + CALL EXTERR + DEFM 'Directory full' + DEFB 0 +SAVE: CALL WRITE + ADD HL,BC + EX (SP),HL + SBC HL,BC + EX (SP),HL + JR Z,SAVE1 + JR NC,SAVE +SAVE1: POP BC +CLOSE: LD A,16 + CALL BDOS1 + INC A + RET NZ + LD A,200 + CALL EXTERR + DEFM 'Close error' + DEFB 0 +; +;OSSHUT - Close disk file(s). +; Inputs: E = file channel +; If E=0 all files are closed +; Destroys: A,B,C,D,E,H,L,F +; +OSSHUT: LD A,E + OR A + JR NZ,SHUTIT +SHUT0: INC E + BIT 3,E + RET NZ + PUSH DE + CALL SHUT1 + POP DE + JR SHUT0 +; +SHUTIT: CALL FIND1 + JR NZ,SHUT2 + JP CHANER +; +SHUT1: CALL FIND1 + RET Z +SHUT2: XOR A + LD (HL),A + DEC HL + LD (HL),A + LD HL,37 + ADD HL,DE + BIT 7,(HL) + INC HL + CALL NZ,WRITE + LD HL,FCBSIZ + ADD HL,DE + LD BC,(FREE) + SBC HL,BC + JR NZ,CLOSE + LD (FREE),DE ;RELEASE SPACE + JR CLOSE +; +;TYPE - *TYPE command. +;Types file to console output. +; +TYPE: SCF ;*TYPE + CALL OSOPEN + OR A + JR Z,NOTFND + LD E,A +TYPE1: CALL TRAP ;IMPORTANT (ACORN) + CALL OSBGET + CALL OSWRCH + JR NC,TYPE1 + JR OSSHUT +; +;OSLOAD - Load an area of memory from a file. +; Inputs: HL addresses filename (term CR) +; DE = address at which to load +; BC = maximum allowed size (bytes) +; Outputs: Carry reset indicates no room for file. +; Destroys: A,B,C,D,E,H,L,F +; +STLOAD: CALL SAVLOD ;*LOAD + PUSH HL + JR OSL1 +; +OSLOAD: PUSH BC ;LOAD + CALL SETUP0 +OSL1: EX DE,HL + CALL OPEN + JR NZ,LOAD0 +NOTFND: LD A,214 + CALL EXTERR + DEFM 'File not found' + DEFB 0 +LOAD: CALL READ + JR NZ,LOAD1 + CALL INCSEC + ADD HL,BC +LOAD0: EX (SP),HL + SBC HL,BC + EX (SP),HL + JR NC,LOAD +LOAD1: POP BC + PUSH AF + CALL CLOSE + POP AF + CCF +RESET: RET +; +;OSOPEN - Open a file for reading or writing. +; Inputs: HL addresses filename (term CR) +; Carry set for OPENIN, cleared for OPENOUT. +; Outputs: A = file channel (=0 if cannot open) +; Destroys: A,B,C,D,E,H,L,F +; +OSOPEN: PUSH AF ;SAVE CARRY + CALL SETUP0 + POP AF + CALL NC,CREATE + CALL C,OPEN + RET Z ;ERROR + LD B,7 ;MAX. NUMBER OF FILES + LD HL,TABLE+13 +OPEN1: LD A,(HL) + DEC HL + OR (HL) + JR Z,OPEN2 + DEC HL + DJNZ OPEN1 + LD A,192 + CALL EXTERR + DEFM 'Too many open files' + DEFB 0 +; +OPEN2: LD DE,(FREE) ;FREE SPACE POINTER + LD (HL),E + INC HL + LD (HL),D + LD A,B ;CHANNEL (1-7) + LD HL,FCBSIZ + ADD HL,DE ;RESERVE SPACE + LD (FREE),HL + LD HL,FCB + PUSH DE + LD BC,36 + LDIR ;COPY FCB + EX DE,HL + INC HL + LD (HL),C ;CLEAR PTR + INC HL + POP DE + LD B,A + CALL RDF ;READ OR FILL + LD A,B + JP CHECK +; +;OSBPUT - Write a byte to a random disk file. +; Inputs: E = file channel +; A = byte to write +; Destroys: A,B,C,F +; +OSBPUT: PUSH DE + PUSH HL + LD B,A + CALL FIND + LD A,B + LD B,0 + DEC HL + LD (HL),B ;CLEAR EOF + INC HL + LD C,(HL) + RES 7,C + SET 7,(HL) + INC (HL) + INC HL + PUSH HL + ADD HL,BC + LD (HL),A + POP HL + CALL Z,WRRDF ;WRITE THEN READ/FILL + POP HL + POP DE + RET +; +;OSBGET - Read a byte from a random disk file. +; Inputs: E = file channel +; Outputs: A = byte read +; Carry set if LAST BYTE of file +; Destroys: A,B,C,F +; +OSBGET: PUSH DE + PUSH HL + CALL FIND + LD C,(HL) + RES 7,C + INC (HL) + INC HL + PUSH HL + LD B,0 + ADD HL,BC + LD B,(HL) + POP HL + CALL PE,INCRDF ;INC SECTOR THEN READ + CALL Z,WRRDF ;WRITE THEN READ/FILL + LD A,B + POP HL + POP DE + RET +; +;OSSTAT - Read file status. +; Inputs: E = file channel +; Outputs: Z flag set - EOF +; (If Z then A=0) +; DE = address of file block. +; Destroys: A,D,E,H,L,F +; +OSSTAT: CALL FIND + DEC HL + LD A,(HL) + INC A + RET +; +;GETEXT - Find file size. +; Inputs: E = file channel +; Outputs: DEHL = file size (0-&800000) +; Destroys: A,B,C,D,E,H,L,F +; +GETEXT: CALL FIND + EX DE,HL + LD DE,FCB + LD BC,36 + PUSH DE + LDIR ;COPY FCB + EX DE,HL + EX (SP),HL + EX DE,HL + LD A,35 + CALL BDOS1 ;COMPUTE SIZE + POP HL + XOR A + JR GETPT1 +; +;GETPTR - Return file pointer. +; Inputs: E = file channel +; Outputs: DEHL = pointer (0-&7FFFFF) +; Destroys: A,B,C,D,E,H,L,F +; +GETPTR: CALL FIND + LD A,(HL) + ADD A,A + DEC HL +GETPT1: DEC HL + LD D,(HL) + DEC HL + LD E,(HL) + DEC HL + LD H,(HL) + LD L,A + SRL D + RR E + RR H + RR L + RET +; +;PUTPTR - Update file pointer. +; Inputs: A = file channel +; DEHL = new pointer (0-&7FFFFF) +; Destroys: A,B,C,D,E,H,L,F +; +PUTPTR: LD D,L + ADD HL,HL + RL E + LD B,E + LD C,H + LD E,A ;CHANNEL + PUSH DE + CALL FIND + POP AF + AND 7FH + BIT 7,(HL) ;PENDING WRITE? + JR Z,PUTPT1 + OR 80H +PUTPT1: LD (HL),A + PUSH DE + PUSH HL + DEC HL + DEC HL + DEC HL + LD D,(HL) + DEC HL + LD E,(HL) + EX DE,HL + OR A + SBC HL,BC + POP HL + POP DE + RET Z + INC HL + OR A + CALL M,WRITE + PUSH HL + DEC HL + DEC HL + DEC HL + LD (HL),0 + DEC HL + LD (HL),B + DEC HL + LD (HL),C ;NEW RECORD NO. + POP HL + JR RDF +; +;WRRDF - Write, read; if EOF fill with zeroes. +;RDF - Read; if EOF fill with zeroes. +; Inputs: DE address FCB. +; HL addresses data buffer. +; Outputs: A=0, Z-flag set. +; Carry set if fill done (EOF) +; Destroys: A,H,L,F +; +WRRDF: CALL WRITE +RDF: CALL READ + DEC HL + RES 7,(HL) + DEC HL + LD (HL),A ;CLEAR EOF FLAG + RET Z + LD (HL),-1 ;SET EOF FLAG + INC HL + INC HL + PUSH BC + XOR A + LD B,128 +FILL: LD (HL),A + INC HL + DJNZ FILL + POP BC + SCF + RET +; +;INCRDF - Increment record, read; if EOF fill. +; Inputs: DE addresses FCB. +; HL addresses data buffer. +; Outputs: A=1, Z-flag reset. +; Carry set if fill done (EOF) +; Destroys: A,H,L,F +; +INCRDF: CALL INCSEC + CALL RDF + INC A + RET +; +;READ - Read a record from a disk file. +; Inputs: DE addresses FCB. +; HL = address to store data. +; Outputs: A<>0 & Z-flag reset indicates EOF. +; Carry = 0 +; Destroys: A,F +; +;BDOS1 - CP/M BDOS call. +; Inputs: A = function number +; DE = parameter +; Outputs: AF = result (carry=0) +; Destroys: A,F +; +READ: CALL SETDMA + LD A,33 +BDOS1: CALL BDOS0 + JR NZ,CPMERR + OR A + RET +CPMERR: LD A,255 + CALL EXTERR + DEFM 'CP/M Error' + DEFB 0 +; +BDOS0: PUSH BC + PUSH DE + PUSH HL + PUSH IX + PUSH IY + LD C,A + CALL BDOS + INC H + DEC H + POP IY + POP IX + POP HL + POP DE + POP BC + RET +; +;WRITE - Write a record to a disk file. +; Inputs: DE addresses FCB. +; HL = address to get data. +; Destroys: A,F +; +WRITE: CALL SETDMA + LD A,40 + CALL BDOS1 + JR Z,INCSEC + LD A,198 + CALL EXTERR + DEFM 'Disk full' + DEFB 0 +; +;INCSEC - Increment random record number. +; Inputs: DE addresses FCB. +; Destroys: F +; +INCSEC: PUSH HL + LD HL,33 + ADD HL,DE +INCS1: INC (HL) + INC HL + JR Z,INCS1 + POP HL + RET +; +;OPEN - Open a file for access. +; Inputs: FCB set up. +; Outputs: DE = FCB +; A=0 & Z-flag set indicates Not Found. +; Carry = 0 +; Destroys: A,D,E,F +; +OPEN: LD DE,FCB + LD A,15 + CALL BDOS1 + INC A + RET +; +;CREATE - Create a disk file for writing. +; Inputs: FCB set up. +; Outputs: DE = FCB +; A=0 & Z-flag set indicates directory full. +; Carry = 0 +; Destroys: A,D,E,F +; +CREATE: CALL CHKAMB + LD DE,FCB + LD A,19 + CALL BDOS1 ;DELETE + LD A,22 + CALL BDOS1 ;MAKE + INC A + RET +; +;CHKAMB - Check for ambiguous filename. +; Destroys: A,D,E,F +; +CHKAMB: PUSH BC + LD DE,FCB + LD B,12 +CHKAM1: LD A,(DE) + CP '?' + JR Z,AMBIG ;AMBIGUOUS + INC DE + DJNZ CHKAM1 + POP BC + RET +AMBIG: LD A,204 + CALL EXTERR + DEFM 'Bad name' + DEFB 0 +; +;SETDMA - Set "DMA" address. +; Inputs: HL = address +; Destroys: A,F +; +SETDMA: LD A,26 + EX DE,HL + CALL BDOS0 + EX DE,HL + RET +; +;FIND - Find file parameters from channel. +; Inputs: E = channel +; Outputs: DE addresses FCB +; HL addresses pointer byte (FCB+37) +; Destroys: A,D,E,H,L,F +; +FIND: INC E + DEC E + JR Z,CHANER + CALL FIND1 + LD HL,37 + ADD HL,DE + RET NZ +CHANER: LD A,222 + CALL EXTERR + DEFM 'Invalid channel' + DEFB 0 +; +;FIND1 - Look up file table. +; Inputs: E = channel +; Outputs: Z-flag set = file not opened +; If NZ, DE addresses FCB +; HL points into table +; Destroys: A,D,E,H,L,F +; +FIND1: LD A,E + AND 7 + ADD A,A + LD E,A + LD D,0 + LD HL,TABLE-2 + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + LD A,D + OR E + RET +; +;SETUP - Set up File Control Block. +; Inputs: HL addresses filename +; Format [A:]FILENAME[.EXT] +; Device defaults to current drive +; Extension defaults to .BBC +; A = fill character +; Outputs: HL updated +; A = terminator +; BC = 128 +; Destroys: A,B,C,H,L,F +; +;FCB FORMAT (36 BYTES TOTAL): +; 0 0=SAME DISK, 1=DISK A, 2=DISK B (ETC.) +; 1-8 FILENAME, PADDED WITH SPACES +; 9-11 EXTENSION, PADDED WITH SPACES +; 12 CURRENT EXTENT, SET TO ZERO +; 32-35 CLEARED TO ZERO +; +SETUP0: LD A,' ' +SETUP: PUSH DE + PUSH HL + LD DE,FCB+9 + LD HL,BBC + LD BC,3 + LDIR + LD HL,FCB+32 + LD B,4 +SETUP1: LD (HL),C + INC HL + DJNZ SETUP1 + POP HL + LD C,A + XOR A + LD (DE),A + POP DE + CALL SKIPSP + CP '"' + JR NZ,SETUP2 + INC HL + CALL SKIPSP + CALL SETUP2 + CP '"' + INC HL + JR Z,SKIPSP +BADSTR: LD A,253 + CALL EXTERR + DEFM 'Bad string' + DEFB 0 +; +PARSE: LD A,(HL) + INC HL + CP '`' + RET NC + CP '?' + RET C + XOR 40H + RET +; +SETUP2: PUSH DE + INC HL + LD A,(HL) + CP ':' + DEC HL + LD A,B + JR NZ,DEVICE + LD A,(HL) ;DRIVE + AND 31 + INC HL + INC HL +DEVICE: LD DE,FCB + LD (DE),A + INC DE + LD B,8 +COPYF: LD A,(HL) + CP '.' + JR Z,COPYF1 + CP ' ' + JR Z,COPYF1 + CP CR + JR Z,COPYF1 + CP '=' + JR Z,COPYF1 + CP '"' + JR Z,COPYF1 + LD C,'?' + CP '*' + JR Z,COPYF1 + LD C,' ' + INC HL + CP '|' + JR NZ,COPYF2 + CALL PARSE + JR COPYF0 +COPYF1: LD A,C +COPYF2: CALL UPPRC +COPYF0: LD (DE),A + INC DE + DJNZ COPYF +COPYF3: LD A,(HL) + INC HL + CP '*' + JR Z,COPYF3 + CP '.' + LD BC,3*256+' ' + LD DE,FCB+9 + JR Z,COPYF + DEC HL + POP DE + LD BC,128 +SKIPSP: LD A,(HL) + CP ' ' + RET NZ + INC HL + JR SKIPSP +; +BBC: DEFM 'BBC' +; +;HEX - Read a hex string and convert to binary. +; Inputs: HL = text pointer +; Outputs: HL = updated text pointer +; DE = value +; A = terminator (spaces skipped) +; Destroys: A,D,E,H,L,F +; +HEX: LD DE,0 ;INITIALISE + CALL SKIPSP +HEX1: LD A,(HL) + CALL UPPRC + CP '0' + JR C,SKIPSP + CP '9'+1 + JR C,HEX2 + CP 'A' + JR C,SKIPSP + CP 'F'+1 + JR NC,SKIPSP + SUB 7 +HEX2: AND 0FH + EX DE,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + OR E + LD E,A + INC HL + JR HEX1 +; +;OSCLI - Process an "operating system" command +; +OSCLI: CALL SKIPSP + CP CR + RET Z + CP '|' + RET Z + CP '.' + JP Z,DOT ;*. + EX DE,HL + LD HL,COMDS +OSCLI0: LD A,(DE) + CALL UPPRC + CP (HL) + JR Z,OSCLI2 + JR C,UNK +OSCLI1: BIT 7,(HL) + INC HL + JR Z,OSCLI1 + INC HL + INC HL + JR OSCLI0 +; +OSCLI2: PUSH DE +OSCLI3: INC DE + INC HL + LD A,(DE) + CALL UPPRC + CP '.' ;ABBREVIATED? + JR Z,OSCLI4 + XOR (HL) + JR Z,OSCLI3 + CP 80H + JR Z,OSCLI4 + POP DE + JR OSCLI1 +; +OSCLI4: POP AF + INC DE +OSCLI5: BIT 7,(HL) + INC HL + JR Z,OSCLI5 + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + PUSH HL + EX DE,HL + JP SKIPSP +; +UNK: EX DE,HL + JP ASCLI +; +; +BYE: RST 0 ;*BYE, *QUIT +; +ERA: CALL SETUP0 ;*ERA, *ERASE + LD C,19 + JR XEQ ;"DELETE" +; +RES: LD C,13 ;*RESET + JR XEQ ;"RESET" +; +DRV: CALL SETUP0 ;*DRIVE + LD A,(FCB) + DEC A + JP M,HUH + LD E,A + LD C,14 + JR XEQ0 +; +REN: CALL SETUP0 ;*REN, *RENAME + CP '=' + JR NZ,HUH + INC HL + PUSH HL + CALL EXISTS + LD HL,FCB + LD DE,FCB+16 + LD BC,12 + LDIR + POP HL + CALL SETUP0 + CALL CHKAMB + LD C,23 +XEQ: LD DE,FCB +XEQ0: LD A,(HL) + CP CR + JR NZ,HUH +BDC: LD A,C + CALL BDOS1 + RET P +HUH: LD A,254 + CALL EXTERR + DEFM 'Bad command' + DEFB 0 +; +EXISTS: LD HL,DSKBUF + CALL SETDMA + LD DE,FCB + LD A,17 + CALL BDOS1 ;SEARCH + INC A + RET Z + LD A,196 + CALL EXTERR + DEFM 'File exists' + DEFB 0 +; +SAVLOD: CALL SETUP0 ;PART OF *SAVE, *LOAD + CALL HEX + CP '+' + PUSH AF + PUSH DE + JR NZ,SAVLO1 + INC HL +SAVLO1: CALL HEX + CP CR + JR NZ,HUH + EX DE,HL + POP DE + POP AF + RET Z + OR A + SBC HL,DE + RET NZ + JR HUH +; +DOT: INC HL +DIR: LD A,'?' ;*DIR + CALL SETUP + CP CR + JR NZ,HUH + LD C,17 +DIR0: LD B,4 +DIR1: CALL LTRAP + LD DE,FCB + LD HL,DSKBUF + CALL SETDMA + LD A,C + CALL BDOS1 ;SEARCH DIRECTORY + JP M,CRLF + RRCA + RRCA + RRCA + AND 60H + LD E,A + LD D,0 + LD HL,DSKBUF+1 + ADD HL,DE + PUSH HL + LD DE,8 + ADD HL,DE + LD E,(HL) + INC HL + BIT 7,(HL) ;SYSTEM FILE? + POP HL + LD C,18 + JR NZ,DIR1 + PUSH BC + LD A,B + CP 4 + LD A,' ' + CALL Z,DRIVE + CALL OSWRCH + LD B,8 + LD A,' ' + BIT 7,E ;READ ONLY? + JR Z,DIR3 + LD A,'*' +DIR3: CALL CPTEXT + LD B,3 + LD A,' ' + CALL SPTEXT + POP BC + DJNZ DIR1 + CALL CRLF + JR DIR0 +; +DRIVE: LD A,(FCB) + DEC A + LD C,25 + CALL M,BDC + ADD A,'A' + RET +; +UPPRC: AND 7FH + CP '`' + RET C + AND 5FH ;CONVERT TO UPPER CASE + RET +; +HELP: LD B,32 ;*HELP + LD HL,VERMSG + JP PTEXT +; +; +COMDS: DEFM 'BY' + DEFB 'E'+80H + DEFW BYE + DEFM 'CP' + DEFB 'M'+80H + DEFW BYE + DEFM 'DI' + DEFB 'R'+80H + DEFW DIR + DEFM 'DRIV' + DEFB 'E'+80H + DEFW DRV + DEFM 'ERAS' + DEFB 'E'+80H + DEFW ERA + DEFM 'ER' + DEFB 'A'+80H + DEFW ERA + DEFM 'HEL' + DEFB 'P'+80H + DEFW HELP + DEFM 'LOA' + DEFB 'D'+80H + DEFW STLOAD + DEFM 'QUI' + DEFB 'T'+80H + DEFW BYE + DEFM 'RENAM' + DEFB 'E'+80H + DEFW REN + DEFM 'RE' + DEFB 'N'+80H + DEFW REN + DEFM 'RESE' + DEFB 'T'+80H + DEFW RES + DEFM 'SAV' + DEFB 'E'+80H + DEFW STSAVE + DEFM 'TYP' + DEFB 'E'+80H + DEFW TYPE + DEFB 0FFH +; +;PROCESS 6502's BRK INSTRUCTION +; +BRK: LD HL,(BRKPTR) + PUSH HL +BRKTRP: POP HL + LD A,(HL) + INC HL + PUSH HL + JP EXTERR +; +;TRAP - Test for "ESC" and abort if so. +; Destroys: A,H,L,F +; +TRAP: +LTRAP: LD A,(BRKFLG) + OR A + RET P +ESC: LD A,126 + CALL ASBYTE + JP ESCAPE +; +;PTEXT - Print text +; Inputs: HL = address of text +; B = number of characters to print +; Destroys: A,B,H,L,F +; +CPTEXT: PUSH AF + LD A,':' + CALL OSWRCH + POP AF +SPTEXT: CALL OSWRCH +PTEXT: LD A,(HL) + AND 7FH + INC HL + CALL OSWRCH + DJNZ PTEXT + RET +; +;OSINIT - Initialise RAM mapping etc. +;If BASIC is entered by BBCBASIC FILENAME then file +;FILENAME.BBC is automatically CHAINed. +; Outputs: DE = initial value of HIMEM (top of RAM) +; HL = initial value of PAGE (user program) +; Z-flag reset indicates AUTO-RUN. +; Destroys: A,B,C,D,E,H,L,F +; +OSINIT: LD A,0C3H + LD (38H),A + LD HL,BRKTRP + LD (39H),HL + LD HL,BRK + LD (BRKVEC),HL + LD A,229 + LD HL,0 + CALL ASBYTE ;ESC interrupts program + LD A,230 + LD HL,0 + CALL ASBYTE ;ESC flushes buffers + LD C,45 + LD E,254 + CALL BDOS ;TRAP ERRORS (CP/M 3) + XOR A + LD B,INILEN + LD HL,TABLE +CLRTAB: LD (HL),A ;CLEAR FILE TABLE + INC HL + DJNZ CLRTAB + LD DE,ACCS + LD HL,DSKBUF + LD C,(HL) + INC HL + CP C + JR Z,NOBOOT + LDIR ;COPY TO ACCS +NOBOOT: EX DE,HL + LD (HL),CR + LD DE,(6) ;DE = HIMEM + LD E,A ;PAGE BOUNDARY + LD HL,USER + RET +; +;OSRDCH - Read a character from console input. +; Outputs: A = character. +; Destroys: A,F +; +OSRDCH: PUSH BC + PUSH DE + PUSH HL + CALL ASRDCH + POP HL + POP DE + POP BC + RET +; +;OSWRCH - Write a character to console output. +; Inputs: A = character. +; Destroys: Nothing +; +PROMPT: LD A,'>' +OSWRCH: PUSH AF + PUSH BC + PUSH DE + PUSH HL + CALL ASWRCH + POP HL + POP DE + POP BC + POP AF + RET +; +;OSLINE - Read a complete line, terminated by +;carriage-return. +; Inputs: HL addresses destination buffer. +; (L=0) +; Outputs: Buffer filled, terminated by CR. +; A=0. +; Destroys: A,B,C,D,E,H,L,IX,F +; +OSLINE: LD IX,SCRAP + LD (IX+0),L + LD (IX+1),H + LD (IX+2),255 ;MAX. LINE LENGTH + LD (IX+3),' ' ;MIN. ASCII VALUE + LD (IX+4),255 ;MAX. ASCII VALUE + LD A,218 + LD HL,0 + CALL ASBYTE ;FLUSH VDU QUEUE + XOR A + LD HL,SCRAP + CALL ASWORD + JP C,ESC + XOR A + RET +; +CR EQU 0DH +FCBSIZ EQU 128+36+2 +; +BDOS EQU 5 +; +BRKFLG EQU 0FF80H +BRKPTR EQU 0FF82H +ASRDCH EQU 0FFE0H +ASWRCH EQU 0FFEEH +ASWORD EQU 0FFF1H +ASBYTE EQU 0FFF4H +ASCLI EQU 0FFF7H +BRKVEC EQU 0FFFAH +; +FCB EQU 5CH +DSKBUF EQU 80H +; +TABLE: DEFS 14 ;FILE BLOCK POINTERS +INILEN EQU $-TABLE +SCRAP: DEFS 31 + DEFB 0 +; +FIN: END + \ No newline at end of file diff --git a/src/CMOS.Z80 b/src/CMOS.Z80 index 539ee06..3bac740 100644 --- a/src/CMOS.Z80 +++ b/src/CMOS.Z80 @@ -440,14 +440,14 @@ INCRDF: CALL INCSEC ; READ: CALL SETDMA LD A,33 -BDOS1: CALL BDOS0 ;* - JR NZ,CPMERR ;* - OR A ;* - RET ;* -CPMERR: LD A,255 ;* CP/M 3 - CALL EXTERR ;* BDOS ERROR - DEFM 'CP/M Error' ;* - DEFB 0 ;* +BDOS1: CALL BDOS0 + JR NZ,CPMERR + OR A + RET +CPMERR: LD A,255 + CALL EXTERR + DEFM 'CP/M Error' + DEFB 0 ; BDOS0: PUSH BC PUSH DE @@ -456,8 +456,8 @@ BDOS0: PUSH BC PUSH IY LD C,A CALL BDOS - INC H ;* TEST H - DEC H ;* CP/M 3 ONLY + INC H + DEC H POP IY POP IX POP HL @@ -883,10 +883,10 @@ DIR1: CALL LTRAP LD HL,DSKBUF+1 ADD HL,DE PUSH HL - LD DE,8 ;** + LD DE,8 ADD HL,DE - LD E,(HL) ;** - INC HL ;** + LD E,(HL) + INC HL BIT 7,(HL) ;SYSTEM FILE? POP HL LD C,18 @@ -899,13 +899,13 @@ DIR1: CALL LTRAP ADD A,'A' CALL OSWRCH LD B,8 - LD A,' ' ;** - BIT 7,E ;** READ ONLY? - JR Z,DIR3 ;** - LD A,'*' ;** + LD A,' ' + BIT 7,E ;READ ONLY? + JR Z,DIR3 + LD A,'*' DIR3: CALL CPTEXT LD B,3 - LD A,' ' ;** + LD A,' ' CALL SPTEXT POP BC DJNZ DIR2 @@ -1046,11 +1046,11 @@ COMDS: DEFM 'BY' ; B = number of characters to print ; Destroys: A,B,H,L,F ; -CPTEXT: PUSH AF ;** +CPTEXT: PUSH AF LD A,':' CALL OSWRCH - POP AF ;** -SPTEXT: CALL OSWRCH ;** + POP AF +SPTEXT: CALL OSWRCH PTEXT: LD A,(HL) AND 7FH INC HL diff --git a/src/EXEC.Z80 b/src/EXEC.Z80 index da5ac69..7250bfa 100644 --- a/src/EXEC.Z80 +++ b/src/EXEC.Z80 @@ -10,7 +10,7 @@ ; ;VERSION 2.1, 22-01-1984 ;VERSION 3.1, 11-06-1987 -;VERSION 5.0, 10-06-2024 +;VERSION 5.0, 16-06-2024 ; GLOBAL XEQ GLOBAL RUN0 @@ -1557,14 +1557,14 @@ IF: CALL EXPRI JR Z,IFNOT ;FALSE LD A,(IY) CP TTHEN - JR NZ,XEQGO7 + JP NZ,XEQ IF0: INC IY ;SKIP "THEN" LD A,(IY) CP ';' JR Z,IF0 IF1: CALL NXT CP TLINO - JR NZ,XEQGO7 ;STATEMENT FOLLOWS + JP NZ,XEQ ;STATEMENT FOLLOWS JP GOTO ;LINE NO. FOLLOWS ; IFELSE: LD A,(IY) @@ -1968,13 +1968,17 @@ TRACE0: DEC HL TRACE1: LD (TRACEN),HL JR XEQGO1 ; -;VDU expr,expr;.... +;VDU expr,expr;....[|] ; VDU: CALL EXPRI EXX LD A,L - CALL OSWRCH + LD B,1 +VDU1: CALL OSWRCH + DJNZ VDU1 LD A,(IY) + CP '|' + JR Z,VDU4 CP ',' JR Z,VDU2 CP ';' @@ -1986,6 +1990,11 @@ VDU3: CALL TERMQ JR NZ,VDU JR XEQGO1 ; +VDU4: INC IY + XOR A + LD B,9 + JR VDU1 +; ;CLOSE channel number ; CLOSE: CALL CHANEL diff --git a/src/MAIN.Z80 b/src/MAIN.Z80 index 335449c..2b56132 100644 --- a/src/MAIN.Z80 +++ b/src/MAIN.Z80 @@ -174,7 +174,7 @@ PURGE: LD (HL),A ;CLEAR SCRATCHPAD CALL NEWIT JP NZ,CHAIN0 ;AUTO-RUN CALL TELL -VERMSG: DEFM 'BBC BASIC (Z80) Version 5beta5' +VERMSG: DEFM 'BBC BASIC (Z80) Version 5beta6' DEFB CR DEFB LF NOTICE: DEFM '(C) Copyright R.T.Russell 2024' diff --git a/src/MATH.Z80 b/src/MATH.Z80 index 1d4e864..bf886d9 100644 --- a/src/MATH.Z80 +++ b/src/MATH.Z80 @@ -4,7 +4,7 @@ ;(C) COPYRIGHT R.T.RUSSELL 1986-2024 ;VERSION 0.0, 26-10-1986 ;VERSION 0.1, 14-12-1988 (BUG FIX) -;VERSION 5.0, 21-05-2024 (SHIFTS ADDED) +;VERSION 5.0, 16-06-2024 (SHIFTS ADDED) ; ;BINARY FLOATING POINT REPRESENTATION: ; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA @@ -387,16 +387,7 @@ IMUL: LD A,H JP NEGATE ; IMUL1: DEC C - EXX - SLA E - RL D - EXX - RL E - RL D - EXX - ADC HL,HL - EXX - ADC HL,HL + CALL SLA8 JP P,IMUL1 ;NORMALISE EX AF,AF' RET M @@ -2177,30 +2168,12 @@ SQR2: INC A RET P SQRA: SLA C RL B + INC C EXX RL C RL B - EXX - INC C - SLA E - RL D - EXX - RL E - RL D - EXX - ADC HL,HL - EXX - ADC HL,HL - EXX - SLA E - RL D - EXX - RL E - RL D - EXX - ADC HL,HL - EXX - ADC HL,HL + CALL SLA8 + CALL SLA8 EXX JP NC,SQR1 SQR3: OR A @@ -2230,6 +2203,18 @@ SQRB: ADD HL,HL DEC C RET ; +SLA8: EXX + SLA E + RL D + EXX + RL E + RL D + EXX + ADC HL,HL + EXX + ADC HL,HL + RET +; DIGITQ: LD A,(IX) CP '9'+1 CCF diff --git a/tests/EXITTEST.BBC b/tests/EXITTEST.BBC index 95b7242..e7abb45 100644 Binary files a/tests/EXITTEST.BBC and b/tests/EXITTEST.BBC differ