diff --git a/src/zvm_m65/z80_instr_general.s b/src/zvm_m65/z80_instr_general.s index dafaa89d..dc88a098 100644 --- a/src/zvm_m65/z80_instr_general.s +++ b/src/zvm_m65/z80_instr_general.s @@ -4,12 +4,63 @@ ; +Z80_instr_2F: ; CPL + + lda REG_A + eor #$FF + sta REG_A + + lda REG_F + ora #(Z80_HF + Z80_NF) + sta REG_F + jmp ZVM_next + +; XXX put NEG here + +Z80_instr_3F: ; CCF + + +Z80_PUT_0_NF + bbs0 REG_F,@1 +@0: + +Z80_PUT_0_HF + +Z80_PUT_1_CF + jmp ZVM_next +@1: + +Z80_PUT_1_HF + +Z80_PUT_0_CF + jmp ZVM_next + +Z80_instr_37: ; SCF + + +Z80_PUT_0_HF + +Z80_PUT_0_NF + +Z80_PUT_1_CF + jmp ZVM_next + +Z80_instr_76: ; HALT + + ; Used to call BIOS routines + + ldx #$01 ; default BIOS function, warm start + + lda REG_PC + sec + sbc #$64 + cmp #33 + bcs @1 + tax +@1: + txa + asl + tax + jmp (zvm_BIOS_vectable,x) + Z80_instr_F3: ; DI lda #$00 - +skip_2_bytes_trash_nvz - - ; FALLTROUGH + sta REG_IFF1 + sta REG_IFF2 + jmp ZVM_next Z80_instr_FB: ; EI diff --git a/src/zvm_m65/zvm_bios.s b/src/zvm_m65/zvm_bios.s index 5120a799..b722b289 100644 --- a/src/zvm_m65/zvm_bios.s +++ b/src/zvm_m65/zvm_bios.s @@ -3,4 +3,177 @@ ; Z80 Virtual Machine BIOS for CP/M ; -; XXX implement + +; Virtual BIOS memory map + +; $FE00 - $FE63 - jumptable, 3*33 bytes +; $FE63 - $FE84 - magic HALT instructions to select BIOS routines +; $FE85 - $FEFF - unused +; $FF00 - $FFFF - Disk Drive Tables, dynamically generated, $10 bytes for each one + + + + +zvm_BIOS_vectable: + + !word zvm_BIOS_00_BOOT + !word zvm_BIOS_01_WBOOT + !word zvm_BIOS_02_CONST + !word zvm_BIOS_03_CONIN + !word zvm_BIOS_04_CONOUT + !word zvm_BIOS_05_LIST + !word zvm_BIOS_06_AUXOUT + !word zvm_BIOS_07_AUXIN + !word zvm_BIOS_08_HOME + !word zvm_BIOS_09_SELDSK + !word zvm_BIOS_10_SETTRK + !word zvm_BIOS_11_SETSEC + !word zvm_BIOS_12_SETDMA + !word zvm_BIOS_13_READ + !word zvm_BIOS_14_WRITE + !word zvm_BIOS_15_LISTST + !word zvm_BIOS_16_SECTRN + !word zvm_BIOS_17_CONOST + !word zvm_BIOS_18_AUXIST + !word zvm_BIOS_19_AUXOST + !word zvm_BIOS_20_DEVTBL + !word zvm_BIOS_21_DEVINI + !word zvm_BIOS_22_DRVTBL + !word zvm_BIOS_23_MULTIO + !word zvm_BIOS_24_FLUSH + !word zvm_BIOS_25_MOVE + !word zvm_BIOS_26_TIME + !word zvm_BIOS_27_SELMEM + !word zvm_BIOS_28_SETBNK + !word zvm_BIOS_29_XMOVE + !word zvm_BIOS_30_USERF + !word zvm_BIOS_31_RESERV1 + !word zvm_BIOS_32_RESERV2 + +zvm_BIOS_00_BOOT: ; Cold start + + ; XXX !!! + + ; FALLTROUGH + +zvm_BIOS_01_WBOOT: ; Warm start +zvm_BIOS_31_RESERV1: ; Reserved +zvm_BIOS_32_RESERV2: ; Reserved + + ; XXX !!! + +zvm_BIOS_02_CONST: ; Check if input character available + + ; XXX !!! + +zvm_BIOS_03_CONIN: ; Console input + + ; XXX !!! + +zvm_BIOS_04_CONOUT: ; Console output + + ; XXX + +zvm_BIOS_05_LIST: ; Provide list of character output devices + + ; XXX + +zvm_BIOS_06_AUXOUT: ; AUX output + + ; XXX + +zvm_BIOS_07_AUXIN: ; AUX input + + ; XXX + +zvm_BIOS_08_HOME: ; Go to track 0 + + ; XXX !!! + +zvm_BIOS_09_SELDSK: ; Select drive + + ; XXX !!! + +zvm_BIOS_10_SETTRK: ; Set track number + + ; XXX !!! + +zvm_BIOS_11_SETSEC: ; Set sector number + + ; XXX !!! + +zvm_BIOS_12_SETDMA: ; Set DMA address + + ; XXX !!! + +zvm_BIOS_13_READ: ; Read sector + + ; XXX !!! + +zvm_BIOS_14_WRITE: ; Write sector + + ; XXX !!! + +zvm_BIOS_15_LISTST: ; List status + + ; XXX + +zvm_BIOS_16_SECTRN: ; Convert logical to physical sector + + ; XXX !!! + +zvm_BIOS_17_CONOST: ; Console output status + + ; XXX + +zvm_BIOS_18_AUXIST: ; AUX input status + + ; XXX + +zvm_BIOS_19_AUXOST: ; AUX output status + + ; XXX + +zvm_BIOS_20_DEVTBL: ; Character device table address + + ; XXX + +zvm_BIOS_21_DEVINI: ; Initialize character device + + ; XXX + +zvm_BIOS_22_DRVTBL: ; Disk drive table address + + ; XXX + +zvm_BIOS_23_MULTIO: ; Set number of logically consecutive sectors + + ; XXX !!! + +zvm_BIOS_24_FLUSH: ; Force buffer flushing for user deblocking + + ; XXX !!! + +zvm_BIOS_25_MOVE: ; Memory move + + ; XXX + +zvm_BIOS_26_TIME: ; Get or set time + + ; XXX !!! + +zvm_BIOS_27_SELMEM: ; Select memory bank + + ; XXX + +zvm_BIOS_28_SETBNK: ; Set bank for DMA operation + + ; XXX + +zvm_BIOS_29_XMOVE: ; Set bank if buffer is in bank other than 1 or 2 + + ; XXX + +zvm_BIOS_30_USERF: ; Implementation-specific functionality + + ; XXX implement function to save RAM DISK back to SD CARD diff --git a/src/zvm_m65/zvm_core.s b/src/zvm_m65/zvm_core.s index c0746e1d..e71b3775 100644 --- a/src/zvm_m65/zvm_core.s +++ b/src/zvm_m65/zvm_core.s @@ -41,8 +41,8 @@ ZVM_store_next: asl tax bcs @1 - jmp (.TAB_LO) ; execute opcode $00-$7F -@1: jmp (.TAB_HI) ; execute opcode $80-$FF + jmp (.TAB_LO,x) ; execute opcode $00-$7F +@1: jmp (.TAB_HI,x) ; execute opcode $80-$FF } @@ -114,14 +114,10 @@ Z80_instr_22: ; LD (nn),HL Z80_instr_27: ; DAA Z80_instr_29: ; ADD HL,HL Z80_instr_2A: ; LD HL,(nn) -Z80_instr_2F: ; CPL Z80_instr_31: ; LD SP,nn Z80_instr_32: ; LD (nn),A -Z80_instr_37: ; SCF Z80_instr_39: ; ADD HL,SP Z80_instr_3A: ; LD A,(nn) -Z80_instr_3F: ; CCF -Z80_instr_76: ; HALT Z80_instr_80: ; ADD A,B Z80_instr_81: ; ADD A,C Z80_instr_82: ; ADD A,D