system/shard-z80-altos/6/src/ALTOSSHD.ASM

Raw file
Back to index

   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
ADDR B1 B2 B3 B4 ASCII INSTR PARAMETER  COMMENT
0100 C3 F9 01    ...   JP    01F9       ; Init Shard + Start EUMEL0
0103 C3 8C 0B    ...   JP    0B8C       ; LIMIT
0106 C3 2A 01    .*.   JP    012A       ; OUTPUT
0109 C3 4B 01    .K.   JP    014B       ; BLOCKIN
010C C3 53 01    .S.   JP    0153       ; BLOCKOUT
010F C3 5B 01    .[.   JP    015B       ; IOCONTROL
0112 C3 AC 0B    ...   JP    0BAC       ; SYSEND
0115 C3 90 0B    ...   JP    0B90       ; SCHINF
0118 C3 94 0B    ...   JP    0B94       ; SCHACC
011B C3 89 0B    ...   JP    0B89       ; LONGMOVE
011E 06                                 ; SHDVER = 6 
011F 00 00                              ; ID 4
0121 00 00                              ; ID 5
0123 00 00                              ; ID 6
0125 00 00                              ; ID 7
0127 C3 63 01    .c.   JP    0163       ; I/O-Setzen fuer 'putboot' 
012A DD E5       ..    PUSH  IX         ; OUTPUT (Kanal A, Length BC, 
012C FD E5       ..    PUSH  IY         ;         Addr HL, Ausgegeben BC, 
012E E5          .     PUSH  HL         ;         Carry SET : Alles raus)
012F D5          .     PUSH  DE
0130 F5          .     PUSH  AF 
0131 E5          .     PUSH  HL 
0132 CD A6 01    ...   CALL  01A6       ; Zugriff auf Kanaltabelle --> IY/DE
0135 D5          .     PUSH  DE         ; DE --> IX (Addr. von Startaddr.) 
0136 DD E1       ..    POP   IX 
0138 EB          .     EX    DE,HL 
0139 5E          ^     LD    E,(HL)     ; (Startaddresse) --> DE 
013A 23          #     INC   HL 
013B 56          V     LD    D,(HL) 
013C E1          .     POP   HL         ; Textstartaddresse 
013D CD 49 01    .I.   CALL  0149       ; = JP (DE) Routine starten 
0140 D1          .     POP   DE         ; ehem. Returnaddresse loeschen
0141 7A          z     LD    A,D 
0142 D1          .     POP   DE 
0143 E1          .     POP   HL 
0144 FD E1       ..    POP   IY 
0146 DD E1       ..    POP   IX 
0148 C9          .     RET 
0149 D5          .     PUSH  DE 
014A C9          .     RET              ;----------------------------------- 
014B DD E5       ..    PUSH  IX         ; BLOCKIN 
014D DD 21 02 00 .!..  LD    IX,0002    ; Aufgabe 2
0151 18 18       ..    JR    016B       ;----------------------------------
0153 DD E5       ..    PUSH  IX         ; BLOCKOUT
0155 DD 21 03 00 .!..  LD    IX,0003    ; Aufgabe 3
0159 18 10       ..    JR    016B       ;---------------------------------- 
015B DD E5       ..    PUSH  IX         ; IOCONTROL
015D DD 21 04 00 .!..  LD    IX,0004    ; Aufgabe 4
0161 18 08       ..    JR    016B       ;---------putboot Aufg. 5---------- 
0163 DD E5       ..    PUSH  IX         ; 
0165 DD 21 05 00 .!..  LD    IX,0005    ; Aufgabe 5
0169 18 00       ..    JR    016B       ;--------------------------------- 
016B FD E5       ..    PUSH  IY         ; Je nach IX Kanal-Aufgabe (I/O)
016D D5          .     PUSH  DE 
016E E5          .     PUSH  HL 
016F CD 79 01    .y.   CALL  0179       ; Register wurden gerettet
0172 E1          .     POP   HL 
0173 D1          .     POP   DE 
0174 FD E1       ..    POP   IY 
0176 DD E1       ..    POP   IX 
0178 C9          .     RET              ;----------------------------------- 
0179 E5          .     PUSH  HL 
017A D5          .     PUSH  DE 
017B CD A6 01    ...   CALL  01A6       ; Kanaladdr --> DE, IY
017E DD 19       ..    ADD   IX,DE      ; DE = 4. + 5. Byte + Aufgabennummer
0180 DD 6E 00    .n.   LD    L,(IX+00)  ; Byte zur Aufgabe 
0183 26 FF       &.    LD    H,FF 
0185 D5          .     PUSH  DE 
0186 DD E1       ..    POP   IX         ; IX = Addresse des tabellenentries
0188 19          .     ADD   HL,DE      ; 
0189 59          Y     LD    E,C        ; BC = code1
018A 78          x     LD    A,B 
018B B7          .     OR    A 
018C 28 05       (.    JR    Z,0193     ; EUMEL-Funktion 0<=code1<256
018E 3C          <     INC   A 
018F 28 02       (.    JR    Z,0193     ; Shard-Funktion -256<=code1<0
0191 1E FF       ..    LD    E,FF       ; -1 = Illegale Funktion
0193 7E          ~     LD    A,(HL) 
0194 23          #     INC   HL 
0195 BB          .     CP    E          ; Addresse mit der Funktionsnummer 
0196 28 07       (.    JR    Z,019F     ; suchen 
0198 3C          <     INC   A          ; FF=Tabellenende 
0199 28 04       (.    JR    Z,019F 
019B 23          #     INC   HL 
019C 23          #     INC   HL 
019D 18 F4       ..    JR    0193       ; naechste Funktionsnummer 
019F 5E          ^     LD    E,(HL) 
01A0 23          #     INC   HL 
01A1 56          V     LD    D,(HL)     ; Sprung zur Addresse, die in der 
01A2 EB          .     EX    DE,HL      ; Tabelle steht 
01A3 D1          .     POP   DE         ; DE= code2 (Eingang HL)
01A4 E3          .     EX    (SP),HL 
01A5 C9          .     RET              ; --------------------------------- 
01A6 C5          .     PUSH  BC         ;   Kanalinfos aus Tabelle --> IY/DE
01A7 11 05 00    ...   LD    DE,0005    ; Entrylaenge in der Tabelle
01AA 21 12 02    !..   LD    HL,0212    ; Tabellenanfang (Kanaele)
01AD 46          F     LD    B,(HL)     ; Erstes Byte ist Tabellenlaenge
01AE 23          #     INC   HL 
01AF BE          .     CP    (HL)       ; Erstes Entrybyte ist Kanalnummer
01B0 28 03       (.    JR    Z,01B5     ; Bis Kanal gefunden
01B2 19          .     ADD   HL,DE 
01B3 10 FA       ..    DJNZ  01AF 
01B5 23          #     INC   HL         ; 2. u. 3. Byte --> DE
01B6 5E          ^     LD    E,(HL) 
01B7 23          #     INC   HL 
01B8 56          V     LD    D,(HL) 
01B9 D5          .     PUSH  DE         ; 2. u. 3. Byte --> IY 
01BA FD E1       ..    POP   IY 
01BC 23          #     INC   HL         ; 4. u. 5. Byte --> DE
01BD 5E          ^     LD    E,(HL) 
01BE 23          #     INC   HL 
01BF 56          V     LD    D,(HL) 
01C0 C1          .     POP   BC         ; gerettetes BC zurueck
01C1 C9          .     RET              ;----------------------------------
;============================= Parameterkanal ============================== 
01C2 01 5F 06                           ; 1, IOCONTROL "typ"
01C5 02 50 06                           ; 2, IOCONTROL "frout"
01C8 05 46 06                           ; 5, IOCONTROL "size"
01CB 06 ED 01                           ; 6, IOCONTROL "flow"
01CE 08 ED 01                           ; 8, IOCONTROL "baud"
01D1 09 ED 01                           ; 9, IOCONTROL "bits"
01D4 E2 ED 01                           ; -30, IOCONTROL maske f. busystatus
01D7 E1 ED 01                           ; -31, IOCONTROL maske f. strobe setz.
01DA FF 4C 06                           ; -1, IOCONTROL ill.
01DD FE 86 0B                           ; -2, Aufg. 5 : kanal init
01E0 FF 55 06                           ; -1, Aufg. 5 : BC = 1
01E3 FF 4C 06                           ; BLOCKIO ill.
01E6 59                                 ; Parameterkanal : OUTPUT: 0659 ill. 
01E7 06                                 ; 
01E8 FD                                 ; BLOCKIN : 01E3
01E9 FD                                 ; BLOCKOUT : 01E3
01EA DC                                 ; IOCONTROL : 01C2
01EB F7                                 ; Aufg. 5 : 01DD
01EC 00                                 ; Keine I/O moeglich
                                        ; ----- set "flow","bits","baud" --- 
01ED 7D          }     LD    A,L        ; Kanal = addressierter kanal
01EE 2E 00       ..    LD    L,00       ; 0 = Parameter setzen (code2) 
01F0 C3 63 01    .c.   JP    0163       ; Aufgabe 5, L = 0 
01F3 7D          }     LD    A,L        ; kanal = addressierter Kanal
01F4 2E 01       ..    LD    L,01       ; 1 = Parameter lesen (code2) 
01F6 C3 63 01    .c.   JP    0163       ; Aufgabe 5, L = 1
01F9 F3          .     DI               ;---------- Init Shard -------------
01FA 3E 00       >.    LD    A,00       ; Page 0 = Interruptvektoren
01FC ED 47       .G    LD    I,A 
01FE 31 00 B0    1..   LD    SP,B000 
0201 3E 21       >!    LD    A,21       ; Kanal 0..32 
0203 01 FE FF    ...   LD    BC,FFFE    ; Funktion -2 = Kanalinit 
0206 3D          =     DEC   A 
0207 F5          .     PUSH  AF 
0208 CD 63 01    .c.   CALL  0163       ; Kanaele initialisieren (IRQ's) 
020B F1          .     POP   AF 
020C B7          .     OR    A 
020D 20 F4        .    JR    NZ,0203 
020F C3 10 1E    ...   JP    1E10       ; Systemstart EUMEL0 bzw. 'putboot' 
     -----------------------------------  Entry : Kanal, Puffer, ROUTINETBL 
0212 0C                                 ; Tabelle mit 12 Kanaelen
0213 20 00 00 E6 01                     ; Parameterkanal, Kein Puffer 
0218 00 64 0C 0C 07                     ; Hintergrund 
021D 01 CD 0C 7B 02                     ; Kanal 1 .. 6 = seriell
0222 02 5B 0D 7B 02                     ; 
0227 03 E9 0D 7B 02 
022C 04 77 0E 7B 02
0231 05 05 0F 7B 02
0236 06 93 0F 7B 02 
023B 07 BD 0F EA 0A                     ; printer
0240 08 C3 0F EA 0A                     ; parallel 1
0245 09 C9 0F EA 0A                     ; parallel 2
024A 1F CF 0F 7D 06                     ; floppy
024F FF 00 00 3F 06                     ; illegal Kanal
;======================== Serielle Kanaele =================================
0254 01 5F 06                           ; 1, IOCONTROL "typ"
0257 02 36 05                           ; 2, IOCONTROL "frout" 
025A 05 46 06                           ; 5, IOCONTROL "size"
025D 06 F3 01                           ; 6, IOCONTROL "flow"
0260 08 F3 01                           ; 8, IOCONTROL "baud"
0263 09 F3 01                           ; 9, IOCONTROL "bits"
0266 FD D6 02                           ; -3, IOCONTROL "portinfo" 
0269 FF 4C 06                           ; -1 ill. 
026C 06 2A 03                           ; 6, Aufg .5 : "flow" setzen/info 
026F 08 F2 02                           ; 8, Aufg. 5 : "baud" setzen/info
0272 09 AA 03                           ; 9, Aufg. 5 : "bits" setzen/info 
0275 FE A2 02                           ; -2, Aufg. 5 : Kanal init
0278 FF 4C 06                           ; BLOCKIN/BLOCKOUT ill.
027B 31                                 ; Seriell : 0431 = OUTPUT 
027C 04 
027D FD                                 ; BLOCKIN : 0278
027E FD                                 ; BLOCKOUT : 0278
027F D9                                 ; IOCONTROL : 0251
0280 F1                                 ; Aufg. 5 : 026C
0281 03                                 ; Typ : Stream I/O 
    ; Baudratetabelle : 1. Byte: Bit 7+6 = Vorteiler (Register4) 
    ;                      Bit 4 = DIV 256, DIV 16,Bit 5 : Mode (CTC) 
    ;                   2. Byte: CTC-Zeitkonstante 
0282 40 9C                              ; 50 Baud 
0284 40 68                              ; 75 Baud 
0286 40 47                              ; 110 baud 
0288 E0 E8                              ; 134.5 Baud 
028A E0 D0                              ; 150 Baud 
028C A0 D0                              ; 300 Baud 
028E 60 D0                              ; 600 Baud 
0290 60 68                              ; 1200 baud 
0292 60 45                              ; 1800 Baud 
0294 60 34                              ; 2400 Baud 
0296 60 23                              ; 3600 Baud 
0298 60 1A                              ; 4800 Baud 
029A 60 11                              ; 7200 Baud 
029C 60 0D                              ; 9600 Baud 
029E 60 07                              ; 19200 Baud 
02A0 60 03                              ; 38400 Baud
02A2 FD 4E 1A    .N.   LD    C,(IY+1A)  ;------------- "kanal init" -------- 
02A5 06 0D       ..    LD    B,0D       ; Commandport in (IY+1A) 
02A7 21 C9 02    !..   LD    HL,02C9    ; 13 Bytes ausgeben 
02AA ED B3       ..    OTIR             ; An den Commandport schicken
02AC FD 5E 1D    .^.   LD    E,(IY+1D)  ; Interruptvektor des Kanals 
02AF ED 57       .W    LD    A,I        ; Vektortabellenaddresse High
02B1 57          W     LD    D,A 
02B2 ED 59       .Y    OUT   (C),E      ; Interruptvektor fuer Kanal 
02B4 0E 1E       ..    LD    C,1E       ; Serviceroutine am Pufferende 
02B6 06 00       ..    LD    B,00       ; (IY+1E)
02B8 FD E5       ..    PUSH  IY 
02BA E1          .     POP   HL 
02BB 09          .     ADD   HL,BC 
02BC 06 04       ..    LD    B,04       ; 4 Interrupt (Vector+Status) 
02BE EB          .     EX    DE,HL      ; DE= Serviceroutinenaddresse 
02BF 73          s     LD    (HL),E     ; HL = Interruptvektoraddresse 
02C0 23          #     INC   HL         ; Serviceroutine eintragen
02C1 72          r     LD    (HL),D 
02C2 23          #     INC   HL         ; Fuer alle 4 Interrupts einen 
02C3 13          .     INC   DE         ; Interrupthandler 
02C4 13          .     INC   DE 
02C5 13          .     INC   DE 
02C6 10 F7       ..    DJNZ  02BF 
02C8 C9          .     RET              ;-------- Inittabelle Serielle ----- 
02C9 14 44             ; reset ext status IRQs, Clock x16, 1 Stopbit,noparity
02CB 03 61             ; Rx 7 Bits, Autoenables (CTS), Receiver enable 
02CD 05 EA             ; Tx 8 Bits, DTR = 1, RTS = 1, Transmitter enable 
02CF 11 1F             ; kein WAIT/RDY, Vektor incl. Status, alle IRQs an 
02D1 03 C1             ; Rx 8 Bits, Keine Autoenables, Receiver enable 
02D3 11 1F             ; s.o. 
02D5 02                ; Interruptvektor folgt als naechstes Byte
02D6 FD 4E 1A    .N.   LD    C,(IY+1A)  ;------"IOCONTROL portinfo -3"------ 
02D9 06 01       ..    LD    B,01       ; ^ Status/Commandport
02DB 3E 30       >0    LD    A,30 
02DD F3          .     DI 
02DE ED 41       .A    OUT   (C),B      ; Read-Register 1 waehlen
02E0 ED 40       .@    IN    B,(C)      ; Einlesen
02E2 ED 79       .y    OUT   (C),A      ; Error Reset = 30H
02E4 ED 78       .x    IN    A,(C)      ; Statusregister (0) lesen
02E6 FB          .     EI 
02E7 E6 AC       ..    AND   AC         ; DCD,CTS,... durchlassen 
02E9 4F          O     LD    C,A        ; Lowbyte = Read-Register 1 Bits 
02EA 78          x     LD    A,B        ; Highbyte = Read-Register 0 Bits 
02EB E6 70       .p    AND   70         ; Nur Error-Bits durchlassen 
02ED DD B6 15    ...   OR    (IX+15)    ; Schon vorhandene Fehler dazu
02F0 47          G     LD    B,A 
02F1 C9          .     RET              ;----------- "baud" -------------- 
02F2 01 01 00    ...   LD    BC,0001    ; Rueckmeldung "nicht moeglich" 
02F5 CB 7C       .|    BIT   7,H        ; Keine Shard-spezifischen Baudrates 
02F7 C0          .     RET   NZ 
02F8 7C          |     LD    A,H        ; Schluessel --> A
02F9 B7          .     OR    A 
02FA C8          .     RET   Z          ; 0 ist ungueltiger Schluessel
02FB FD CB 11 4E ...N  BIT   1,(IY+11)  ; Baudrateeinstellung moeglich ? 
02FF C8          .     RET   Z          ; nein 
0300 0E 00       ..    LD    C,00       ; Rueckmeldung "ok" 
0302 CB 45       .E    BIT   0,L        ; 0 = Lesen, 1 = parameter setzen 
0304 C0          .     RET   NZ         ; Nur Information, dann fertig 
0305 11 80 02    ...   LD    DE,0280    ; Tabelle der Baudrates/Timeconsts 
0308 6C          l     LD    L,H 
0309 CB 25       .%    SLA   L 
030B 26 00       &.    LD    H,00       ; Schluessel * 2 + Tabellenanfang 
030D 19          .     ADD   HL,DE 
030E 7E          ~     LD    A,(HL)     ; Timeconst 
030F E6 C0       ..    AND   C0         ; Taktvorteiler (1,16,32,64) waehlen 
0311 4F          O     LD    C,A        ; fuer SIO/DART-Register 4
0312 3E 3F       >?    LD    A,3F       ; Nur Clock-Bits (6,7) veraendern 
0314 CD 1E 04    ...   CALL  041E       ; Clock x1, x16
0317 7E          ~     LD    A,(HL)     ; 
0318 E6 30       .0    AND   30         ; CTC Vorteiler (DIV16,DIV256) 
031A 07          .     RLCA 
031B F6 05       ..    OR    05         ; Modus = Timer, Kein IRQ, Timeconst
031D FD 4E 1C    .N.   LD    C,(IY+1C)  ; CTC-Port fuer Baudrategenerator 
0320 ED 79       .y    OUT   (C),A      ; An CTC ausgeben 
0322 23          #     INC   HL 
0323 7E          ~     LD    A,(HL)     ; Timeconst fuer CTC 
0324 ED 79       .y    OUT   (C),A 
0326 01 00 00    ...   LD    BC,0000    ; "ok"
0329 C9          .     RET              ;-------------- "flow" ------------- 
032A CB 7C       .|    BIT   7,H        ; Keine Shard-spezifischen "flow"s 
032C C2 55 06    .U.   JP    NZ,0655    ; BC = 1 liefern
032F CB 45       .E    BIT   0,L        ; NZ, wenn nur Information 
0331 C2 5B 06    .[.   JP    NZ,065B    ; "alles moeglich" melden 
0334 CD 07 06    ...   CALL  0607       ; Flowmodebits loeschen
0337 F3          .     DI 
0338 FD CB 11 86 ....  RES   0,(IY+11)  ; Kein RTS/CTS 
033C FD CB 17 AE ....  RES   5,(IY+17)  ; Autoenables (CTS) loeschen
0340 FD 36 12 04 .6..  LD    (IY+12),04 ; AND-maske Statusport Tx-Full 
0344 FD 36 13 04 .6..  LD    (IY+13),04 ; XOR-maske Statusport Tx-Full
0348 25          %     DEC   H          ; H=0, oder H>1 
0349 20 03        .    JR    NZ,034E 
034B CD FE 05    ...   CALL  05FE       ; H=1 : XON/XOFF setzen
034E 25          %     DEC   H 
034F 20 14        .    JR    NZ,0365    ; H=0 : keine Flusskontrolle
0351 FD CB 11 C6 ....  SET   0,(IY+11)  ; H=2 : RTS/CTS
0355 FD CB 17 EE ....  SET   5,(IY+17)  ; Autoenables (CTS) moeglich 
0359 FD 36 12 2C .6.,  LD    (IY+12),2C ; TxDfull, CTS on, DCD on
035D FD 36 13 2C .6.,  LD    (IY+13),2C ; Alle obigen Bits invertieren 
0361 FD 36 14 82 .6..  LD    (IY+14),82 ; ? 
0365 FD 7E 17    .~.   LD    A,(IY+17)  ; Writeregister 3
0368 06 03       ..    LD    B,03       ; Register 3
036A FD 4E 1A    .N.   LD    C,(IY+1A)  ; Commanndport
036D ED 41       .A    OUT   (C),B      ; Neuen Autoenableswert ausgeben
036F ED 79       .y    OUT   (C),A 
0371 FB          .     EI 
0372 CD 3C 04    .<.   CALL  043C       ; ggf. XON/XOFF je nach Status ausg.
0375 01 00 00    ...   LD    BC,0000    ; "ok"
0378 C9          .     RET              ;----- RTS/DTR o.XON/XOFF set/reset 
0379 CD E9 05    ...   CALL  05E9       ; testet BIT 0 (IY0+0)
037C C4 3C 04    .<.   CALL  NZ,043C    ; ggf XON/XOFF ausgeben
037F FD CB 11 46 ...F  BIT   0,(IY+11)  ; NZ, wenn RTS/CTS eingestellt 
0383 C8          .     RET   Z 
0384 F3          .     DI               ; RTS/CTS ist eingestellt 
0385 FD 7E 14    .~.   LD    A,(IY+14)  ; Bits, die bei RTS/CTS veraendert 
0388 4F          O     LD    C,A        ; werden: RTS/DTR 
0389 FD B6 19    ...   OR    (IY+19)    ; Register 5 Wert
038C A9          .     XOR   C          ; RTS/DTR ggf loeschen
038D FD 77 19    .w.   LD    (IY+19),A  ; Wieder zurueckschreiben
0390 FD 4E 1A    .N.   LD    C,(IY+1A)  ; Commandport
0393 06 05       ..    LD    B,05       ; Register 5 beschreiben 
0395 ED 41       .A    OUT   (C),B 
0397 ED 79       .y    OUT   (C),A      ; Neuen Wert laden
0399 FB          .     EI 
039A C9          .     RET              ;----------------------------------- 
039B CD D6 05    ...   CALL  05D6       ; Wenn XON/XOFF,
039E C4 3C 04    .<.   CALL  NZ,043C    ; XON oder XOFF ausgeben
03A1 F3          .     DI 
03A2 FD 7E 14    .~.   LD    A,(IY+14)  ; RTS/DTR ggf. setzen 
03A5 FD B6 19    ...   OR    (IY+19)    ; weiter wie oben
03A8 18 E3       ..    JR    038D       ;------------ "bits" -------------- 
03AA CB 7C       .|    BIT   7,H        ; Keine Shard-Spezifischen "bits" 
03AC C2 55 06    .U.   JP    NZ,0655 
03AF CB 45       .E    BIT   0,L        ; Info: "alles moeglich" melden 
03B1 C2 5B 06    .[.   JP    NZ,065B 
03B4 7C          |     LD    A,H        ; H = stop * 32 + par * 8 + (bit-1)
03B5 C6 20       .     ADD   A,20       ; Stopbits + 1 : 1..3, parity
03B7 1F          .     RRA              ; Bit 0,1 = parity
03B8 1F          .     RRA              ; Bit 2,3 = stopbits
03B9 1F          .     RRA 
03BA E6 0F       ..    AND   0F         ; restregister ausblenden 
03BC CB 4F       .O    BIT   1,A        ; 
03BE 28 02       (.    JR    Z,03C2     ; Wenn gerader Parity: 
03C0 CB C7       ..    SET   0,A        ; Parity enablen 
03C2 4F          O     LD    C,A        ; C enthaelt OR-Wert fuer Register 4
03C3 3E F0       >.    LD    A,F0       ; Nur Stopbits und Parity veraendern 
03C5 CD 1E 04    ...   CALL  041E       ; SIO-Register 4 veraendern
03C8 7C          |     LD    A,H        ; Datenbits ausblenden 
03C9 E6 07       ..    AND   07 
03CB 47          G     LD    B,A        ; + 1 = Anzahl Datenbits 
03CC 04          .     INC   B 
03CD 3E 00       >.    LD    A,00 
03CF 16 F8       ..    LD    D,F8       ; 11111000
03D1 37          7     SCF              ; Maskenbits "AND" fuer ungueltige 
03D2 17          .     RLA              ; Datenbits links reinrotieren 
03D3 CB 22       ."    SLA   D          ; Bei weniger als 5 Bits zusaetzl. 1
03D5 10 FA       ..    DJNZ  03D1 
03D7 5F          _     LD    E,A 
03D8 CD 18 06    ...   CALL  0618       ; Datenbitsmasken setzen 
03DB 16 00       ..    LD    D,00       ; Keine Bits invertieren 
03DD CD 1F 06    ...   CALL  061F       ; Datenbitmasken setzen AND/XOR
03E0 CD 26 06    .&.   CALL  0626 
03E3 06 00       ..    LD    B,00 
03E5 CB 54       .T    BIT   2,H 
03E7 28 0C       (.    JR    Z,03F5     ; 1,2,3,4,5 datenbits : 00
03E9 CB 44       .D    BIT   0,H        ; 6 datenbits : 80H
03EB 28 02       (.    JR    Z,03EF     ; 7 datenbits : 40H
03ED CB F8       ..    SET   7,B        ; 8 datenbits : C0H
03EF CB 4C       .L    BIT   1,H 
03F1 28 02       (.    JR    Z,03F5 
03F3 CB F0       ..    SET   6,B 
03F5 FD 7E 17    .~.   LD    A,(IY+17)  ; Register 3 Wert
03F8 E6 3F       .?    AND   3F         ; Bits, die nicht veraendert werden 
03FA B0          .     OR    B 
03FB FD 77 17    .w.   LD    (IY+17),A  ; Register 3 Wert setzen
03FE 16 03       ..    LD    D,03 
0400 FD 4E 1A    .N.   LD    C,(IY+1A)  ; Command-Port 
0403 F3          .     DI 
0404 ED 51       .Q    OUT   (C),D      ; Register 3 selektieren
0406 ED 79       .y    OUT   (C),A      ; Neuen Register 3 Wert
0408 CB 38       .8    SLR   B          ; Register 5 Bits "tiefer"
040A FD 7E 19    .~.   LD    A,(IY+19)  ; Alten Registerwert 
040D E6 9F       ..    AND   9F         ; unbenoetigte Bits ausblenden 
040F B0          .     OR    B 
0410 FD 77 19    .w.   LD    (IY+19),A  ; abspeichern 
0413 16 05       ..    LD    D,05       ;
0415 ED 51       .Q    OUT   (C),D      ; Register 5 selektieren
0417 ED 79       .y    OUT   (C),A      ; Wert in das Register schreiben
0419 FB          .     EI 
041A 01 00 00    ...   LD    BC,0000    ; "ok"
041D C9          .     RET              ;---------- Register 4 setzen -----
041E F3          .     DI               ; A enthaelt Maske fuer alte Bits
041F FD A6 18    ...   AND   (IY+18)    ; Register 4 Maske 
0422 B1          .     OR    C          ; Neuer Clock/Parity/Stopbit Wert
0423 FD 77 18    .w.   LD    (IY+18),A  ; In der Tabelle setzen
0426 06 04       ..    LD    B,04       ; 
0428 FD 4E 1A    .N.   LD    C,(IY+1A)  ; Am Kommandoport ausgeben
042B ED 41       .A    OUT   (C),B      ; Register 4 waehlen 
042D ED 79       .y    OUT   (C),A      ; Neuen Wert des Registers setzen
042F FB          .     EI 
0430 C9          .     RET              ; ---------------------------------- 
0431 CD CD 04    ...   CALL  04CD       ; Serieller OUTPUT:String in Puffer
0434 F5          .     PUSH  AF         ; schreiben fuer IRQ-Ausgabe
0435 C5          .     PUSH  BC 
0436 C4 3C 04    .<.   CALL  NZ,043C    ; NZ, wenn Puffer gefuellt
0439 C1          .     POP   BC 
043A F1          .     POP   AF 
043B C9          .     RET              ;--------- ggf. XON/XOFF ausgeben-- 
043C FD 4E 1A    .N.   LD    C,(IY+1A)  ; Statusportaddresse
043F F3          .     DI 
0440 ED 78       .x    IN    A,(C)      ; Statusbyte
0442 FD A6 12    ...   AND   (IY+12)    ;"Transmitter full"-Bit ausmaskieren
0445 FD AE 13    ...   XOR   (IY+13)    ; Umdrehen, falls high-Aktiv
0448 20 0A        .    JR    NZ,0454    ; NZ=Puffer noch voll
044A CD 45 05    .E.   CALL  0545       ; Flusskontrolle pruefen(XON/XOFF-->A
044D FD 4E 1B    .N.   LD    C,(IY+1B)  ; Addresse des Datenports seriell
0450 28 02       (.    JR    Z,0454     ; Nichtausgeben, weil Flusskontrolle
0452 ED 79       .y    OUT   (C),A      ; Zeichen aus Akku ausgeben
0454 FB          .     EI 
0455 C9          .     RET              ;--------Transmitbuffer empty IRQ- 
0456 FD E3       ..    EX    (SP),IY    ; Ruecksprungaddresse -31
0458 C5          .     PUSH  BC         ; = Anfang der Kanalinfotabelle 
0459 F5          .     PUSH  AF 
045A 01 DF FF    ...   LD    BC,FFDF    ; -31
045D FD 09       ..    ADD   IY,BC 
045F FD 4E 1A    .N.   LD    C,(IY+1A)  ; Kommandoport des Kanals
0462 3E 28       >(    LD    A,28       ; reset interrupt pending 
0464 ED 79       .y    OUT   (C),A      ; Kommando ausgeben 
0466 CD 3F 04    .?.   CALL  043F       ; Flusskontrolle durchfuehren
0469 18 48       .H    JR    04B3       ; Interruptende
046B FD E3       ..    EX    (SP),IY    ;------- External/Status Change IRQ 
046D C5          .     PUSH  BC 
046E F5          .     PUSH  AF 
046F 01 DC FF    ...   LD    BC,FFDC    ; IY := Kanaltabelleninfo
0472 FD 09       ..    ADD   IY,BC 
0474 FD 4E 1A    .N.   LD    C,(IY+1A)  ; Statusportaddresse 
0477 ED 78       .x    IN    A,(C)      ; Status einlesen 
0479 06 10       ..    LD    B,10       ; reset Ext/Status Interrupts 
047B ED 41       .A    OUT   (C),B 
047D FC D1 05    ...   CALL  M,05D1     ; break empfangen : bit 7 = 1
0480 CD 3C 04    .<.   CALL  043C       ; Flusskontrolle durchfuehren
0483 18 2E       ..    JR    04B3       ; interrupt ende
0485 FD E3       ..    EX    (SP),IY    ;--------special receive cond. IRQ 
0487 C5          .     PUSH  BC 
0488 F5          .     PUSH  AF 
0489 01 D6 FF    ...   LD    BC,FFD6    ; IY := Kanaltabelleninfo 
048C FD 09       ..    ADD   IY,BC 
048E FD 4E 1A    .N.   LD    C,(IY+1A)  ; Status- u. Kommandoport 
0491 3E 01       >.    LD    A,01       ; Read-Register 1
0493 06 30       .0    LD    B,30 
0495 ED 79       .y    OUT   (C),A      ; Reg.selekt
0497 ED 78       .x    IN    A,(C)      ; Status einlesen
0499 ED 41       .A    OUT   (C),B      ; Error-reset
049B 47          G     LD    B,A 
049C FD B6 15    ...   OR    (IY+15) 
049F FD 77 15    .w.   LD    (IY+15),A  ; Fehler vermerken
04A2 78          x     LD    A,B 
04A3 FD A6 16    ...   AND   (IY+16)    ; Zulaessige Fehler maskieren
04A6 28 1B       (.    JR    Z,04C3     ; keine Fehler, normale Eingabe 
04A8 FD 4E 1B    .N.   LD    C,(IY+1B)  ; Zeichen vom Datenport einlesen
04AB ED 78       .x    IN    A,(C) 
04AD CD C9 05    ...   CALL  05C9       ; Zeichen per Inputinterrupt melden 
04B0 CC 3C 04    .<.   CALL  Z,043C     ; Flusskontrolle durchfuehren
04B3 F1          .     POP   AF 
04B4 C1          .     POP   BC 
04B5 FD E1       ..    POP   IY 
04B7 FB          .     EI 
04B8 ED 4D       .M    RETI             ;-------Receive Character avil. IRQ 
04BA FD E3       ..    EX    (SP),IY 
04BC C5          .     PUSH  BC 
04BD F5          .     PUSH  AF 
04BE 01 D9 FF    ...   LD    BC,FFD9    ; IY := Pufferanfang
04C1 FD 09       ..    ADD   IY,BC 
04C3 FD 4E 1B    .N.   LD    C,(IY+1B)  ; Datenport
04C6 ED 78       .x    IN    A,(C)      ; Zeichen einlesen 
04C8 CD A9 05    ...   CALL  05A9       ; Zeichen per inputinterrupt melden 
04CB 18 E3       ..    JR    04B0       ; Interrupt mit Flusskontroller ende 
04CD 78          x     LD    A,B        ;--------String in Puffer schreiben 
04CE B1          .     OR    C          ; Nichts Auszugeben --> SCF RET
04CF 37          7     SCF 
04D0 C8          .     RET   Z 
04D1 C5          .     PUSH  BC         ; String (HL/BC) in Puffer schreiben 
04D2 FD 7E 02    .~.   LD    A,(IY+02)  ; IY - Kanaldescriptor
04D5 FD 96 03    ...   SUB   (IY+03)    ; Puffergroesse - Pufferzeigerwrite 
04D8 28 51       (Q    JR    Z,052B     ; puffer ist voll 
04DA C5          .     PUSH  BC 
04DB 5F          _     LD    E,A        ; freier Platz
04DC 78          x     LD    A,B        ; Highbyte > 0 ? Laenge 
04DD B7          .     OR    A 
04DE 28 02       (.    JR    Z,04E2 
04E0 0E FF       ..    LD    C,FF       ; Mehr als 255 Bytes Laenge
04E2 7B          {     LD    A,E        ; 
04E3 B9          .     CP    C 
04E4 30 01       0.    JR    NC,04E7    ; Nicht genuegend Platz ?
04E6 4F          O     LD    C,A 
04E7 FD 7E 02    .~.   LD    A,(IY+02)  ; Puffergroesse- Pufferreadzeiger 
04EA FD 96 04    ...   SUB   (IY+04) 
04ED 20 05        .    JR    NZ,04F4    ; Noch Platz
04EF FD 36 04 00 .6..  LD    (IY+04),00 ; Lesezeiger auf Anfang
04F3 79          y     LD    A,C 
04F4 B9          .     CP    C 
04F5 30 01       0.    JR    NC,04F8 
04F7 4F          O     LD    C,A 
04F8 06 00       ..    LD    B,00 
04FA C5          .     PUSH  BC 
04FB FD 56 07    .V.   LD    D,(IY+07)  ; Pufferanfang + Pufferzeiger
04FE FD 7E 06    .~.   LD    A,(IY+06) 
0501 FD 86 04    ...   ADD   (IY+04) 
0504 30 01       0.    JR    NC,0507 
0506 14          .     INC   D          ; -->  DE bringen
0507 5F          _     LD    E,A        ; und String von HL --> DE bringen 
0508 ED B0       ..    LDIR 
050A C1          .     POP   BC 
050B FD 7E 04    .~.   LD    A,(IY+04) 
050E 81          .     ADD   C          ; Pufferzeiger erhoehen
050F FD 77 04    .w.   LD    (IY+04),A 
0512 F3          .     DI 
0513 FD 7E 03    .~.   LD    A,(IY+03)  ; Pufferzeigerwrite erhoehen
0516 81          .     ADD   C          ; darf kein IRQ auftreten
0517 FD 77 03    .w.   LD    (IY+03),A 
051A FB          .     EI 
051B E3          .     EX    (SP),HL    ; Stringlaenge (auf Stack) --> HL
051C B7          .     OR    A 
051D ED 42       .B    SBC   HL,BC      ; Reststringlaenge
051F 44          D     LD    B,H 
0520 4D          M     LD    C,L 
0521 E1          .     POP   HL 
0522 20 AE        .    JR    NZ,04D2    ; Reststring ggf. ausgeben
0524 C1          .     POP   BC         ; Alle Zeichen uebernommen 
0525 37          7     SCF 
0526 FD CB 01 46 ...F  BIT   0,(IY+01) 
052A C9          .     RET              ;----------------------------------
052B E1          .     POP   HL 
052C B7          .     OR    A 
052D ED 42       .B    SBC   HL,BC 
052F 44          D     LD    B,H 
0530 4D          M     LD    C,L 
0531 FD CB 01 46 ...F  BIT   0,(IY+01) 
0535 C9          .     RET              ;----------- "frout" -------------- 
0536 F3          .     DI               ; keine zeichen annehmen 
0537 FD 7E 02    .~.   LD    A,(IY+02)  ; Puffergroesse - Pufferzeigerwrite 
053A 47          G     LD    B,A        ; Pufferzeiger Write = anzahl Z. 
053B FD 96 03    ...   SUB   (IY+03) 
053E FB          .     EI 
053F B8          .     CP    B          ; SCF, wenn Puffer leer
0540 3F          ?     CCF 
0541 06 00       ..    LD    B,00 
0543 4F          O     LD    C,A 
0544 C9          .     RET              ;---------------------------------- 
0545 FD CB 01 66 ...f  BIT   4,(IY+01)  ; Flusskontrolle ?
0549 20 37        7    JR    NZ,0582    ; ja 
054B FD CB 01 4E ...N  BIT   1,(IY+01) 
054F C8          .     RET   Z 
0550 FD CB 01 C6 ....  SET   0,(IY+01)  ; Zeichen aus Puffer lesen (IY+05)
0554 FD 7E 03    .~.   LD    A,(IY+03) 
0557 B7          .     OR    A          ; Writezeiger am Anfang (leer)
0558 C8          .     RET   Z          ; Zurueck
0559 FD CB 01 86 ....  RES   0,(IY+01) 
055D FD 35       .5    DEC   (IY+03)    ; Writezeiger DEC 1
055F 03          .     INC   BC 
0560 FD 46 07    .F.   LD    B,(IY+07)  ; Pufferanfang High
0563 FD 7E 05    .~.   LD    A,(IY+05) 
0566 FD BE 02    ...   CP    (IY+02) 
0569 20 02        .    JR    NZ,056D 
056B 3E 00       >.    LD    A,00 
056D 3C          <     INC   A 
056E FD 77 05    .w.   LD    (IY+05),A 
0571 3D          =     DEC   A 
0572 FD 86 06    ...   ADD   (IY+06)    ; Pufferanfang low
0575 30 01       0.    JR    NC,0578 
0577 04          .     INC   B          ; BC = Pufferzeiger
0578 4F          O     LD    C,A 
0579 0A          .     LD    A,(BC)     ; Zeichen aus Puffer (zeiger)
057A FD A6 0C    ...   AND   (IY+0C)    ; Bit 8 ggf ausblenden
057D FD AE 0D    ...   XOR   (IY+0D)    ;
0580 04          .     INC   B 
0581 C9          .     RET              ; Flusskontrolle
0582 FD CB 01 A6 ....  RES   4,(IY+01) 
0586 FD CB 01 6E ...n  BIT   5,(IY+01)  ; XON oder XOFF ?
058A 28 08       (.    JR    Z,0594 
058C FD CB 01 AE ....  RES   5,(IY+01) 
0590 FD 7E 10    .~.   LD    A,(IY+10)  ; XON (CTRL-Q) stattdessen ausgeben
0593 C9          .     RET              ;-----------------------------------
0594 F6 01       ..    OR    01 
0596 FD 7E 0F    .~.   LD    A,(IY+0F)  ; XOFF stattdessen ausgeben
0599 C9          .     RET              ;----------------------------------
059A FD CB 01 4E ...N  BIT   1,(IY+01)  ; XON empfangen
059E FD CB 01 CE ....  SET   1,(IY+01) 
05A2 C9          .     RET              ;--------------------------------- 
05A3 FD CB 01 8E ....  RES   1,(IY+01)  ; XOFF-empfangen
05A7 18 1D       ..    JR    05C6 
05A9 FD A6 08    ...   AND   (IY+08)    ;------- Zeichen per 'inputinterrupt'
05AC FD AE 09    ...   XOR   (IY+09)    ; masken fuer fehlerfreien receive 
05AF FD CB 01 56 ...V  BIT   2,(IY+01)  ; XON/XOFF ? 
05B3 28 0A       (.    JR    Z,05BF 
05B5 FD BE 10    ...   CP    (IY+10)    ; XON-Zeichen ?
05B8 28 E0       (.    JR    Z,059A 
05BA FD BE 0F    ...   CP    (IY+0F)    ; XOFF-Zeichen ?
05BD 28 E4       (.    JR    Z,05A3 
05BF 47          G     LD    B,A        ; Zeichen in B verlangt
05C0 FD 7E 00    .~.   LD    A,(IY+00)  ; Kanalnummer 
05C3 CD 13 1E    ...   CALL  1E13       ; Inputinterrupt aufrufen
05C6 F6 01       ..    OR    01 
05C8 C9          .     RET              ;-------- fehlerhafter receive
05C9 FD A6 0A    ...   AND   (IY+0A)    ; masken fuer fehlerhaften receive 
05CC FD AE 0B    ...   XOR   (IY+0B) 
05CF 18 DE       ..    JR    05AF       ; weiter wie normal 
05D1 FD 7E 0E    .~.   LD    A,(IY+0E)  ;--------- fehlerhafter receive ---- 
05D4 18 D9       ..    JR    05AF       ; '?' ausgeben 
05D6 F3          .     DI               ;---------------------------------- 
05D7 FD 7E 01    .~.   LD    A,(IY+01) 
05DA CB 5F       ._    BIT   3,A 
05DC 28 09       (.    JR    Z,05E7 
05DE F6 30       .0    OR    30         ; Bit 4 + 5 setzen (XON/XOFF) 
05E0 FD 77 01    .w.   LD    (IY+01),A 
05E3 FD CB 01 46 ...F  BIT   0,(IY+01) 
05E7 FB          .     EI 
05E8 C9          .     RET              ;---------------------------------- 
05E9 F3          .     DI               ; von RTS/DTR - XON/XOFF Routine 
05EA FD 7E 01    .~.   LD    A,(IY+01)  ; aufgerufen
05ED CB 5F       ._    BIT   3,A 
05EF 28 0B       (.    JR    Z,05FC     ; Unbekannte Flusskontrolle
05F1 F6 10       ..    OR    10 
05F3 E6 DF       ..    AND   DF 
05F5 FD 77 01    .w.   LD    (IY+01),A 
05F8 FD CB 01 46 ...F  BIT   0,(IY+01) 
05FC FB          .     EI 
05FD C9          .     RET              ;----------- XON/XOFF setzen --------
05FE FD CB 01 DE ....  SET   3,(IY+01) 
0602 FD CB 01 D6 ....  SET   2,(IY+01) 
0606 C9          .     RET              ;--------- IO-Stop d. Flow loeschen 
0607 FD CB 01 9E ....  RES   3,(IY+01)  ; XON/XOFF loeschen
060B FD CB 01 96 ....  RES   2,(IY+01) 
060F FD CB 01 4E ...N  BIT   1,(IY+01)  ; XON Modus ?
0613 FD CB 01 CE ....  SET   1,(IY+01)  ; XON-setzen
0617 C9          .     RET              ;--------- Datenbitmasken --------- 
0618 FD 73 0C    .s.   LD    (IY+0C),E  ; AND-maske fuer Datenbits setzen 
061B FD 72 0D    .r.   LD    (IY+0D),D  ; Bei weniger als 5 Bits links 1er
061E C9          .     RET              ;--------- Datenbitmasken setzen-- 
061F FD 73 08    .s.   LD    (IY+08),E  ; AND  fuer fehlerfreien reiceive
0622 FD 72 09    .r.   LD    (IY+09),D  ; XOR
0625 C9          .     RET              ;--------- Datenbitmasken setzen 
0626 FD 73 0A    .s.   LD    (IY+0A),E  ; AND fuer fehlerhaften receive
0629 FD 72 0B    .r.   LD    (IY+0B),D  ; XOR
062C C9          .     RET              ;-----------------------------------
;======================== Illegaler Kanal ================================= 
062D 01 5F 06                           ; 1, IOCONTROL "typ"
0630 02 50 06                           ; 2, IOCONTROL "frout"
0633 05 46 06                           ; 5, IOCONTROL "size"
0636 FF 4C 06                           ; -1, IOCONTROL ill.
0639 FF 55 06                           ; -1, Aufg. 5 Nicht moeglich
063C FF 4C 06                           ; -1, BLOCKIN/BLOCKOUT nicht moegl. 
063F 59 06                              ; Illegaler Kanal : OUTPUT 0659 
0641 FD                                 ; BLOCKIN : 063C
0642 FD                                 ; BLOCKOUT : 063C
0643 EE                                 ; IOCONTROL : 062D
0644 FA                                 ; Aufg. 5 : 0636
0645 00                                 ; Keine I/O moeglich
0646 3E 00       >.    LD    A,00       ; ---------- "size" --------------
0648 01 00 00    ...   LD    BC,0000    ; Null Bloecke
064B C9          .     RET              ;----------- "illegal" -1 ---------
064C 01 FF FF    ...   LD    BC,FFFF    ; Kann nicht ausgefuehrt werden
064F C9          .     RET              ;------------ "frout" -------------
0650 01 C8 00    ...   LD    BC,00C8    ; kann 200 zeichen uebernehmen 
0653 37          7     SCF              ; Puffer leer
0654 C9          .     RET              ;---------- "nicht moegl" ----------
0655 01 01 00    ...   LD    BC,0001    ; Liefert 1
0658 C9          .     RET              ;---------- "OUTPUT" --------------
0659 37          7     SCF              ; Alle Zeichen uebernommen 
065A C9          .     RET              ;------------- "ok" ---------------- 
065B 01 00 00    ...   LD    BC,0000 
065E C9          .     RET              ; -------- "typ" ------------------ 
065F 06 00       ..    LD    B,00       ; Type aus Parameterblock d. Kanals
0661 DD 4E 06    .N.   LD    C,(IX+06) 
0664 C9          .     RET              ;---------------------------------- 
;=========================== Floppykanal ================================== 
0665 05 95 06                           ; 5, IOCONTROL "size"
0668 01 5F 06                           ; 1, IOCONTROL "typ"
066B FF 4C 06                           ; -1, IOCONTROL ill.
066E FE 85 06                           ; -2, Aufg. 5 : Kanal init
0671 FF 55 06                           ; -1, Aufg. 5 : Geht nicht
0674 00 9D 06                           ; 0, BLOCKIN : 069D
0677 00 99 06                           ; 0, BLOCKOUT : 0699
067A FF 4C 06                           ; -1, BLOCKOUT ill.
067D 59 06                              ; Floppy: OUTPUT 0659 
067F F7                                 ; BLOCKIN : 0674
0680 FA                                 ; BLOCKOUT : 0677
0681 E8                                 ; IOCONTROL : 0665
0682 F1                                 ; Aufg. 5 : 066E
0683 0C                                 ; Typ : BLOCKIO ohne format
0684 04 
0685 3E 70       >p    LD    A,70       ; ----------- Floppyinit ----------- 
0687 D3 0A       ..    OUT   (0A),A     ; Interruptvektor PIOA Floppy = $70
0689 11 58 09    .X.   LD    DE,0958    ; Interruptroutine FDC
068C ED 57       .W    LD    A,I        ; In die Interruptvektortabelle 
068E 67          g     LD    H,A        ; eintragen
068F 2E 70       .p    LD    L,70 
0691 73          s     LD    (HL),E 
0692 23          #     INC   HL 
0693 72          r     LD    (HL),D 
0694 C9          .     RET              ;------------ "size" ---------------
0695 01 D0 04    ...   LD    BC,04D0    ; 1232 Bloecke = 616K
0698 C9          .     RET              ;----------- "BLOCKOUT" ----------- 
0699 3E 01       >.    LD    A,01       ; A=1 : Write
069B 18 01       ..    JR    069E       ; BLOCKIO
069D AF          .     XOR   A          ;------------ "BLOCKIN" ---------- 
069E E5          .     PUSH  HL         ; Hauptspeicheraddresse
069F 21 CF 04    !..   LD    HL,04CF    ; Mit Max. Blocknummer
06A2 B7          .     OR    A 
06A3 ED 52       .R    SBC   HL,DE 
06A5 E1          .     POP   HL 
06A6 DA C9 0B    ...   JP    C,0BC9     ; Block zu hoch = 3
06A9 E5          .     PUSH  HL 
06AA 21 11 08    !..   LD    HL,0811    ; Floppysemaphor reservieren
06AD CD 47 0C    .G.   CALL  0C47 
06B0 E1          .     POP   HL 
06B1 EB          .     EX    DE,HL      ; DE = Hauptspeicheraddresse
06B2 4F          O     LD    C,A        ; A= Read/Write,HL = Blocknummer
06B3 7D          }     LD    A,L 
06B4 E6 0F       ..    AND   0F         ; A = Sektornummer 0..15
06B6 CB 25       .%    SLA   L 
06B8 CB 14       ..    RL    H          ; HL = Tracknummer 
06BA CB 25       .%    SLA   L          ; Track = (Blocknr * 16) DIV 256
06BC CB 14       ..    RL    H          ;       = Blocknr DIV 16
06BE CB 25       .%    SLA   L 
06C0 CB 14       ..    RL    H 
06C2 CB 25       .%    SLA   L 
06C4 CB 14       ..    RL    H 
06C6 6F          o     LD    L,A        ; L = Sektor, H = Track
06C7 79          y     LD    A,C        ; A = Read/Write
06C8 B7          .     OR    A 
06C9 FD 7E 08    .~.   LD    A,(IY+08) 
06CC 28 05       (.    JR    Z,06D3     ; Z, wenn Read
06CE CD CA 09    ...   CALL  09CA       ; Write Floppy (Interrupt anstossen)
06D1 18 03       ..    JR    06D6       ; Skip
06D3 CD BE 09    ...   CALL  09BE       ; Read Floppy (Interrupt anstossen)
06D6 FD E5       ..    PUSH  IY 
06D8 CD 19 1E    ...   CALL  1E19       ; Zur Sicherheit einmal 'warte'
06DB FD E1       ..    POP   IY 
06DD FD 7E 05    .~.   LD    A,(IY+05)  ; Return von Floppy-IRQ-Routine
06E0 3C          <     INC   A 
06E1 28 F3       (.    JR    Z,06D6     ; FF = Busy, IRQ noch nicht beendet
06E3 21 11 08    !..   LD    HL,0811    ; Semaphor wieder freigeben
06E6 CD 61 0C    .a.   CALL  0C61 
06E9 3D          =     DEC   A          ; Muss = 0 sein, sonst fehler
06EA C2 AE 0B    ...   JP    NZ,0BAE    ; Fehler ggf. melden
06ED 01 00 00    ...   LD    BC,0000    ; Return: ok
06F0 C9          .     RET              ;-----------------------------------
;========================= Hintergrundkanal (Harddisk) ===================== 
06F1 05 34 07                           ; 5, IOCONTROL "size"
06F4 01 5F 06                           ; 1, IOCONTROL "typ"
06F7 FF 4C 06                           ; -1, IOCONTROL ill.
06FA FE 19 07                           ; -2, Aufg. 5 : kanal Init
06FD 9C 3C 07                           ; -100, Aufg.5:Anz.HG-Bloecke setzen
0700 FF 55 06                           ; -1, Aufg. 5 : BC = 1
0703 00 4D 07                           ; 0, BLOCKIN
0706 00 49 07                           ; 0, BLOCKOUT
0709 FF 4C 06                           ; -1, BLOCKIO illg. 
070C 59                                 ; Hintergrund : OUTPUT 0659
070D 06 
070E F7                                 ; BLOCKIN : 0703
070F FA                                 ; BLOCKOUT : 0706
0710 E5                                 ; IOCONTROL : 06F1
0711 EE                                 ; Aufg. 5 : 06FA
0712 0C                                 ; Typ : BLOCKIN/BLOCKOUT
0713 00          .     NOP 
0714 01 00 00    ...   LD    BC,0000 
0717 00          .     NOP 
0718 FF          .     RST   38         ;----------"HD-Init" --------------- 
0719 21 DA 0F    !..   LD    HL,0FDA    ; Bei Floppy (0FDA) = 46H
071C 22 0F 08    "..   LD    (080F),HL  ; Harddisktransferbufferaddresse
071F DD 7E 0A    .~.   LD    A,(IX+0A)  ; New Cylinder Number
0722 D3 22       ."    OUT   (22),A 
0724 3E 70       >p    LD    A,70       ; Interruptvektor FDC+HDC
0726 D3 0A       ..    OUT   (0A),A 
0728 11 58 09    .X.   LD    DE,0958    ; Interruptserviceroutinenaddresse
072B ED 57       .W    LD    A,I 
072D 67          g     LD    H,A 
072E 2E 70       .p    LD    L,70 
0730 73          s     LD    (HL),E 
0731 23          #     INC   HL 
0732 72          r     LD    (HL),D 
0733 C9          .     RET              ;------------ "size" --------------- 
0734 FD 4E 01    .N.   LD    C,(IY+01)  ; HG-Maxblock Low
0737 FD 46 02    .F.   LD    B,(IY+02)  ; High
073A 03          .     INC   BC         ; +1 = Anzahl Bloecke
073B C9          .     RET              ;------ Anzahl-HG-Bloecke setzen ---
073C FD 75 01    .u.   LD    (IY+01),L  ; Letzter HD-Block 
073F FD 74 02    .t.   LD    (IY+02),H 
0742 FD 73 03    .s.   LD    (IY+03),E  ; Erster HD-Block
0745 FD 72 04    .r.   LD    (IY+04),D 
0748 C9          .     RET              ;-------- Hintergrund-Write --------- 
0749 3E 01       >.    LD    A,01       ; 
074B 18 01       ..    JR    074E       ;--------- Hintergrund-Read -------- 
074D AF          .     XOR   A 
074E E5          .     PUSH  HL         ; Blocknummer in DE
074F FD 6E 01    .n.   LD    L,(IY+01)  ; Anzahl Hintergrundbloecke
0752 FD 66 02    .f.   LD    H,(IY+02) 
0755 B7          .     OR    A 
0756 ED 52       .R    SBC   HL,DE 
0758 E1          .     POP   HL 
0759 DA C9 0B    ...   JP    C,0BC9     ; Block zu hoch
075C E5          .     PUSH  HL 
075D 21 11 08    !..   LD    HL,0811    ; Harddisksemaphor reservieren
0760 CD 47 0C    .G.   CALL  0C47 
0763 FD 6E 03    .n.   LD    L,(IY+03)  ; Erster Harddiskblock
0766 FD 66 04    .f.   LD    H,(IY+04) 
0769 19          .     ADD   HL,DE      ; + Blocknummer
076A EB          .     EX    DE,HL 
076B E1          .     POP   HL         ; DE=Blocknummer neu
076C E5          .     PUSH  HL         ; HL=Hauptspeicherzieladdresse
076D F5          .     PUSH  AF         ; Wird spaeter als BC gepopt
076E B7          .     OR    A 
076F 20 03        .    JR    NZ,0774    ; NZ=Write
0771 2A 0F 08    *..   LD    HL,(080F)  ; Harddiskbufferaddresse
0774 CD A5 07    ...   CALL  07A5       ; HDC fuer Transfer anstossen
0777 DD E5       ..    PUSH  IX 
0779 CD 19 1E    ...   CALL  1E19       ; 'warte' EUMEL0 aufrufen
077C DD E1       ..    POP   IX 
077E DD 7E 07    .~.   LD    A,(IX+07)  ; Harddisk ready ?
0781 3C          <     INC   A          ; FF = not ready
0782 28 F3       (.    JR    Z,0777     ; weiter warten
0784 21 11 08    !..   LD    HL,0811    ; Semaphor freigeben
0787 CD 61 0C    .a.   CALL  0C61 
078A 3D          =     DEC   A          ; Fehlercode
078B C1          .     POP   BC 
078C E1          .     POP   HL 
078D C2 AE 0B    ...   JP    NZ,0BAE    ; Bei Fehler melden 
0790 78          x     LD    A,B        ; A=1 : Write
0791 B7          .     OR    A 
0792 20 0C        .    JR    NZ,07A0    ; Bei Write kein Transfer mehr
0794 EB          .     EX    DE,HL      ; DE = Hauptspeicherzieladdresse
0795 2A 0F 08    *..   LD    HL,(080F)  ; Hauptspeicher fuer HD-Transfer
0798 23          #     INC   HL         ; Vorweg Status etc.
0799 23          #     INC   HL 
079A 23          #     INC   HL 
079B 01 00 02    ...   LD    BC,0200    ; Vom HD-Buffer --> EUMEL-Block
079E ED B0       ..    LDIR 
07A0 01 00 00    ...   LD    BC,0000    ; "ok"
07A3 C9          .     RET              ;----------------------------------
07A4 C9          .     RET 
07A5 E5          .     PUSH  HL         ;----------- HD-Transfer anstoss. --
07A6 F5          .     PUSH  AF         ; A=1:Write,0=Read,HL=Mem.Addresse
07A7 D5          .     PUSH  DE         ; DE=Blocknummer
07A8 06 00       ..    LD    B,00       ; Cachesize = 21 max.
07AA 3A 05 00    :..   LD    A,(0005)   ; (5) = Cachegroesse
07AD B7          .     OR    A 
07AE 28 26       (&    JR    Z,07D6     ; Nicht in Cache, neu berechnen
07B0 4F          O     LD    C,A 
07B1 7A          z     LD    A,D        ; D = Blocknummer High zum suchen
07B2 21 05 00    !..   LD    HL,0005    ; Tabellenanfang = 6
07B5 09          .     ADD   HL,BC      ; + Cachegroesse
07B6 ED B9       ..    CPDR             ; Blocknummerhigh suchen 
07B8 20 1C        .    JR    NZ,07D6    ; Nicht gefunden, Tabelle durch
07BA F5          .     PUSH  AF         ; gefunden, test, ob Blocknummerlow 
07BB E5          .     PUSH  HL         ; auch stimmt
07BC 21 1A 00    !..   LD    HL,001A    ; Tabellenanfang = 27
07BF 09          .     ADD   HL,BC 
07C0 7B          {     LD    A,E        ; Blocknummer Low
07C1 BE          .     CP    (HL) 
07C2 28 07       (.    JR    Z,07CB     ; Ja, Block gefunden in Cache
07C4 E1          .     POP   HL 
07C5 F1          .     POP   AF 
07C6 EA B6 07    ...   JP    PE,07B6    ; Noch nicht die ganze Tabelle durch
07C9 18 0B       ..    JR    07D6       ; Ganz durch, neu berechnen 
07CB E1          .     POP   HL         ; Aus Cache entnehmen
07CC F1          .     POP   AF 
07CD 21 44 00    !D.   LD    HL,0044 
07D0 09          .     ADD   HL,BC 
07D1 C1          .     POP   BC 
07D2 EB          .     EX    DE,HL 
07D3 C3 A7 07    ...   JP    07A7       ;---------------------------------- 
07D6 E1          .     POP   HL 
07D7 F1          .     POP   AF 
07D8 D1          .     POP   DE 
07D9 01 40 04    .@.   LD    BC,0440    ; 1088 Bloecke subtrahieren
07DC F5          .     PUSH  AF         ; fuer Cylindernrhigh
07DD AF          .     XOR   A 
07DE ED 42       .B    SBC   HL,BC      ; 1088 = 17(sektoren)*4(heads)*16
07E0 3C          <     INC   A 
07E1 30 FB       0.    JR    NC,07DE    ; cylindernrh = blocknr DIV 1088
07E3 09          .     ADD   HL,BC 
07E4 3D          =     DEC   A          ; restbloecke in HL
07E5 07          .     RLCA             ; ins hoeherwertige Nibble bringen 
07E6 07          .     RLCA             ; (*16)
07E7 07          .     RLCA 
07E8 07          .     RLCA 
07E9 F5          .     PUSH  AF 
07EA 01 44 00    .D.   LD    BC,0044    ; Cylindernummerlow
07ED AF          .     XOR   A          ; restblocknr DIV 68 = cylindernrl
07EE ED 42       .B    SBC   HL,BC 
07F0 3C          <     INC   A 
07F1 30 FB       0.    JR    NC,07EE 
07F3 09          .     ADD   HL,BC 
07F4 3D          =     DEC   A 
07F5 67          g     LD    H,A       ; Cylinder = cylinderl*16+cylinderh
07F6 F1          .     POP   AF 
07F7 B4          .     OR    H 
07F8 67          g     LD    H,A       ; H = Cylinder
07F9 7D          }     LD    A,L       ; Head = Blocknr MOD 4
07FA E6 03       ..    AND   03 
07FC 07          .     RLCA            ; Head ins Highnibble bringen
07FD 07          .     RLCA 
07FE 07          .     RLCA 
07FF 07          .     RLCA 
0800 CB 3D       .=    SLR   L         ; Sektor = restblocknr DIV 4
0802 CB 3D       .=    SLR   L         ; 17. Sektor ist ungenutzt
0804 4F          O     LD    C,A 
0805 F1          .     POP   AF 
0806 FE 01       ..    CP    01 
0808 79          y     LD    A,C 
0809 CA 6B 08    .k.   JP    Z,086B     ; Z, wenn Write
080C C3 5C 08    .\.   JP    085C       ; Read
080F 00          .     NOP              ; HD-Transferpuffer
0810 00          .     NOP 
0811 00          .     NOP 
;=============================== Timerinterrupt ===========================
0812 11 2D 08    .-.   LD    DE,082D    ;-------- Timer Init ----------------
0815 ED 57       .W    LD    A,I 
0817 67          g     LD    H,A 
0818 2E C6       ..    LD    L,C6       ; HL = 00C6 Interruptserviceroutine 
081A 3E 33       >3    LD    A,33       ; Fuer alle Kanaele einen programm. 
081C E6 FC       ..    AND   FC         ; C0=0, C2=1, C4=2, C6=3(timer)
081E 4F          O     LD    C,A 
081F ED 69       .i    OUT   (C),L      ; Interruptvektor setzen
0821 73          s     LD    (HL),E     ; Addresse der Serviceroutine 
0822 23          #     INC   HL         ; --> (00C6) fuer CTC-Kanal 3 
0823 72          r     LD    (HL),D 
0824 3E B5       >.    LD    A,B5       ; IRQ,Timer,DIV256,pos.flanke,kein
0826 D3 33       .3    OUT   (33),A     ; externer trigger, timeconst folgt
0828 3E FA       >.    LD    A,FA       ; 250 = Zeitkonstante: 
082A D3 33       .3    OUT   (33),A     ; Hz=4000000/256/250=62.5 ^ 16ms
082C C9          .     RET              ;------ Timer-Service-IRQ --------- 
082D F5          .     PUSH  AF 
082E 3E 10       >.    LD    A,10       ; Alle 16ms Interrupt 
0830 CD 16 1E    ...   CALL  1E16       ; "timerinterrupt" 
0833 3A 5B 08    :[.   LD    A,(085B) 
0836 3C          <     INC   A 
0837 FE 3E       .>    CP    3E         ; Alle 62 Timerdurchlaeufe ~ 1s 
0839 28 07       (.    JR    Z,0842 
083B 32 5B 08    2[.   LD    (085B),A   ; Zaehler INCR 1
083E F1          .     POP   AF 
083F FB          .     EI 
0840 ED 4D       .M    RETI             ;-------------IRQ-Ende-------------- 
0842 AF          .     XOR   A          ; Sekundenzaehler auf 0
0843 32 5B 08    2[.   LD    (085B),A 
0846 DD E5       ..    PUSH  IX 
0848 FD E5       ..    PUSH  IY 
084A E5          .     PUSH  HL 
084B D5          .     PUSH  DE 
084C C5          .     PUSH  BC 
084D C3 50 08    .P.   JP    0850       ; Wird jede Sekunde aufgerufen 
0850 C1          .     POP   BC 
0851 D1          .     POP   DE 
0852 E1          .     POP   HL 
0853 FD E1       ..    POP   IY 
0855 DD E1       ..    POP   IX 
0857 F1          .     POP   AF 
0858 FB          .     EI 
0859 ED 4D       .M    RETI             ;-----------IRQ-Ende---------------- 
085B 00          .     NOP              ; Sekundenzaehler
;============================= Harddisk I/O ===============================
085C 0E 01       ..    LD    C,01       ;----------- HD-Read-Routine-------- 
085E DD 36 09 01 .6..  LD    (IX+09),01 ; Read-Kommando fuer HDC
0862 ED 53 AB 09 .S..  LD    (09AB),DE  ; Zieladdresse
0866 11 02 02    ...   LD    DE,0202    ; 515 Bytes
0869 18 0D       ..    JR    0878 
086B 0E 05       ..    LD    C,05       ;---------- HD-Write-Routine ------- 
086D DD 36 09 02 .6..  LD    (IX+09),02 ; (09BA) = Track(High),Sektor(Low)
0871 ED 53 AB 09 .S..  LD    (09AB),DE  ; Sourceaddresse, 02 = WriteCMD HDC
0875 11 FF 01    ...   LD    DE,01FF    ; 512 Bytes
0878 DD 22 BC 09 ."..  LD    (09BC),IX  ; IX retten
087C ED 53 AD 09 .S..  LD    (09AD),DE  ; Anzahl Bytes zu uebertragen
0880 DD 36 0C 05 .6..  LD    (IX+0C),05 
0884 22 BA 09    "..   LD    (09BA),HL 
0887 DD 36 07 FF .6..  LD    (IX+07),FF 
088B 2A BA 09    *..   LD    HL,(09BA) 
088E F6 01       ..    OR    01         ; HD-Drive 1 auswaehlen
0890 D3 20       .     OUT   (20),A     ; Head und Drive selektieren
0892 57          W     LD    D,A 
0893 79          y     LD    A,C 
0894 32 B7 09    2..   LD    (09B7),A   ; Read or Write 01/05
0897 DB 23       .#    IN    A,(23)     ; Status einlesen
0899 CB 77       .w    BIT   6,A 
089B 28 07       (.    JR    Z,08A4 
089D 3E 02       >.    LD    A,02       ; NZ = "write fault"
089F D3 20       .     OUT   (20),A     ; Drive 2 selektieren
08A1 7A          z     LD    A,D        ; Headnummer setzen
08A2 D3 20       .     OUT   (20),A 
08A4 7C          |     LD    A,H        ; Cylindernummer
08A5 DD BE 0A    ...   CP    (IX+0A)    ; = Alter Cylinder
08A8 CA C4 08    ...   JP    Z,08C4     ; ja, kein neuer Cylinderseek
08AB DD 7E 0A    .~.   LD    A,(IX+0A)  ; alten Cylinder holen --> HDC
08AE D3 21       .!    OUT   (21),A     ; last significant Bits of CYL
08B0 AF          .     XOR   A          ; most significant Bits of CYL = 0
08B1 D3 21       .!    OUT   (21),A 
08B3 7C          |     LD    A,H        ; Neue Cylindernummer
08B4 D3 22       ."    OUT   (22),A     ; ausgeben und 
08B6 DD 77 0A    .w.   LD    (IX+0A),A  ; vermerken
08B9 AF          .     XOR   A          ; Most significant Bits = 0
08BA D3 22       ."    OUT   (22),A 
08BC 3E 10       >.    LD    A,10       ; Seek-Kommando an HDC
08BE CD 5B 09    .[.   CALL  095B 
08C1 2A BA 09    *..   LD    HL,(09BA)  ; Sektornummer
08C4 7D          }     LD    A,L        ; ausgeben
08C5 D3 21       .!    OUT   (21),A 
08C7 21 A9 09    !..   LD    HL,09A9    ; DMA-Init-Tabelle
08CA C5          .     PUSH  BC 
08CB 01 00 11    ...   LD    BC,1100    ; DMA-Transfer vorbereiten
08CE ED B3       ..    OTIR             ; 17 Bytes an DMA-Controller
08D0 C1          .     POP   BC 
08D1 DD 7E 09    .~.   LD    A,(IX+09)  ; 01=Read, 02=Write
08D4 CD 5B 09    .[.   CALL  095B       ; An HDC-Controller schicken
08D7 DD 36 0C FF .6..  LD    (IX+0C),FF ; Status in A
08DB 21 40 09    !@.   LD    HL,0940    ; Fehlernummer (in L) --> IX+07 
08DE E5          .     PUSH  HL 
08DF 21 58 09    !X.   LD    HL,0958    ; HD-IRQ-Serviceroutine
08E2 22 70 00    "p.   LD    (0070),HL  ; in Vektortabelle eintragen
08E5 2E 00       ..    LD    L,00 
08E7 E6 5D       .]    AND   5D         ; HD-Status in A
08E9 CA 46 09    .F.   JP    Z,0946     ; "ok"
08EC CB 5F       ._    BIT   3,A        ; NZ, wenn "Record not found"
08EE C2 11 09    ...   JP    NZ,0911    ; 
08F1 CB 67       .g    BIT   4,A        ; NZ, wenn "CRC error"
08F3 28 03       (.    JR    Z,08F8 
08F5 2E 02       ..    LD    L,02       ; 2 = "crc err"
08F7 C9          .     RET              ;------------------------------- 
08F8 CB 57       .W    BIT   2,A        ; NZ, wenn "bad sector"
08FA 28 03       (.    JR    Z,08FF 
08FC 2E 03       ..    LD    L,03       ; "bad sect"
08FE C9          .     RET              ;-------------------------------
08FF CB 77       .w    BIT   6,A        ; NZ, wenn "write fault"
0901 28 0B       (.    JR    Z,090E 
0903 2E 04       ..    LD    L,04       ; "write fault"
0905 3E 02       >.    LD    A,02       ; Drive 2 selektieren
0907 D3 20       .     OUT   (20),A 
0909 E6 3F       .?    AND   3F 
090B D3 20       .     OUT   (20),A     ; Heads 4..15 gibt es nicht
090D C9          .     RET              ;-------------------------------
090E 2E 05       ..    LD    L,05       ; "write fault" 
0910 C9          .     RET              ;------------------------------ 
0911 2E 07       ..    LD    L,07       ; "rec not fnd"
0913 DD 35       .5    DEC   (IX+08)    ; Noch einmal
0915 08          .     EX    AF,AF' 
0916 C0          .     RET   NZ         ; Nach 8 Versuchen:
0917 E1          .     POP   HL 
0918 DD 36 0B 07 .6..  LD    (IX+0B),07 ; Register fuer Cylinderpos etc. 
091C DD 36 08 08 .6..  LD    (IX+08),08 
0920 DD 36 07 FF .6..  LD    (IX+07),FF 
0924 DD 36 0C FF .6..  LD    (IX+0C),FF 
0928 DD 36 0A 00 .6..  LD    (IX+0A),00 
092C 3E 20       >     LD    A,20       ; Recalibrate Head
092E CD 5B 09    .[.   CALL  095B       ; Kommando ausgeben
0931 DD 7E 0B    .~.   LD    A,(IX+0B) 
0934 DD 77 07    .w.   LD    (IX+07),A 
0937 21 58 09    !X.   LD    HL,0958    ; Dummy-IRQ-Vektor (EI, RETI)
093A 22 70 00    "p.   LD    (0070),HL 
093D C3 A4 07    ...   JP    07A4       ; RET
0940 DD 75 07    .u.   LD    (IX+07),L 
0943 C3 A4 07    ...   JP    07A4       ; NOP oder RET (i.d.R RET)
0946 3E BB       >.    LD    A,BB       ; Lesemaske setzen 
0948 D3 00       ..    OUT   (00),A     ; DMA-Kommando
094A 3E 01       >.    LD    A,01       ; BIT0 = Register 0 wird gelesen
094C D3 00       ..    OUT   (00),A     ; Register 0 ist Statusregister
094E DB 00       ..    IN    A,(00)     ; DMA-Status einlesen (Readregister0)
0950 E6 21       .!    AND   21         ; Test, ob DMA laeuft
0952 EE 01       ..    XOR   01         ; Kein Blockende und DMA erhielt BCK
0954 C8          .     RET   Z          ; DMA- angestossen = 0
0955 36 06       6.    LD    (HL),06    ; DMA-failed
0957 C9          .     RET 
0958 FB          .     EI 
0959 ED 4D       .M    RETI             ;--------- Kommando an HDC -------- 
095B E1          .     POP   HL         ; in A
095C 22 7F 09    "..   LD    (097F),HL  ; Returnaddresse --> CALL Fehler 
095F 21 68 09    !h.   LD    HL,0968    ; Interruptserviceroutine
0962 22 70 00    "p.   LD    (0070),HL 
0965 D3 23       .#    OUT   (23),A     ; Kommando ausgeben
0967 C9          .     RET              ;-------- IRQ-Serviceroutine HDC-----
0968 F5          .     PUSH  AF 
0969 DD E5       ..    PUSH  IX 
096B DD 2A BC 09 .*..  LD    IX,(09BC) 
096F E5          .     PUSH  HL 
0970 DB 08       ..    IN    A,(08)     ; HDC-IRQ ?
0972 CB 7F       ..    BIT   7,A 
0974 F5          .     PUSH  AF 
0975 DB 23       .#    IN    A,(23)     ; Status lesen (wird geloescht)
0977 67          g     LD    H,A 
0978 3E 00       >.    LD    A,00 
097A D3 23       .#    OUT   (23),A     ; Null (quiescent state) Kommando
097C F1          .     POP   AF 
097D 7C          |     LD    A,H 
097E C4 67 09    .g.   CALL  NZ,0967   ; Fehler --> L bringen
0981 DB 04       ..    IN    A,(04)    ; Drive/Controller Status FDC 
0983 E1          .     POP   HL 
0984 DD E1       ..    POP   IX 
0986 F1          .     POP   AF 
0987 FB          .     EI 
0988 ED 4D       .M    RETI             ;----------------------------------- 
098A F5          .     PUSH  AF 
098B E5          .     PUSH  HL 
098C DD E5       ..    PUSH  IX 
098E DB 23       .#    IN    A,(23)     ; Status einlesen (dummy)
0990 DD 2A BC 09 .*..  LD    IX,(09BC) 
0994 3E 40       >@    LD    A,40       ; Welches Kommando ist das ???!!!
0996 D3 23       .#    OUT   (23),A 
0998 DB 04       ..    IN    A,(04)     ; FDC-Status einlesen
099A DD 36 07 08 .6..  LD    (IX+07),08 
099E 21 58 09    !X.   LD    HL,0958    ; Dummy-IRQ-Vektor
09A1 22 70 00    "p.   LD    (0070),HL 
09A4 DD E1       ..    POP   IX 
09A6 E1          .     POP   HL 
09A7 F1          .     POP   AF 
09A8 C9          .     RET              ; DMA-Initialisierungstabelle -HDC-
                            ;-DMA-Register 6 (Kommandoregister) "RESET"
09A9 C3                                 ; Softreset an DMA-Controller
                            ;-DMA-Register 0 (Port A Addressregister) 
09AA 7D                                 ; A --> B uebertragen, BL & Adr folgt
09AB 00 00                              ; Startaddresse Port A 
09AD FF 01                              ; Anzahl Bytes -1 (Bytecount) 
                            ;-DMA-Register 1 (Port A Modus)
09AF 14                                 ; Port A ist Speicher, INCR Adress
                            ;-DMA-Register 2 (Port B Modus) 
09B0 28                                 ; Port B ist IO-Port, Adr. konstant 
                            ;-DMA-Register 4 (Betriebsart & Port B Adr.reg.)
09B1 A5                                 ; Blockmodus, IO-Port B folgt 
09B2 21                                 ; 21 = Data I/O-Port fuer HDC
                            ;-DMA-Register 5 (Pin-Control)
09B3 8A                                 ; Stop am Blockende,Pin16=-CE,RDYakt1
                            ;-DMA-Register 6 (Kommando) "LOAD"
09B4 CF                                 ; Adresse & BL aus WR0/WR4 laden 
09B5 01                                 ; Wegen Maskenfehler: Direction umk. 
09B6 CF                                 ;        "         Kommando "LOAD"
09B7 01                                 ; 01 : B-->A, 05 : A-->B
09B8 CF                                 ; Kommando : "LOAD"
09B9 87                                 ; DMA-Freigabe       ------ bis hier
09BA 00          .     NOP              ; Bereich fuer IX (retten) 
09BB 00          .     NOP 
09BC 00          .     NOP              ; Sektornummer, 09BD = Tracknummer 
09BD 00          .     NOP              ;------- Floppy-Read anstoss.------ 
;============================= Floppy I/O ==================================
09BE FD 36 01 9F .6..  LD    (IY+01),9F ; AND-Maske fuer FDC-Status-ready
09C2 0E 01       ..    LD    C,01       ; DMA-Read-Kommando
09C4 FD 36 02 88 .6..  LD    (IY+02),88 ; FDC-Kommando read
09C8 18 0A       ..    JR    09D4 
09CA FD 36 01 FF .6..  LD    (IY+01),FF ;------- Floppy-Write anstoss.------ 
09CE 0E 05       ..    LD    C,05       ; AND-Maske fuer FDC-Status-ready
09D0 FD 36 02 A8 .6..  LD    (IY+02),A8 ; ^ DMA-Write-Kommando,FDC-Kommandowrite 
09D4 FD 22 B1 0A ."..  LD    (0AB1),IY  ; IY retten
09D8 FB          .     EI 
09D9 E5          .     PUSH  HL 
09DA 21 C1 0A    !..   LD    HL,0AC1    ; DMA-Direction-Byte
09DD 71          q     LD    (HL),C 
09DE E1          .     POP   HL 
09DF FD 36 0A 46 .6.F  LD    (IY+0A),46 
09E3 ED 53 B5 0A .S..  LD    (0AB5),DE  ; Zieladdresse fuer DMA 
09E7 FD 36 05 FF .6..  LD    (IY+05),FF 
09EB CB BF       ..    RES   7,A 
09ED DD BE 07    ...   CP    (IX+07) 
09F0 28 1C       (.    JR    Z,0A0E 
09F2 DD 77 07    .w.   LD    (IX+07),A 
09F5 22 C4 0A    "..   LD    (0AC4),HL  ; track/sektor retten
09F8 FD 7E 06    .~.   LD    A,(IY+06) 
09FB D3 05       ..    OUT   (05),A     ;  Tracknummer
09FD D3 07       ..    OUT   (07),A     ;  Output to FDC
09FF 3E 12       >.    LD    A,12       ; FDC-Kommando
0A01 CD 76 0A    .v.   CALL  0A76 
0A04 FD 7E 09    .~.   LD    A,(IY+09)  ; Floppydrive (Headselect)
0A07 CB C7       ..    SET   0,A        ; Single Density
0A09 D3 08       ..    OUT   (08),A     ; Floppy Format + Headselect
0A0B 2A C4 0A    *..   LD    HL,(0AC4)  ; geretteter Sektor 
0A0E 7D          }     LD    A,L        ; Sektornumber
0A0F D3 06       ..    OUT   (06),A 
0A11 7C          |     LD    A,H        ; Tracknummer
0A12 FD BE 06    ...   CP    (IY+06) 
0A15 28 0A       (.    JR    Z,0A21 
0A17 FD 77 06    .w.   LD    (IY+06),A 
0A1A D3 07       ..    OUT   (07),A     ; Outputdatabyte Track setzen
0A1C 3E 1A       >.    LD    A,1A       ; FDC-Kommando
0A1E CD 76 0A    .v.   CALL  0A76 
0A21 DB 08       ..    IN    A,(08)     ; Headloadinput testen
0A23 CB 4F       .O    BIT   1,A 
0A25 FD 7E 02    .~.   LD    A,(IY+02)  ; Read/Write-Kommando an FDC
0A28 20 02        .    JR    NZ,0A2C    ; Head ist auf der Floppy
0A2A CB D7       ..    SET   2,A        ; Head muss noch auf Floppy
0A2C 21 B3 0A    !..   LD    HL,0AB3    ; DMA-Tabelle 
0A2F 01 00 11    ...   LD    BC,1100    ; 17 Bytes in DMA schreiben
0A32 ED B3       ..    OTIR 
0A34 CD 76 0A    .v.   CALL  0A76       ; FDC-Kommando ausgeben (starten)
0A37 FD 36 0A FF .6..  LD    (IY+0A),FF 
0A3B 21 AE 0A    !..   LD    HL,0AAE 
0A3E 22 70 00    "p.   LD    (0070),HL 
0A41 DB 04       ..    IN    A,(04)     ; FDC - Status
0A43 FD A6 01    ...   AND   (IY+01)    ; maske fuer 'fehler'
0A46 CB 7F       ..    BIT   7,A 
0A48 20 11        .    JR    NZ,0A5B    ; ist noch busy
0A4A B7          .     OR    A          ; Irgendwelche Fehler ?
0A4B 20 05        .    JR    NZ,0A52 
0A4D FD 36 05 00 .6..  LD    (IY+05),00 ; Kein Fehler, "ok"
0A51 C9          .     RET 
0A52 CB 67       .g    BIT   4,A        ; CRC ?
0A54 20 0A        .    JR    NZ,0A60 
0A56 FD 36 05 02 .6..  LD    (IY+05),02 ; Fehler "crc err"
0A5A C9          .     RET 
0A5B FD 36 05 01 .6..  LD    (IY+05),01 ; Fehler 1 : "busy"
0A5F C9          .     RET 
0A60 FD 36 05 FF .6..  LD    (IY+05),FF ; Interrupt noch nicht beendet setz.
0A64 3E 0A       >.    LD    A,0A       ; Kommando 10 an FDC
0A66 CD 76 0A    .v.   CALL  0A76 
0A69 FD 36 05 02 .6..  LD    (IY+05),02 ; Fehler 2 : "crc err"
0A6D DB 04       ..    IN    A,(04)     ; FDC-Status
0A6F 21 AE 0A    !..   LD    HL,0AAE    ; Dummy-IRQ Vektor (EI, RETI)
0A72 22 70 00    "p.   LD    (0070),HL  ; eintragen
0A75 C9          .     RET              ;----------FDC Kommandoausgeben----
0A76 E1          .     POP   HL         ; Returnaddresse = Fehlernr.laden
0A77 22 A5 0A    "..   LD    (0AA5),HL 
0A7A 21 96 0A    !..   LD    HL,0A96 
0A7D 22 70 00    "p.   LD    (0070),HL  ; Floppy IRQ-Vektor setzen
0A80 D3 04       ..    OUT   (04),A     ; 1797 FDC Command
0A82 C9          .     RET              ;----------------------------------
0A83 F5          .     PUSH  AF 
0A84 FD 2A B1 0A .*..  LD    IY,(0AB1)  ; geretteter IY
0A88 FD 36 05 02 .6..  LD    (IY+05),02 ; "crc err"
0A8C E5          .     PUSH  HL 
0A8D 21 AE 0A    !..   LD    HL,0AAE    ; Dummy-Interrupt-Vektor
0A90 22 70 00    "p.   LD    (0070),HL 
0A93 E1          .     POP   HL 
0A94 F1          .     POP   AF 
0A95 C9          .     RET              ;----- IRQ-Service-Routine ---------
0A96 FB          .     EI               ; 
0A97 FD E5       ..    PUSH  IY 
0A99 E5          .     PUSH  HL 
0A9A C5          .     PUSH  BC 
0A9B F5          .     PUSH  AF 
0A9C FD 2A B1 0A .*..  LD    IY,(0AB1)  ; geretteter IY
0AA0 DB 08       ..    IN    A,(08)     ; IRQ-Anford.Register
0AA2 CB 77       .w    BIT   6,A        ; BIT6=FDC IRQ aufgetreten
0AA4 C4 82 0A    ...   CALL  NZ,0A82    ; Returnaddresse in CALL-Addresse
0AA7 DB 23       .#    IN    A,(23)     ; Statusbyte Harddisk loeschen
0AA9 F1          .     POP   AF 
0AAA C1          .     POP   BC 
0AAB E1          .     POP   HL 
0AAC FD E1       ..    POP   IY 
0AAE FB          .     EI 
0AAF ED 4D       .M    RETI             ;-----------------------------------
0AB1 00          .     NOP              ; Platz zum retten von IY 
0AB2 00          .     NOP              ;- DMA-Initialisierung fuer FDC --- 
0AB3 C3                                 ; Softreset an DMA-Controller
                            ;-DMA-Register 0 (Port A Addressregister) 
0AB4 7D                                 ; A --> B uebertragen, BL & Adr folgt
0AB5 00 00                              ; Startaddresse Port A 
0AB7 FF 01                              ; Anzahl Bytes -1 (Bytecount) 
                            ;-DMA-Register 1 (Port A Modus)
0AB9 14                                 ; Port A ist Speicher, INCR Adress
                            ;-DMA-Register 2 (Port B Modus) 
0ABA 28                                 ; Port B ist IO-Port, Adr. konstant 
                            ;-DMA-Register 4 (Betriebsart & Port B Adr.reg.)
0ABB 85                                 ; Einzelbytemodus(!) IO-Port B folgt 
0ABC 07                                 ; 01 = Data I/O-Port fuer FDC
                            ;-DMA-Register 5 (Pin-Control)
0ABD 8A                                 ; Stop am Blockende,Pin16=-CE,RDYakt1
                            ;-DMA-Register 6 (Kommando) "LOAD"
0ABE CF                                 ; Adresse & BL aus WR0/WR4 laden 
0ABF 01                                 ; Wegen Maskenfehler: Direction umk. 
0AC0 CF                                 ;        "         Kommando "LOAD"
0AC1 01                                 ; 01 : B-->A, 05 : A-->B
0AC2 CF                                 ; Kommando : "LOAD"
0AC3 87                                 ; DMA-Freigabe       ------ bis hier
0AC4 00 00                              ;---------------------------------- 
;=========================== Parallel Kanaele =============================
0AC6 01 5F 06                           ; 1 IOCONTROL "typ"
0AC9 02 7B 0B                           ; 2 IOCONTROL "frout"
0ACC 05 46 06                           ; 5 IOCONTROL "size"
0ACF FD 07 0B                           ; -3 IOCONTROL "Printerstat --> BC" 
0AD2 FC FF 0A                           ; -4 IOCONTROL"code2 --> Printerport" 
0AD5 FB 03 0B                           ; -5 IOCONTROL"code2 --> Pstatusport"
0AD8 FF 4C 06                           ; -1 IOCONTROL ill.
0ADB E2 0D 0B                           ; -30 Aufg. 5, Maske fuer Busy-Status
0ADE E1 14 0B                           ; -31 Aufg. 5, Maske fuer Printerstb.
0AE1 FE F1 0A                           ; -2  Aufg. 5 = Kanal init
0AE4 FF 55 06                           ; -1, Aufg. 5 --> BC = 1 
0AE7 FF 4C 06                           ; -1, BLOCKIN, BLOCKOUT ill.
0AEA 1E                                 ; Parallel 0B1E = OUTPUT
0AEB 0B          .     DEC   BC 
0AEC FD          .                      ; BLOCKIN : 0AE7
0AED FD          .                      ; BLOCKOUT : 0AE7
0AEE DC                                 ; IOCONTROL : 0AC6
0AEF F1                                 ; Aufg. 5 : 0ADB
0AF0 03                                 ; Typ : Input/Ouput (Stream)
0AF1 DB 10       ..    IN    A,(10)     ;-------- Kanal Init --------------- 
0AF3 FD A6 03    ...   AND   (IY+03)    ; Printer selektieren
0AF6 FD AE 04    ...   XOR   (IY+04) 
0AF9 FD AE 05    ...   XOR   (IY+05) 
0AFC D3 10       ..    OUT   (10),A     ; Ausgabe an Printerstatusport
0AFE C9          .     RET              ;----------- "IOCONTROL -4" --------
0AFF 7B          {     LD    A,E        ; Printerdata direkt ausgeben 
0B00 D3 11       ..    OUT   (11),A 
0B02 C9          .     RET              ;---------- "IOCONTROL -5"- --------
0B03 7B          {     LD    A,E        ; datastrobe, input prime, control 
0B04 D3 10       ..    OUT   (10),A     ; An Statusport (printer) ausgeben 
0B06 C9          .     RET              ;-------- "IOCONTROL -3" -----------
0B07 DB 10       ..    IN    A,(10)     ; Liest der Printerstatus ein 
0B09 4F          O     LD    C,A 
0B0A 06 00       ..    LD    B,00 
0B0C C9          .     RET              ;----- Aufg. 5, "-14" -------------- 
0B0D FD 73 01    .s.   LD    (IY+01),E  ; code2 --> AND/XOR Masken "Busy"
0B10 FD 72 02    .r.   LD    (IY+02),D 
0B13 C9          .     RET              ;----- Aufg. 5, "-15" ------------- 
0B14 FD 73 03    .s.   LD    (IY+03),E  ; code2, code3 --> Maske "selekt" 
0B17 FD 72 04    .r.   LD    (IY+04),D 
0B1A FD 74 05    .t.   LD    (IY+05),H 
0B1D C9          .     RET              ;--------- "OUTPUT" --------------- 
0B1E 78          x     LD    A,B        ; Nichts auszugeben ? 
0B1F B1          .     OR    C 
0B20 37          7     SCF 
0B21 C8          .     RET   Z 
0B22 C5          .     PUSH  BC 
0B23 DB 10       ..    IN    A,(10)     ; Status einelsen
0B25 FD A6 03    ...   AND   (IY+03)    ; Printerselekt.
0B28 FD AE 04    ...   XOR   (IY+04) 
0B2B 57          W     LD    D,A 
0B2C FD AE 05    ...   XOR   (IY+05) 
0B2F 5F          _     LD    E,A 
0B30 E5          .     PUSH  HL 
0B31 09          .     ADD   HL,BC      ; Ende des Textes
0B32 E3          .     EX    (SP),HL 
0B33 41          A     LD    B,C        ; Textlaenge Low (Pbuffersize < 256)
0B34 0E 11       ..    LD    C,11       ; Dataport = 11H
0B36 DB 10       ..    IN    A,(10)     ; Printer busy ?
0B38 FD A6 01    ...   AND   (IY+01) 
0B3B FD AE 02    ...   XOR   (IY+02) 
0B3E 20 1B        .    JR    NZ,0B5B    ; testen, ob printer da
0B40 ED A3       ..    OUTI             ; Ein Zeichen ausgeben
0B42 7A          z     LD    A,D 
0B43 D3 10       ..    OUT   (10),A     ; Printer Strobe an
0B45 7B          {     LD    A,E 
0B46 D3 10       ..    OUT   (10),A     ; printer Strobe aus
0B48 20 EC        .    JR    NZ,0B36    ; Naechstes Zeichen
0B4A 44          D     LD    B,H 
0B4B 4D          M     LD    C,L 
0B4C E1          .     POP   HL 
0B4D E5          .     PUSH  HL 
0B4E B7          .     OR    A          ; Anzahl Restzeichen --> BC
0B4F ED 42       .B    SBC   HL,BC 
0B51 E5          .     PUSH  HL 
0B52 C5          .     PUSH  BC 
0B53 E1          .     POP   HL 
0B54 C1          .     POP   BC 
0B55 20 DC        .    JR    NZ,0B33    ; Nochmal mit dem rest aufrufen
0B57 E1          .     POP   HL 
0B58 C1          .     POP   BC 
0B59 37          7     SCF              ; Alles uebernommen 
0B5A C9          .     RET              ;----------
0B5B CD 72 0B    .r.   CALL  0B72       ; test,. ob printer bereit
0B5E 28 E0       (.    JR    Z,0B40 
0B60 CD 72 0B    .r.   CALL  0B72 
0B63 28 DB       (.    JR    Z,0B40     
0B65 54          T     LD    D,H 
0B66 5D          ]     LD    E,L        
0B67 E1          .     POP   HL 
0B68 B7          .     OR    A 
0B69 ED 52       .R    SBC   HL,DE 
0B6B EB          .     EX    DE,HL 
0B6C E1          .     POP   HL         
0B6D ED 52       .R    SBC   HL,DE      ; Nicht alles uebernommen
0B6F 44          D     LD    B,H 
0B70 4D          M     LD    C,L 
0B71 C9          .     RET              ; ----------- "printerstatus" ----- 
0B72 DB 10       ..    IN    A,(10)     ; Status einlesen
0B74 FD A6 01    ...   AND   (IY+01)    ; Maskieren 
0B77 FD AE 02    ...   XOR   (IY+02)    ; Kanal 7..9 selektieren 
0B7A C9          .     RET              ;-------------- "frout" ------------ 
0B7B CD 72 0B    .r.   CALL  0B72       ; Puffer voll ?
0B7E CA 50 06    .P.   JP    Z,0650     ; Nein, kann 200 Zeichen uebernehmen 
0B81 B7          .     OR    A 
0B82 01 00 00    ...   LD    BC,0000    ; Druckerpuffer voll --> 0 Zeichen 
0B85 C9          .     RET              ;--------- Aufg. 5 -2 ------------- 
;================== Sonstige Shard-Routinen (Non I/O) =====================
0B86 C3 12 08    ...   JP    0812       ; Init Parameterkanal = Timerinit 
0B89 ED B0       ..    LDIR             ;------------ "LONGMOVE" ----------- 
0B8B C9          .     RET              ;------------- "LIMIT" ------------- 
0B8C 11 FF FF    ...   LD    DE,FFFF    ; Geht bis zum RAM-Ende
0B8F C9          .     RET              ;------------ "SCHINF" ------------- 
0B90 01 00 00    ...   LD    BC,0000    ; Kein Schattenspeicher vorhanden ? 
0B93 C9          .     RET              ;------------ "SCHACC" --------------
0B94 F5          .     PUSH  AF 
0B95 E5          .     PUSH  HL 
0B96 CB 2C       .,    SRA   H 
0B98 CB 1D       ..    RR    L 
0B9A 7D          }     LD    A,L 
0B9B CD AD 0B    ...   CALL  0BAD 
0B9E E1          .     POP   HL                           ?
0B9F 7D          }     LD    A,L 
0BA0 21 00 FC    !..   LD    HL,FC00 
0BA3 CB 47       .G    BIT   0,A 
0BA5 28 03       (.    JR    Z,0BAA 
0BA7 21 00 FE    !..   LD    HL,FE00 
0BAA F1          .     POP   AF 
0BAB C9          .     RET 
0BAC C9          .     RET              ; -----------"SYSEND"-------------- 
0BAD C9          .     RET              ; ----- SHARD-fehler melden ------ 
0BAE E1          .     POP   HL         ; Ruecksprungaddresse 
0BAF E3          .     EX    (SP),HL 
0BB0 21 CD 0B    !..   LD    HL,0BCD    ; Tabellenanfang Fehlernummer + text
0BB3 16 00       ..    LD    D,00 
0BB5 4E          N     LD    C,(HL)     ; Textnummer aus Tabelle 
0BB6 23          #     INC   HL 
0BB7 B9          .     CP    C          ; gesucht und gefunden ?
0BB8 28 09       (.    JR    Z,0BC3     ; Ja, gefunden. Nummer melden
0BBA 0C          .     INC   C          ; Naechste Fehlernummer
0BBB 28 06       (.    JR    Z,0BC3 
0BBD 23          #     INC   HL 
0BBE 5E          ^     LD    E,(HL) 
0BBF 23          #     INC   HL 
0BC0 19          .     ADD   HL,DE 
0BC1 18 F2       ..    JR    0BB5       ; Naechsten nehmen
0BC3 4E          N     LD    C,(HL)     ; Fehlernummer in BC
0BC4 06 00       ..    LD    B,00 
0BC6 23          #     INC   HL 
0BC7 E3          .     EX    (SP),HL    ; Zur Rueckspungaddresse
0BC8 E9          .     JP    (HL) 
0BC9 3E 09       >.    LD    A,09       ; Block zu hoch
0BCB 18 E1       ..    JR    0BAE       ; melden ------------------------
0BCD 01 01 09    ...   LD    BC,0901    ; #1 : "not ready", Typ 1
0BD0 6E          n     LD    L,(HL) 
0BD1 6F          o     LD    L,A 
0BD2 74          t     LD    (HL),H 
0BD3 20 72        r    JR    NZ,0C47 
0BD5 65          e     LD    H,L 
0BD6 61          a     LD    H,C        
0BD7 64          d     LD    H,H 
0BD8 79          y     LD    A,C 
0BD9 02          .     LD    (BC),A     ; #2 : "crc err". Typ 2
0BDA 02          .     LD    (BC),A 
0BDB 07          .     RLCA 
0BDC 63          c     LD    H,E 
0BDD 72          r     LD    (HL),D 
0BDE 63          c     LD    H,E        
0BDF 20 65        e    JR    NZ,0C46 
0BE1 72          r     LD    (HL),D     
0BE2 72          r     LD    (HL),D 
0BE3 03          .     INC   BC         ; #3 : "bad sect". Typ 2
0BE4 02          .     LD    (BC),A 
0BE5 08          .     EX    AF,AF' 
0BE6 62          b     LD    H,D 
0BE7 61          a     LD    H,C 
0BE8 64          d     LD    H,H 
0BE9 20 73        s    JR    NZ,0C5E 
0BEB 65          e     LD    H,L 
0BEC 63          c     LD    H,E 
0BED 74          t     LD    (HL),H 
0BEE 04          .     INC   B          ; #4 : "write fault". Typ 2
0BEF 02          .     LD    (BC),A 
0BF0 0B          .     DEC   BC 
0BF1 77          w     LD    (HL),A 
0BF2 72          r     LD    (HL),D 
0BF3 69          i     LD    L,C 
0BF4 74          t     LD    (HL),H 
0BF5 65          e     LD    H,L 
0BF6 20 66        f    JR    NZ,0C5E    
0BF8 61          a     LD    H,C 
0BF9 75          u     LD    (HL),L 
0BFA 6C          l     LD    L,H 
0BFB 74          t     LD    (HL),H 
0BFC 05          .     DEC   B          ; #5 : "busy". Typ 2
0BFD 02          .     LD    (BC),A 
0BFE 04          .     INC   B 
0BFF 62          b     LD    H,D        
0C00 75          u     LD    (HL),L 
0C01 73          s     LD    (HL),E     
0C02 79          y     LD    A,C        
0C03 06 02       ..    LD    B,02       ; #6 : "dma failed". Typ 2
0C05 0A          .     LD    A,(BC) 
0C06 64          d     LD    H,H 
0C07 6D          m     LD    L,L 
0C08 61          a     LD    H,C        
0C09 20 66        f    JR    NZ,0C71 
0C0B 61          a     LD    H,C        
0C0C 69          i     LD    L,C 
0C0D 6C          l     LD    L,H 
0C0E 65          e     LD    H,L 
0C0F 64          d     LD    H,H 
0C10 07          .     RLCA             ; #7 : "rec not fnd". Typ 2
0C11 02          .     LD    (BC),A 
0C12 0B          .     DEC   BC 
0C13 72          r     LD    (HL),D     
0C14 65          e     LD    H,L 
0C15 63          c     LD    H,E 
0C16 20 6E        n    JR    NZ,0C86 
0C18 6F          o     LD    L,A 
0C19 74          t     LD    (HL),H     
0C1A 20 66        f    JR    NZ,0C82 
0C1C 6E          n     LD    L,(HL) 
0C1D 64          d     LD    H,H 
0C1E 08          .     EX    AF,AF'     ; #8 : "timeout". Typ 2
0C1F 02          .     LD    (BC),A 
0C20 07          .     RLCA 
0C21 74          t     LD    (HL),H 
0C22 69          i     LD    L,C 
0C23 6D          m     LD    L,L        
0C24 65          e     LD    H,L 
0C25 6F          o     LD    L,A 
0C26 75          u     LD    (HL),L 
0C27 74          t     LD    (HL),H 
0C28 09          .     ADD   HL,BC      ; #9 : "block zu hoch". Typ 3
0C29 03          .     INC   BC 
0C2A 0D          .     DEC   C 
0C2B 62          b     LD    H,D 
0C2C 6C          l     LD    L,H 
0C2D 6F          o     LD    L,A 
0C2E 63          c     LD    H,E 
0C2F 6B          k     LD    L,E 
0C30 20 7A        z    JR    NZ,0CAC 
0C32 75          u     LD    (HL),L 
0C33 20 68        h    JR    NZ,0C9D 
0C35 6F          o     LD    L,A        
0C36 63          c     LD    H,E 
0C37 68          h     LD    L,B 
0C38 FF          .     RST   38         ; #255 : "wrg err code". Typ 1 
0C39 01 0C 77    ..w   LD    BC,770C 
0C3C 72          r     LD    (HL),D 
0C3D 67          g     LD    H,A 
0C3E 20 65        e    JR    NZ,0CA5 
0C40 72          r     LD    (HL),D 
0C41 72          r     LD    (HL),D 
0C42 20 63        c    JR    NZ,0CA7 
0C44 6F          o     LD    L,A 
0C45 64          d     LD    H,H 
0C46 65          e     LD    H,L 
;=============================== Semaphorhandler =========================== 
0C47 35          5     DEC   (HL)       ; --- Semaphor (HL) testen, warte -- 
0C48 34          4     INC   (HL) 
0C49 36 01       6.    LD    (HL),01    ; Semaphor belegen 
0C4B C8          .     RET   Z          ; unbeleget, return
0C4C E5          .     PUSH  HL         ; Register fuer 'warte' retten
0C4D DD E5       ..    PUSH  IX 
0C4F FD E5       ..    PUSH  IY 
0C51 C5          .     PUSH  BC 
0C52 D5          .     PUSH  DE 
0C53 F5          .     PUSH  AF 
0C54 CD 19 1E    ...   CALL  1E19       ; "warte" bis Semaphor frei
0C57 F1          .     POP   AF 
0C58 D1          .     POP   DE 
0C59 C1          .     POP   BC 
0C5A FD E1       ..    POP   IY 
0C5C DD E1       ..    POP   IX 
0C5E E1          .     POP   HL 
0C5F 18 E6       ..    JR    0C47      ; Semaphor jetzt frei ? 
0C61 36 00       6.    LD    (HL),00    ; -------- Sempahor freigeben ------ 
0C63 C9          .     RET 
;=========================== Kanalpuffer + Kanalstatusbytes ================ 
 
;----------------------------- Hintergrund Kanal 0 ------------------------
0C64 00                                 ; Hintergrund 
0C65 FF 43                              ; letzter EUMEL-Block (8,5MB)
0C67 00 00                              ; erster EUMEL-Block
 
;----------------------------- Serieller Kanal 1 ------------------------- 
0C69 FF                                 ; 100 Bytes Puffer fuer Kanal 1
     ... 
0CCC FF 
0CCD 01                           IY+00 ; Kanal 1 
0CCE 03                              01 ; Flusskontrollen Bits 
                                          BIT 0 : 
                                          BIT 1 : 0 = XOFF-Status, 1=XON
                                          BIT 2 : XON/XOFF bei receive
                                          BIT 3 : XON/XOFF bei transmit
0CCF 64                              02 ; Puffergroesse = 100 
0CD0 00                              03 ; Pufferzeiger Write
0CD1 00                              04 ; Pufferzeiger Read 
0CD2 00                              05 ; 
0CD3 69 0C                           06 ; 0C69 = Pufferanfang 
0CD5 7F                              08 ; AND-maske f. fehlerfreien receive 
0CD6 00                              09 ; Datenbitmaske XOR   "
0CD7 7F                              0A ; AND-maske f. fehlerhaften reiceive 
0CD8 00                              0B ; Datenbitmaske XOR  "
0CD9 7F                              0C ; Maske fuer Read aus Puffer AND
0CDA 00                              0D ;    "                       XOR
0CDB 3F        ?                     0E ; Zeichen fuer Fehlerhaften Receive 
0CDC 13                              0F ; 19 = Stop (XOFF)
0CDD 11                              10 ; 17 = Weiter (XON)
0CDE 02                              11 ; BIT 1 = 1 : Baudrateeinst. moegl. 
                                        ; BIT 0 = 1 : RTS/CTS 
0CDF 04                              12 ; AND-Maske Test Statusport (TxDfull)
0CE0 04                              13 ; XOR-Maske f. TxDfull (ggf invert.)
0CE1 00                              14 ; DTR/RTS - Bits im Register 5 (82H)
0CE2 00                              15 ; OR-Register fuer V24-Errors
0CE3 00                              16 ; AND-Maske fuer zulaessige Fehler
0CE4 C1                              17 ; Register 3 (Rxbits, Autoenables) 
0CE5 44                              18 ; Register 4 (Stopb., Clock, parity) 
0CE6 EA                              19 ; Register 5 (Txbits, RTS, DTR)
0CE7 1D                              1A ; Port Kanal 1 Status/Command
0CE8 1C                              1B ; Datenport Kanal 1 : DART Channel A
0CE9 0C                              1C ; BR-Generatorport: CTC1 - Kanal 0
0CEA 88                              1D ; Interruptvektor Kanal 1 
0CEB CD 56 04          CALL  0456       ; Transmitbuffer empty IRQ 
0CEE CD 6B 04          CALL  046B       ; External/Status Change IRQ 
0CF1 CD BA 04          CALL  04BA       ; Receive Character available IRQ 
0CF4 CD 85 04          CALL  0485       ; Special Receive condition IRQ
 
;----------------------------- Serieller Kanal 2 -------------------------- 
0CF7 FF                                 ; 100 Bytes Puffer Kanal 2 
     ...
0D5A FF 
0D5B 02                                 ; Kanal 2 
0D5C 03                                 ; Flusskontrollenbits
0D5D 64                                 ; 100 = Puffergroesse
0D5E 00 00 00                           ; Pufferzeiger
0D61 F7 0C                              ; 0CF7 = Pufferanfang Kanal 2
0D63 7F 00                              ; Masken fuer fehlerfreiene Receive
0D65 7F 00                              ;          "  fehlerhaften Receive 
0D67 7F 00                              ; Masken fuer read aus Puffer 
0D69 3F          ?                      ; Zeichen fuer fehlerhaften receive 
0D6A 13 11                              ; XOFF/XON Zeichen 
0D6C 02                                 ; Baudrateeinstellung moeglich 
0D6D 04 04                              ; Masken fuer Test Statusport:TxDfull
0D6F 00                                 ; DTR/RTS Bits in Register 5
0D70 00 00                              ; Masken fuer zulaessige Fehler 
0D72 C1 44 EA                           ; Register 3, 4, 5 Werte
0D75 1F                                 ; Port Kanal 2 Status / Command 
0D76 1E                                 ; Datenport Kanal 2 : DART Channel B 
0D77 0E                                 ; BR-Generatorport: CTC1 - Kanal 1
0D78 80                                 ; Interruptvektor Kanal 2
0D79 CD 56 04          CALL  0456       ; Interruptroutinen
0D7C CD 6B 04          CALL  046B 
0D7F CD BA 04          CALL  04BA 
0D82 CD 85 04          CALL  0485 
 
;------------------------------ Serieller kanal 3 -------------------------
0D85 FF                                 ; 100 Byte Datenpuffer (Senden)
     ... 
0DE8 FF 
0DE9 03                                 ; Kanal 3 
0DEA 03                                 ; Flusskontrollenbits 
0DEB 64                                 ; Puffergroesse 
0DEC 00 00 00                           ; Pufferzeiger
0DEF 85 0D                              ; Pufferanfang Kanal 3 : 0D85 
0DF1 7F 00                              ; Datenbitsmasken s.o
0DF3 7F 00                              ;   "
0DF5 7F 00                              ;   "
0DF7 3F        ?                        ; Zeichen bei fehlerhaftem Receive
0DF8 13 11                              ; XOFF/XON Zeichen 
0DFA 02                                 ; Baudrateeinstellung moeglich 
0DFB 04 04                              ; Masken fuer Test Statusport:TxDfull 
0DFD 00                                 ; DTR/RTS Bits in register 5 (82H) 
0DFE 00 00                              ; Masken fuer zulaessige Fehler 
0E00 C1 44 EA                           ; Register 3, 4, 5 Werte 
0E03 29                                 ; Port Kanal 3 Status / Command 
0E04 28                                 ; Datenport Kanal 3 : SIO 1 Channel A
0E05 32                                 ; BR-generatorport: CTC2 - Kanal 2 
0E06 98                                 ; Interruptvektor Kanal 3
0E07 CD 56 04          CALL  0456       ; Interruptroutinen
0E0A CD 6B 04          CALL  046B 
0E0D CD BA 04          CALL  04BA 
0E10 CD 85 04          CALL  0485 
 
;--------------------------------- Serieller Kanal 4 ----------------------- 
0E13 FF                                 ; 100 Bytes Kanalpuffer 
     ... 
0E76 FF 
0E77 04                                 ; Kanal 4 
0E78 03                                 ; Flusskontrollenbits 
0E79 64                                 ; Puffergroesse 
0E7A 00 00 00                           ; Pufferzeiger 
0E7D 13 0E                              ; Pufferanfang Kanal 4 : 0E13
0E7F 7F 00                              ; Datenbitmasken s.o. 
0E81 7F 00 
0E83 7F 00 
0E85 3F          ?                      ; Zeichen bei fehlerhaften Receive 
0E86 13 11                              ; XOFF/XON Zeichen 
0E88 02                                 ; Baudrateeinstellung moeglich 
0E89 04 04                              ; Masken fuer TxDfull Status 
0E8B 00                                 ; RTS/DTR Bits (82H) 
0E8C 00 00                              ; Masken fuer zulaessige Fehler 
0E8E C1 44 EA                           ; Register 3, 4, 5 Werter 
0E91 2B                                 ; Port Kanal 4 Status/Command 
0E92 2A                                 ; Datenport kanal 4 : SIO 1 Channel B
0E93 31                                 ; BR-Generatorport: CTC2 - Kanal 1
0E94 90                                 ; Interruptvektor Kanal 4
0E95 CD 56 04          CALL  0456       ; Interruptroutinen 
0E98 CD 6B 04          CALL  046B 
0E9B CD BA 04          CALL  04BA 
0E9E CD 85 04          CALL  0485 
 
;-------------------------------- Serieller Kanal 5 -----------------------
0EA1 FF                                 ; 100 Bytes Ausgabepuffer
     ... 
0F04 FF 
0F05 05                                 ; Kanal 5 
0F06 03                                 ; Flusskontrollenbits 
0F07 64                                 ; Puffergroesse 
0F08 00 00 00                           ; Pufferzeiger 
0F0B A1 0E                              ; Pufferanfang : 0EA1 
0F0D 7F 00                              ; Datenbitmasken s.o. 
0F0F 7F 00                              ;   "
0F11 7F 00                              ;   " 
0F13 3F          ?                      ; Zeichen fuer fehlerhaften Receive
0F14 13 11                              ; XOFF/XON Zeichen 
0F16 02                                 ; Baudrateeinstellung moeglich 
0F17 04 04                              ; Maskenbits fuer Status TxDfull
0F19 00                                 ; RTS/DTR Bits (82H) 
0F1A 00 00                              ; Masken fuer zulaessige fehler 
0F1C C1 44 EA                           ; Register 3, 4, 5 Werte 
0F1F 2D                                 ; Port Kanal 5 Status / Command 
0F20 2C                                 ; Datenport kanal 5 : SIO 2 Channel A
0F21 30                                 ; BR-Generatorport: CTC2 - Kanal 0
0F22 A8                                 ; Interruptvektor Kanal 5 
0F23 CD 56 04          CALL  0456       ; Interruptroutinen
0F26 CD 6B 04          CALL  046B 
0F29 CD BA 04          CALL  04BA 
0F2C CD 85 04          CALL  0485 
 
;--------------------------- Serieller kanal 6 ---------------------------- 
0F2F FF                                 ; 100 Bytes ausgabepuffer 
     ... 
0F92 FF 
0F93 06                                 ; Kanal 6 
0F94 03                                 ; Flusskontrollenbits
0F95 64                                 ; Puffergroesse
0F96 00 00 00                           ; Pufferzeiger 
0F99 2F 0F                              ; Pufferanfang Kanal 6 : 0F2F 
0F9B 7F 00                              ; Datenbitmasken s.o. 
0F9D 7F 00                              ;      " 
0F9F 7F 00                              ;      " 
0FA1 3F          ?                      ; Zeichen fuer fehlerhaften Receive
0FA2 13 11                              ; XOFF/XON Zeichen 
0FA4 02                                 ; Baudrateeinstellung moeglich 
0FA5 04 04                              ; Maskenbits Status TxDfull 
0FA7 00                                 ; RTS/DTR Bits in Register 5 
0FA8 00 00                              ; Masken fuer zulaessige Fehler 
0FAA C1 44 EA                           ; Register 3, 4, 5 Werte 
0FAD 2F                                 ; Port Kanal 6 : Status / Command 
0FAE 2E                                 ; Datenport kanal 6 : SIO 2 Channel B
0FAF 31                                 ; BR-Generatorport : CTC2 - Kanal 1 
0FB0 A0                                 ; Interruptvektor kanal 6 
0FB1 CD 56 04          CALL  0456       ; Interruptroutinen
0FB4 CD 6B 04          CALL  046B 
0FB7 CD BA 04          CALL  04BA 
0FBA CD 85 04          CALL  0485 
 
;------------------------------- Parallelkanal 7 --------------------------
0FBD 07                                 ; Kanal 7 
0FBE 20                                 ; AND-Maske fuer Printerbusy
0FBF 00                                 ; XOR-Maske f. Printer 0 busy
0FC0 FE                                 ; AND-Maske fuer Printerstrobe
0FC1 00                                 ; XOR-Maske1 fuer Printerstrobe an
0FC2 01                                 ; XOR-Maske2 fuer Printerstrobe aus
 
;------------------------------- Parallel Kanal 8 ------------------------- 
0FC3 08                                 ; Kanal 8 
0FC4 40                                 ; AND-Maske fuer Printerbusy
0FC5 00                                 ; XOR-Maske fuer Printer 1 busy
0FC6 FD                                 ; AND-Maske fuer Printerstrobe
0FC7 00                                 ; XOR-Maske1 fuer Printerstrobe an
0FC8 02                                 ; XOR-Maske2 fuer Printerstrobe aus
 
;------------------------------ Parallel kanal 9 -------------------------- 
0FC9 09                                 ; Kanal 9 
0FCA 80                                 ; AND-Maske f. Printerbusy
0FCB 00                                 ; XOR-Maske f. Printer 2 busy
0FCC FB                                 ; AND-Maske fuer Printerstrobe
0FCD 00                                 ; XOR-Maske1 fuer Printerstrobe an
0FCE 04                                 ; XOR-maske2 fuer Printerstrobe aus
 
;----------------------------- Floppy Kanal 31 ---------------------------- 
0FCF 1F                                 ; Kanal 31 
0FD0 00                                 ; IY+00
0FD1 00                                 ; IY+01 FDC-AND-Maske Status-ready
0FD2 00                                 ; 02 FDC-Kommando Read/Write
0FD3 00                                 ; 03
0FD4 00                                 ; 04 
0FD5 00                                 ; 05 : Returncode aus Floppy-IRQ
0FD6 00                                 ; 06 : Alter Sektor 
0FD7 00                                 ; 07
0FD8 04                                 ; 08
0FD9 FF                                 ; 09 Floppydrive (f. Headselect)
0FDA 00                                 ; 0A  - 46H = "F"
;============================== SHARD ENDE =================================