; Minimal Spectrum ROM ; ==================== ; Written by Andrew Owen, J.G.Harston ; ; The source is assembleable with ZMac ; See http://www.mdfs.net/Software/Z80/ZMac ; ; v0.01 28-Jul-2006 AO - Initial version ; v0.02 28-Jul-2006 JGH - Added BREAK_KEY, works with BBC BASIC. ; Added PO_SEARCH, CL_HOME, CL_SET, SET_MIN, SAVE_ETC, LINE_RUN. Moved ; LD_EDGE into cassette area, moved keyboard routines together with ; keyboard table. ORG &0000 .L0000 ; RESET RET DEFS &0008-$ .L0008 ; RST &08 RET DEFS &0010-$ .L0010 ; OUT_CHAR EXX CALL L0164 EXX RET DEFS &0018-$ .L0018 RET DEFS &0020-$ .L0020 RET DEFS &0028-$ .L0028 RET DEFS &0030-$ .L0030 RET DEFS &0038-$ .L0038 ; INTERUPTS PUSH AF PUSH HL LD HL,&5C78 INC (HL) JR NZ,L0046 INC L INC (HL) JR NZ,L0046 INC L INC (HL) .L0046 PUSH BC PUSH DE CALL L03B6 POP DE POP BC POP HL POP AF EI RET DEFS &0066-$ .NMI RETN DEFS &0080-$ DEFM "Minimal Spectrum ROM" DEFB 0 DEFM "Copyright (C)2006 Andrew Owen" DEFB 0 ; KEYBOARD ROUTINES ; ================= ; Keyboard tables ; --------------- DEFS &0100-$ .L0100 DEFM "BHY65TGV" DEFM "NJU74RFC" DEFM "M" .L0111 DEFM "KI83EDX" DEFB &0E DEFM "LO" .L011B DEFM "92WSZ" DEFB &20,&0D,"P01QA~" DEFB "*?\" DEFB 0,"{}^",0 .L012F DEFB "-+=.,;",&22,&00 DEFB "<|>]/",0,"`[" DEFB ":_!@#$%&" DEFB "'()",&0C,&07,&06,&04,&05 DEFB &08,&0A,&0B,&09,&0F,&00 ; Keyboard routines ; ----------------- .L03B6 LD L,&2F LD DE,&FFFF LD BC,&FEFE .L03BE IN A,(C) CPL AND &1F JR Z,L03D3 LD H,A LD A,L .L03C7 INC D RET NZ .L03C9 SUB &08 SRL H JR NC,L03C9 LD D,E LD E,A JR NZ,L03C7 .L03D3 DEC L RLC B JR C,L03BE LD A,D INC A JR Z,L03EA CP &28 JR Z,L03EA CP &19 JR Z,L03EA LD A,E LD E,D LD D,A CP &18 RET NZ .L03EA LD HL,&5C00 .L03ED BIT 7,(HL) JR NZ,L03F8 INC HL DEC (HL) DEC HL JR NZ,L03F8 LD (HL),&FF .L03F8 LD A,L LD L,&04 CP L JR NZ,L03ED CALL L0443 RET NC LD HL,&5C00 CP (HL) JR Z,L0435 LD L,&04 CP (HL) JR Z,L0435 BIT 7,(HL) JR NZ,L0416 LD L,&00 BIT 7,(HL) .L0415 RET Z .L0416 LD E,A LD (HL),A INC HL LD (HL),&05 INC HL LD A,(&5C09) LD (HL),A INC HL PUSH HL LD L,&41 LD C,(HL) LD L,&3B LD D,(HL) CALL L0458 POP HL LD (HL),A .L042D LD (&5C08),A LD L,&3B SET 5,(HL) RET .L0435 INC HL LD (HL),&05 INC HL DEC (HL) RET NZ LD A,(&5C0A) LD (HL),A INC HL LD A,(HL) JR L042D .L0443 LD B,D LD D,&00 LD A,E CP &27 RET NC CP &18 JR NZ,L0451 BIT 7,B RET NZ .L0451 LD HL,L0100 ADD HL,DE LD A,(HL) SCF RET .L0458 LD HL,L0100-26 LD A,E CP &3A JR C,L0472 BIT 0,B JR Z,L0481 LD HL,&5C6A BIT 3,(HL) JR Z,L046D XOR &20 .L046D INC B RET NZ XOR &20 RET .L0472 CP &30 RET C INC B RET Z BIT 5,B LD HL,L011B JR NZ,L0481 LD HL,L0111 .L0481 LD D,&00 ADD HL,DE LD A,(HL) RET ; PRINTOUT ROUTINES ; ================= .L0164 CALL PO_FETCH ; Get current position CP &20 JR NC,L017F ; Jump with printable characters ; Otherwise do backspace INC C LD A,&22 CP C JR NZ,L017C INC B LD C,&02 .L0174 LD A,&19 CP B JR NZ,L017C DEC B LD C,&21 .L017C JP CL_SET .L017F CALL PO_ANY ; Print the character .PO_STORE LD (&5C88),BC LD (&5C84),HL RET .PO_FETCH LD BC,(&5C88) LD HL,(&5C84) RET .PO_ANY CP &80 JR C,L01C9 ; Print CHARS matrix CP &90 JR NC,L01C0 ; Print UDC matrix LD B,A CALL L01A6 CALL PO_FETCH LD DE,&5C92 JR L01E3 .L01A6 LD HL,&5C92 CALL L01AC .L01AC RR B SBC A,A AND &0F LD C,A RR B SBC A,A AND &F0 OR C LD C,&04 .L01BA LD (HL),A INC HL DEC C JR NZ,L01BA RET .L01C0 SUB &90 PUSH BC LD BC,(&5C7B) JR L01CE .L01C9 PUSH BC LD BC,(&5C36) .L01CE EX DE,HL LD HL,&5C3B RES 0,(HL) CP &20 JR NZ,L01DA SET 0,(HL) .L01DA LD H,&00 LD L,A ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,BC POP BC EX DE,HL .L01E3 LD A,C DEC A LD A,&21 JR NZ,L01EB DEC B LD C,A .L01EB CP C PUSH DE CALL Z,PO_SCR POP DE PUSH BC PUSH HL LD A,(&5C91) LD B,&FF RRA JR C,L01FC INC B .L01FC RRA RRA SBC A,A LD C,A LD A,&08 AND A EX DE,HL .L0204 EX AF,AF' LD A,(DE) AND B XOR (HL) XOR C LD (DE),A EX AF,AF' JR C,L021C INC D .L020E INC HL DEC A JR NZ,L0204 EX DE,HL DEC H CALL L0224 POP HL POP BC DEC C INC HL RET .L021C EX AF,AF' LD A,&20 ADD A,E LD E,A EX AF,AF' JR L020E .L0224 LD A,H RRCA RRCA RRCA AND &03 OR &58 LD H,A LD DE,(&5C8F) LD A,(HL) XOR E AND D XOR E BIT 6,(IY+87) JR Z,L0243 AND &C7 BIT 2,A JR NZ,L0243 XOR &38 .L0243 BIT 4,(IY+87) JR Z,L0251 AND &F8 BIT 5,A JR NZ,L0251 XOR &07 .L0251 LD (HL),A RET ; PS_SCR - Scroll the screen if neccessary ; ---------------------------------------- .PO_SCR LD DE,CL_SET PUSH DE LD A,B CP (IY+49) JR C,L0273 RET NZ BIT 4,(IY+2) JR Z,L0275 LD E,(IY+45) DEC E JR Z,L0275 LD SP,(&5C3F) RES 4,(IY+2) RET .L0273 POP HL RET .L0275 CALL L02DF LD B,(IY+49) INC B LD C,&21 PUSH BC CALL L037C LD A,H RRCA RRCA RRCA AND &03 OR &58 LD H,A LD DE,&5AE0 LD A,(DE) LD C,(HL) LD B,&20 EX DE,HL .L0293 LD (DE),A LD (HL),C INC DE INC HL DJNZ L0293 POP BC RET .L029B AND A .L029C CCF JR C,L029C LD BC,&1721 JR CL_SET ; CL_ALL jumps here .L02A4 LD HL,&0000 LD (&5C7D),HL RES 0,(IY+48) CALL L029B LD B,&18 CALL L0325 LD HL,(&5C51) LD DE,L0164 LD (HL),E INC HL LD (HL),D LD (IY+82),&01 .CL_SET LD A,B BIT 0,(IY+2) JR Z,L02CF ADD A,(IY+49) SUB &18 .L02CF PUSH BC LD B,A CALL L037C POP BC LD A,&21 SUB C LD E,A LD D,&00 ADD HL,DE JP PO_STORE .L02DF LD B,&17 CALL L037C LD C,&08 .L02E6 PUSH BC PUSH HL LD A,B AND &07 LD A,B JR NZ,L02FA .L02EE EX DE,HL LD HL,&F8E0 ADD HL,DE EX DE,HL LD BC,&0020 DEC A LDIR .L02FA EX DE,HL LD HL,&FFE0 ADD HL,DE EX DE,HL LD B,A AND &07 RRCA RRCA RRCA LD C,A LD A,B LD B,&00 LDIR LD B,&07 ADD HL,BC AND &F8 JR NZ,L02EE POP HL INC H POP BC DEC C JR NZ,L02E6 CALL L0369 LD HL,&FFE0 ADD HL,DE EX DE,HL LDIR LD B,&01 .L0325 PUSH BC CALL L037C LD C,&08 .L032B PUSH BC PUSH HL LD A,B .L032E AND &07 RRCA RRCA RRCA LD C,A LD A,B LD B,&00 DEC C LD D,H LD E,L LD (HL),&00 INC DE LDIR LD DE,&0701 ADD HL,DE DEC A AND &F8 LD B,A JR NZ,L032E POP HL INC H POP BC DEC C JR NZ,L032B CALL L0369 LD H,D LD L,E INC DE LD A,(&5C8D) BIT 0,(IY+2) JR Z,L0361 LD A,(&5C48) .L0361 LD (HL),A DEC BC LDIR POP BC LD C,&21 RET .L0369 LD A,H RRCA RRCA RRCA DEC A OR &50 LD H,A EX DE,HL LD H,C LD L,B ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD B,H LD C,L RET .L037C LD A,&18 SUB B LD D,A RRCA RRCA RRCA AND &E0 LD L,A LD A,D AND &18 OR &40 LD H,A RET ; Scan SCREEN$ ; ------------ ; Destination of &254F .L038D PUSH BC PUSH DE PUSH HL LD A,(DE) XOR (HL) JR Z,L0398 INC A JR NZ,L03AB DEC A .L0398 LD C,A LD B,&07 .L039B INC D INC HL LD A,(DE) XOR (HL) XOR C JR NZ,L03AB DJNZ L039B POP BC POP BC POP BC LD A,&80 SUB B RET .L03AB POP HL LD DE,&08 ADD HL,DE POP DE POP BC DJNZ L038D LD C,B RET ; TAPE ROUTINES, ANCHORED AT &04C2 ; ================================ ; Save header and data ; -------------------- ; Destination of &0984 DEFS &04A8-$ .L04A8 PUSH IX LD DE,&11 XOR A CALL L04C2 POP IX LD B,&32 .L04B5 HALT DJNZ L04B5 LD E,(IX+11) LD D,(IX+12) LD A,&FF POP IX ; Fall through into SA_BYTES ; &04C2 - SA_BYTES ; Save bytes from IX to IX+DE-1, A=0 or FF for header or data ; ----------------------------------------------------------- .L04C2 LD HL,L053F PUSH HL LD HL,&1F80 BIT 7,A JR Z,L04D0 LD HL,&0C98 .L04D0 EX AF,AF' INC DE DEC IX DI LD A,&02 LD B,A .L04D8 DJNZ L04D8 OUT (&FE),A XOR &0F LD B,&A4 DEC L JR NZ,L04D8 DEC B DEC H JP P,L04D8 LD B,&2F .L04EA DJNZ L04EA OUT (&FE),A LD A,&0D LD B,&37 .L04F2 DJNZ L04F2 OUT (&FE),A LD BC,&3B0E EX AF,AF' LD L,A JP L0507 .L04FE LD A,D OR E JR Z,L050E LD L,(IX+0) .L0505 LD A,H XOR L .L0507 LD H,A LD A,&01 SCF JP L0525 .L050E LD L,H JR L0505 .L0511 LD A,C BIT 7,B .L0514 DJNZ L0514 JR NC,L051C LD B,&42 .L051A DJNZ L051A .L051C OUT (&FE),A LD B,&3E JR NZ,L0511 DEC B XOR A INC A .L0525 RL L JP NZ,L0514 DEC DE INC IX LD B,&31 LD A,&7F IN A,(&FE) RRA RET NC LD A,D INC A JP NZ,L04FE LD B,&3B .L053C DJNZ L053C RET ; &053F - SALD_RET ; ---------------- .L053F PUSH AF LD A,(&5C48) AND &38 RRCA RRCA RRCA OUT (&FE),A LD A,&7F IN A,(&FE) RRA EI JR C,L0554 POP HL RET .L0554 POP AF RET ; &0556 - LD_BYTES ; ---------------- ; Load or verify DE bytes to IX, A=0 or FF for header or data ; NC=verify, C=load .L0556 INC D EX AF,AF' DEC D DI LD A,&0F OUT (&FE),A LD HL,L053F PUSH HL IN A,(&FE) RRA AND &20 OR &02 LD C,A CP A .L056B RET NZ .L056C ; CALL L048A DEFB &DD,&DD,&DD ; Speculator tape trap JR NC,L056B LD HL,&0415 .L0574 DJNZ L0574 DEC HL LD A,H OR L JR NZ,L0574 CALL L0486 JR NC,L056B .L0580 LD B,&9C CALL L0486 JR NC,L056B LD A,&C6 CP B JR NC,L056C INC H JR NZ,L0580 .L058F LD B,&C9 CALL L048A JR NC,L056B LD A,B CP &D4 JR NC,L058F CALL L048A RET NC LD A,C XOR &03 LD C,A LD H,&00 LD B,&B0 JR L05C8 .L05A9 EX AF,AF' JR NZ,L05B3 JR NC,L05BD LD (IX+0),L JR L05C2 .L05B3 RL C XOR L RET NZ LD A,C RRA LD C,A INC DE JR L05C4 .L05BD LD A,(IX+0) XOR L RET NZ .L05C2 INC IX .L05C4 DEC DE EX AF,AF' LD B,&B2 .L05C8 LD L,&01 .L05CA CALL L0486 RET NC LD A,&CB CP B RL L LD B,&B0 JP NC,L05CA LD A,H XOR L LD H,A LD A,D OR E JR NZ,L05A9 LD A,H CP &01 RET .L0486 CALL L048A RET NC .L048A LD A,&16 .L048C DEC A JR NZ,L048C AND A .L0490 INC B RET Z LD A,&7F IN A,(&FE) RRA RET NC XOR C AND &20 JR Z,L0490 LD A,C CPL LD C,A AND &07 OR &08 OUT (&FE),A SCF RET ; &0605 - SAVE_ETC - Process filing commands ; ------------------------------------------ .L0605 POP AF LD A,(&5C74) SUB &E0 LD (&5C74),A RET ; Do nothing ; REDIRECTIONS FROM MAIN ROM ADDRESSES ; ==================================== ; &0984 - Save header at IX then data at address on stack ; ------------------------------------------------------- DEFS &0984-$ .L0984 JP L04A8 ; &0C41 - PO_SEARCH ; ----------------- DEFS &0C41-$ RET ; &0DAF - CL_ALL - Clear the whole display ; ---------------------------------------- DEFS &0DAF-$ .L0DAF JP L02A4 ; &0DD6 - HOME - Home cursor ; -------------------------- DEFS &0DD6-$ .L0DD6 LD BC,&1821 ; &0DD9 - CL_SET - Position cursor ; -------------------------------- JP CL_SET ; &16B0 - SET_MIN - Set workspace to minimum size ; ----------------------------------------------- DEFS &16B0-$ .L16B0 LD HL,(&5C59) LD (HL),13 LD (&5C5B),HL INC HL LD (HL),&80 INC HL LD (&5C61),HL RET ; &1B8A - LINE_RUN - Execute line ; ------------------------------- DEFS &1B8A-$ .L1B8A RET ; &1F54 - BREAK_KEY - Check BREAK key ; ----------------------------------- DEFS &1F54-$ .L1F54 LD A,&7F IN A,(&FE) RRA RET C ; &1F5A - SHIFT_KEY - Check SHIFT key ; ----------------------------------- .L1F5A LD A,&FE IN A,(&FE) RRA RET ; &254F - S_SCRN_LP - SCREEN$ ; --------------------------- DEFS &254F-$ .L254F JP L038D ; &3D00 - Character font ; ---------------------- DEFS &3D00-$ .L3D00