Files
vs2k-patch-roms/Patches/pk2k/ka410w_v23_rom-0013.patch
2025-07-15 10:56:56 +01:00

1671 lines
25 KiB
Diff

KA410ROM23.BIN /abs /out=KA410ROM23W.BIN /jou=KA410ROM23W
!-------------------------------------------------------------------------------
! "KA410-B V2.3" ROM:
! - replace "MUA0" TVBTDRIVER by "DKAn" DK2KBTDRIVER
! - fix bogus 000000C4 SCSI (disk) self-test error
! - add "T 56" for checking/setting the SCSI host id (default = 0)
! - try to improve SCSI arbitration logic during self-test (03C6)
! (no errors observed yet).
!
!-------------------------------------------------------------------------------
! w.j.m. 24-mar-1999 (based upon 2KBTDRIVER.MAR with CDROM = 1)
! mod 29-mar-1999 wjm: (after Vs3100 "STRG V1.3")
! fix "000000C4" SCSI self-test problem,
! caused by not expecting interrupt due to ATN;
! also remove "000000C6" test.
! mod 02-apr-1999 wjm: 2KBTDRIVER.MAR updated to support `IO410$AB_SCSI';
! change rom-id from "KA410-B W" to KA410-W V"
! mod 04-apr-1999 wjm: add "T 56"; try to fix arbitration logic (03C6 error).
!-------------------------------------------------------------------------------
!
def IO410$AL_SIDEX = 20040004
def IO410$AB_CPMBX = 200B0038 ! NVRAM, HALT flags
def IO410$AB_SCSI = 200B00BC ! NVRAM, SCSI host id (name made up)
def IO410$AB_SCTLS = 200C0080
!
def ka410rom = IO410$AL_SIDEX - 4 ! more physical addresses ...
def ka410rom_end = ka410rom + 040000
def ka410rom_cksum = ka410rom_end - 4
!
!-------------------------------------------------------------------------------
!
! NOTE: As of 02-apr-1999, this patch affects both the ROM VMB,
! and the self-test code, so both ids are changed.
! Use ">>> T 80000050" in order to inspect the VMB version.
!
def vmb_version = 2005376C - ka410rom
!
replace/ascii/long vmb_version
'V1.2'
exit
'W1.2'
exit
!
def rom_version_410 = 200414B0 - ka410rom
!
replace/ascii/long rom_version_410
'KA41'
'0-B '
'V2.x'
exit
'KA41'
'0-W ' ! ... here
'V2.x'
exit
!
!-------------------------------------------------------------------------------
!----- part 1a: fix SCSI self-test (000000C4)
!
def t6_unit_c4_loop = 20044D4F - ka410rom
def t6_unit_c6_start = 20044D82 - ka410rom
def t6_unit_c6_end = 20044D92 - ka410rom
def t6_unit_finish = 20044E1F - ka410rom ! exit tests here
def delay_316 = 2004C7AF - ka410rom ! just a random subroutine
!
verify/inst t6_unit_c4_loop ! wait for interrupt after DMA MSG_IN
' MOVL B^014(R7),R2' ! get mask set by interrupt handler
' BITL #00000050,R2' ! expect <6> and/or <4>
' BNEQ _4D7A' ! if so, done with "C4" test
' BBCCI #0,B^014(R7),_4D64' ! if some other interrupt occurred,
' TSTB B^01C(R6)' ! touch _RESET to acknowledge it
'_4D64: JSB L^delay_316'
' AOBLEQ #000007D0,R1,t6_unit_c4_loop'
' MOVB #0C4,B^8(R7)' ! set ttssmmC4 status
' BRW t6_unit_finish'
'_4D7A: BBCCI #0,B^014(R7),_4D82' ! if an interrupt occurred
' TSTB B^01C(R6)' ! touch _RESET to acknowledge it
'_4D82: MOVL B^014(R7),R2' ! get mask again
' BBS #4,R2,t6_unit_c6_end' ! if <4>(inteop), done with "C6" test
' MOVB #0C6,B^8(R7)' ! set ttssmmC6 status
' BRW t6_unit_finish'
exit
!
replace/inst t6_unit_c4_loop + 4
' BITL #00000050,R2' ! expect <4>(inteop) and <6>(phase chg)
exit
' BITL #000000D0,R2' ! also expect <7>(ATN)
exit
!
replace/inst t6_unit_c6_start ! <4> is typically missing ...
' MOVL B^014(R7),R2'
' BBS #4,R2,t6_unit_c6_end'
' MOVB #0C6,B^8(R7)'
' BRW t6_unit_finish'
exit
' nop' ! ... so remove this test (cf. Vs3100)
exit
!
!-------------------------------------------------------------------------------
!----- part 1b: try to fix SCSI self-test arbitration (03C6)
!
def t6_select_3c6 = 20045293 - ka410rom
def t6_select_3c6_end = 200452A3 - ka410rom
def t6_select_exit = 2004531D - ka410rom
!
verify/inst t6_select_3c6
' movb (r6),r2' ! get _CUR_DATA
' cmpb r4,r2' ! compare 1@hostid to bus data
' bleq t6_select_3c6_end' !* signed test here is definitely wrong
' movzwl #03C6,r0' ! ... return(03C6)
' brw t6_select_exit' ! (can't retry forever w/i self-test)
exit
!
replace/inst <t6_select_3c6 + 6>
' bleq t6_select_3c6_end' ! fail with (signed) lower id contender,
exit ! 7<0<1<2<3<4<5<6
' bgequ t6_select_3c6_end' ! fail with *higher* id contender,
exit ! 0<1<2<3<4<5<6<7
!
!-------------------------------------------------------------------------------
!----- part 2: add "T 56" utility for setting SCSI host id
!
! unused space in KA410-B V2.3 ROM:
! vmb410_end ... PRA0_bootblock approx. 320 bytes
! space after "B PRA0" image approx. 37 kBytes
!
def PRA0_bootblock = 20059C00 - ka410rom
verify/long PRA0_bootblock ! plausibility check only
+0E7000018
exit
!
examine <pra0_bootblock + 8> ! # blocks loaded by "B PRA0"
def pra0_boot_blocks = \
def free_area = pra0_bootblock + 0200 + <0200 * pra0_boot_blocks>
def free_size = <ka410rom_cksum - ka410rom> - free_area ! size of "patch area"
!
!---
!
! a few random subroutines ...
def cons_output_r0r1 = 20047764 - ka410rom ! r0 = length, r1 = address
def cons_output7b_r2 = 2004777D - ka410rom ! output any 7 bit byte in R2
def cons_input_num = 2004132E - ka410rom ! [(r0=0) => input a number]
!
def phy_test_50_54 = 20048EC0 ! T 5% get here
def test_50_54 = phy_test_50_54 - ka410rom
def test_53 = 200490FD - ka410rom ! T 53: prompt for HALT flags
!
def selftest_array = 20045739 - 8 - ka410rom
def selftest_array_NVR = selftest_array + <2 * 080>
verify/long/asc <selftest_array_NVR + 8>
'NVR '
' '
exit
! test_50_54 is reached via a pointer within this area, cf. below.
!
verify/inst test_50_54
' CLRB W^009F(R11)'
' CASEL R0,#0050,#4'
! 1$: .WORD LB_20048EDD - 1$ ! test 50 or 80000050 (status display)
! .WORD LB_20049026 - 1$ ! test 51 (q boot device)
! .WORD LB_20049098 - 1$ ! test 52 (q boot flags)
! .WORD LB_200490FD - 1$ ! test 53 (q halt flags)
! .WORD LB_2004914F - 1$ ! test 54 (q language)
! LB_20048ED6:
! MOVZBL #0017,R0 ! "?ILL CMD" message code
! BSBW S_20047731 ! output a message
! RSB
exit
!
! we'll model "T 56" after this one ...
verify/inst test_53
' pushr #01E' ! save R1..R4
' movab b^<20049093 + 1 - ka410rom>,r1' ! -> 4 spaces
' movzbl b^<20049093 - ka410rom>,r0' ! R0 := 4
' bsbw cons_output_r0r1'
' movw @#IO410$AB_CPMBX,-(sp)'
' extzv #6,#2,(sp),r0' ! R0 := old value
' addl2 #030,r0' ! same in ASCII
' movl r0,r2'
' bsbw cons_output7b_r2'
' clrl r0'
' bsbw cons_input_num' ! [input a number]
' tstl r0'
' bneq t53_30$' ! [got one]
' tstl r1'
' beql t53_50$' ! [confirmed old value]
' brb t53_80$' ! [input error]
't53_30$: movl (r1),r1' ! R1 := {input value}
' clrl r0' ! assume out-of-range error
' cmpl r1,#3' ! check range (0..3)
' bgtru t53_80$' ! br if no good
' insv r1,#6,#2,(sp)' ! ok, update stack copy
' insv r1,#2,#2,(sp)'
't53_50$: movl #1,r0' ! success status
't53_80$: movw (sp)+,@#IO410$AB_CPMBX' ! re-store stack copy
' popr #001E' ! restore R1..R4
' rsb'
exit
!
!--- NEW data & code for "T 56"
!
def t56_asciz = free_area
deposit/word/asc <t56_asciz + 1>
'SC'
'SI'
'A:'
' '
exit
ex/word
def free_area = . ! start of "patch area"
def free_size = <ka410rom_cksum - ka410rom> - free_area ! size of "patch area"
!
deposit/byte t56_asciz ! fill in string length
+<free_area - <t56_asciz + 1>>
exit
!
def test_56 = free_area
deposit/inst test_56 ! (after TEST 53 code, above)
' clrb w^009F(r11)' ! [from test_50_54]
' pushr #01E' ! save R1..R4
' movab b^<t56_asciz + 1>,r1' ! R1 -> "SCSIA: "
' movzbl b^t56_asciz,r0' ! R0 := string length
' jsb l^cons_output_r0r1'
' movw @#IO410$AB_SCSI,-(sp)' ! fetch NVRAM byte (left shifted by 2)
' extzv #2,#3,(sp),r0' ! R0 := old hostid
' addl2 #030,r0' ! convert to ASCII
' movl r0,r2'
' jsb cons_output7b_r2'
' clrl r0'
' jsb cons_input_num' ! [input a number]
' tstl r0'
' bneq t56_30$' ! [got one]
' tstl r1'
' beql t56_50$' ! [confirmed old value]
' brb t56_80$' ! [input error]
't56_30$: movl (r1),r1' ! R1 := {input value}
' clrl r0' ! assume out-of-range error
' cmpl r1,#7' ! check range (0..7)
' bgtru t56_80$' ! br if no good
' insv r1,#2,#3,(sp)' ! ok, update stack copy
't56_50$: movl #1,r0' ! success status
't56_80$: movw (sp)+,@#IO410$AB_SCSI' ! re-store stack copy
' popr #001E' ! restore R1..R4
' rsb'
exit
ex/inst
def free_area = . ! start of "patch area"
def free_size = <ka410rom_cksum - ka410rom> - free_area ! size of "patch area"
!
!--- dispatch to test_56
!
def t5x_dispatch = free_area
def phy_t5x_dispatch = t5x_dispatch + ka410rom
deposit/inst t5x_dispatch
' cmpl r0,#0056' ! Test 56 ?
' beql test_56' ! br if so
' jmp l^test_50_54'
exit
ex/inst
def free_area = . ! start of "patch area"
def free_size = <ka410rom_cksum - ka410rom> - free_area ! size of "patch area"
!
!--- point to NEW "T 5x" dispatcher
!
replace/long <selftest_array_NVR + 0040>
+phy_test_50_54
exit
+phy_t5x_dispatch
exit
!
!-------------------------------------------------------------------------------
!----- part 3: within VMB, replace TVBTDRIVER by (own) DK2KBTDRIVER
!
def btab_mua = 200537D9 - ka410rom
!
def TVBTDRIVER = 2005630D - ka410rom
def TVBTDRIVER_DRIVRNAME= 200565D7 - ka410rom
def TVBTDRIVER_AUXDRNAME= 200565E4 - ka410rom
def TVBTDRIVER_DEVNAME = 200565F1 - ka410rom
def TVBTDRIVER_UNIT_INIT= 20056616 - ka410rom
def TVBTDRIVER_ENTRY = 200566E1 - ka410rom
def TVBTDRIVER_UNIT_DISC= 200576E5 - ka410rom
def TVBTDRIVER_END = 200576FF - ka410rom ! ESBTDRIVER starts here
!
def BOO$DRIVER_TBL = 20058500 - ka410rom ! ^d10 longwords per driver:
! ! DU, TV("MU"), ES
!
def BTD$K_SCSI_5380_TAPE = 0025 !! "boot device code" associated with MUA0
def BTD$K_SCSI_5380_DISK = 002A !! I'd like to use this for DKAn, however
! !! (as of VMS V5.5-2) INIADP410 will map the
! !! SCSI port only for BTD$K_SCSI_5380_TAPE.
!
!***
!
replace/word/ascii btab_mua ! .ascii "MU" -> "DK"
'MU'
exit
'DK'
exit
!
verify/word btab_mua + 2 ! .asciz "A"
+0041
exit
!
replace/word btab_mua + 4 ! maxunit
+0000
exit
+0007
exit
!
verify/word btab_mua + 6 ! boot device type, must match BOO$DRIVER_TBL
+BTD$K_SCSI_5380_TAPE ! Can't change this (see above comments);
exit ! old value is fine, with at least VMS V5.5-2
!
verify/long btab_mua + 8
+IO410$AB_SCTLS
exit
!
!***
!
def drv_base = TVBTDRIVER
!
!@@@@ start DK2KBTDRIVER.PAT 2-APR-1999 13:08:14.48
!
! Data generated from DK2KBTDRIVER.BIN
!
def DK2KBTDRIVER_ENTRY = drv_base + 0000025C
def DK2KBTDRIVER_DRIVRNAME = drv_base + 00000050
def DK2KBTDRIVER_AUXDRNAME = drv_base + 0000005D
def DK2KBTDRIVER_UNIT_INIT = drv_base + 000000A5
def DK2KBTDRIVER_UNIT_DISC = drv_base + 00000FA1
def DK2KBTDRIVER_DEVNAME = drv_base + 0000006A
!
!
def DK2KBTDRIVER_LENGTH = 000013AB
!
deposit/long drv_base ! replace previous driver
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
0FFFFFFFF
000000000
0444B440C
045564952
058452E52
04B500C45
052444B32
0452E5256
04B444558
000001B06
006000100
000000000
003060000
008000000
000080600
000000000
00000280A
000000000
006000000
00000000A
02A0A0000
000000000
000000000
09501FC00
00F1282AF
09F0302EF
0200B00BC
001509C50
03CFF71CF
0125564A9
06BCF9107
0281301FF
0648F55D1
018000000
00755D11F
08FD00815
000000908
0559C0450
0FF4CCF01
000648FC5
050550000
064A950B0
0FF3CCF91
013FF35CF
0F88FB0DD
0DB1EA901
040D05038
08A5754A9
0D008A702
0F2305005
04450E800
0305005D0
050E800E9
08F50D13B
0000001A4
0CA302013
0408FDD00
0F5000F42
08ED5FD6E
0305005D0
050E800C9
08F50D11B
0000001A4
093300512
0D0C91100
0003A988F
0AE305000
00E50E900
008EF00E2
003000000
0D0001930
000045009
000101506
00C000C00
008000000
000000000
000020000
0E8049A30
03F300350
0E0AF7D0A
030FE75CF
050E80554
00A303003
0E8001030
027300350
005C7300A
0300350E8
07D050A1E
0C5307E51
00350E806
09A0A1130
0D2305000
00350E806
09E0A0530
09A52ADAF
082905182
005463050
093F751F5
01214A708
05001D0FA
005518E7D
0FE8CCF7D
030FE1DCF
050E90433
004F63009
0300350E9
090050575
004A7808F
06EF50CDD
0948ED5FD
exit
deposit/long drv_base+00000200
0DD0504A7
0126ED750
0A48FD009
050000001
004304711
00950E804
009088FD0
011500000
04ECF7D38
0FDD8CFFE
03004B730
050E80539
0CF029128
00313FE16
091098930
0FE0DCF00
07F300313
00400EF09
050FDC3CF
013500291
0500691B4
06B30AF13
0058ED509
0AC0600EF
050D15010
031031220
038DB01B5
0CEFDD5CF
0CFFDD1CF
0ACC0FDCE
0FDC8CF14
05A04ACD0
0B3CF52D0
01509EFFD
0FDB0CF5A
0AFCF5AD0
0031F30FD
083CF55D0
0CF55D0FD
058D5FD86
08FD00712
000010000
0CF5AD058
058D0FD66
0D0FD65CF
0FD68CF58
0CFD0507C
07B50FD62
00002008F
051505000
0021351D5
050D150D6
00000FF8F
09A041500
0D050FF8F
0FD48CF50
002008FC5
058500000
0FD38CFD1
01FFFFF8F
07D231A00
0CFFD8ACF
05090FD06
090FD06CF
0CFFD21CF
0CF90FCFE
0F6CFFD1B
015CF90FC
0FCEECFFD
0CF7D2C11
0E3CFFD6E
0E7CFD4FC
0CF5090FC
0CF90FCE3
0D9CFFCFA
0F4CF90FC
0FCD1CFFC
0FCEECF90
090FCC9CF
0CFFCE8CF
0D430FCC1
05050E902
0E8039730
073300350
0051E3008
03050019A
050E90531
005123057
014A70893
067904E13
0B3CFD550
0D70715FC
030FCADCF
0CC300227
0E158F503
0E803E830
03D300650
01050E900
0FC94CFD5
0CFC00A15
08FCFFC96
0FF2031FC
0FC7CCFD0
073CFD058
0CFC25AFC
06FCFFC7A
06FCFD0FC
0CFD055FC
00551FC66
0E903B030
007300350
000023008
08FDDD611
000000054
080CF0091
0D04C12FC
00008708F
001D06E00
0CF05E16E
0E009FC30
0FC28CF07
007DC3036
0CF0400EF
09150FC20
027135001
001F48FD0
0916E0000
01B135003
exit
deposit/long drv_base+00000400
000548FD0
0916E0000
00F135004
001A48FD0
0916E0000
003135002
0D007A930
0DB05508E
0FC20CF38
0FC1CCFCE
0C0FC19CF
013CF14AC
004ACD0FC
008ACD05A
00CACD058
0CF52D055
009EFFBF6
0F3CF5A15
0CF5AD0FB
06230FBF2
0CF55D001
055D0FBC6
0D0FBC9CF
0FBB4CF5A
0B3CF58D0
0CF58D0FB
0507CFBB6
0FBB0CFD0
0008F7B50
050000002
051D55150
050D60213
0FF8F50D1
015000000
0FF8F9A04
0CF50D050
08FC5FB96
000000200
0CFD15850
0FF8FFB86
01A001FFF
0EACF7D23
0FB54CFFB
054CF5090
06FCF90FB
0FB4CCFFB
0FB69CF90
090FB44CF
0CFFB63CF
02C11FB3C
0FBCECF7D
0D4FB31CF
090FB35CF
0FB31CF50
0FB48CF90
090FB27CF
0CFFB42CF
0CF90FB1F
017CFFB3C
036CF90FB
0FB0FCFFB
0E9012230
0E5307250
00350E801
03006C130
0009A036C
0037F3050
0D47950E9
00BCFD550
0D70715FB
030FB05CF
008930078
0641314A7
010A72093
05090F413
004A79067
0E08F8A50
050018850
004A75090
004306ED5
004A79002
0E18F8A50
0A7509050
0BF58F504
0E8021430
069300650
01050E9FE
0FAC0CFD5
0CFC00A15
0BBCFFAC2
0FEFE31FA
0FAA8CFD0
09FCFD058
0CFC25AFA
09BCFFAA6
09BCFD0FA
0CFD055FA
00451FA92
0E901DC30
033300350
0FE2E3006
0DF90D611
01150FAA6
0DF509005
0CFD6FA9E
08FB3FA9A
093CF01FF
0D62A12FA
0D5FA89CF
013FA8DCF
0CA1F1920
0FFFE008F
0FA7CCFFF
07D7E567D
056FA6DCF
0F06647DD
0CF15098E
08E7DFA6A
08FCA0556
0FFFFFE00
07DFA5DCF
0EF9E7E56
000000BBF
0FF8FCA56
056000001
047CF56C8
01509EFFA
0A9D05656
exit
deposit/long drv_base+00000600
046DE5750
08FC95767
090000000
067FA2DCF
0FA2CCFDA
0568E7D3A
00CA79405
0501CA790
0FA08CF90
0A7018867
0F48FD008
0CF000001
0A790FA02
08F935004
008125040
0F9F4CFF5
0009631F1
06EF501DD
0908ED5FD
0935004A7
006135020
008A7018A
0CF8BCB11
05067F9CE
0C7CF5091
090ED1AF9
0935004A7
0E4125020
05004A790
050E08F8A
090500488
0DD04A750
0FD6EF501
0CF898ED5
0A3CFF9A2
0509050F9
004A79067
0E08F8A50
050098850
004A75090
008A7018A
09010A794
08A5004A7
09050E88F
0D004A750
007A1208F
0F978CF00
0A7408F93
0F5071210
0F4F96DCF
0A7901011
08F8A5004
0509050E5
001D004A7
08FD00550
000000054
0517D0550
0018A307E
03050029A
050E9019D
00BCF9E1E
0829A52F9
050829051
0F5001330
00893F751
0FA1214A7
07D5001D0
03005518E
0089304B2
0031214A7
09304A930
01310A720
0675090F1
05004A790
050E08F8A
090500188
0D504A750
0000D306E
05004A790
050E18F8A
004A75090
004A79005
0E08F8A50
050108850
004A75090
010A72093
0A790FA12
08F8A5004
0509050F0
0D50504A7
018F8DDCF
0FF8F9006
0D6F8DACF
030F8D1CF
0039A00F8
0010B3050
0300350E8
0CFD0043E
09050F8BE
0BBCF4067
0FFB130F8
09A00DB30
0EE305007
00350E800
0D0042130
050F8A1CF
0CF406790
09430F8A0
0408F93FF
0F91210A7
0501CA790
000548FDD
0CFD00000
09150F882
07FCF4000
0910B12F8
079CF4000
0D00312F8
06EE86E01
067CFD509
0300314F8
08ED0001E
05BCFD750
01350E8F8
058CF0091
0ED0C12F8
011CF0400
0031201F8
exit
deposit/long drv_base+00000800
0055001D0
07D7E517D
0CFF86FCF
00830F7F2
00350E8FE
03003AD30
050E8FEC8
003A43003
09A004F30
062305001
04350E900
09E5108D0
052F7D9CF
093003B30
01214A708
003843003
030826790
051F5FEFF
0BFCF9EEB
0A29052F7
0A2905006
09006A203
09003A250
0905005A2
005A204A2
004A25090
07DFEFC30
03005518E
08F930352
01210A740
003483008
050548F9A
0A7209305
0D0EB1310
0DD055001
010A79051
00302EF51
050915151
090221251
0D00CA751
00003E88F
0F78CCF00
014A70893
0CFF50812
030F5F782
001D0030E
0518ED050
01150D405
0000000F8
000000000
000000000
000000000
000000000
0324B4400
04454424B
045564952
061682052
06E69746C
074612067
06C657220
076697461
064612065
073657264
000002073
020200000
04B324B44
052445442
052455649
073616220
064612065
03D207264
000000020
000000000
0520D0A00
053494745
053524554
052202020
000203A30
000000000
020000000
031522020
00000203A
000000000
020200000
03A325220
000000020
000000000
020202000
0203A3352
000000000
000000000
020200D0A
020202020
020202020
034522020
00000203A
000000000
020200000
03A355220
000000020
000000000
020202000
0203A3652
000000000
000000000
052202020
000203A37
000000000
00A000000
02020200D
020202020
020202020
03A385220
000000020
000000000
020202000
0203A3952
000000000
000000000
031522020
000203A30
000000000
020000000
031315220
00000203A
000000000
00D0A0000
020202020
exit
deposit/long drv_base+00000A00
020202020
020202020
0203A5041
000000000
000000000
046202020
000203A50
000000000
020000000
050532020
00000203A
000000000
020200000
03A435020
000000020
000000000
0430D0A00
05542444D
000203A46
000000000
020000000
000000000
000000000
045532020
05F45534E
03A465542
000000020
000000000
000002000
000000000
00D0A0000
054415453
0425F5355
0203A4655
020200000
020202020
020202020
053202020
045534E45
04154535F
03A535554
00A000020
047534D0D
05F4E495F
03A465542
020000020
020202020
020202020
020202020
0534E4553
0534D5F45
04E495F47
00000203A
020202020
020202020
04E455320
0495F4553
05845444E
00000203A
000000000
00D0A0000
052455355
04655425F
04444415F
000203A52
000000000
020000000
055202020
05F524553
05F465542
03A4E454C
000000020
000000000
020202000
020572F52
045545942
0454C5F53
0203A5446
000000000
000000000
047500D0A
04241545F
0505F454C
0203A5254
000000000
000000000
020202020
053414220
050565F45
000203A4E
000000000
020000000
020202020
055422020
052454646
05254505F
00000203A
000000000
00D0A0000
05F50414D
045444F4D
00000203A
000000000
00D0A0000
043415453
020203A4B
000000000
000000000
020200D0A
020202020
000002020
000000000
00D0A0000
0F438CF9F
0CF6E8EC3
0AE9EFCF3
08FBB7E04
038DB3FFF
0D0081350
000DEAD8F
030005000
0CFD0038F
011CFFCDF
00FCF9EFD
0FCCDCFF4
07D037E30
0CFFCCACF
08FD0FD1F
exit
deposit/long drv_base+00000C00
000000052
09EFCC6CF
0CFFCCACF
0CF9EFCC3
01650FCBB
004004C9F
0CF8ED020
05430FCA3
0A0CF7D03
0FD0FCFFC
094CF8ED0
0034530FC
0FC91CF7D
0D0FD0FCF
0FC85CF8E
07D033630
0CFFC82CF
08ED0FD0F
030FC76CF
0CF7D0327
00FCFFC73
0CF8ED0FD
01830FC67
064CF7D03
0FD1ACFFC
058CF8ED0
0030930FC
0FC55CF7D
0D0FD1ACF
0FC49CF8E
07D02FA30
0CFFC46CF
08ED0FD1A
030FC3ACF
0CF7D02EB
01ACFFC37
0CF8ED0FD
0DC30FC2B
028CF7D02
0FD25CFFC
01CCF8ED0
002CD30FC
0FC19CF7D
0D0FD25CF
0FC0DCF8E
07D02BE30
0CFFC0ACF
08ED0FD25
030FBFECF
0CF7D02AF
025CFFBFB
0CF8ED0FD
0A030FBEF
0ECCF7D02
0FD30CFFB
0E0CF8ED0
0029130FB
0FBDDCF7D
0D0FD30CF
0FBD1CF8E
07D028230
0CFFBCECF
08ED0FD30
030FBC2CF
0CF7D0273
030CFFBBF
0478FD0FD
0CF000000
0CF9EFBBB
0B8CFFC11
0B0CF9EFB
09F1650FB
02004004C
000478FD0
0A0CF0000
03DCF9EFB
0FB9DCFFC
0FB95CF9E
04C9F1650
0D0200400
00000478F
0FB85CF00
0FC69CF9E
09EFB82CF
050FB7ACF
0004C9F16
08FD02004
000000047
09EFB6ACF
0CFFC95CF
0CF9EFB67
01650FB5F
004004C9F
087CFD020
0FB45CFF2
07D01F630
0CFFB42CF
0CFD0FCCE
034CFF27A
001E530FB
0FB31CF7D
091FCB4CF
006F265CF
08FB00714
0A6CF3030
063CFD0FC
0FB15CFF2
07D01C630
0CFFB12CF
0CFD0FCBC
004CFF256
001B530FB
0FB01CF7D
0D0FCA2CF
0FB01CF39
0FC73CF9E
09EFAFECF
050FAF6CF
0004C9F16
0CFD02004
0DCCFF26A
0018D30FA
0FAD9CFB0
0B0FCE3CF
0CFFAD4CF
0CFB0FCBF
0A8CFFACF
0CACFB0FC
exit
deposit/long drv_base+00000E00
0FC84CFFA
0F240CFD0
030FAB6CF
0CF7D0167
0D5CFFAB3
0CF2DD0FC
0CF9EFAB3
0B0CFFC5E
0A8CF9EFA
09F1650FA
02004004C
0004B8FD0
098CF0000
070CF9EFA
0FA95CFFC
0FA8DCF9E
04C9F1650
0D0200400
0CFF1C9CF
02430FA73
070CF7D01
0FCABCFFA
0F1BCCFD0
030FA62CF
0CF7D0113
0B4CFFA5F
0B3CFD0FC
0FA51CFF1
07D010230
0CFFA4ECF
08FD0FCBE
00000004E
09EFA4ACF
0CFFC6DCF
0CF9EFA47
01650FA3F
004004C9F
09FCFD020
0FA25CFF1
07D00D630
0CFFA22CF
0CFD0FCAA
014CFF192
000C530FA
0FA11CF7D
0D0FCB0CF
0CFF185CF
0B430FA03
000CF7D00
0FCBACFFA
0004A8FD0
0FCCF0000
06DCF9EF9
0F9F9CFFC
0F9F1CF9E
04C9F1650
0D0200400
0CFF15DCF
08830F9D7
0D4CF7D00
0FCA2CFF9
0D4CF14D0
08FCF9EF9
0F9D1CFFC
0F9C9CF9E
04C9F1650
0D0200400
066D0565E
030F9AECF
0CF7D005F
08BCFF9AB
0CF12D0FC
0CF9EF9AB
0A8CFFC7A
0A0CF9EF9
09F1650F9
02004004C
09E5205D0
0D05604A6
0F981CF66
07D003230
0CFF97ECF
012D0FC70
09EF97ECF
0CFFC5FCF
0CF9EF97B
01650F973
004004C9F
0D352F520
032313000
036353433
041393837
045444342
0D00FBB46
051F946CF
09E5208D0
053F941CF
050FC8F79
0E48F7850
08FCA5050
0FFFFFFF0
0AF409050
0F56342CC
00FBAE652
0DB008005
040D05038
0045754A9
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
exit
deposit/long drv_base+00001000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
exit
deposit/long drv_base+00001200
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
exit
!
! End of data generated from DK2KBTDRIVER.BIN
!
!@@@@ end DK2KBTDRIVER.PAT
!
!***
!
def drv_length = TVBTDRIVER_END - TVBTDRIVER
!!
!! DK2KBTDRIVER must fit into the space formerly occupied by TVBTDRIVER
!!
def room_left = drv_length - DK2KBTDRIVER_LENGTH
!!
!! Check that room_left is .ge.0 - the following comes out as -1 if not so:
def zero_is_ok = room_left@<-<^d30>> ! (sign-extended sign bit)
!! ... and if this is indeed negative, the next command will abort PATCH
examine zero_is_ok ! output of this command doesn't matter
!!
!! end of DK2KBTDRIVER length check
!
!***
!
def tbl_ent = BOO$DRIVER_TBL + <1*<^d40>> ! 2nd entry
!
verify/word tbl_ent
0FFFF ! -1 => no check for CPUTYPE
+BTD$K_SCSI_5380_TAPE ! `device type' must match "btab", can't change
exit
!
verify/long tbl_ent + 4
+00000000 ! no `action' (otherwise <action - table>)
+<tvbtdriver_end - drv_base> ! driver size (must not change)
+<drv_base - tbl_ent> ! start of driver (does not change)
exit
!
replace/long tbl_ent + <4*4>
+<tvbtdriver_entry - drv_base> ! => I/O routine entry (JSB)
+<tvbtdriver_drivrname - drv_base> ! => name of primary driver (.ascic)
+<tvbtdriver_auxdrname - drv_base> ! => name of port driver (.ascic), or 0
+<tvbtdriver_unit_init - drv_base> ! => init routine (CALL)
+<tvbtdriver_unit_disc - drv_base> ! => cleanup routine (CALL)
+<tvbtdriver_devname - drv_base> ! => device name (.ascii, 2 bytes)
exit
+<dk2kbtdriver_entry - drv_base>
+<dk2kbtdriver_drivrname - drv_base>
+<dk2kbtdriver_auxdrname - drv_base>
+<dk2kbtdriver_unit_init - drv_base>
+<dk2kbtdriver_unit_disc - drv_base>
+<dk2kbtdriver_devname - drv_base>
exit
!
!-------------------------------------------------------------------------------
!
update
exit