copy all local files to repo
cp/m files, sprites, circuit design
This commit is contained in:
503
emu/z80pack-1.9/cpmsim/srcmpm/bnkxios.mac
Normal file
503
emu/z80pack-1.9/cpmsim/srcmpm/bnkxios.mac
Normal file
@@ -0,0 +1,503 @@
|
||||
; MP/M 2 XIOS for Z80-Simulator
|
||||
;
|
||||
; Copyright (C) 1989-2006 by Udo Munk
|
||||
;
|
||||
.Z80
|
||||
CSEG
|
||||
;
|
||||
; i/o ports
|
||||
;
|
||||
CONSTA EQU 0 ;console status port
|
||||
CONDAT EQU 1 ;console data port
|
||||
PRTSTA EQU 2 ;printer status port
|
||||
PRTDAT EQU 3 ;printer data port
|
||||
AUXSTA EQU 4 ;auxilary status port
|
||||
AUXDAT EQU 5 ;auxilary data port
|
||||
FDCD EQU 10 ;fdc-port: # of drive
|
||||
FDCT EQU 11 ;fdc-port: # of track
|
||||
FDCS EQU 12 ;fdc-port: # of sector
|
||||
FDCOP EQU 13 ;fdc-port: command
|
||||
FDCST EQU 14 ;fdc-port: status
|
||||
DMAL EQU 15 ;dma-port: dma address low
|
||||
DMAH EQU 16 ;dma-port: dma address high
|
||||
MMUINI EQU 20 ;initialize mmu
|
||||
MMUSEL EQU 21 ;bank select mmu
|
||||
CLKCMD EQU 25 ;clock command
|
||||
CLKDAT EQU 26 ;clock data
|
||||
TIMER EQU 27 ;interrupt timer
|
||||
;
|
||||
; clock commands
|
||||
;
|
||||
GETSEC EQU 0 ;get seconds
|
||||
GETMIN EQU 1 ;get minutes
|
||||
GETHOU EQU 2 ;get hours
|
||||
GETDAL EQU 3 ;get days low
|
||||
GETDAH EQU 4 ;get days high
|
||||
;
|
||||
BDOS EQU 5 ;bdos calls
|
||||
SETTD EQU 104 ;bdos set time and date
|
||||
;
|
||||
POLL EQU 131 ;xdos poll function
|
||||
PLCI0 EQU 0 ;poll console in #0
|
||||
FLAGSET EQU 133 ;xdos flag set function
|
||||
SYSDATA EQU 154 ;xdos syste data address
|
||||
;
|
||||
; jump vector for individual subroutines
|
||||
;
|
||||
JP COMMONBASE ;commonbase
|
||||
JP WARMSTART ;warm start
|
||||
JP CONST ;console status
|
||||
JP CONIN ;console character in
|
||||
JP CONOUT ;console character out
|
||||
JP LIST ;list character out
|
||||
JP PUNCH ;not used by MP/M 2
|
||||
JP READER ;not used by MP/M 2
|
||||
JP HOME ;move head to home
|
||||
JP SELDSK ;select disk
|
||||
JP SETTRK ;set track numer
|
||||
JP SETSEC ;set sector number
|
||||
JP SETDMA ;set dma address
|
||||
JP READ ;read disk
|
||||
JP WRITE ;write disk
|
||||
JP LISTST ;not used by MP/M 2
|
||||
JP SECTRAN ;sector translate
|
||||
JP SELMEMORY ;select memory
|
||||
JP POLLDEVICE ;poll device
|
||||
JP STARTCLOCK ;start clock
|
||||
JP STOPCLOCK ;stop clock
|
||||
JP EXITREGION ;exit region
|
||||
JP MAXCONSOLE ;maximum console number
|
||||
JP SYSTEMINIT ;system initialization
|
||||
JP IDLE ;idle prozedure
|
||||
;
|
||||
COMMONBASE:
|
||||
JP COLDSTART
|
||||
SWTUSER:
|
||||
JP $-$
|
||||
SWTSYS: JP $-$
|
||||
PDISP: JP $-$
|
||||
XDOS: JP $-$
|
||||
SYSDAT: DEFW $-$
|
||||
;
|
||||
COLDSTART:
|
||||
WARMSTART:
|
||||
LD C,0
|
||||
JP XDOS ;system reset, terminate prozess
|
||||
;
|
||||
; MP/M II V2.0 Console Bios
|
||||
;
|
||||
CONST:
|
||||
CALL PTBLJMP ;compute and jump to handler
|
||||
DW PTSTI0
|
||||
;
|
||||
CONIN:
|
||||
CALL PTBLJMP ;compute and jump to handle
|
||||
DW PTIN0
|
||||
;
|
||||
CONOUT:
|
||||
CALL PTBLJMP ;compute and jump to handler
|
||||
DW PTOUT0
|
||||
;
|
||||
PTSTI0: IN A,(CONSTA) ;console 0 input
|
||||
RET
|
||||
;
|
||||
PTIN0: LD C,POLL ;poll console 0 status in
|
||||
LD E,PLCI0
|
||||
CALL XDOS ;poll console 0
|
||||
IN A,(CONDAT) ;read character
|
||||
AND 7FH ;strip parity
|
||||
RET
|
||||
;
|
||||
PTOUT0: LD A,C ;console 0 output
|
||||
OUT (CONDAT),A
|
||||
RET
|
||||
;
|
||||
PTBLJMP: ;compute and jump to handler
|
||||
LD A,D
|
||||
ADD A,A ;double table index for adress offset
|
||||
POP HL ;return adress of jump table
|
||||
LD E,A
|
||||
LD D,0
|
||||
ADD HL,DE ;table index * 2 + table base
|
||||
LD E,(HL) ;get handler address
|
||||
INC HL
|
||||
LD D,(HL)
|
||||
EX DE,HL
|
||||
JP (HL) ;jump to computed handler
|
||||
;
|
||||
LIST:
|
||||
LD A,C
|
||||
OUT (PRTDAT),A
|
||||
RET
|
||||
;
|
||||
; not used by MP/M 2
|
||||
PUNCH:
|
||||
READER:
|
||||
LISTST:
|
||||
RET
|
||||
;
|
||||
; MP/M II V2.0 Xios
|
||||
;
|
||||
; select/protect memory
|
||||
; BC = address of memory descriptor
|
||||
SELMEMORY:
|
||||
LD HL,3 ;offset memory bank in memory descriptor
|
||||
ADD HL,BC
|
||||
LD A,(HL) ;get bank
|
||||
OUT (MMUSEL),A ;and select it
|
||||
RET
|
||||
;
|
||||
; poll character devices
|
||||
;
|
||||
POLLDEVICE:
|
||||
JP PTSTI0 ;poll console 0 status in
|
||||
;
|
||||
; start clock
|
||||
;
|
||||
STARTCLOCK:
|
||||
LD A,0FFH
|
||||
LD (TICKN),A
|
||||
RET
|
||||
;
|
||||
; stop clock
|
||||
;
|
||||
STOPCLOCK:
|
||||
XOR A
|
||||
LD (TICKN),A
|
||||
RET
|
||||
;
|
||||
; exit region:
|
||||
; enable interrupt if not preempted or in dispatcher
|
||||
;
|
||||
EXITREGION:
|
||||
LD A,(PREEMP)
|
||||
OR A
|
||||
RET NZ
|
||||
EI
|
||||
RET
|
||||
;
|
||||
; maximum console number
|
||||
;
|
||||
MAXCONSOLE:
|
||||
LD A,1
|
||||
RET
|
||||
;
|
||||
; system initialization
|
||||
; C MP/M debugger restart #
|
||||
; DE MP/M entry point for debugger
|
||||
; HL BIOS jump table address
|
||||
;
|
||||
SYSTEMINIT:
|
||||
;
|
||||
;doesn't work
|
||||
PUSH HL
|
||||
LD C,SYSDATA ;get system data page address
|
||||
CALL XDOS
|
||||
CALL SETTOD ;set tod from hardware clock
|
||||
POP HL
|
||||
;
|
||||
LD A,8 ;initialize banked memory
|
||||
OUT (MMUINI),A
|
||||
LD B,A
|
||||
;
|
||||
SYS1: DEC B
|
||||
LD A,B
|
||||
OUT (MMUSEL),A ;select every bank and initialize
|
||||
LD A,0C3H ;jp instruction
|
||||
LD (0),A
|
||||
LD (38H),A
|
||||
LD (1),HL
|
||||
PUSH HL
|
||||
LD HL,INTHND
|
||||
LD (39H),HL
|
||||
POP HL
|
||||
JP NZ,SYS1
|
||||
;
|
||||
LD HL,SIGNON ;print message
|
||||
SYS2: LD A,(HL)
|
||||
OR A
|
||||
JP Z,SYS3
|
||||
OUT (CONDAT),A
|
||||
INC HL
|
||||
JP SYS2
|
||||
;
|
||||
SYS3: IM 1
|
||||
LD A,1 ;enable 20ms interrupt timer
|
||||
OUT (TIMER),A
|
||||
EI
|
||||
RET
|
||||
;
|
||||
; set mp/m tod from hardware clock
|
||||
; hl = tod address
|
||||
;
|
||||
SETTOD: LD A,GETDAL
|
||||
OUT (CLKCMD),A
|
||||
IN A,(CLKDAT)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
LD A,GETDAH
|
||||
OUT (CLKCMD),A
|
||||
IN A,(CLKDAT)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
LD A,GETHOU
|
||||
OUT (CLKCMD),A
|
||||
IN A,(CLKDAT)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
LD A,GETMIN
|
||||
OUT (CLKCMD),A
|
||||
IN A,(CLKDAT)
|
||||
LD (HL),A
|
||||
RET
|
||||
;
|
||||
; idle
|
||||
;
|
||||
IDLE: EI
|
||||
HALT
|
||||
RET
|
||||
;
|
||||
; interrupt handler
|
||||
;
|
||||
INTHND: LD (SVDHL),HL ;save registers
|
||||
POP HL
|
||||
LD (SVDRET),HL
|
||||
PUSH AF
|
||||
LD HL,0
|
||||
ADD HL,SP
|
||||
LD (SVDSP),HL
|
||||
LD SP,INTSTK
|
||||
PUSH DE
|
||||
PUSH BC
|
||||
LD A,0FFH ;set preempted flag
|
||||
LD (PREEMP),A
|
||||
LD A,(TICKN)
|
||||
OR A ;test tick, indicates delayed process
|
||||
JP Z,INTHND1
|
||||
LD C,FLAGSET ;set flag #1 each tick
|
||||
LD E,1
|
||||
CALL XDOS
|
||||
INTHND1:
|
||||
LD HL,CNT50 ;decrement tick counter
|
||||
DEC (HL)
|
||||
JP NZ,INTDONE
|
||||
LD (HL),50 ;set flag #2 each second
|
||||
LD C,FLAGSET
|
||||
LD E,2
|
||||
CALL XDOS
|
||||
INTDONE:
|
||||
XOR A ;clear preempted flag
|
||||
LD (PREEMP),A
|
||||
POP BC ;restore registers
|
||||
POP DE
|
||||
LD HL,(SVDSP)
|
||||
LD SP,HL
|
||||
POP AF
|
||||
LD HL,(SVDRET)
|
||||
PUSH HL
|
||||
LD HL,(PDISP+1) ;dispatch processes
|
||||
PUSH HL
|
||||
LD HL,(SVDHL)
|
||||
RETI
|
||||
;
|
||||
; i/o drivers for disks
|
||||
;
|
||||
; move to the track 00 position of current drive
|
||||
; translate this call into a settrk call with parameter 00
|
||||
;
|
||||
HOME: LD C,0 ;select track 0
|
||||
JP SETTRK ;we will move to 00 on first read/write
|
||||
;
|
||||
; select disk given by register C
|
||||
;
|
||||
SELDSK: LD HL,0000H ;error return code
|
||||
LD A,C
|
||||
CP 4 ;must be between 0 and 3
|
||||
JR NC,SELHD ;no carry if 4,5,...
|
||||
; disk number is in the proper range
|
||||
; compute proper disk parameter header address
|
||||
OUT (FDCD),A ;selekt disk drive
|
||||
LD L,A ;L=disk number 0,1,2,3
|
||||
ADD HL,HL ;*2
|
||||
ADD HL,HL ;*4
|
||||
ADD HL,HL ;*8
|
||||
ADD HL,HL ;*16 (size of each header)
|
||||
LD DE,DPBASE
|
||||
ADD HL,DE ;HL=.dpbase(diskno*16)
|
||||
RET
|
||||
SELHD: CP 8 ;select the harddisk?
|
||||
RET NZ ;no, error
|
||||
OUT (FDCD),A ;select disk drive
|
||||
LD HL,HDBASE ;HL=hdbase for harddisk
|
||||
RET
|
||||
;
|
||||
; set track given by register c
|
||||
;
|
||||
SETTRK: LD A,C
|
||||
OUT (FDCT),A
|
||||
RET
|
||||
;
|
||||
; set sector given by register c
|
||||
;
|
||||
SETSEC: LD A,C
|
||||
OUT (FDCS),A
|
||||
RET
|
||||
;
|
||||
; translate the sector given by BC using the
|
||||
; translate table given by DE
|
||||
;
|
||||
SECTRAN:
|
||||
EX DE,HL ;HL=.trans
|
||||
ADD HL,BC ;HL=.trans(sector)
|
||||
LD L,(HL) ;L = trans(sector)
|
||||
LD H,0 ;HL= trans(sector)
|
||||
RET ;with value in HL
|
||||
;
|
||||
; set dma address given by registers b and c
|
||||
;
|
||||
SETDMA: LD A,C ;low order address
|
||||
OUT (DMAL),A
|
||||
LD A,B ;high order address
|
||||
OUT (DMAH),A ;in dma
|
||||
RET
|
||||
;
|
||||
; perform read operation
|
||||
;
|
||||
READ: XOR A ;read command -> A
|
||||
JP WAITIO ;to perform the actual i/o
|
||||
;
|
||||
; perform a write operation
|
||||
;
|
||||
WRITE: LD A,1 ;write command -> A
|
||||
;
|
||||
; enter here from read and write to perform the actual i/o
|
||||
; operation. return a 00h in register a if the operation completes
|
||||
; properly, and 01h if an error occurs during the read or write
|
||||
;
|
||||
; in this case, we have saved the disk number in 'diskno' (0-3)
|
||||
; the track number in 'track' (0-76)
|
||||
; the sector number in 'sector' (1-26)
|
||||
; the dma address in 'dmaad' (0-65535)
|
||||
;
|
||||
WAITIO: OUT (FDCOP),A ;start i/o operation
|
||||
IN A,(FDCST) ;status of i/o operation -> A
|
||||
RET
|
||||
;
|
||||
; XIOS data segment
|
||||
;
|
||||
SIGNON: DEFB 13,10
|
||||
DEFM 'MP/M 2 XIOS V1.1 for Z80SIM, '
|
||||
DEFM 'Copyright 1989-2006 by Udo Munk'
|
||||
DEFB 13,10,0
|
||||
;
|
||||
TICKN: DEFB 0 ;flag for tick
|
||||
PREEMP: DEFB 0 ;preempted flag
|
||||
TOD: DEFS 4 ;time of day
|
||||
SVDHL: DEFS 2 ;save hl during interrupt
|
||||
SVDRET: DEFS 2 ;save return address during interrupt
|
||||
SVDSP: DEFS 2 ;save sp during interrupt
|
||||
CNT50: DEFB 50 ;50 ticks a 20ms = 1 second
|
||||
;interrupt stack
|
||||
DEFW 0C7C7H,0C7C7H,0C7C7H,0C7C7H
|
||||
DEFW 0C7C7H,0C7C7H,0C7C7H,0C7C7H
|
||||
DEFW 0C7C7H,0C7C7H,0C7C7H,0C7C7H
|
||||
DEFW 0C7C7H,0C7C7H,0C7C7H,0C7C7H
|
||||
INTSTK:
|
||||
;
|
||||
; fixed data tables for four-drive standard
|
||||
; IBM-compatible 8" disks
|
||||
;
|
||||
; disk parameter header for disk 00
|
||||
DPBASE: DEFW TRANS,0000H
|
||||
DEFW 0000H,0000H
|
||||
DEFW DIRBF,DPBLK
|
||||
DEFW CHK00,ALL00
|
||||
; disk parameter header for disk 01
|
||||
DEFW TRANS,0000H
|
||||
DEFW 0000H,0000H
|
||||
DEFW DIRBF,DPBLK
|
||||
DEFW CHK01,ALL01
|
||||
; disk parameter header for disk 02
|
||||
DEFW TRANS,0000H
|
||||
DEFW 0000H,0000H
|
||||
DEFW DIRBF,DPBLK
|
||||
DEFW CHK02,ALL02
|
||||
; disk parameter header for disk 03
|
||||
DEFW TRANS,0000H
|
||||
DEFW 0000H,0000H
|
||||
DEFW DIRBF,DPBLK
|
||||
DEFW CHK03,ALL03
|
||||
;
|
||||
; sector translate vector for the IBM 8" disks
|
||||
;
|
||||
TRANS: DEFB 1,7,13,19 ;sectors 1,2,3,4
|
||||
DEFB 25,5,11,17 ;sectors 5,6,7,8
|
||||
DEFB 23,3,9,15 ;sectors 9,10,11,12
|
||||
DEFB 21,2,8,14 ;sectors 13,14,15,16
|
||||
DEFB 20,26,6,12 ;sectors 17,18,19,20
|
||||
DEFB 18,24,4,10 ;sectors 21,22,23,24
|
||||
DEFB 16,22 ;sectors 25,26
|
||||
;
|
||||
; disk parameter block, common to all IBM 8" disks
|
||||
;
|
||||
DPBLK: DEFW 26 ;sectors per track
|
||||
DEFB 3 ;block shift factor
|
||||
DEFB 7 ;block mask
|
||||
DEFB 0 ;extent mask
|
||||
DEFW 242 ;disk size-1
|
||||
DEFW 63 ;directory max
|
||||
DEFB 192 ;alloc 0
|
||||
DEFB 0 ;alloc 1
|
||||
DEFW 16 ;check size
|
||||
DEFW 2 ;track offset
|
||||
;
|
||||
; fixed data tables for 4MB harddisk
|
||||
;
|
||||
; disk parameter header
|
||||
HDBASE: DEFW HDTRA,0000H
|
||||
DEFW 0000H,0000H
|
||||
DEFW DIRBF,HDBLK
|
||||
DEFW CHKHD,ALLHD
|
||||
;
|
||||
; sector translate vector for the hardisk
|
||||
;
|
||||
HDTRA: DEFB 1,2,3,4,5,6,7,8,9,10
|
||||
DEFB 11,12,13,14,15,16,17,18,19,20
|
||||
DEFB 21,22,23,24,25,26,27,28,29,30
|
||||
DEFB 31,32,33,34,35,36,37,38,39,40
|
||||
DEFB 41,42,43,44,45,46,47,48,49,50
|
||||
DEFB 51,52,53,54,55,56,57,58,59,60
|
||||
DEFB 61,62,63,64,65,66,67,68,69,70
|
||||
DEFB 71,72,73,74,75,76,77,78,79,80
|
||||
DEFB 81,82,83,84,85,86,87,88,89,90
|
||||
DEFB 91,92,93,94,95,96,97,98,99,100
|
||||
DEFB 101,102,103,104,105,106,107,108,109,110
|
||||
DEFB 111,112,113,114,115,116,117,118,119,120
|
||||
DEFB 121,122,123,124,125,126,127,128
|
||||
;
|
||||
; disk parameter block for harddisk
|
||||
;
|
||||
HDBLK: DEFW 128 ;sectors per track
|
||||
DEFB 4 ;block shift factor
|
||||
DEFB 15 ;block mask
|
||||
DEFB 0 ;extent mask
|
||||
DEFW 2039 ;disk size-1
|
||||
DEFW 1023 ;directory max
|
||||
DEFB 255 ;alloc 0
|
||||
DEFB 255 ;alloc 1
|
||||
DEFW 0 ;check size
|
||||
DEFW 0 ;track offset
|
||||
;
|
||||
DIRBF: DEFS 128 ;scratch directory area
|
||||
ALL00: DEFS 31 ;allocation vector 0
|
||||
ALL01: DEFS 31 ;allocation vector 1
|
||||
ALL02: DEFS 31 ;allocation vector 2
|
||||
ALL03: DEFS 31 ;allocation vector 3
|
||||
ALLHD: DEFS 255 ;allocation vector harddisk
|
||||
CHK00: DEFS 16 ;check vector 0
|
||||
CHK01: DEFS 16 ;check vector 1
|
||||
CHK02: DEFS 16 ;check vector 2
|
||||
CHK03: DEFS 16 ;check vector 3
|
||||
CHKHD: DEFS 0 ;check vector harddisk
|
||||
;
|
||||
END
|
177
emu/z80pack-1.9/cpmsim/srcmpm/ldrbios.mac
Normal file
177
emu/z80pack-1.9/cpmsim/srcmpm/ldrbios.mac
Normal file
@@ -0,0 +1,177 @@
|
||||
; MP/M 2 LDRBIOS for Z80-Simulator
|
||||
;
|
||||
; Copyright (C) 1989-2006 by Udo Munk
|
||||
;
|
||||
ORG 1700H
|
||||
;
|
||||
; I/O ports
|
||||
;
|
||||
CONSTA EQU 0 ;console status port
|
||||
CONDAT EQU 1 ;console data port
|
||||
FDCD EQU 10 ;fdc-port: # of drive
|
||||
FDCT EQU 11 ;fdc-port: # of track
|
||||
FDCS EQU 12 ;fdc-port: # of sector
|
||||
FDCOP EQU 13 ;fdc-port: command
|
||||
FDCST EQU 14 ;fdc-port: status
|
||||
DMAL EQU 15 ;dma-port: dma address low
|
||||
DMAH EQU 16 ;dma-port: dma address high
|
||||
;
|
||||
; jump vector for individual subroutines
|
||||
;
|
||||
JP BOOT ;perform cold start initialization
|
||||
JP WBOOT ;perform warm start initialization
|
||||
JP CONST ;check for console input char ready
|
||||
JP CONIN ;read console character in
|
||||
JP CONOUT ;write console character out
|
||||
JP LIST ;write list character out
|
||||
JP AUXOUT ;write auxiliary output char
|
||||
JP AUXIN ;read auxiliary input char
|
||||
JP HOME ;move head to track 0 on selcted disk
|
||||
JP SELDSK ;select disk drive
|
||||
JP SETTRK ;set track number
|
||||
JP SETSEC ;set sector number
|
||||
JP SETDMA ;set dma address
|
||||
JP READ ;read specified sector
|
||||
JP WRITE ;write specified sector
|
||||
JP LISTST ;return list status
|
||||
JP SECTRAN ;translate logical to physical sector
|
||||
;
|
||||
; fixed data tables for a IBM-compatible 8" disk
|
||||
;
|
||||
; disk parameter header
|
||||
;
|
||||
DPH: DEFW TRANS,0000H
|
||||
DEFW 0000H,0000H
|
||||
DEFW DIRBF,DPBLK
|
||||
DEFW CHK00,ALL00
|
||||
;
|
||||
; sector translate vector for the IBM 8" disk
|
||||
;
|
||||
TRANS: DEFB 1,7,13,19 ;sectors 1,2,3,4
|
||||
DEFB 25,5,11,17 ;sectors 5,6,7,8
|
||||
DEFB 23,3,9,15 ;sectors 9,10,11,12
|
||||
DEFB 21,2,8,14 ;sectors 13,14,15,16
|
||||
DEFB 20,26,6,12 ;sectors 17,18,19,20
|
||||
DEFB 18,24,4,10 ;sectors 21,22,23,24
|
||||
DEFB 16,22 ;sectors 25,26
|
||||
;
|
||||
; disk parameter block for the IBM 8" disk
|
||||
;
|
||||
DPBLK: DEFW 26 ;sectors per track
|
||||
DEFB 3 ;block shift factor
|
||||
DEFB 7 ;block mask
|
||||
DEFB 0 ;extent mask
|
||||
DEFW 242 ;disk size-1
|
||||
DEFW 63 ;directory max
|
||||
DEFB 192 ;alloc 0
|
||||
DEFB 0 ;alloc 1
|
||||
DEFW 16 ;check size
|
||||
DEFW 2 ;track offset
|
||||
;
|
||||
; signon message
|
||||
;
|
||||
SIGNON: DEFB 13,10
|
||||
DEFM 'LDRBIOS V1.0 for Z80SIM, '
|
||||
DEFM 'Copyright 1989-2006 by Udo Munk'
|
||||
DEFB 13,10,0
|
||||
;
|
||||
; end of fixed tables
|
||||
;
|
||||
; individual subroutines to perform each function
|
||||
;
|
||||
BOOT: LD HL,SIGNON ;print message
|
||||
BOOTL: LD A,(HL)
|
||||
OR A
|
||||
JP Z,WBOOT
|
||||
LD C,A
|
||||
CALL CONOUT
|
||||
INC HL
|
||||
JP BOOTL
|
||||
;
|
||||
; those are not implemented in loader bios
|
||||
;
|
||||
WBOOT:
|
||||
CONST:
|
||||
CONIN:
|
||||
LIST:
|
||||
AUXOUT:
|
||||
AUXIN:
|
||||
WRITE:
|
||||
LISTST:
|
||||
RET
|
||||
;
|
||||
; console character output from register c
|
||||
;
|
||||
CONOUT: LD A,C ;get to accumulator
|
||||
OUT (CONDAT),A ;send character to console
|
||||
RET
|
||||
;
|
||||
;
|
||||
; i/o drivers for the disk follow
|
||||
;
|
||||
; move to the track 00 position of current drive
|
||||
; translate this call into a settrk call with parameter 00
|
||||
;
|
||||
HOME: LD C,0 ;select track 0
|
||||
JP SETTRK ;we will move to 00 on first read/write
|
||||
;
|
||||
; select disk given by register C
|
||||
;
|
||||
SELDSK: PUSH BC
|
||||
CALL BOOT ;signon message
|
||||
POP BC
|
||||
LD HL,0000H ;error return code
|
||||
LD A,C
|
||||
CP 0 ;we boot from drive 0 only
|
||||
RET NZ ;return error
|
||||
; disk number is in the proper range
|
||||
; return proper disk parameter header address
|
||||
OUT (FDCD),A ;selekt disk drive
|
||||
LD HL,DPH
|
||||
RET
|
||||
;
|
||||
; set track given by register c
|
||||
;
|
||||
SETTRK: LD A,C
|
||||
OUT (FDCT),A
|
||||
RET
|
||||
;
|
||||
; set sector given by register c
|
||||
;
|
||||
SETSEC: LD A,C
|
||||
OUT (FDCS),A
|
||||
RET
|
||||
;
|
||||
; translate the sector given by BC using the
|
||||
; translate table given by DE
|
||||
;
|
||||
SECTRAN:
|
||||
EX DE,HL ;hl=.trans
|
||||
ADD HL,BC ;hl=.trans(sector)
|
||||
LD L,(HL) ;l = trans(sector)
|
||||
LD H,0 ;hl= trans(sector)
|
||||
RET ;with value in hl
|
||||
;
|
||||
; set dma address given by registers b and c
|
||||
;
|
||||
SETDMA: LD A,C ;low order address
|
||||
OUT (DMAL),A
|
||||
LD A,B ;high order address
|
||||
OUT (DMAH),A ;in dma
|
||||
RET
|
||||
;
|
||||
; perform read operation
|
||||
;
|
||||
READ: XOR A ;read command -> a
|
||||
OUT (FDCOP),A ;start i/o operation
|
||||
IN A,(FDCST) ;status of i/o operation -> a
|
||||
RET
|
||||
;
|
||||
BEGDAT EQU $
|
||||
DIRBF: DEFS 128 ;scratch directory area
|
||||
ALL00: DEFS 31 ;allocation vector
|
||||
CHK00: DEFS 16 ;check vector
|
||||
;
|
||||
ENDDAT EQU $ ;end
|
||||
DATSIZ EQU $-BEGDAT ;size of data area
|
||||
END ;of bios
|
Reference in New Issue
Block a user