; Minimal Spectrum ROM ; ==================== ; Written by Andrew Owen ; ; v0.01 - Initial version by Andrew Owen ORG &0000 .L0000 ; RESET RET DEFS &0008-$ .L0008 ; RST &08 RET DEFS &0010-$ .L0010 ; OUT_CHAR EXX CALL L0164 EXX RET DEFB 0,0 .L0018 ; RST &18 RET DEFS &0020-$ .L0020 RET DEFS &0028-$ .L0028 RET DEFS &0030-$ .L0030 ; RST &30 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-$ .L0066 ; NMI RETN DEFS &00E6-$ .L00E6 ; start of a table 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 .L0156 DEFS &0164-$ ; Printout routine ; ================ .L0164 CALL L018A CP &20 JR NC,L017F 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 L02C3 .L017F CALL L0192 .L0182 LD (&5C88),BC LD (&5C84),HL RET .L018A LD BC,(&5C88) LD HL,(&5C84) RET .L0192 CP &80 JR C,L01C9 CP &90 JR NC,L01C0 LD B,A CALL L01A6 CALL L018A 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 ADD A,&15 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,L0253 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 .L0253 LD DE,L02C3 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,L1721 JR L02C3 ; CL_ALL jumps here .L02A4 LD HL,&00 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 .L02C3 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 L0182 .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,&20 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,L0701 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 .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 .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,L00E6 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 .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 .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 ; &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 ; ---------------- .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 .L05E3 DEFM "Copyright (C)2006 Andrew Owen" .L0600 DEFS &0701-$ .L0701 DEFS &0984-$ ; Save header at IX then data at address on stack ; ----------------------------------------------- .L0984 JP L04A8 ; &0DAF - CL_ALL - Clear the whole display ; ---------------------------------------- DEFS &0DAF-$ .L0DAF JP L02A4 ; &16B0 - SET_MIN - Set workspace to minimum size ; ----------------------------------------------- DEFS &16B0-$ .L16B0 RET DEFS &1721-$ .L1721 ; &1F54 - BREAK_KEY - Check BREAK key ; ----------------------------------- DEFS &1F54-$ .L1F54 LD A,&7F IN A,(&FE) RRA RET C LD A,&FE IN A,(&FE) RRA RET ; &254F - S_SCRN_LP - SCREEN$ DEFS &254F-$ .L254F JP L038D ; &3D00 - Character font ; ---------------------- DEFS &3D00-$ .L3D00